##########################################################################
# 版權聲明 #
# #
# 本篇文章的版權為作者PinHong Chen先生所有. 允許網路上的非營利 #
# 轉載. 作者的電子郵件地址:honger.bbs@aidebbs.edu.tw #
# 本文可在下列URL取得: #
# http://www.math.ncu.edu.tw/~chenym/perl/intro.html #
From news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board Wed Feb 14 23:57:10 1996
Path: news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board
From: honger.bbs@aidebbs.edu.tw (Her Done Mine Chao!)
Newsgroups: tw.bbs.comp.www
Subject: Basic Introduction to Perl
Date: 13 Feb 1996 06:54:46 GMT
Organization: 灣學術網路 BBS 實驗站
Message-ID: <3BCREM$5jj@aidebbs.edu.tw>
X-Filename: www/M.824194486.A
NNTP-Posting-Host: eo4.ee.ntu.edu.tw
Lines: 307
這是小弟的一篇介紹 perl 的文章,希望對你有用:
:)
Honger
PPPP EEEEE RRRR L
P P E R R L
PPPP EEEE RRRR L
P E R R L
P EEEEE R R LLLLLL
1. Introduction
這不是 perl 的完整介紹,只是想將 perl 向 C programmer 作個介紹,也許能
有所幫助!
perl 是由 Larry Wall 先生所寫. 目前的版本 5.002, 加入多項的功能. 請
看 perl.1, 那有詳細的條列.
一般而言, 由 awk, sed, shell programming 寫的東西可以輕易用 perl 來
處理,而且速度更快. 在 C program 中,特別是有關抽取文字檔中的資訊,加以轉化
的問題. 當然了, perl 執行時會有一道轉成內部表示式的關, 真正 optimized
過的 C code 仍會比 perl code 快. 一般而言, perl code 會比 C code 短很多.
perl 在 regular expression, list(array) 和 associative array 有很方
便的語法和不錯的執行效率. 連 yacc (Berkeley yacc) 也可有產生 perl code 的
選項, 這對於 prototyping 十分方便.
2. Perl Basics
2.1 Basic data structure and Control construct
perl 的 comment 是從 # 之後開始.而 perl 並不區分 string
, integer 和 float point number 的 data type, 統統以純量代表.例如:
# This is a comment line till the end of this line
$x=1.5;
$y="I hate shell programming";
$z=1.3e-27;
這個 $ 是表示現在操作的是個純量(相對於 list 或 associative array).
在 C 裡的 operator, 如 +,-,*,/,%,^,++,--,+=,-=,*=,/=,%=,==,!=, &&,
||, |, & 全都有, 意思也不變. 不過若用於字串, . (dot)是表示連接的意思.
因此 .= 也有類似 C 中 += 的意思.
$x='I hate ';
$x.="awk programming.";
print $x;
結果為 I hate awk programming. 字串可用單或雙括號圍住. 超出一行也沒關.
也可以寫的像 shell programming 中:
$x= << END;
This part can be put what
you like here
1234567890
till the sign as the beginning.
END
相當於
$x="This part can be put what
till the sign as the beginning.";
字串的比較有 eq, ne, gt, lt, ....就像那 Fortran 的 operator. 聰明的
你猜猜就知道啦.
至於 control 方面, 如 if, while, do .. while, 都和 C 類似. 如:
$sum=0;
for($i=0;$i<10; $i++){
$sum+=$i;
}
大括號是不可省略的! 這和 C 不同. 也可:
$i=0;
while($i<10){
$sum+=$i++;
如果你要從 loop 中跳出來, last 相當於 C 中 break, next 相當於 continue.
if($i % 2==0){
$sum+=$i++;
next;
}elsif($sum>50){
last;
}
if 敘述要注意大括號是不可省, 還有 else if 必須寫成 elsif.
2.2 List
List 和 1 dimension array 在 perl 中沒區別. 用法如:
@a=(1,2,3);
$a[0]-=$a[1];
print "a[0]=$a[0]";
結果就是 a[0]=-1. @是表示現在在操作 list. 雙括號的字串中,若有變數, perl
會直接解譯. 如上例中的 $a[0]. List 可以直接連接:
@b=(4,5);
@c=(@a,@b,6,7);
print "@c";
結果是 1 2 3 4 5 6 7. perl 有特殊的變數, $#a 來表示 @a 的最後 index,
所以上例中, $c[$#c] 就是 7, 也可寫成 $c[-1]. 那麼 $c[-2] 就是 6 了.
List 還有些 operator, push, pop, shift, unshift, splice, 其中
push 推一些元素入 list:
push @a,(3,4);
結果 @a 成為 (1,3,4).
pop 拉最後一個元素 :
$b=pop @a;
shift, unshift 和 pop, push 類似不過操作在 list 前端.
$b=shift @a;
unshift @a,0;
結果 @a 成為 (0,3), $b 變成 1.
Loop 也可寫成:
@weekday=( 'Mon','Tue','Wed','Thu','Fri','Sat');
foreach $x(@weekday){
# schedule something
結果 $x 會依序變成 'Mon','Sat' 等.
2.3 Associative Array
這是使用 string 來做 index 的 array, 一般叫作 hash.
$phone_no{'peter'}='02-9110238';
$phone_no{'john'}="06-1234567";
$name='peter';
print "$name Phone No.=",$phone_no{$name},"\n";
結果就會印一行:
peter Phone No.=02-9110238
上面兩行也可寫成:
%phone_no=( 'peter' => '02-9110238', 'john' => '06-1234567');
=> 和 , 一樣所以:
%phone_no=( 'peter' , '02-9110238', 'john' , '06-1234567');
也可, 就是相當於一個 key 和 value, 所組成的list.
2.4 Subroutine
副程式可以任意擺放, perl 全看得到.
sub foo{
my $x=$_[0];
my $y=$_[1];
return $x/$y;
$x=1;
$y=8;
print foo(4,0)">結果是 2.
上例中, my 這個 keyword 表示, $x, $y 是在 foo 圍內有效 (local variable
in subroutine lexical scope).而 $_[0], $_[1] 用於傳參數. perl 的 subroutine
呼叫參數都是放在固定 @_ 的 list 中.
2.5 Special Variables
perl 常使用的 default variable 是 $_.
foreach (@weekday){
# do with $_
結果 $_ 會依序變成 'Mon',0)"> @ARGV 是 perl 執行時的 command line argument,$ARGV[0] 相當於 C 中的
argv[1]. $ARGV[1] 相當於 C 中的 argv[2]. C 中的 argv[0] 放在 $0.
%ENV 是 perl 執行時的 environment variable, $ENV{'HOME'} 就是 user
的 home path, $ENV{'PWD'} 就是 current path.
其它特殊變數請參考 perlvar.1.
2.6 File Handle
perl 中主要開檔的方法:
open(FH,"test.dat"); # 寫入
$oneLine=; # 讀取 FH
print FH "1234"; # 寫入 FH
close(FH); # 關檔
例子:
printf "%4d:%s",++$n,$_;
close(FH);
結果會把 test.dat 加 4 位行號印出.( 只寫 時相當於省略 $_= ).
2.7 Regular Expression
perl 對於 regular expression 有重新改寫. 好用且功能強, 是 sed 和 awk 的
superset. 要求執行 regular expression 比對的 operator 為 ~= ( match),0)">!= ( not match). regular expression 用 /.../ 括住.
$line=" end; ";
if($line =~ /end/){
print "match!";
}else{
print "NO!";
結果會印出 match!, 如果改成
if($line =~ /^end/){
結果會印出 NO!
^ 表string 的開端,0)"> $ 表string 的結束,0)"> [a-z] 表 a 到 z 中任一字元
pat1 | pat2 表 pat1 或 pat2 皆可
x* 表 x 重 0 次或以上
x+ 表 x 重 1 次或以上
\d 相當於 [0123456789], \D 就是相反
\w 相當於 [_a-zA-Z0-9], \W 就是相反
\s 表示 space, \S 表非 space character
若要取代,則:
$d="Sep. 15th, Sep. 17th";
$a =~ s/Sep/9/;
結果是 9. 15th, Sep. 17th, 加 g (global) option 如下:
$a =~ s/Sep/9/g;
2.8 Reference
Perl 5.0 之後允許 list of list 也就可能有 2-Dimension Array.
例如:
$a[0][0]=1;
$phone{$name}[0]='1234';
$phone{$name}[1]='2674';
實際上 是用所謂的 reference,就像是 C 的 address. 一個純量可純存一個
reference.
$aref=\@a; # 取 @a 的 reference
print $aref->[0]; # 相當於 print $a[0];
push @{$aref},4; # 相當於 push @a,4;
2-dimension array 可以如:
@a=([1,3],[4,5,6]);
print $a[1][2];
結果是 6.
使用 associative array 也類似:
$database{$name}{'home'}{'address'}='No. 1234, 75th Street";
$database{$name}{'office'}{'phone'}='02-8127365";
List of associative array 也都可以使用.
2.9 Example
Email 中若有 uuencode 的資料,可以寫 perl 將它 extract 出來.
#!/usr/local/bin/perl
open(EMAIL,"<$ARGV[0]")||die "Cannot open $ARGV[0]:$!";
# 若開不成 perl 會跳出且印 Cannot open ...
while(){
if(/^begin\s+\d\d\d\s+/){
# 遇到 begin 開頭後印出
print $_;
while(){
if(/^end/){
# 遇到 end 時結述
last;
}
print $_;
}
close(EMAIL);
可以寫得更簡化,不過那就屬於您功力的無限空間了.........
# 版權聲明 #
# #
# 本篇文章的版權為作者PinHong Chen先生所有. 允許網路上的非營利 #
# 轉載. 作者的電子郵件地址:honger.bbs@aidebbs.edu.tw #
# 本文可在下列URL取得: #
# http://www.math.ncu.edu.tw/~chenym/perl/intro.html #
From news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board Wed Feb 14 23:57:10 1996
Path: news.ncu.edu.tw!news.cc.nctu.edu.tw!news.csie.nctu.edu.tw!aide_board
From: honger.bbs@aidebbs.edu.tw (Her Done Mine Chao!)
Newsgroups: tw.bbs.comp.www
Subject: Basic Introduction to Perl
Date: 13 Feb 1996 06:54:46 GMT
Organization: 灣學術網路 BBS 實驗站
Message-ID: <3BCREM$5jj@aidebbs.edu.tw>
X-Filename: www/M.824194486.A
NNTP-Posting-Host: eo4.ee.ntu.edu.tw
Lines: 307
這是小弟的一篇介紹 perl 的文章,希望對你有用:
:)
Honger
PPPP EEEEE RRRR L
P P E R R L
PPPP EEEE RRRR L
P E R R L
P EEEEE R R LLLLLL
1. Introduction
這不是 perl 的完整介紹,只是想將 perl 向 C programmer 作個介紹,也許能
有所幫助!
perl 是由 Larry Wall 先生所寫. 目前的版本 5.002, 加入多項的功能. 請
看 perl.1, 那有詳細的條列.
一般而言, 由 awk, sed, shell programming 寫的東西可以輕易用 perl 來
處理,而且速度更快. 在 C program 中,特別是有關抽取文字檔中的資訊,加以轉化
的問題. 當然了, perl 執行時會有一道轉成內部表示式的關, 真正 optimized
過的 C code 仍會比 perl code 快. 一般而言, perl code 會比 C code 短很多.
perl 在 regular expression, list(array) 和 associative array 有很方
便的語法和不錯的執行效率. 連 yacc (Berkeley yacc) 也可有產生 perl code 的
選項, 這對於 prototyping 十分方便.
2. Perl Basics
2.1 Basic data structure and Control construct
perl 的 comment 是從 # 之後開始.而 perl 並不區分 string
, integer 和 float point number 的 data type, 統統以純量代表.例如:
# This is a comment line till the end of this line
$x=1.5;
$y="I hate shell programming";
$z=1.3e-27;
這個 $ 是表示現在操作的是個純量(相對於 list 或 associative array).
在 C 裡的 operator, 如 +,-,*,/,%,^,++,--,+=,-=,*=,/=,%=,==,!=, &&,
||, |, & 全都有, 意思也不變. 不過若用於字串, . (dot)是表示連接的意思.
因此 .= 也有類似 C 中 += 的意思.
$x='I hate ';
$x.="awk programming.";
print $x;
結果為 I hate awk programming. 字串可用單或雙括號圍住. 超出一行也沒關.
也可以寫的像 shell programming 中:
$x= << END;
This part can be put what
you like here
1234567890
till the sign as the beginning.
END
相當於
$x="This part can be put what
till the sign as the beginning.";
字串的比較有 eq, ne, gt, lt, ....就像那 Fortran 的 operator. 聰明的
你猜猜就知道啦.
至於 control 方面, 如 if, while, do .. while, 都和 C 類似. 如:
$sum=0;
for($i=0;$i<10; $i++){
$sum+=$i;
}
大括號是不可省略的! 這和 C 不同. 也可:
$i=0;
while($i<10){
$sum+=$i++;
如果你要從 loop 中跳出來, last 相當於 C 中 break, next 相當於 continue.
if($i % 2==0){
$sum+=$i++;
next;
}elsif($sum>50){
last;
}
if 敘述要注意大括號是不可省, 還有 else if 必須寫成 elsif.
2.2 List
List 和 1 dimension array 在 perl 中沒區別. 用法如:
@a=(1,2,3);
$a[0]-=$a[1];
print "a[0]=$a[0]";
結果就是 a[0]=-1. @是表示現在在操作 list. 雙括號的字串中,若有變數, perl
會直接解譯. 如上例中的 $a[0]. List 可以直接連接:
@b=(4,5);
@c=(@a,@b,6,7);
print "@c";
結果是 1 2 3 4 5 6 7. perl 有特殊的變數, $#a 來表示 @a 的最後 index,
所以上例中, $c[$#c] 就是 7, 也可寫成 $c[-1]. 那麼 $c[-2] 就是 6 了.
List 還有些 operator, push, pop, shift, unshift, splice, 其中
push 推一些元素入 list:
push @a,(3,4);
結果 @a 成為 (1,3,4).
pop 拉最後一個元素 :
$b=pop @a;
shift, unshift 和 pop, push 類似不過操作在 list 前端.
$b=shift @a;
unshift @a,0;
結果 @a 成為 (0,3), $b 變成 1.
Loop 也可寫成:
@weekday=( 'Mon','Tue','Wed','Thu','Fri','Sat');
foreach $x(@weekday){
# schedule something
結果 $x 會依序變成 'Mon','Sat' 等.
2.3 Associative Array
這是使用 string 來做 index 的 array, 一般叫作 hash.
$phone_no{'peter'}='02-9110238';
$phone_no{'john'}="06-1234567";
$name='peter';
print "$name Phone No.=",$phone_no{$name},"\n";
結果就會印一行:
peter Phone No.=02-9110238
上面兩行也可寫成:
%phone_no=( 'peter' => '02-9110238', 'john' => '06-1234567');
=> 和 , 一樣所以:
%phone_no=( 'peter' , '02-9110238', 'john' , '06-1234567');
也可, 就是相當於一個 key 和 value, 所組成的list.
2.4 Subroutine
副程式可以任意擺放, perl 全看得到.
sub foo{
my $x=$_[0];
my $y=$_[1];
return $x/$y;
$x=1;
$y=8;
print foo(4,0)">結果是 2.
上例中, my 這個 keyword 表示, $x, $y 是在 foo 圍內有效 (local variable
in subroutine lexical scope).而 $_[0], $_[1] 用於傳參數. perl 的 subroutine
呼叫參數都是放在固定 @_ 的 list 中.
2.5 Special Variables
perl 常使用的 default variable 是 $_.
foreach (@weekday){
# do with $_
結果 $_ 會依序變成 'Mon',0)"> @ARGV 是 perl 執行時的 command line argument,$ARGV[0] 相當於 C 中的
argv[1]. $ARGV[1] 相當於 C 中的 argv[2]. C 中的 argv[0] 放在 $0.
%ENV 是 perl 執行時的 environment variable, $ENV{'HOME'} 就是 user
的 home path, $ENV{'PWD'} 就是 current path.
其它特殊變數請參考 perlvar.1.
2.6 File Handle
perl 中主要開檔的方法:
open(FH,"test.dat"); # 寫入
$oneLine=; # 讀取 FH
print FH "1234"; # 寫入 FH
close(FH); # 關檔
例子:
printf "%4d:%s",++$n,$_;
close(FH);
結果會把 test.dat 加 4 位行號印出.( 只寫 時相當於省略 $_= ).
2.7 Regular Expression
perl 對於 regular expression 有重新改寫. 好用且功能強, 是 sed 和 awk 的
superset. 要求執行 regular expression 比對的 operator 為 ~= ( match),0)">!= ( not match). regular expression 用 /.../ 括住.
$line=" end; ";
if($line =~ /end/){
print "match!";
}else{
print "NO!";
結果會印出 match!, 如果改成
if($line =~ /^end/){
結果會印出 NO!
^ 表string 的開端,0)"> $ 表string 的結束,0)"> [a-z] 表 a 到 z 中任一字元
pat1 | pat2 表 pat1 或 pat2 皆可
x* 表 x 重 0 次或以上
x+ 表 x 重 1 次或以上
\d 相當於 [0123456789], \D 就是相反
\w 相當於 [_a-zA-Z0-9], \W 就是相反
\s 表示 space, \S 表非 space character
若要取代,則:
$d="Sep. 15th, Sep. 17th";
$a =~ s/Sep/9/;
結果是 9. 15th, Sep. 17th, 加 g (global) option 如下:
$a =~ s/Sep/9/g;
2.8 Reference
Perl 5.0 之後允許 list of list 也就可能有 2-Dimension Array.
例如:
$a[0][0]=1;
$phone{$name}[0]='1234';
$phone{$name}[1]='2674';
實際上 是用所謂的 reference,就像是 C 的 address. 一個純量可純存一個
reference.
$aref=\@a; # 取 @a 的 reference
print $aref->[0]; # 相當於 print $a[0];
push @{$aref},4; # 相當於 push @a,4;
2-dimension array 可以如:
@a=([1,3],[4,5,6]);
print $a[1][2];
結果是 6.
使用 associative array 也類似:
$database{$name}{'home'}{'address'}='No. 1234, 75th Street";
$database{$name}{'office'}{'phone'}='02-8127365";
List of associative array 也都可以使用.
2.9 Example
Email 中若有 uuencode 的資料,可以寫 perl 將它 extract 出來.
#!/usr/local/bin/perl
open(EMAIL,"<$ARGV[0]")||die "Cannot open $ARGV[0]:$!";
# 若開不成 perl 會跳出且印 Cannot open ...
while(){
if(/^begin\s+\d\d\d\s+/){
# 遇到 begin 開頭後印出
print $_;
while(){
if(/^end/){
# 遇到 end 時結述
last;
}
print $_;
}
close(EMAIL);
可以寫得更簡化,不過那就屬於您功力的無限空間了.........