Perl常用語法

Rangle發表於2018-05-30

本文主要為了方便閱讀、編寫perl指令碼而記錄的常用的命令、語法。

一、條件判斷語法

注意,數字 0, 字串 '0' 、 "" , 空 list () , 和 undef 為 false ,其他值均為 true。 true 前面使用 !not則返回 false

語句描述

if 語句

一個 if 語句 由一個布林表示式後跟一個或多個語句組成。

if...else 語句

一個 if 語句 後可跟一個可選的 else 語句,else 語句在布林表示式為假時執行。

if...elsif...else 語句

您可以在一個 if 語句後可跟一個可選的 elsif 語句,然後再跟另一個 else 語句

unless 語句

一個 unless 語句 由一個布林表示式後跟一個或多個語句組成。

unless...else 語句。

一個 unless 語句 後可跟一個可選的 else 語句

unless...elsif..else statement

一個 unless 語句 後可跟一個可選的 elsif 語句,然後再跟另一個 else 語句

switch 語句

在最新版本的 Perl 中,我們可以使用 switch 語句。它根據不同的值執行對應的程式碼塊。

1.IF語句

語法:

if(boolean_expression){
   # 在布林表示式 boolean_expression 為 true 執行
}

示例:

#!/usr/bin/perl 

$a=20;


if($a>=20){
   printf "a 大於等於 20 \n";
}
printf "變數a的值為:$a\n"

結果:

2.IF...ELSE 語句

 語法:

if(boolean_expression){
   # 在布林表示式 boolean_expression 為 true 執行
}else{
   # 在布林表示式 boolean_expression 為 false 執行
}

示例:

#!/usr/bin/perl 

$a=10;

if($a>=20){
   printf "a 大於等於 20 \n";
}else{
   printf "a 小於 20\n";
}
printf "變數a的值為:$a\n";

輸出結果:

3.IF...ELSIF...else 語句

語法:

if(boolean_expression 1){
   # 在布林表示式 boolean_expression 1 為 true 執行
}
elsif( boolean_expression 2){
   # 在布林表示式 boolean_expression 2 為 true 執行
}
elsif( boolean_expression 3){
   # 在布林表示式 boolean_expression 3 為 true 執行
}
else{
   # 布林表示式的條件都為 false 時執行
}

示例:

#!/usr/bin/perl 

$a=10;

if($a>10){
   printf "a 大於 10 \n";
}elsif($a=10){
   printf "a 等於 10\n";
}else{
   printf "a 小於 10\g";
}

printf "變數a的值為:$a\n";

結果:

4.switch 語句

 語法:

use Switch;
 
switch(argument){
   case 1            { print "數字 1" }
   case "a"          { print "字串 a" }
   case [1..10,42]   { print "數字在列表中" }
   case (\@array)    { print "數字在陣列中" }
   case /\w+/        { print "正則匹配模式" }
   case qr/\w+/      { print "正則匹配模式" }
   case (\%hash)     { print "雜湊" }
   case (\&sub)      { print "子程式" }
   else              { print "不匹配之前的條件" }
}

示例:

#!/usr/bin/perl
 
use Switch;
 
$var = 10;
@array = (10, 20, 30);
%hash = ('key1' => 10, 'key2' => 20);
 
switch($var){
   case 10           { print "數字 10\n" }
   case "a"          { print "字串 a" }
   case [1..10,42]   { print "數字在列表中" }
   case (\@array)    { print "數字在陣列中" }
   case (\%hash)     { print "在雜湊中" }
   else              { print "沒有匹配的條件" }
}

結果:

5.三元運算

 語法:

Exp1 ? Exp2 : Exp3;

示例:

#!/usr/bin/perl
 
$a=1>2?false:true;

print "$a\n"

結果:

二、迴圈語句語法

迴圈型別描述

while 迴圈

當給定條件為 true 時,重複執行語句或語句組。迴圈主體執行之前會先測試條件。

until 迴圈

重複執行語句或語句組,直到給定的條件為 true。 迴圈主體執行之前會先測試條件。

for 迴圈

多次執行一個語句序列,簡化管理迴圈變數的程式碼。

foreach 迴圈

foreach 迴圈用於迭代一個列表或集合變數的值。

do...while 迴圈

除了它是在迴圈主體結尾測試條件外,其他與 while 語句類似。

巢狀迴圈

您可以在 while、for 或 do..while 迴圈內使用一個或多個迴圈。

1.while迴圈

語法:

while(condition)
{
   statement(s);
}

示例:

#!/usr/bin/perl
 
$a = 10;
 
while( $a < 20 ){
   printf "a 的值為 : $a\n";
   $a = $a + 1;
}

結果:

2.for迴圈

語法:

for ( init; condition; increment ){
   statement(s);
}

示例:

#!/usr/bin/perl
 
for( $a = 0; $a < 10; $a = $a + 1 ){
    print "a 的值為: $a\n";
}

結果:

3.迴圈控制語句

控制語句描述

next 語句

停止執行從next語句的下一語句開始到迴圈體結束識別符號之間的語句,轉去執行continue語句塊,然後再返回到迴圈體的起始處開始執行下一次迴圈。

last 語句

退出迴圈語句塊,從而結束迴圈

continue 語句

continue 語句塊通常在條件語句再次判斷前執行。

redo 語句

redo 語句直接轉到迴圈體的第一行開始重複執行本次迴圈,redo語句之後的語句不再執行,continue語句塊也不再執行;

goto 語句

Perl 有三種 goto 形式:got LABLE,goto EXPR,和 goto &NAME。

 三、perl運算子

1.算數運算子

運算子描述例項
+ 加法運算 $a + $b 結果為 30
- 減法運算 $a - $b 結果為 -10
* 乘法運算 $a * $b 結果為 200
/ 除法運算 $b / $a 結果為 2
% 求餘運算,整除後的餘數 $b % $a 結果為 0
** 乘冪 $a**$b 結果為 10 的 20 次方

2.比較運算子

運算子描述例項
== 檢查兩個運算元的值是否相等,如果相等則條件為 true,否則為 false。 ($a == $b) 為 false
!= 檢查兩個運算元的值是否相等,如果不相等則條件為 true,否則為 false。 ($a != $b) 為 true。
<=> 檢查兩個運算元的值是否相等, 如果左邊的數小於右邊的數返回 -1,如果相等返回 0, 如果左邊的數大於右邊的數返回 1 。 ($a <=> $b) 返回 -1。
> 檢查左運算元的值是否大於右運算元的值,如果是則條件為 true,否則為 false。 ($a > $b) 返回 false。
< 檢查左運算元的值是否小於右運算元的值,如果是則條件為 true,否則返回 false。 ($a < $b) 返回 true。
>= 檢查左運算元的值是否大於或等於右運算元的值,如果是則條件為 true,否則返回 false。 ($a >= $b) 返回 false。
<= 檢查左運算元的值是否小於或等於右運算元的值,如果是則條件為 true,否則返回 false。。 ($a <= $b) 返回 true。
運算子描述例項
lt 檢查左邊的字串是否小於右邊的字串,如果是返回 true,否則返回 false。 ($a lt $b) 返回 true。
gt 檢查左邊的字串是否大於右邊的字串,如果是返回 true,否則返回 false。 ($a gt $b) 返回 false。
le 檢查左邊的字串是否小於或等於右邊的字串,如果是返回 true,否則返回 false。 ($a le $b) 返回 true
ge 檢查左邊的字串是否大於或等於右邊的字串,如果是返回 true,否則返回 false。 ($a ge $b) 返回 false。
eq 檢查左邊的字串是否等於右邊的字串,如果是返回 true,否則返回 false。 ($a eq $b) 返回 false。
ne 檢查左邊的字串是否不等於右邊的字串,如果是返回 true,否則返回 false。 ($a ne $b) 返回 true
cmp 如果左邊的字串大於右邊的字串返回 1,如果相等返回 0,如果左邊的字串小於右邊的字串返回 -1。 ($a cmp $b) 返回 -1。

3.邏輯運算子

運算子描述例項
and 邏輯與運算子符。如果兩個運算元都為 true,則條件為 true。 ($a and $b) 為 false。
&& C 風格的邏輯與運算子符。如果兩個運算元都為 true,則條件為 true ($a && $b) 為 false。
or 邏輯或運算子。如果兩個運算元中有任意一個非零,則條件為 true。 ($a or $b) 為 true。
|| C 風格邏輯或運算子。如果兩個運算元中有任意一個非零,則條件為 true。 ($a || $b) 為 true。
not 邏輯非運算子。用來反轉運算元的邏輯狀態。如果條件為 true,則邏輯非運算子將使其為 false。 not($a and $b) 為 tru

4.賦值運算子

運算子描述例項
= 簡單的賦值運算子,把右邊運算元的值賦給左邊運算元 $c = $a + $b 將把 $a + $b 的值賦給 $c
+= 加且賦值運算子,把右邊運算元加上左邊運算元的結果賦值給左邊運算元 $c += $a 相等於 $c = $c + $a
-= 減且賦值運算子,把左邊運算元減去右邊運算元的結果賦值給左邊運算元 $c -= $a 相等於 $c = $c - $a
*= 乘且賦值運算子,把右邊運算元乘以左邊運算元的結果賦值給左邊運算元 $c *= $a 相等於 $c = $c * $a
/= 除且賦值運算子,把左邊運算元除以右邊運算元的結果賦值給左邊運算元 $c /= $a 相等於 $c = $c / $a
%= 求模且賦值運算子,求兩個運算元的模賦值給左邊運算元 $c %= $a 相等於 $c = $c % a
**= 乘冪且賦值運算子,求兩個運算元的乘冪賦值給左邊運算元 $c **= $a 相等於 $c = $c ** $a

5.位運算子

運算子描述例項
& 如果同時存在於兩個運算元中,二進位制 AND 運算子複製一位到結果中。 ($a & $b) 將得到 12,二進位制為 0000 1100
| 如果存在於任一運算元中,二進位制 OR 運算子複製一位到結果中。 ($a | $b) 將得到 61 ,二進位制為 0011 1101
^ 如果存在於其中一個運算元中但不同時存在於兩個運算元中,二進位制異或運算子複製一位到結果中。 ($a ^ $b) 將得到 49,二進位制為 0011 0001
~ 二進位制補碼運算子是一元運算子,具有"翻轉"位效果,即0變成1,1變成0。 (~$a ) 將得到 -61 ,二進位制為 1100 0011 ,一個有符號二進位制數的補碼形式。
<< 二進位制左移運算子。左運算元的值向左移動右運算元指定的位數。 $a << 2 將得到 240 ,二進位制為 1111 0000
>> 二進位制右移運算子。左運算元的值向右移動右運算元指定的位數。 $a >> 2 將得到 15 ,二進位制為 0000 1111

6.引號運算子

q{ } 為字串新增單引號 q{abcd} 結果為 'abcd'
qq{ } 為字串新增雙引號 qq{abcd} 結果為 "abcd"
qx{ } 為字串新增反引號 qx{abcd} 結果為 `abcd`

7.其他運算子

運算子描述例項
. 點號 (.) 用於連線兩個字串。 如果 $a="run", $b="oob" , $a.$b 結果為 "runoob"
x x 運算子返回字串重複的次數。 ('-' x 3) 輸出為 ---。
.. .. 為範圍運算子。 (2..5) 輸出結果為 (2, 3, 4, 5)
++ 自增運算子,整數值增加 1 $a =10, $a++ will 輸出為 11
-- 自減運算子,整數值減少 1 $a =10, $a-- 輸出為 9
-> 箭號用於指定一個類的方法 $obj->$a 表示物件 $obj 的 $a 方法。

8.運算子優先順序

運算子符結合性
++, --
-, ~, ! 從右到左
** 從右到左
=~, !~ 從左到右
*, /, %, x 從左到右
+, -, . 從左到右
<<, >> 從左到右
-e, -r,
<, <=, >, >=, lt, le, gt, ge 從左到右
==, !=, <=>, eq, ne, cmp 從左到右
& 從左到右
|, ^ 從左到右
&& 從左到右
|| 從左到右
.. 從左到右
? and : 從右到左
=, +=, -=, *=, 從右到左
其他
, 從左到右
not 從左到右
and 從左到右
or, xor 從左到右

四、perl時間格式

time() 函式:返回從1970年1月1日起累計的秒數
localtime() 函式:獲取本地時區時間
gmtime() 函式: 獲取格林威治時間

1.localtime對應時間變數

sec,     # 秒, 0 到 61
min,     # 分鐘, 0 到 59
hour,    # 小時, 0 到 24
mday,    # 天, 1 到 31
mon,     # 月, 0 到 11
year,    # 年,從 1900 開始
wday,    # 星期幾,0-6,0表示週日
yday,    # 一年中的第幾天,0-364,365
isdst    # 如果夏令時有效,則為真

2.格式化時間輸出

1)通過時間變數格式化輸出

#!/usr/bin/perl
 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
 
printf("格式化時間:YYYY-mm-DD HH:MM:SS\n");
printf("%04d-%02d-%02d %02d:%02d:%02d\n",$year+1900,$mon+1,$mday,$hour, $min, $sec);

2)通過POSIX 函式 strftime()格式化時間輸出

#!/usr/bin/perl
use POSIX qw(strftime); 

$datestring = strftime "%Y-%m-%d %H:%M:%S", localtime;
printf("時間日期 - $datestring\n");

3.POSIX 函式 strftime()格式

符號描述例項
%a 星期幾的簡稱( Sun..Sat) * Thu
%A 星期幾的全稱( Sunday..Saturday) * Thursday
%b 月的簡稱(Jan..Dec) * Aug
%B 月的全稱(January..December) * August
%c 日期和時間 * Thu Aug 23 14:55:02 2001
%C 年份除於100,並取整 (00-99) 20
%d 一個月的第幾天 (01-31) 23
%D 日期, MM/DD/YY 相等於%m/%d/%y 08/23/01
%e 一個月的第幾天,使用空格填充個位數 ( 1-31) 23
%F YYYY-MM-DD 的簡寫類似於 %Y-%m-%d 2001-08-23
%g 年份的最後兩位數 (00-99) 01
%g 2001
%h 月的簡稱 * (和%b選項相同) Aug
%H 24 小時制 (00-23) 14
%I 12 小時制 (01-12) 02
%j 一年的第幾天 (001-366) 235
%m 月 (01-12) 08
%M 分鐘 (00-59) 55
%n 新行 ('\n')  
%p 顯示出AM或PM PM
%r 時間(hh:mm:ss AM或PM),12小時 * 02:55:02 pm
%R 24 小時 HH:MM 時間格式,相等於 %H:%M 14:55
%S 秒數 (00-61) 02
%t 水平製表符 ('\t')  
%T 時間(24小時制)(hh:mm:ss),相等於%H:%M:%S 14:55
%u ISO 8601 的星期幾格式,星期一為1 (1-7) 4
%U 一年中的第幾周,星期天為第一天(00-53) 33
%V ISO 8601 第幾周 (00-53) 34
%w 一個星期的第幾天(0代表星期天) (0-6) 4
%W 一年的第幾個星期,星期一為第一天 (00-53) 34
%x 顯示日期的格式(mm/dd/yy) * 08/23/01
%X 顯示時間格式 * 14:55:02
%y 年,兩位數 (00-99) 01
%Y 2001
%z ISO 8601與UTC的時區偏移(1 minute=1, 1 hour=100)

 

+100
%Z 當前時區的名稱,如"中國標準時間" *

 

CDT
%% % 符號 %

五、perl中$組合含義

$! 根據上下文內容返回錯誤號或者錯誤串
$” 列表分隔符
$# 列印數字時預設的數字輸出格式
$$ Perl直譯器的程式ID
$% 當前輸出通道的當前頁號
$& 與上個格式匹配的字串
$( 當前程式的組ID$) 當前程式的有效組ID
$* 設定1表示處理多行格式.現在多以/s和/m修飾符取代之.
$, 當前輸出欄位分隔符
$. 上次閱讀的檔案的當前輸入行號
$/ 當前輸入記錄分隔符,預設情況是新行
$: 字元設定,此後的字串將被分開,以填充連續的欄位.
$; 在模擬多維陣列時使用的分隔符.
$? 返回上一個外部命令的狀態
$@ Perl直譯器從eval語句返回的錯誤訊息
$[ 陣列中第一個元素的索引號
$\ 當前輸出記錄的分隔符
$] Perl直譯器的子版本號
$^ 當前通道最上面的頁面輸出格式名字
$^A 列印前用於儲存格式化資料的變數
$^D 除錯標誌的值
$^E 在非UNIX環境中的作業系統擴充套件錯誤資訊
$^F 最大的檔案捆述符數值
$^H 由編譯器啟用的語法檢查狀態
$^I 內建控制編輯器的值
$^L 傳送到輸出通道的走紙換頁符
$^M 備用記憶體池的大小
$^O 作業系統名
$^P 指定當前除錯值的內部變數
$^R 正規表示式塊的上次求值結果
$^S 當前直譯器狀態
$^T 從新世紀開始算起,腳步本以秒計算的開始執行的時間
$^W 警告開關的當前值
$^X Perl二進位制可執行程式碼的名字
$_ 預設的輸入/輸出和格式匹配空間
$| 控制對當前選擇的輸出檔案控制程式碼的緩衝
$~ 當前報告格式的名字
$` 在上個格式匹配資訊前的字串
$’ 在上個格式匹配資訊後的字串
$+ 與上個正規表示式搜尋格式匹配的最後一個括號
$< 當前執行直譯器的使用者的真實ID
$ 含有與上個匹配正規表示式對應括號結果
$= 當前頁面可列印行的數目
$> 當前程式的有效使用者ID包含正在執行的指令碼的檔名
$ARGV 從預設的檔案控制程式碼中讀取時的當前檔名
%ENV 環境變數列表
%INC 通過do或require包含的檔案列表
%SIG 訊號列表及其處理方式
@_ 傳給子程式的引數列表
@ARGV 傳給指令碼的命令列引數列表
@INC 在匯入模組時需要搜尋的目錄列表
$-[0]和$+[0] 代表當前匹配的正規表示式在被匹配的字串中的起始和終止的位置

、perl中引數傳遞

Getopt::Std模組的功能: 初始化perl命令列中所接受的引數,簡化了命令列引數的解析

語法:

※引數型別:整數, 浮點數, 字串
GetOptions( ‘tag=s’ => \$tag );
=表示此引數一定要有引數值, 若改用’:'代替表示引數不一定要有引數值
s表示傳遞字串引數, 若為i表傳遞整數引數, 若為f表傳遞浮點數
=>表示引數值傳遞給變數$tag,最終引數值可通過$tag獲取

示例:

#!/usr/bin/perl

use Getopt::Long;

GetOptions ("parameter=s" => \$parameter);

print "$parameter \n";

執行結果:perl pl01.py -parameter 輸入引數值 或者perl pl01.py -parameter=輸入引數值