在 BASH 腳本程序中,我們用 read var 來實現從鍵盤的輸入,用 echo $var 來實現輸出。那么在 Perl 中將有一點變化。Perl 中將標準輸入用關鍵詞
$var=
@var=
在 Perl 語言中,變量 $_ 是許多操作符的缺省變量。因此如果需要讀入許多行并對每行分別處理一般這樣寫:
while($_=
chop($_); # chop 調用用于去掉 $_ 變量中的最后一個字符(換行符)。
# 處理$_(每一行)
}
或者可以簡寫為:
while(
chop; # 等同于chop($_)
# 處理$_(每一行)
}
如果 <> 括號之間沒有任何字符,則表示從命令行所指示的文件中讀取數據,看下面這個例子(read.pl):
#!/usr/bin/perl;
while(<>){
print $_;
}
如果在命令行輸入 $ perl read.pl read.pl 。這個程序將在屏幕上打印出文件 read.pl 的每一行。
在前面的例子中我們已經看見,Perl 語言中向標準輸出輸出數據可以用 print 語句。我們在 print 語句中可以輸出多個變量,變量之間用 "," 分隔開來。如下面的例子:
print 3,45*2,"hello",2+2;
上面的輸出語句將給出 "390hello4" 的輸出結果。
除了 print 語句以外,Perl 中還提供了一個 printf 語句用于標準輸出,不過 printf 更接近于 C 語言的 printf 函數,可以進行格式化的輸出,如:
printf "%10s% 8d%8.2f\n",$a,$b,$c;
printf("%10s% 8d%8.2f\n",$a,$b,$c); # 加上括號的 C 語言寫法也是可以的。
另外 print 和 printf 在輸出數組變量的時候也是不同的,如下例:
@a = (1 , 2, 3);
printf @a;
print "\n";
print @a;
print "\n";
輸出的結果是:
1
123
如果在 @a 兩邊加上 "" ,則輸出就都是 123了。
Perl 語言的 if...then...else... 語句結構和 C 語言非常相似,該結構一共有三種變種,分別如下:
if 語法 1:
if(判別運算式)
{
表達式為真時的語句塊;
}
或寫成:表達式為真時的語句 if (判別運算式);
實例為:print "您的分數及格了!\n" if ($score>=60);
if 語法 2:
if(判別運算式一){
判別式一為真時的語句塊;
}else{
判別式一為假時的語句塊;
}
if 語法 3:
if (判別運算式一)
{
判別式一為真時的語句塊;
}elsif(判別運算式二){
判別式二為真時的語句塊;
}elsif(判別運算式三){
判別式三為真時的語句塊;
}else{
所有判別式為假時的語句塊;
}
unless的含義就是說“如果判別式不為真,就執行...”。
unless 語法 1:
unless(判別運算式) {
判別式為假時語句塊;
}
或寫為:判別式為假時語句 unless (判別運算式);
unless 語法 2:
unless(判別運算式)
{
判別式為假時語句塊;
}else{
判別式為真時語句塊;
}
這些符號看上去像標點符號,或是表達式的一部分。和 C 語言中一樣,他們在 Perl 語言中也可作為控制結構,而且更簡潔,只是可讀性差了很多。
比如說:
if (判別表達式) {為真時語句塊};
也可以寫為:
判別表達式 && 為真時的語句塊
同樣道理,unless(this){that} 可替換為 this||that。
? : 則可以這樣使用:
exp1?exp2:exp3
這個式子表示:如果 exp1 為真則求 exp2 的值,否則求 exp3 的值。
Perl 語言中 while, do...while, for, until, foreach 均可以用于實現循環結構,循環中還可以用 last,next,redo 等操作符進行控制。下面我們先介紹 while 語法。
while(判別運算式) {
程序敘述區塊;
}
上個語法在Perl中也可以寫成: 程序敘述區塊 while(判別運算式);
do
{
程序敘述區塊;
}while(判別運算式);
在 while 和 do while 循環最大的區別是在 do while 循環中,循環體至少會被執行一次。
until(判別運算式)
{
程序敘述區塊;
}
上個語法在Perl中也可以寫成: 程序敘述區塊 until (判別運算式);
do{
程序敘述區塊;
}until (判別運算式);
for (初始化運算式;判別運算式;循環過程運算式)
{
程序敘述區塊;
}
或者
for $variable(@array)
{
程序敘述區塊;
}
第二個語法中如果把 $variable 變量省略的話,就會將數組 @array 的元素一個一個指定給 $_ 這個變量,這是比較精簡的寫法。其中第一個語法更接近于 C 語言的語法。
foreach $variable(@array)
{
程序敘述區塊;
}
如果把$variable變量省略的話,就會將數組@array的元素一一指定給$_這個內定的輸出變量.
范例:
for($i=1;$i<=10;$i++)
{
last if ($i==5); # 如果 $i 等于5的話就退出 for 循環
print"$i\n";
}
范例:
for($i<=10;$i++)
{
# 如果是 2 的倍數的話,就到循環的下一個陳述
next if($i%2)==0)
print"$i是一個奇數!\n";
}
Perl 語言中有兩種函數,一種是 Perl 自帶的一些實用系統函數,如文件打開函數 open 等;另一種是用戶自定義的函數,用戶通過自己定義函數可以使得程序的結構化更加清晰。
用戶函數又稱子程序(Subroutine),在 Perl 中用下面的結構來定義用戶函數:
sub 子程序名{
語句塊;
}
這里的子程序名與變量的取名規則類似。
與 BASH 程序不同,Perl 中的用戶函數的定義可以位于程序的任何位置,比如說放在文件的未尾,而并不需要放在調用該函數的代碼之前。如果兩個子程序使用了相同的程序名,位置靠后的子程序將覆蓋前面子程序。
需要注意的是用戶函數中的變量默認為全局變量,并不是像 C 語言中那樣是局部變量,Perl 函數中的變量可以被其他程序段共享。如果希望定義局部變量,可以用下面兩種方法來實現:
local($a);
my $a;
另外用戶函數的調用:通過在子程序前加“&”符號才可以,函數可在任一表達式內被調用。函數調用可以嵌套,即子程序中可以再調用另外的子程序,即可以程序員可以用 Perl 寫出具有遞歸特性的代碼。
調用用戶函數產生的結果稱為返回值(return value)。返回值是每次函數被執行時,最后一個被執行到的表達式的計算結果。如:
sub add_a_b{
$a+$b;
}
函數最后一條表達式為 $a+$b,故返回值為 $a+$b 的計算結果。以下是調用情況:
$a = 5;
$b = 6;
$c = &add_a_b; # $c 的值為 11
$d = 5 * &add_a_b; # $d 的值為 5*11,即 55
還有一個問題是,在 Perl 程序中如何向函數中傳遞參數呢?這是可以實現的,調用函數時,可以將參數依次放在函數名后面的 "()" 中,而在函數體中,系統默認數組 @_ 中就按同樣順序存放著所有的參數。我們可以訪問 @_ 變量,從而確定參數的個數及其數值。
仍以加法函數為例:
sub add_a_b{
$_[0]+$_[1];
}
$c=&add_a_b(5,6); #$c的值為11
$d=5*&add_a_b(2,3); #d的值為5*5即25
更為奇特的是,這種方式可以實現變參數傳遞,即參數個數不確定的傳遞。C 語言也可以實現這種傳遞,如我們熟悉的 printf 函數,只是他們的實現機制不太一樣,C 更深奧一些,此處就不多解釋了。
sub add_all{
$sum=0; #將sum初始化
foreach $_(@_) { #遍歷參數列表
$sum+=$_; #累加每個元素
}
$sum; #返回sum即總和的值
}
$a=&add_all(3,4,5); #$a的值為3+4+5即12
$d=2*&add_all(1,2,3,4,5); #d的值為2*15即30
下面將介紹一些 Perl 自身提供的一些標準系統函數,這些函數包括: print 、printf 、chop 、split 、keys 、values 、reverse 、sort 、length 、substr 、index 、push 、pop 、unshift 、shift 、join 、grep 、hex 、rand 、localtime 、die 、open 、close 、pack 、read 、exit。下面就來分別介紹他們。
指令:print
語法:print Filehandle LIST
說明:這個 Filehandle 可以看作在 I(INPUT)/O(OUTPUT) 之間的一個橋梁,可以利用 FILEHANDLE 來做出數據讀入寫出的動作。STDIN 是代表從哪里輸入數據,例如從電腦的鍵盤輸入;STDOUT是代表從哪里輸出數據,例如從電腦的屏幕輸出;STDERR 是代表從哪里輸出錯誤的數據,例如從電腦的屏幕輸出。而在PERL語言中有三個標準FILEHANDLE:
1. STDIN(標準輸入):是代表 STDIN 的 FILEHANDLE
2. STDOUT(標準輸出):是代表 STDOUT 的 FILEHANDLE
3. STDERR(標準錯誤輸出):是代表 STDERR 的 FILEHANDLE
如果要使用其他 FILEHANDLE 的時候,就要先用 OPEN 這個函數來打開一個 FILEHANDLE,我們可以用 PRINT 這個函數將 LIST 中的數據輸出給 FILEHANDLE。
語法: print LIST
說明: 如果省略 Filehandle 的話,就會把 Filehandle 默認為 STDOUT。也就是會將 LIST 的數據內容顯示在終端屏幕上。
語法: print
說明: 同時省略 Filehandle 和 LIST 的話,就會以 STDOUT 為 Filehandle,并會輸出 $_ 這個系統內部變量的數據內容。如果 $_ 變量是一個空字符串的話,就會顯示出一個空字符串。
指令: printf
語法: printf Filehandle LIST
說明: 在 Perl 語言中也提代 C 語言中 printf 的語法,用法和 C 語言中的用法一模一樣。如果把 Filehandle 省略的話,也一樣會把 STDOUT 當成是默認的 Filehandle。
示例:
printf("chomod %d %s\n","711""cgi"); 會將chmod 711 cgi加上換行顯示于屏幕上。
指令:chop 語法:chop($url)
說明:把最后一個字符刪除。
示例:
$url="www.aka.org.cn/; chop($url);
這時$url="www.aka.org.cn" 還可以簡寫成 chop($url="www.aka.org.cn/"); chop 函數一般用于去掉從鍵盤讀入數據中的最后一個換行符。
指令:split
語法:split(/pattern/,$text,limit) 其中/pattern/是文字處理的模式,而limit是代表要分割的個數,一般可以省略。
說明:用一個指定的文字處理模式來分割 $text 字符串。
示例:
$text="Michael,Gevin,Mike"; @name=split(/,/,$text); # 這時 @name=("Michael","Gevin","Mike");
@name=split(/,/,$text,2); # 這時 @name=("Michael","Gevin");
在傳送CGI應用程序數據的時候會先將數據編碼,其中會將FORM中第個數據字段 的數據內容用&這個符號隔開,所以在解碼的時候就要以 "&" 這個符號為分割的字符,將每個數據字段分割出。而數據字段的名稱和這個數據字段的值是用=這個符號來隔開,如果想取得數據字段的名稱和所對應的值的話,就用要 "=" 這個符號來分割數據字段,
指令:keys
語法:keys(%array)
說明:取出關聯數組 %ARRAY 中全部的 key。
示例:
%NAME=(1,"mike",2,"michael"); @readkey=keys(%NAMES); # 這時 @readkey=(1,2);
指令:values
語法:values(%array)
說明:取出關聯數組 %ARRAY 中全部的 value。
示例:
%NAMES=(1,"mike",2,"michael"); @readval=values(%NAMES); #這時 @readval=("mike","michael");
指令:reverse
語法:reverse(@array)
說明:將數組 @array 中的元素由后到前重新排列。
示例:
@back=("A","B","C","D","E"); @back=reverse(@back); # 這時 @back=("E","D","C","B","A");
指令:sort
語法:sort(@array)
說明:將數組中的元素由小到大排序,如果要由大到小排序的話,要加上reverse這個函數。
示例:
@abc=("d","b","c","a"); @abc=sort(@abc); # 這時 @abc=("a","b","c","d");
@abc=(reverse sort@abc); # 這時@abc=("d","c","b","a"); 這個語法也可以寫成 @abc=(reverse sort(@abc));
@number=(5,2,10); @number=sort(@number);
# 上面示例用sort函數來排序數值的時,會出差錯,因此要用下面到下面這一句。
@number=(sort{$a<=>$b}@number); # 這時 @number=(2,5,10);
指令:length
語法:length($string)
說明:求出字符串$string的字節(bytes)值。
示例:
$string="Perl5"; $size=length($string); # 這時 $size=5;
指令:substr
語法:substr($string,offset,length) offset代表起始字符的位置,length代表引用的字符串長度,如果省略length則代表從起始值到字符串的最后一個字符長度。而offset如果是負值的話,就會從字符串右邊開始指定字符。
示例:
$s=substr("perl5",2,2); # 這時 $s="rl";
$s=substr("perl5",2); # 這時 $s="rl5";
$s=substr("perl5",-2,2); # 這時 $s="er";
指令:index
語法:index($string,$substring,position) $substring是要尋找的字符;position代表從哪一個位置開始尋找,假如省略position就從頭開始找起。
說明:返回所要找尋的字符在一字符串$string中的位置,如果在字符串中找不到字符的話,則會返回-1這個 值。
示例:
$s=index("perl5","p"); # 這時 $s=0
$s=index("perl5","l",2); # 這時 $s=3
$s=index("perl5","perl"); # 這時 $s=-1
指令:push
語法:push(@array,$string)
說明:在數組@array的最后附加新的元素 ($string)到數組@array中。
示例:
@array=("one","two"); push(@array,"three"); # 這時 @array=("one","two","three")
指令:pop
語法:pop(@array)
說明:將數組(@array)的最后一個元素刪除,并將刪除的元素返回。
示例:
@array=("one","two"); $rm=pop(@array); # 這時 @array=("one");而$rm="two";
指令:unshift
語法:unshift(@array,$string)
說明:在數組@array的第一個元素前附加新的元素$string到數組@array中。
示例:
@array=("one","two"); unshift(@array,"three"); # 這時 @array=("three","one","two")
指令:shift
語法:shift(@array)
說明:將數組@array的第一個元素刪除,并將刪除的元素返回。
示例:
@array=("one","two"); @rm=shift(@array); # 這時 @array=("two");而$rm="one";
指令:join
語法:join($string,@array)
說明:在一數組@array的元素之間加上一指定的字符$string,并將結果返回。
示例:
@array=("one","two","three");
$total=join(":",@array); 這時 $total="one:two:three";
指令:grep
語法:grep(/pattern/,@array)
說明:將合文字處理模式(regular expression)的數組元素找出來。
示例:
@array=("one","on","in");
$count=grep(/on/,@array); # 這時 $count=2
@result=grep(/on/,@array); # 這時 @result=("one","on");
指令:hex
語法:hex($string)
說明:將十六進制的數值轉成十進制。
示例:
$decimal=hex("ff"); 這時 $decimal=255;
指令:rand
語法:rand($interger)
說明:常和函數srand搭配來取得一隨機數,如果沒有先宣告stand函數的話,則取出的常數值是一個固定值。這個語法會返回一個介于 0 和$interger之間的數值,如果$interger省略的話,則會返回一個介于 0 和 1 的數值。
示例:
srand; # 要先調用一次srand函數,才能產生隨機數的效果
$int=rand(10); # $int的值會大于 0 而且小于 10 ,如果希望產生的亂數是整數的話,就要再加上int 這個函數,如下
$int=int(rand(10)); # $int的值是一個整數,且值在 0 和 9 之間
指令:localtime
語法:localtime(time)
說明:可返回九個有關時間的元素,在寫CGI應用程序的時候常會用到系統的時間,所以在此會詳細介紹這個函數的用法。
示例:
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
其中: $sec 代表秒數 [0,59]、$min 代表分數 [0,59]、$hour 代表小時數 [0,23]、$mday 代表是在這個月的第幾天 [1,31]、$mon 代表月數 [0,11] 因此要將 $mon 加 1 之后,才能符合實際情況、$year 從 1990 年算起的年數、$wday 從星期六算起,代表是在這周中的第幾天 [0-6]、$yday 從一月一日算起,代表是在這年中的第幾天 [0,366]、$isdst 只是一個 flag 知道這些變量之后,就可以在 CGI 應用程序中拿來應用了。
此外,也可以用下面這一行指令在 UNIX 系統下取得系統的時間。為了避免錯誤發生,最好用絕對路徑的方法來取得系統時間,如果絕對路徑不清楚的話可以用 "which data" 這個指令來得知。$data='/usr/bin/data'; 而在 Perl 5 版本中,也可以用下面這一行指令來取得系統時間。 $data=localtime(time);
指令:die
語法:die LIST
說明:會把LIST字符串顯示出來,并退出程序。常常和 $! 這個代表錯誤信息變量一起使用。
示例:
open(FILE,"$filename")||die "不能打開文件$!\n; # 如果打開文件失敗的話,就會顯示出錯誤的信息,之后再退出程序。
指令:open
語法1:open(filehandle,"$filename") 其中 $filename 是一個指定打開的文件名。
說明:這是一個很常用的函數,可用于文件的打開(read only)。
示例:
$filename="usr/abc.txt";
open(FILE,"$filename")||die"不能打開文件$filename\n; #將<file>數據指定給純變量$line(一行一行地)
while($line=
{
print"$line";
}
close(file); 就會把abc.txt這個文件的內容顯示出來。
語法2:open(filehandle,"<$filename")
說明:這個語法也可以打開一個存在的文件(read only)。
示例:
$filesname="usr/abc.txt";
open(file,"<$filename")||die"不能打開文件$filename\n";
@array=<file> # 將
close(file);
print "@array"; # 也會把abc.TXT這個文件的內容顯示出來。
語法3:open(filehandle,">$filename")
說明:建立一個新的文件(write only);如果已經存在這個文件了,就會把舊文件名覆蓋掉。并可用print filehandle的方式將數據存入打開的文件中。
示例:
$filename="/usr/abc.txt";
open(file,">$filename")||die"不能打開文件$filename\n;
print file "this is a new line1\n; # \n是換行字符
print file "this is a new line2\n;
close(file); # 會將數據存在一個新文件中。
語法4:open(filehandle,">>$filename")
說明:數據用附加的方式定入一文件(write only),如果指定的文件名不存在的話就會建立一個新的文件。
示例:
$filename="/path/abc.txt";
open(file,">>$filename")||die"不能打開文件$filename\n";
print file "this is a new line1\n";
print file "this is a new line2\n";
close(file); # 會打數據附加(append)到一個文件(abc.txt)中。
語法5:open(filehandle,"|unix command")
說明:就會把在filehandle的數據輸入給unix的指令來作處理。
示例:
$mailprog="/usr/ucb/mail"; # unix系統上的寄信程序(一定要加絕對路徑)
$who="mqingyi@126.com";
$open(file,"|$mailprog$who")||die"打開失敗\n";
print file "I love you!\n";
print file "I want to see you.\n";
close(file);
該段代碼通過 unix 系統的 mail 程序,將 FILE 這個 FILEHANDLE 的數據內容寄給 $who 這個變量所指定的收信人。
指令:close
用法:close(filehandle)
說明:用 open 這個函數來打開一個 filehandle 之后,一定要用 close 批這個函數把所打開的 filehandle 關閉。
示例:
open(filehandle,"$filename");
close(filehandle);
指令:pack
語法:pack("指定的格式",list)
說明:pack這個函數會將一個 list 變成所指定的二進制數據格式。在CGI程序分割解碼過程中,會用到 pack 這個函數。
示例:
$string=pack("c",65); #這時 $string="a"; 將65這個ascii碼轉換成一個unsigned字符,其中c就是指定指轉換成 unsigned 字符的意思。
指令:read
語法:read(filehandle,$string,length) 其中 length 是代表讀入字符串的長度(bytes)。
說明:用 read 這個函數把 filehandle 中的數據依指定的字符串長度讀入之后指派給 $string 這個變量。在cgi程序分割解碼過程中,如果 FORM 的傳送方式是設定為POST的話,就會將傳送的數據設定為標準輸入,所以會將數據內容指定給 STDIN 這個標準輸入的 filehandle ,而CGI環境變量 $env{'content_length'} 就是代表使用者送出數據內容的長度,因此我們要用 read 這個函數來取得使用者送出的數據內容。
示例:
read(stdin,$buffer,$env{'content_length'}); # 就會將 stdin 這個標準輸入 filehandle 中的數據依指定的字符串長度讀入,再指派給 $buffer 這個變量。
指令:exit
語法:exit
說明:退出執行的程序。
示例:
print"i love cgi\n"; exit; # 表示顯示完 "i love cgi" 以后,將退出這個程序。
大多數 Perl 程序都不是孤立的,它們與環境相互作用。很多的程序也需要通過文件操作實現數據的存貯和交換。文件句柄(file handle)是 Perl 程序中為程序和外部世界提供 I/O 連接的名稱。建議在 Perl 程序中文件句柄全部使用大寫字母,以示與變量等字符串的區別。特別地,可以將 STDIN/STDOUT/STDERR 也認為是 Perl 的文件句柄,分別代表 標準輸入/標準輸出/標準錯誤輸出。
Perl的文件操作與C語言極為相似。如:
open(FILENAME,"abc.txt");
該調用為讀文件打開,若為寫文件而打開,需在文件名前加上大于號:
open(FILENAME,">abc.txt");
若要追加至文件尾,可在文件名前加上兩個大于號:
open(FILENAME,">>abc.txt");
以上三種open()格式在成功時返回真,失敗時返回假。但程序中通常沒有提示,出錯時往往會被人們忽略。 通常當需要給出出錯提示時,可加入die()函數。例如:
open(OUTFILE,">/tmp/outfile")|| die "出錯,不能建立/tmp/outfile\n";
當 open 操作失敗時,就會執行 die 給出出錯提示。
對文件句柄的操作完成后,可以用 close 操作符關閉文件。如:
close(OUTFILE);
Perl的文件操作也可以先測試文件是否存在,是否可讀寫等,這樣操作起來會更安全。如:
$x="abc.txt";
if(-e $x) { #abc.txt是否存在?
# 存在操作
} else {
printf "文件不存在。\n";
}
-e 操作符用于測試文件或目錄是否存在。
以下為所有文件測試操作符的清單:
文件測試 | 測試操作符提供的信息 |
-r | 文件或目錄可讀 |
-w | 文件或目錄可寫 |
-x | 文件或目錄執行 |
-o | 文件或目錄歸用戶所有 |
-R | 文件或目錄對真正用戶可讀 |
-W | 文件或目錄對真正用戶可寫 |
-X | 文件或目錄對真正用戶執行 |
-O | 文件或目錄歸真正用戶所有 |
-e | 文件或目錄存在 |
-z | 文件存在且大小為0 |
-s | 文件或目錄存在且不為0(返回字節數) |
-f | 文件為普通文件 |
-d | 文件為目錄 |
-l | 文件為符號鏈接 |
-p | 文件為命名管道(FIFO) |
-S | 文件為一個套口(socket) |
-b | 文件為塊特殊文件 |
-c | 文件為字符特殊文件 |
-t | 打開tty控制臺的文件句柄 |
-u | 文件或目錄是設置用戶ID號 |
-g | 文件或目錄是設置用戶組ID號 |
-k | 文件或目錄的sticky位置位 |
-T | 文件是文本文件 |
-B | 文件是二進制文件 |
-M | 以天為單位的存在時間 |
-A | 以天為單位訪問時間 |
-C | 以天為單位同代碼更改時間 |
Perl的 unlink() 操作符可實現刪除文件。如:
unlink("abc.txt"); # 刪除abc.txt
Perl的rename()操作符可實現文件重命名。如:
rename("abc","aka") || die "出錯,不能更名";
此時將文件 abc 更名為 aka,成功返回真,否則給出出錯提示。
Perl中處理目錄非常類似于對文件的處理。
打開目錄句柄:
opendir(ETC,"/etc")||die "出錯,不能打開目錄";
關閉目錄句柄:
closedir(ETC);
創建目錄:
mkdir("aka",0777)||die "不能創建 aka 目錄";
0777 為文件權限描速數。
刪除目錄:
rmdir("aka") || die "不能刪除 aka 目錄"。
當你向系統 Shell 發送一個命令行時,Shell 創建一個進程來執行這個命令。這個新進程成為 Shell 的子進程,它的執行不依賴于 Shell 但又與 Shell 相互協調。 同樣,Perl程序也能啟動新進程。
生成新進程的最簡單的方法就是用 system 操作符。如:
system("date");
若要將輸出送至now_day文件,則可以:
system("date>now_day") || die "不能建立now_day文件";
產生進程的另一方法是將 Shell 命令置于兩個單引號之間。如:
$nowday="現在時間:".'date'
$nowday 的值為“現在時間:”和date命令的結果的連接。即:"現在時間:Fri Feb 18 23:49:23 PDT 1998"
舉一個綜合例子,要求從date的輸入中分析,周未時打印"周未了,輕松一下",否則打印"努力工作"。簡潔的寫法為:
if('date'=~/^S/){
printf "周未了,輕松一下\n";
} else {
printf "努力工作\n"
}
date 的輸出格式第一個字節為星期,英語中恰好只有周未為 "S" 打頭,因此使用了常規表達式判斷第一個字符是否為S,即可達到要求。