日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Perl 筆記

 印度阿三17 2020-02-28


常用記錄

chop與chomp的區(qū)別

  • chop()函數(shù),只是去除最后一個(gè)字符

  • chomp()函數(shù),就要首先判斷最后一個(gè)字符是不是為"\n",他才去除。

變量初值

對(duì)于沒有賦初值的scaler,默認(rèn)初始為空,但若參與運(yùn)算,則當(dāng)作0處理。

$x = $ff   1;
print("$x\n");
print("$ff\n");
1

這里沒有對(duì)ff定義,但x的值print出來是1,說明ff在參與運(yùn)算時(shí)是0;但運(yùn)算后其值并沒有改變,還是空。

多行注釋

=pod
codes to comment
=cut

正則匹配注意事項(xiàng)

  1. =~ 匹配時(shí),等號(hào)和~符號(hào)之間不能有空格!,否則輸出一串怪異數(shù)字。

lc和uc

$side = uc $attrs[0];  把a(bǔ)ttrs[0]轉(zhuǎn)換成大寫,然后給side變量賦值。
$gender = lc $attrs[1]; 把a(bǔ)ttrs[1]轉(zhuǎn)換成小寫,然后給gender賦值。

split 產(chǎn)生空元素

在按照/ /或者/\s /來split字符串時(shí),常會(huì)遇到莫名其妙多出來一個(gè)空元素的問題。

這是因?yàn)槿绻址_頭就是空格,split會(huì)把開頭的前導(dǎo)空白符(一個(gè)空字符)也算作一個(gè)元素。

如果要按照空格來split,有幾種方法:

  1. split ' '或者直接用默認(rèn)形式split,不加任何東西

    • split ' '是split的特殊情況,該格式是模擬awk的默認(rèn)行為,所以在分割行為開始之前,會(huì)把字符串中的前導(dǎo)空格全部刪除,然后再使用split /\s /處理。

  2. 刪除前導(dǎo)空白符,再用split(/\s /,$_);

    • $_ =~ s/^\s //; ## 丟棄前導(dǎo)空白符 $_ =~ s/\s $//; ## 丟棄末尾空白符

基礎(chǔ)

1. 運(yùn)行perl

  • 文件頂部加 #!/usr/bin/perl

  • 加權(quán)限 chmod u x file.pl 或者chmod 0755 file.pl

  • ./file.pl

2. 字符串

字符串連接符

$str = "hello" . "world";       # 字符串連接
$num = 5   10;                  # 兩數(shù)相加
$mix = $str . $num;             # 連接字符串和數(shù)字

轉(zhuǎn)義符

轉(zhuǎn)義字符含義
\t水平制表符(4空格)
\u強(qiáng)制下一個(gè)字符為大寫
\l強(qiáng)制下一個(gè)字符為小寫
\U強(qiáng)制將所有字符轉(zhuǎn)換為大寫
\L強(qiáng)制將所有的字符轉(zhuǎn)換為小寫
\Q將到\E為止的非單詞(non-word)字符加上反斜線
\E結(jié)束\L、\U、\Q

qq

  • qq(string in qq):相當(dāng)于”string in qq”

  • q(string in q): 相當(dāng)于’string in q’

  • ( )可換為<>,{ },[ ]等配對(duì)字符 qq{string in qq};

here文檔

示例:

#!/usr/bin/perl
 
$a = 10;
$var = <<"EOF";
這是一個(gè) Here 文檔實(shí)例,使用雙引號(hào)。
可以在這輸如字符串和變量。
例如:a = $a
EOF
print "$var\n";

輸出:

這是一個(gè) Here 文檔實(shí)例,使用雙引號(hào)。
可以在這輸如字符串和變量。
例如:a = 10

$a=<< “EOF” 的意思就是說:下一行開始,直到遇見“EOF”為止,所有的字符都按照指定的格式存入變量a中。你可以用EEE,MAMA等等其他的名字都可以。

多行字符串

#!/usr/bin/perl
$string = '
菜鳥教程
    —— 學(xué)的不僅是技術(shù),更是夢(mèng)想!
';
print "$string\n";

也可以用here文檔

特殊字符

# __FILE__, __LINE__, 和 __PACKAGE__ 分別表示當(dāng)前執(zhí)行腳本的文件名,行號(hào),包名
文件名 test.pl
行號(hào) 4
包名 main

v 字符串

一個(gè)以 v 開頭,后面跟著一個(gè)或多個(gè)用句點(diǎn)分隔的整數(shù),會(huì)被當(dāng)作一個(gè)字串文本。將整數(shù)轉(zhuǎn)換為對(duì)應(yīng)的ASCII碼字符。

$foo    = v102.111.111; # 代表foo
$martin = v77.97.114.116.105.110; # 代表Martin

3. 變量

  1. 標(biāo)量:$myfirst=123;

  2. 數(shù)組:@arr=(1,2,3) ,索引用$arr[0]

  3. 哈希:%h=('a'=>1,'b'=>2); 索引用$h{'a'}

數(shù)據(jù)類型
  1. 整形:$x = 12345; 實(shí)際是浮點(diǎn)數(shù)的特例

  • 8 進(jìn)制和 16 進(jìn)制數(shù):8 進(jìn)制以 0 開始,16 進(jìn)制以 0x 開始。

  1. 浮點(diǎn)數(shù):11.4 、 -0.3 、.3 、 3. 、 54.1e 02 、 5.41e03。

    • 浮點(diǎn)寄存器通常不能精確地存貯浮點(diǎn)數(shù),從而產(chǎn)生誤差,在運(yùn)算和比較中要特別注意。指數(shù)的范圍通常為 -309 到 308。

  2. 字符串: 見上面

變量上下文

Perl 解釋器會(huì)根據(jù)上下文來決定變量的類型。實(shí)例如下:

#!/usr/bin/perl
 
@names = ('google', 'runoob', 'taobao');
 
@copy = @names;   # 復(fù)制數(shù)組
$size = @names;   # 數(shù)組賦值給標(biāo)量,返回?cái)?shù)組元素個(gè)數(shù)
數(shù)組
創(chuàng)建數(shù)組:括號(hào)或者qw
@array = (1, 2, 'Hello');
@array = qw/這是 一個(gè) 數(shù)組/;
@days = qw/google #qw支持多行定義數(shù)組
taobao
runoob/;
# 可以按索引給數(shù)組賦值
$array[6] = 'Sunday'; # 允許索引超出定義的長(zhǎng)度
數(shù)組序列號(hào)
@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);
 
print "@var_10\n";   # 輸出 1 到 10
print "@var_20\n";   # 輸出 10 到 20
print "@var_abc\n";  # 輸出 a 到 z
數(shù)組大小

$size = @array;

返回的是數(shù)組長(zhǎng)度,不是元素個(gè)數(shù)。

添加和刪除數(shù)組元素
序號(hào)類型和描述
1push @ARRAY, LIST 將列表的值放到數(shù)組的末尾
2pop @ARRAY 刪除數(shù)組的最后一個(gè)值
3shift @ARRAY 彈出數(shù)組第一個(gè)值,并返回它。數(shù)組的索引值也依次減一。
4unshift @ARRAY, LIST 將列表放在數(shù)組前面,并返回新數(shù)組的元素個(gè)數(shù)。
#!/usr/bin/perl
# 創(chuàng)建一個(gè)簡(jiǎn)單是數(shù)組
@sites = ("google","runoob","taobao");
$new_size = @sites ;
print "1. \@sites  = @sites\n"."原數(shù)組長(zhǎng)度 :$new_size\n";
# 在數(shù)組結(jié)尾添加一個(gè)元素
$new_size = push(@sites, "baidu");
print "2. \@sites  = @sites\n"."新數(shù)組長(zhǎng)度 :$new_size\n";
 
# 在數(shù)組開頭添加一個(gè)元素
$new_size = unshift(@sites, "weibo");
print "3. \@sites  = @sites\n"."新數(shù)組長(zhǎng)度 :$new_size\n";
 
# 刪除數(shù)組末尾的元素
$new_byte = pop(@sites);
print "4. \@sites  = @sites\n"."彈出元素為 :$new_byte\n";
 
# 移除數(shù)組開頭的元素
$new_byte = shift(@sites);
print "5. \@sites  = @sites\n"."彈出元素為 :$new_byte\n";
切割索引
#!/usr/bin/perl
@sites = qw/google taobao runoob weibo qq facebook 網(wǎng)易/;
@sites2 = @sites[3,4,5];
# 輸出:weibo qq facebook
# 連續(xù)索引也可以用..:
@sites2 = @sites[3..5];
替換數(shù)組元素

Perl 中數(shù)組元素替換使用 splice() 函數(shù):

splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

@nums = (1..20);
print "替換前 - @nums\n";
#從第6個(gè)元素開始替換數(shù)組中的5個(gè)元素:
splice(@nums, 5, 5, 21..25); 
print "替換后 - @nums\n";

#替換前 - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#替換后 - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
將字符串轉(zhuǎn)換為數(shù)組

split [ PATTERN [ , EXPR [ , LIMIT ] ] ]

  • PATTERN:分隔符,默認(rèn)為空格。

  • EXPR:指定字符串?dāng)?shù)。

  • LIMIT:如果指定該參數(shù),則返回該數(shù)組的元素個(gè)數(shù)。

# 定義字符串
$var_test = "runoob";
$var_string = "www-runoob-com";
$var_names = "google,taobao,runoob,weibo";
 
# 字符串轉(zhuǎn)為數(shù)組
@test = split('', $var_test);
@string = split('-', $var_string);
@names  = split(',', $var_names);
 
print "$test[3]\n";  # 輸出 o
print "$string[2]\n";  # 輸出 com
print "$names[3]\n";   # 輸出 weibo
將數(shù)組轉(zhuǎn)換為字符串

Perl 中將數(shù)組轉(zhuǎn)換為字符串使用 join() 函數(shù),語法格式如下:

  • join EXPR, LIST

# 數(shù)組轉(zhuǎn)為字符串
$string1 = join( '-', @string );
$string2 = join( ',', @names );
數(shù)組排序

Perl 中數(shù)組排序使用 sort() 函數(shù),語法格式如下:

  • sort [ SUBROUTINE ] LIST

# 定義數(shù)組
@sites = qw(google taobao runoob facebook);
print "排序前: @sites\n";
 
# 對(duì)數(shù)組進(jìn)行排序
@sites = sort(@sites);
# 排序后: facebook google runoob taobao
特殊變量: $[

特殊變量 \([** 表示數(shù)組的第一索引值,一般都為 0 ,如果我們將 **\)[ 設(shè)置為 1,則數(shù)組的第一個(gè)索引值即為 1,第二個(gè)為 2,以此類推。不推薦,新版中已經(jīng)被廢棄

合并數(shù)組
@numbers = (1,3,(4,5,6)); 
print "numbers = @numbers\n"; #numbers = 1 3 4 5 6
哈希
創(chuàng)建hash
  1. $data{'google'} = 'google.com';

  2. 通過列表設(shè)置, 列表中第一個(gè)元素為 key,第二個(gè)為 value。

?ta = ('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com');
?ta = ('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

或者用-代替'':

?ta = (-google=>'google.com', -runoob=>'runoob.com', -taobao=>'taobao.com');

但這種方式的key不能出現(xiàn)空格,讀取時(shí):

$val = $data{-google}
$val = $data{-runoob}
讀取哈希值

@array = @data{-taobao, -runoob};

讀取所有key

@names = keys ?ta;

讀取所有value

@urls = values ?ta;

檢測(cè)元素是否存在

如果你在哈希中讀取不存在的 key/value 對(duì) ,會(huì)返回 undefined 值,且在執(zhí)行時(shí)會(huì)有警告提醒。為了避免這種情況,我們可以使用 exists 函數(shù)來判斷key是否存在

if( exists($data{'facebook'} ) ){}
else{}
哈希中添加或刪除元素
# 添加元素
$data{'facebook'} = 'facebook.com';
# 刪除哈希中的元素
delete $data{'taobao'};

4. 條件

  1. if() {} elsif {} else {}

  2. use Switch;
    $var = 10;
    @array = (10, 20, 30);
    %hash = ('key1' => 10, 'key2' => 20);
    switch($var){
       case 10    { print "數(shù)字 10\n" }
       case "a"   { print "字符串 a" }
       case [1..10] { print "數(shù)字在列表中" }
       case (\@array){ print "數(shù)字在數(shù)組中" }
       case (\%hash) { print "在哈希中" }
       else        { print "沒有匹配的條件" }
    }

    其中@array 和%hash可以判斷var的值是否在列表或者h(yuǎn)ash內(nèi)。

    另外,還可以在case中加上next, case還會(huì)匹配下面其他的是否滿足:

    2. case 10    { print "數(shù)字 10\n"; next; }  # 匹配后繼續(xù)執(zhí)行
  3. 三元運(yùn)算符

    Exp1 ? Exp2 : Exp3;

    $status = ($favorite > 60 )? "熱門網(wǎng)站" : "不是熱門網(wǎng)站";

5. 循環(huán)

while () {}

條件為真時(shí)循環(huán)

until () {}

條件為假時(shí)循環(huán)

for( ; ; )

for( $a = 0; $a < 10; $a = $a   1 ){
    print "a 的值為: $a\n";
}

foreach

循環(huán)列表或者集合變量值

@list = (2, 12, 36, 42, 51);
# 執(zhí)行foreach 循環(huán)
foreach $a (@list){
    print "a 的值為: $a\n";
}

do...while...

do{
   statement(s);
}while( condition );

循環(huán)控制

next

next 語句用于停止執(zhí)行從next語句的下一語句開始到循環(huán)體結(jié)束標(biāo)識(shí)符之間的語句,轉(zhuǎn)去執(zhí)行continue語句塊,然后再返回到循環(huán)體的起始處開始執(zhí)行下一次循環(huán)。

$a = 10;
while( $a < 20 ){
   if( $a == 15)
   {
       # 跳出迭代
       $a = $a   1;
       next;
   }
   print "a 的值為: $a\n";
   $a = $a   1;
}
# 輸出結(jié)果會(huì)跳過15
last

Perl last 語句用于退出循環(huán)語句塊,從而結(jié)束循環(huán),last語句之后的語句不再執(zhí)行,continue語句塊也不再執(zhí)行。

continue

Perl continue 塊通常在條件語句再次判斷前執(zhí)行。continue 語句可用在 while 和 foreach 循環(huán)中。

$a = 0;
while($a < 3){
   print "a = $a\n";
}continue{
   $a = $a   1;
}
# 輸出
a = 0
a = 1
a = 2

@list = (1, 2, 3, 4, 5);
foreach $a (@list){
   print "a = $a\n";
}continue{
   last if $a == 4;
}
# 輸出
a = 1
a = 2
a = 3
a = 4
redo

Perl redo 語句直接轉(zhuǎn)到循環(huán)體的第一行開始重復(fù)執(zhí)行本次循環(huán),redo語句之后的語句不再執(zhí)行,continue語句塊也不再執(zhí)行。

$a = 0;
while($a < 10){
   if( $a == 5 ){
      $a = $a   1;
      redo;
   }
   print "a = $a\n";
}continue{
   $a = $a   1;
}
# 輸出
a = 0
a = 1
a = 2
a = 3
a = 4
a = 6
a = 7
a = 8
a = 9
goto

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

goto label:

$a = 10;
LOOP:do
{
    if( $a == 15){
       # 跳過迭代
       $a = $a   1;
       # 使用 goto LABEL 形式
       print "跳出輸出 \n";
       goto LOOP;
       print "這一句不會(huì)被執(zhí)行 \n";
    }
    print "a = $a\n";
    $a = $a   1;
}while( $a < 20 );

goto expr:

$a = 10;
$str1 = "LO";
$str2 = "OP";
 
LOOP:do
{
    if( $a == 15){
       # 跳過迭代
       $a = $a   1;
       # 使用 goto EXPR 形式
       goto $str1.$str2;    # 類似 goto LOOP
    }
    print "a = $a\n";
    $a = $a   1;
}while( $a < 20 );

6. 運(yùn)算符

基本運(yùn)算符

數(shù)字的比較: $a=10,$b=20

運(yùn)算符描述實(shí)例
<=>檢查兩個(gè)操作數(shù)的值是否相等, 如果左邊的數(shù)小于右邊的數(shù)返回 -1,如果相等返回 0, 如果左邊的數(shù)大于右邊的數(shù)返回 1 。($a <=> $b) 返回 -1。

字符串比較: $a="abc", $b = "xyz"

運(yùn)算符描述實(shí)例
lt檢查左邊的字符串是否小于右邊的字符串,如果是返回 true,否則返回 false。($a lt $b) 返回 true。
gt檢查左邊的字符串是否大于右邊的字符串,如果是返回 true,否則返回 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。

支持:

  • =

  • 位運(yùn)算符

  • 邏輯運(yùn)算符,and ,&& ,or ,|| ,not

引號(hào)運(yùn)算符

運(yùn)算符描述實(shí)例
q{ }為字符串添加單引號(hào)q{abcd} 結(jié)果為 'abcd'
qq{ }為字符串添加雙引號(hào)qq{abcd} 結(jié)果為 "abcd"
qx{ }為字符串添加反引號(hào)qx{abcd} 結(jié)果為 abcd

其他運(yùn)算符

運(yùn)算符描述實(shí)例
.點(diǎn)號(hào) (.) 用于連接兩個(gè)字符串。如果 $a="run", $b="oob" , \(a.\)b 結(jié)果為 "runoob"
xx 運(yùn)算符返回字符串重復(fù)的次數(shù)。('-' x 3) 輸出為 ---。
.... 為范圍運(yùn)算符。(2..5) 輸出結(jié)果為 (2, 3, 4, 5)

自增運(yùn)算符,整數(shù)值增加 1$a =10, $a will 輸出為 11
--自減運(yùn)算符,整數(shù)值減少 1$a =10, $a-- 輸出為 9
->箭號(hào)用于指定一個(gè)類的方法\(obj->\)a 表示對(duì)象 $obj 的 $a 方法。

運(yùn)算符優(yōu)先級(jí)

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

7. 時(shí)間日期

Perl中處理時(shí)間的函數(shù)有如下幾種:

  • 1、time() 函數(shù):返回從1970年1月1日起累計(jì)的秒數(shù)

  • 2、localtime() 函數(shù):獲取本地時(shí)區(qū)時(shí)間

  • 3、gmtime() 函數(shù): 獲取格林威治時(shí)間

@months = qw( 一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 );
@days = qw(星期天 星期一 星期二 星期三 星期四 星期五 星期六);
 
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";
#輸出
12 六月 星期天
$datestring = localtime();
print "時(shí)間日期為:$datestring\n";
#輸出
時(shí)間日期為:Sun Jun 12 11:27:31 2016

求運(yùn)行時(shí)間

新紀(jì)元時(shí)間(Epoch Time)

我們可以使用 time() 函數(shù)來獲取新紀(jì)元時(shí)間,該函數(shù)返回從1970年1月1日起累計(jì)的秒數(shù)。

一般可以用來求程序運(yùn)行的時(shí)間。

$epoc = time();
...
$epoc1 = time();
$run_time = $epoc1-$epoc;

POSIX 函數(shù) strftime()

函數(shù) strftime() 可以將時(shí)間格式化為我們想要的格式。

use POSIX qw(strftime);
 
$datestring = strftime "%Y-%m-%d %H:%M:%S", localtime;
printf("時(shí)間日期 - $datestring\n");
 
#  GMT 格式化時(shí)間日期
$datestring = strftime "%Y-%m-%d %H:%M:%S", gmtime;
printf("時(shí)間日期 - $datestring\n");
時(shí)間日期 - 2016-06-12 12:15:13
時(shí)間日期 - 2016-06-12 04:15:13

8. 子程序(函數(shù))

子程序傳參

Perl 子程序可以和其他編程一樣接受多個(gè)參數(shù),子程序參數(shù)使用特殊數(shù)組 @_ 標(biāo)明。因此子程序第一個(gè)參數(shù)為 $_[0], 第二個(gè)參數(shù)為 $_[1], 以此類推。

 # 定義求平均值函數(shù)
sub Average{
   # 獲取所有傳入的參數(shù)
   $n = scalar(@_);
   $sum = 0;
 
   foreach $item (@_){
      $sum  = $item;
   }
   $average = $sum / $n;
   print '傳入的參數(shù)為 : ',"@_\n";           # 打印整個(gè)數(shù)組
   print "第一個(gè)參數(shù)值為 : $_[0]\n";         # 打印第一個(gè)參數(shù)
   print "傳入?yún)?shù)的平均值為 : $average\n";  # 打印平均值
}
 
# 調(diào)用函數(shù)
Average(10, 20, 30);

向函數(shù)傳遞列表

# 定義函數(shù)
sub PrintList{
   my @list = @_;
   print "列表為 : @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
 
# 列表參數(shù)
PrintList($a, @b);
列表為 : 10 1 2 3 4

相函數(shù)傳遞哈希

# 方法定義
sub PrintHash{
   my (%hash) = @_;
 
   foreach my $key ( keys %hash ){
      my $value = $hash{$key};
      print "$key : $value\n";
   }
}
%hash = ('name' => 'runoob', 'age' => 3);
 
# 傳遞哈希
PrintHash(%hash);

子程序返回值

如果沒有使用 return 語句,則子程序的最后一行語句將作為返回值。

# 方法定義
sub add_a_b{
   # 不使用 return
   $_[0] $_[1];  
 
   # 使用 return
   # return $_[0] $_[1];  
}
print add_a_b(1, 2)

子程序的私有變量

  • 默認(rèn)情況下,Perl 中所有的變量都是全局變量,這就是說變量在程序的任何地方都可以調(diào)用。如果我們需要設(shè)置私有變量,可以使用 my 操作符來設(shè)置。

  • my 操作符用于創(chuàng)建詞法作用域變量,通過 my 創(chuàng)建的變量,存活于聲明開始的地方,直到閉合作用域的結(jié)尾。

  • 閉合作用域指的可以是一對(duì)花括號(hào)中的區(qū)域,可以是一個(gè)文件,也可以是一個(gè) if, while, for, foreach, eval字符串。

# 全局變量
$string = "Hello, World!";
 
# 函數(shù)定義
sub PrintHello{
   # PrintHello 函數(shù)的私有變量
   my $string;
   $string = "Hello, Runoob!";
   print "函數(shù)內(nèi)字符串:$string\n";
}
# 調(diào)用函數(shù)
PrintHello();
print "函數(shù)外字符串:$string\n";
函數(shù)內(nèi)字符串:Hello, Runoob!
函數(shù)外字符串:Hello, World!

變量的臨時(shí)賦值

我們可以使用 local 為全局變量提供臨時(shí)的值,在退出作用域后將原來的值還回去。local 定義的變量不存在于主程序中,但存在于該子程序和該子程序調(diào)用的子程序中。定義時(shí)可以給其賦值

# 全局變量
$string = "Hello, World!";
 
sub PrintRunoob{
   # PrintHello 函數(shù)私有變量
   local $string;
   $string = "Hello, Runoob!";
   # 子程序調(diào)用的子程序
   PrintMe();
   print "PrintRunoob 函數(shù)內(nèi)字符串值:$string\n";
}
sub PrintMe{
   print "PrintMe 函數(shù)內(nèi)字符串值:$string\n";
}
 
sub PrintHello{
   print "PrintHello 函數(shù)內(nèi)字符串值:$string\n";
}
 
# 函數(shù)調(diào)用
PrintRunoob();
PrintHello();
print "函數(shù)外部字符串值:$string\n";
PrintMe 函數(shù)內(nèi)字符串值:Hello, Runoob!
PrintRunoob 函數(shù)內(nèi)字符串值:Hello, Runoob!
PrintHello 函數(shù)內(nèi)字符串值:Hello, World!
函數(shù)外部字符串值:Hello, World!

靜態(tài)變量

use feature 'state';
 
sub PrintCount{
   state $count = 0; # 初始化變量
 
   print "counter 值為:$count\n";
   $count  ;
}
 
for (1..5){
   PrintCount();
}
counter 值為:0
counter 值為:1
counter 值為:2
counter 值為:3
counter 值為:4

注1:state僅能創(chuàng)建閉合作用域?yàn)樽映绦騼?nèi)部的變量。

注2:state是從Perl 5.9.4開始引入的,所以使用前必須加上 use。

注3:state可以聲明標(biāo)量、數(shù)組、哈希。但在聲明數(shù)組和哈希時(shí),不能對(duì)其初始化(至少Perl 5.14不支持)。

子程序調(diào)用上下文

子程序調(diào)用過程中,會(huì)根據(jù)上下文來返回不同類型的值,比如以下 localtime() 子程序,在標(biāo)量上下文返回字符串,在列表上下文返回列表:

# 標(biāo)量上下文
my $datestring = localtime( time );
print $datestring;
 
print "\n";
 
# 列表上下文
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
printf("%d-%d-%d %d:%d:%d",$year 1990,$mon 1,$mday,$hour,$min,$sec);
 
print "\n";
Sun Jun 12 15:58:09 2016
2106-6-12 15:58:9

my 和 local 的區(qū)別

內(nèi)部 -> 外部:

  • (1)my 和 local 都只在一個(gè) block 里有效,出去就失效;

  • (2)但是 local 的變量可以繼續(xù)在這個(gè) block 中調(diào)用的子程序中存在;

  • (3)如果有與外界同名的變量,兩者在 block 退出后都不影響外界同名變量;

外部 -> 內(nèi)部:

(1)外部設(shè)置 my、local、缺省均隊(duì)內(nèi)有效,但是同名變量外部 my,在 block 內(nèi)部 local 是不允許的。因?yàn)槎咴?block 中調(diào)用的子程序中均有效,會(huì)沖突。

(2)如果在一個(gè) block 中有一個(gè) my 修飾的變量和外界的一個(gè)變量同名,而且又需要在這個(gè) block 中使用外界變量時(shí),兩個(gè)辦法:

  • 第一個(gè)辦法,用 main 的 package 修飾這個(gè)變量名 $main::global。

  • 第二個(gè)辦法,用 our 修飾 our $global,那么該 block 中接下來出現(xiàn)的所有 $global 都是外界的 global。

(3)編寫腳本時(shí),注意作用域,防止外部影響內(nèi)部。

9. 引用

引用就是指針,Perl 引用是一個(gè)標(biāo)量類型可以指向變量、數(shù)組、哈希表(也叫關(guān)聯(lián)數(shù)組)甚至子程序,可以應(yīng)用在程序的任何地方。

定義變量的時(shí)候,在變量名前面加個(gè),就得到了這個(gè)變量的一個(gè)引用

$scalarref = \$foo;     # 標(biāo)量變量引用
$arrayref  = \@ARGV;    # 列表的引用
$hashref   = \%ENV;     # 哈希的引用
$coderef   = \&handler; # 子過程引用
$globref   = \*foo;     # GLOB句柄引用

在數(shù)組中我們可以用匿名數(shù)組引用,使用 [] 定義:

$aref= [ 1,"foo",undef,13 ];

匿名數(shù)組的元素仍然可以是匿名數(shù)組,所以我們可以用這種方法構(gòu)造數(shù)組的數(shù)組,可以構(gòu)造任意維度的數(shù)組。

my $aref = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
]

訪問的時(shí)候用引用訪問:

$aref->[0]->[0] 或者

$aref->[0][0]"

哈希中我們可以用匿名哈希引用,使用 {} 定義:

$href= { APR =>4, AUG =>8 };

我們也可以創(chuàng)建一個(gè)沒有子程序名的匿名子程序引用:

$coderef = sub { print "Runoob!\n" };

取消引用

取消引用可以根據(jù)不同的類型使用 $, @ 或 % 來取消,實(shí)例如下:

$var = 10;
 
# $r 引用 $var 標(biāo)量
$r = \$var;
 
# 輸出本地存儲(chǔ)的 $r 的變量值
print "$var 為 : ", $$r, "\n";
 
@var = (1, 2, 3);
# $r 引用  @var 數(shù)組
$r = \@var;
# 輸出本地存儲(chǔ)的 $r 的變量值
print "@var 為: ",  @$r, "\n";
 
%var = ('key1' => 10, 'key2' => 20);
# $r 引用  %var 數(shù)組
$r = \%var;
# 輸出本地存儲(chǔ)的 $r 的變量值
print "\%var 為 : ", %$r, "\n";
10 為 : 10
1 2 3 為: 123
\%var 為 : key110key220

判斷變量類型

ref 來判斷: ref($r)

引用函數(shù)

  • 函數(shù)引用格式: &

  • 調(diào)用引用函數(shù)格式: & 創(chuàng)建的引用名。

# 函數(shù)定義
sub PrintHash{
   my (%hash) = @_;
   
   foreach $item (%hash){
      print "元素 : $item\n";
   }
}
%hash = ('name' => 'runoob', 'age' => 3);
 
# 創(chuàng)建函數(shù)的引用
$cref = \&PrintHash;
 
# 使用引用調(diào)用函數(shù)
&$cref(%hash);

10. 格式化輸出

Perl 中可以使用 format 來定義一個(gè)模板,然后使用 write 按指定模板輸出數(shù)據(jù)。

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

參數(shù)解析:

  • FormatName :格式化名稱。

  • fieldline :一個(gè)格式行,用來定義一個(gè)輸出行的格式,類似 @,^,<,>,| 這樣的字符。

  • value_one,value_two…… :數(shù)據(jù)行,用來向前面的格式行中插入值,都是perl的變量。

  • . :結(jié)束符號(hào)。

$text = "google runoob taobao";
format STDOUT =
first: ^<<<<<  # 左邊對(duì)齊,字符長(zhǎng)度為6
    $text
second: ^<<<<< # 左邊對(duì)齊,字符長(zhǎng)度為6
    $text
third: ^<<<< # 左邊對(duì)齊,字符長(zhǎng)度為5,taobao 最后一個(gè) o 被截?cái)?    $text  
.
write
first: google
second: runoob
third: taoba
  • 格式行以 @ 或者 ^ 開頭,這些行不作任何形式的變量代換。

  • @ 字段(不要同數(shù)組符號(hào) @ 相混淆)是普通的字段。

  • @,^ 后的 <, >,| 長(zhǎng)度決定了字段的長(zhǎng)度,如果變量超出定義的長(zhǎng)度,那么它將被截?cái)唷?/p>

  • <, >,| 還分別表示,左對(duì)齊,右對(duì)齊,居中對(duì)齊。

  • ^ 字段用于多行文本塊填充。

格式值域含義
@<<<左對(duì)齊輸出
@>>>右對(duì)齊輸出
@|||中對(duì)齊輸出
@##.##固定精度數(shù)字
@*多行文本

在上表中,除了多行值域@*,域?qū)挾嫉扔谄渲付ǖ陌址鸃在內(nèi)的字符個(gè)數(shù)

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name, $age
@#####.##
$salary
===================================
.
 
select(STDOUT);
$~ = EMPLOYEE;
 
@n = ("Ali", "Runoob", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
 
$i = 0;
foreach (@n){
    $name = $_;
    $age = $a[$i];
    $salary = $s[$i  ];
    write;
}
===================================
Ali                     20
  2000.00
===================================
===================================
Runoob                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

格式變量

  • $~ ($FORMAT_NAME) :格式名字 \(^ (\)FORMAT_TOP_NAME) :當(dāng)前的表頭格式名字存儲(chǔ)在

  • $% ($FORMAT_PAGE_NUMBER) :當(dāng)前輸出的頁號(hào)

  • $= ($FORMAT_LINES_PER_PAGE) :每頁中的行數(shù)

  • $| ($FORMAT_AUTOFLUSH) :是否自動(dòng)刷新輸出緩沖區(qū)存儲(chǔ)

  • $^L ($FORMAT_FORMFEED) :在每一頁(除了第一頁)表頭之前需要輸出的字符串存儲(chǔ)在

$~ = "MYFORMAT"; # 指定默認(rèn)文件變量下所使用的格式
write;           # 輸出 $~ 所指定的格式
 
format MYFORMAT = # 定義格式 MYFORMAT 
=================================
      Text # 菜鳥教程
=================================
.
write;
=================================
      Text # 菜鳥教程
=================================
=================================
      Text # 菜鳥教程
=================================

如果不指定$~的情況下,會(huì)輸出名為STDOUT的格式:

write;         # 不指定$~的情況下會(huì)尋找名為STDOUT的格式
 
format STDOUT =
~用~號(hào)指定的文字不會(huì)被輸出
----------------
  STDOUT格式
----------------
.

如果STDOUT也沒有,會(huì)報(bào)錯(cuò)。

此外我們通過添加報(bào)表頭部信息來演示 $^ 或 $FORMAT_TOP_NAME 變量的使用

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name, $age
@#####.##
$salary
===================================
.
 
format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.
 
select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;
 
@n = ("Ali", "Runoob", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
 
$i = 0;
foreach (@n){
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i  ];
   write;
}
===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Runoob                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

也可以使用 $% 或$FORMAT_PAGE_NUMBER 為報(bào)表設(shè)置分頁:

# 添加分頁 $% 
format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
=================================== 
.
===================================
Name                    Age Page 1
===================================

輸出到文件

默認(rèn)情況下函數(shù)write將結(jié)果輸出到標(biāo)準(zhǔn)輸出文件STDOUT,我們也可以使它將結(jié)果輸出到任意其它的文件中。最簡(jiǎn)單的方法就是把文件變量作為參數(shù)傳遞給write,如:

write(MYFILE);

但是這樣就不能用$~變量來改變所使用的打印格式。系統(tǒng)變量$~只對(duì)默認(rèn)文件變量起作用,

if (open(MYFILE, ">tmp")) {
$~ = "MYFORMAT";
write MYFILE; # 含文件變量的輸出,此時(shí)會(huì)打印與變量同名的格式,即MYFILE。$~里指定的值被忽略。
 
format MYFILE = # 與文件變量同名 
=================================
      輸入到文件中
=================================
.
close MYFILE;
}

我們可以使用select改變默認(rèn)文件變量時(shí),它返回當(dāng)前默認(rèn)文件變量的內(nèi)部表示,這樣我們就可以創(chuàng)建子程序,按自己的想法輸出,又不影響程序的其它部分。

if (open(MYFILE, ">>tmp")) {
select (MYFILE); # 使得默認(rèn)文件變量的打印輸出到MYFILE中
$~ = "OTHER";
write;           # 默認(rèn)文件變量,打印到select指定的文件中,必使用$~指定的格式 OTHER
 
format OTHER =
=================================
  使用定義的格式輸入到文件中
=================================
. 
close MYFILE;
}

11. 文件操作

open(DATA, "<file.txt") or die "file.txt 文件無法打開, $!";
 
while(<DATA>){
   print "$_";
}

<表示只讀方式。

模式描述
< 或 r只讀方式打開,將文件指針指向文件頭。
> 或 w寫入方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
>> 或 a寫入方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
< 或 r讀寫方式打開,將文件指針指向文件頭。
> 或 w讀寫方式打開,將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
>> 或 a讀寫方式打開,將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。

Sysopen函數(shù)

sysopen 函數(shù)類似于 open 函數(shù),只是它們的參數(shù)形式不一樣。

<FILEHANDL> 操作符

我們使用 <FILEHANDLE> 操作符時(shí),它會(huì)返回文件句柄中每一行的列表,例如我們可以導(dǎo)入所有的行到數(shù)組中。

讀取 import.txt 并將每一行放到 @lines 數(shù)組中:

open(DATA,"<import.txt") or die "無法打開數(shù)據(jù)";
@lines = <DATA>; #<>操作符
print @lines;    # 輸出數(shù)組內(nèi)容
close(DATA);

getc 函數(shù)

getc 函數(shù)從指定的 FILEHANDLE 返回單一的字符,如果沒指定返回 STDIN。如果發(fā)生錯(cuò)誤,或在文件句柄在文件末尾,則返回 undef。

read 函數(shù)

read 函數(shù)用于從緩沖區(qū)的文件句柄讀取信息。這個(gè)函數(shù)用于從文件讀取二進(jìn)制數(shù)據(jù)

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

如果讀取成功返回讀取的字節(jié)數(shù),如果在文件結(jié)尾返回 0,如果發(fā)生錯(cuò)誤返回 undef。

print 函數(shù)

對(duì)于所有從文件句柄中讀取信息的函數(shù),在后端主要的寫入函數(shù)為 print:

print FILEHANDLE LIST
print LIST
print

文件拷貝

 # 只讀方式打開文件
open(DATA1, "<file1.txt");
 
# 打開新文件并寫入
open(DATA2, ">file2.txt");
 
# 拷貝數(shù)據(jù)
while(<DATA1>)
{
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

文件重命名

rename ("/usr/runoob/test/file1.txt", "/usr/runoob/test/file2.txt" ); #file1命名為file2

刪除文件

unlink ("/usr/runoob/test/file1.txt");

指定文件讀寫指針位置

你可以使用 tell 函數(shù)來獲取文件的位置,并通過使用 seek 函數(shù)來指定文件內(nèi)的的位置:

tell 函數(shù)用于獲取文件讀寫指針位置:

tell FILEHANDLE

seek()函數(shù)是通過文件句柄來移動(dòng)文件讀寫指針的方式來讀取或?qū)懭胛募?,以字?jié)為單位進(jìn)行讀取和寫入:

seek FILEHANDLE, POSITION, WHENCE

  • FILEHANDLE:文件句柄,用于存放一個(gè)文件唯一標(biāo)識(shí)符。

  • POSITION:表示文件句柄(讀寫位置指針)要移動(dòng)的字節(jié)數(shù)。

  • WHENCE:表示文件句柄(讀寫位置指針)開始移動(dòng)時(shí)的起始位置,可以取的值為0、1、2;分別表示文件開頭、當(dāng)前位置和文件尾。

open(DATA,"<a.txt") or die "出錯(cuò)!";
#seek DATA,5,0;
$position = tell DATA;
print "$position\n";

while(<DATA>)
{
    print "$_";
}
close (DATA);

輸出:0
dadad

0表示指針位置。

如果用seek進(jìn)行指針偏移:

open(DATA,"<a.txt") or die "出錯(cuò)!";
$ss = seek DATA,5,0;
print "$ss\n";
$position = tell DATA;
print "$position\n";

while(<DATA>)
{
    print "$_";
}
close (DATA);

輸出 1

5

返回1表示seek成功,后面沒輸出文件內(nèi)容因?yàn)槲募镂鍌€(gè)字符后沒內(nèi)容了。

文件信息

測(cè)試文件是否存在,是否可讀寫等

常用的是-e,文件或目錄是否存在;-d ,是否位目錄。

my $file = "a.txt";
my (@description, $size);
if (-e $file)
{
    push @description, '是一個(gè)二進(jìn)制文件' if (-B _);
    push @description, '是一個(gè)socket(套接字)' if (-S _);
    push @description, '是一個(gè)文本文件' if (-T _);
    push @description, '是一個(gè)特殊塊文件' if (-b _);
    push @description, '是一個(gè)特殊字符文件' if (-c _);
    push @description, '是一個(gè)目錄' if (-d _);
    push @description, '文件存在' if (-x _);
    push @description, (($size = -s _)) ? "$size 字節(jié)" : '空';
    print "$file 信息:", join(', ',@description),"\n";
}

輸出:a.txt 信息:是一個(gè)文本文件, 6 字節(jié)

文件測(cè)試操作符如下表所示:

操作符描述
-A文件上一次被訪問的時(shí)間(單位:天)
-B是否為二進(jìn)制文件
-C文件的(inode)索引節(jié)點(diǎn)修改時(shí)間(單位:天)
-M文件上一次被修改的時(shí)間(單位:天)
-O文件被真實(shí)的UID所有
-R文件或目錄可以被真實(shí)的UID/GID讀取
-S為socket(套接字)
-T是否為文本文件
-W文件或目錄可以被真實(shí)的UID/GID寫入
-X文件或目錄可以被真實(shí)的UID/GID執(zhí)行
-b為block-special (特殊塊)文件(如掛載磁盤)
-c為character-special (特殊字符)文件(如I/O 設(shè)備)
-d為目錄
-e文件或目錄名存在
-f為普通文件
-g文件或目錄具有setgid屬性
-k文件或目錄設(shè)置了sticky位
-l為符號(hào)鏈接
-o文件被有效UID所有
-p文件是命名管道(FIFO)
-r文件可以被有效的UID/GID讀取
-s文件或目錄存在且不為0(返回字節(jié)數(shù))
-t文件句柄為TTY(系統(tǒng)函數(shù)isatty()的返回結(jié)果;不能對(duì)文件名使用這個(gè)測(cè)試)
-u文件或目錄具有setuid屬性
-w文件可以被有效的UID/GID寫入
-x文件可以被有效的UID/GID執(zhí)行
-z文件存在,大小為0(目錄恒為false),即是否為空文件,

12. 目錄操作

opendir DIRHANDLE, EXPR  # 打開目錄
readdir DIRHANDLE        # 讀取目錄
rewinddir DIRHANDLE      # 定位指針到開頭
telldir DIRHANDLE        # 返回目錄的當(dāng)前位置
seekdir DIRHANDLE, POS   # 定位指定到目錄的 POS 位置
closedir DIRHANDLE       # 關(guān)閉目錄

顯示所有的文件

使用glob函數(shù)

# 顯示 /tmp 目錄下的所有文件
$dir = "/tmp/*";
my @files = glob( $dir );
 
foreach (@files ){
   print $_ . "\n";
}
 
# 顯示 /tmp 目錄下所有以 .c 結(jié)尾的文件
$dir = "/tmp/*.c";
@files = glob( $dir );
 
foreach (@files ){
   print $_ . "\n";
}
 
# 顯示所有隱藏文件
$dir = "/tmp/.*";
@files = glob( $dir );
foreach (@files ){
   print $_ . "\n";
}
 
# 顯示 /tmp 和 /home 目錄下的所有文件
$dir = "/tmp/* /home/*";
@files = glob( $dir );
 
foreach (@files ){
   print $_ . "\n";
}

或者:

opendir (DIR, '.') or die "無法打開目錄, $!";
while ($file = readdir DIR) {
  print "$file\n";
}
closedir DIR;

# 如果你要顯示 /tmp 目錄下所有以 .c 結(jié)尾的文件,可以使用以下代碼:
opendir(DIR, '.') or die "無法打開目錄, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR))){
   print "$_\n";
}
closedir DIR;

創(chuàng)建一個(gè)新目錄

$dir = "/tmp/perl";
 
# 在 /tmp 目錄下創(chuàng)建 perl 目錄
mkdir( $dir ) or die "無法創(chuàng)建 $dir 目錄, $!";
print "目錄創(chuàng)建成功\n";

刪除目錄

$dir = "/tmp/perl";
 
# 刪除 /tmp 目錄下的 perl 目錄
rmdir( $dir ) or die "無法刪除 $dir 目錄, $!";
print "目錄刪除成功\n";

切換目錄

$dir = "/home";
 
# 將當(dāng)期目錄移動(dòng)到 /home 目錄下
chdir( $dir ) or die "無法切換目錄到 $dir , $!";
print "你現(xiàn)在所在的目錄為 $dir\n";

13. 錯(cuò)誤處理

14. 特殊變量

  • Perl 語言中定義了一些特殊的變量,通常以 $, @, 或 % 作為前綴,例如:$_。

  • 很多特殊的變量有一個(gè)很長(zhǎng)的英文名,操作系統(tǒng)變量 $! 可以寫為 $OS_ERROR。

  • 如果你想使用英文名的特殊變量需要在程序頭部添加 use English;。這樣就可以使用具有描述性的英文特殊變量。

  • 最常用的特殊變量為 $_,該變量包含了默認(rèn)輸入和模式匹配內(nèi)容。

foreach ('Google','Runoob','Taobao') {
    print $_;
    print "\n";
}
foreach ('Google','Runoob','Taobao') {
    print;
    print "\n";
}

上面兩個(gè)的輸出結(jié)果都是一樣的。因?yàn)閜rint 沒有指定輸出變量時(shí)默認(rèn)用$_

以下是幾處即使沒有寫明 Perl 也會(huì)假定使用 $_ 的地方:

  • 各種單目函數(shù),包括像 ord() 和 int() 這樣的函數(shù)以及除 "-t"以外所有的文件 測(cè)試操作 ("-f","-d"),"-t" 默認(rèn)操作 STDIN。

  • 各種列表函數(shù),例如 print() 和 unlink()。

  • 沒有使用 "=~" 運(yùn)算符時(shí)的模式匹配操作 "m//"、"s///" 和"tr///"。

  • 在沒有給出其他變量時(shí)是 "foreach" 循環(huán)的默認(rèn)迭代變量。

  • grep() 和 map() 函數(shù)的隱含迭代變量。

  • 當(dāng) "while" 僅有唯一條件,且該條件是對(duì) ""操作的結(jié)果進(jìn)行測(cè)試時(shí),$_ 就是存放輸入記錄的默認(rèn)位置。除了"while" 測(cè)試條件之外不會(huì)發(fā)生這種情況。(助記:下劃線在特定操作中是可以省略的。)

特殊變量列舉表

https://www.runoob.com/perl/perl-special-variables.html

15. 正則表達(dá)式

Perl語言的正則表達(dá)式功能非常強(qiáng)大,基本上是常用語言中最強(qiáng)大的,很多語言設(shè)計(jì)正則式支持的時(shí)候都參考Perl的正則表達(dá)式。

Perl的正則表達(dá)式的三種形式,分別是匹配,替換和轉(zhuǎn)化:

  • 匹配:m//(還可以簡(jiǎn)寫為//,略去m)

  • 替換:s///

  • 轉(zhuǎn)化:tr///

這三種形式一般都和 =~!~ 搭配使用, =~ 表示相匹配,!~ 表示不匹配。

匹配操作符

匹配操作符 m// 用于匹配一個(gè)字符串語句或者一個(gè)正則表達(dá)式,例如,要匹配 標(biāo)量 $bar 中的 "run",代碼如下所示:

$bar = "I am runoob site. welcome to runoob site.";
if ($bar =~ /run/){
   print "第一次匹配\n";
}else{
   print "第一次不匹配\n";
}
 
$bar = "run";
if ($bar =~ /run/){
   print "第二次匹配\n";
}else{
   print "第二次不匹配\n";
}
第一次匹配
第二次匹配
模式匹配修飾符
修飾符描述
i忽略模式中的大小寫
m多行模式
o僅賦值一次
s單行模式,"."匹配"\n"(默認(rèn)不匹配)
x忽略模式中的空白
g全局匹配
cg全局匹配失敗后,允許再次查找匹配串

正則表達(dá)式變量

perl處理完后會(huì)給匹配到的值存在三個(gè)特殊變量名:

  • $`: 匹配部分的前一部分字符串

  • $&: 匹配的字符串

  • $': 還沒有匹配的剩余字符串

如果將這三個(gè)變量放在一起,你將得到原始字符串。

$string = "welcome to runoob site.";
$string =~ m/run/;
print "匹配前的字符串: $`\n";
print "匹配的字符串: $&\n";
print "匹配后的字符串: $'\n";

替換操作符

替換操作符 s/// 是匹配操作符的擴(kuò)展,使用新的字符串替換指定的字符串?;靖袷饺缦拢?/p>

s/PATTERN/REPLACEMENT/修飾符;
$string = "welcome to google site.";
$string =~ s/google/runoob/;
 
print "$string\n";
替換操作修飾符
修飾符描述
i如果在修飾符中加上"i",則正則將會(huì)取消大小寫敏感性,即"a"和"A" 是一樣的。
m默認(rèn)的正則開始"^"和結(jié)束"$"只是對(duì)于正則字符串如果在修飾符中加上"m",那么開始和結(jié)束將會(huì)指字符串的每一行:每一行的開頭就是"^",結(jié)尾就是"$"。
o表達(dá)式只執(zhí)行一次。
s如果在修飾符中加入"s",那么默認(rèn)的"."代表除了換行符以外的任何字符將會(huì)變成任意字符,也就是包括換行符!
x如果加上該修飾符,表達(dá)式中的空白字符將會(huì)被忽略,除非它已經(jīng)被轉(zhuǎn)義。
g替換所有匹配的字符串。
e替換字符串作為表達(dá)式

轉(zhuǎn)化操作符

修飾符描述
c轉(zhuǎn)化所有未指定字符
d刪除所有指定字符
s把多個(gè)連續(xù)相同的輸出字符縮成一個(gè)

以下實(shí)例將變量 $string 中的所有小寫字母轉(zhuǎn)化為大寫字母:

$string = 'welcome to runoob site.';
$string =~ tr/a-z/A-z/;

print "$string\n";

以下實(shí)例使用 /s 將變量 $string 重復(fù)的字符刪除:

$string = 'runoob';
$string =~ tr/a-z/a-z/s;
 
print "$string\n";
$string =~ tr/\d/ /c;     # 把所有非數(shù)字字符替換為空格
$string =~ tr/\t //d;     # 刪除tab和空格
$string =~ tr/0-9/ /cs    # 把數(shù)字間的其它字符替換為一個(gè)空格。

更多正則表達(dá)式規(guī)則

表達(dá)式描述
.匹配除換行符以外的所有字符
x?匹配 0 次或一次 x 字符串
x*匹配 0 次或多次 x 字符串,但匹配可能的最少次數(shù)
x匹配 1 次或多次 x 字符串,但匹配可能的最少次數(shù)
.*匹配 0 次或多次的任何字符
.匹配 1 次或多次的任何字符
{m}匹配剛好是 m 個(gè) 的指定字符串
{m,n}匹配在 m個(gè) 以上 n個(gè) 以下 的指定字符串
{m,}匹配 m個(gè) 以上 的指定字符串
[]匹配符合 [] 內(nèi)的字符
[^]匹配不符合 [] 內(nèi)的字符
[0-9]匹配所有數(shù)字字符
[a-z]匹配所有小寫字母字符
[^0-9]匹配所有非數(shù)字字符
[^a-z]匹配所有非小寫字母字符
^匹配字符開頭的字符
$匹配字符結(jié)尾的字符
\d匹配一個(gè)數(shù)字的字符,和 [0-9] 語法一樣
\d匹配多個(gè)數(shù)字字符串,和 [0-9] 語法一樣
\D非數(shù)字,其他同 \d
\D非數(shù)字,其他同 \d
\w英文字母或數(shù)字的字符串,和 [a-zA-Z0-9_] 語法一樣
\w和 [a-zA-Z0-9_] 語法一樣
\W非英文字母或數(shù)字的字符串,和 [^a-zA-Z0-9_] 語法一樣
\W和 [^a-zA-Z0-9_] 語法一樣
\s空格,和 [\n\t\r\f] 語法一樣
\s和 [\n\t\r\f] 一樣
\S非空格,和 [^\n\t\r\f] 語法一樣
\S和 [^\n\t\r\f] 語法一樣
\b匹配以英文字母,數(shù)字為邊界的字符串
\B匹配不以英文字母,數(shù)值為邊界的字符串
a|b|c匹配符合a字符 或是b字符 或是c字符 的字符串
abc匹配含有 abc 的字符串 (pattern) () 這個(gè)符號(hào)會(huì)記住所找尋到的字符串,是一個(gè)很實(shí)用的語法.第一個(gè) () 內(nèi)所找到的字符串變成 $1 這個(gè)變量或是 \1 變量,第二個(gè) () 內(nèi)所找到的字符串變成 $2 這個(gè)變量或是 \2 變量,以此類推下去.
/pattern/ii 這個(gè)參數(shù)表示忽略英文大小寫,也就是在匹配字符串的時(shí)候,不考慮英文的大小寫問題.  如果要在 pattern 模式中找尋一個(gè)特殊字符,如 "*",則要在這個(gè)字符前加上  符號(hào),這樣才會(huì)讓特殊字符失效
來源:https://www./content-1-643601.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多