常用記錄chop與chomp的區(qū)別變量初值對(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)=~ 匹配時(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,有幾種方法: split ' ' 或者直接用默認(rèn)形式split ,不加任何東西
刪除前導(dǎo)空白符,再用split(/\s /,$_);
基礎(chǔ)1. 運(yùn)行perl2. 字符串字符串連接符$str = "hello" . "world"; # 字符串連接
$num = 5 10; # 兩數(shù)相加
$mix = $str . $num; # 連接字符串和數(shù)字
轉(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 |
qqqq(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. 變量標(biāo)量:$myfirst=123; 數(shù)組:@arr=(1,2,3) ,索引用$arr[0] 哈希:%h=('a'=>1,'b'=>2); 索引用$h{'a'}
數(shù)據(jù)類型整形:$x = 12345; 實(shí)際是浮點(diǎn)數(shù)的特例
浮點(diǎn)數(shù):11.4 、 -0.3 、.3 、 3. 、 54.1e 02 、 5.41e03。 字符串: 見上面
變量上下文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ù)組元素1 | push @ARRAY, LIST 將列表的值放到數(shù)組的末尾 | 2 | pop @ARRAY 刪除數(shù)組的最后一個(gè)值 | 3 | shift @ARRAY 彈出數(shù)組第一個(gè)值,并返回它。數(shù)組的索引值也依次減一。 | 4 | unshift @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 ] ] ] # 定義字符串
$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ù),語法格式如下: # 數(shù)組轉(zhuǎn)為字符串
$string1 = join( '-', @string );
$string2 = join( ',', @names );
數(shù)組排序Perl 中數(shù)組排序使用 sort() 函數(shù),語法格式如下: # 定義數(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$data{'google'} = 'google.com'; 通過列表設(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. 條件if() {} elsif {} else {} 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í)行
三元運(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)控制nextnext 語句用于停止執(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
lastPerl last 語句用于退出循環(huán)語句塊,從而結(jié)束循環(huán),last語句之后的語句不再執(zhí)行,continue語句塊也不再執(zhí)行。 continuePerl 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
redoPerl 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
gotoPerl 有三種 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 <=> | 檢查兩個(gè)操作數(shù)的值是否相等, 如果左邊的數(shù)小于右邊的數(shù)返回 -1,如果相等返回 0, 如果左邊的數(shù)大于右邊的數(shù)返回 1 。 | ($a <=> $b) 返回 -1。 |
字符串比較: $a="abc", $b = "xyz" 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)算符q{ } | 為字符串添加單引號(hào) | q{abcd} 結(jié)果為 'abcd' | qq{ } | 為字符串添加雙引號(hào) | qq{abcd} 結(jié)果為 "abcd" | qx{ } | 為字符串添加反引號(hào) | qx{abcd} 結(jié)果為 abcd |
其他運(yùn)算符. | 點(diǎn)號(hào) (.) 用于連接兩個(gè)字符串。 | 如果 $a="run", $b="oob" , \(a.\)b 結(jié)果為 "runoob" | x | x 運(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í), -- | 無 | -, ~, ! | 從右到左 | ** | 從右到左 | =~, !~ | 從左到右 | *, /, %, 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è)辦法: (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ù)定義
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// 用于匹配一個(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ī)則. | 匹配除換行符以外的所有字符 | 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/i | i 這個(gè)參數(shù)表示忽略英文大小寫,也就是在匹配字符串的時(shí)候,不考慮英文的大小寫問題. 如果要在 pattern 模式中找尋一個(gè)特殊字符,如 "*",則要在這個(gè)字符前加上 符號(hào),這樣才會(huì)讓特殊字符失效 | 來源:https://www./content-1-643601.html
|