Perl5 語言廢棄了很好的特性,例如 autoref:正則表達式
push $array, name;
Perl5 速度愈來愈快,已經和 Python 不相上下,並且我也最熟悉,加載包也最容易,不過 @INC 加載當前目錄,從 5.26 就要取消了。json
把一個 '0xffff' 格式的字符串轉換成數字,而後轉換成字符:數組
say chr(hex('0x44')); # D say sprintf("0x%x", ord('D')); # 44
翻轉一個字符串:函數
scalar reverse('abcde');
原來,單引號字符串中,只有單引號和轉義符號自己的轉義纔有效。編碼
my $str = '\\ \'';
前置 if 要對錶達式或是值用括號包圍起來,原來 Longest Match Rule 能夠簡化這樣的括號。atom
if ($a > $b) { say 'a > b' }
return 的優先級不是最低的,and 比它的還低,因此若是 ruturn 表達式中有 and/or, 要用括號保護起來:.net
sub is_a { my $a = shift; return (length($a) == 1 and $a eq 'a') }
智能匹配符能夠匹配數組引用和區間:scala
say 'smart match range ok' if 'a' ~~ ['a'..'z'];
JSON::XS 中的 encode_json 會區別字符串中的 \t \r \f:code
say encode_json(['a', "\t\r\f\n"]); ## => ["a","\t\r\f\n"]
if 表達式中,返回 1 會當成真,返回 0 會當成假。字符串
使用 given .. when 和 smart match : ~~ 要加載聲明:
no warnings "experimental"; my $dog = 'Splot'; given ($dog) { when ('Fido') { say 'is Fido' } when ('Splot') { say 'is Splot' } default { say 'not Fido or Splot' } }
smart match 對於字符串來講,和 eq 同樣:
say 'it is same' if 'str' ~~ 'str';
尾部的 if 能夠不用括號包圍表達式,並且 if 的優先級比 and/or 還要低。
say '$a is a' if length($a) == 1 and $a ~~ 'a';
包名和函數名稱不能相同,會發生衝突,由於他們本就在同一個命名空間中:
package PackageName; sub PackageName { say 'hello' }
Perl5 不能直接遍歷字符串的字符,要用 split 把字符串拆分紅字符數組:
for my $char (split('', $string)) { say $char }
map, List::Util qw(all) 的使用,都不要逗號:
@opt_atoms = map { opt_atom($_) } @atoms; if (all { is_chars($_) } @array) { say 'is chars array' }
substr 的用法:
my $str = '0123456'; say substr($str, -2); # 最後兩個字符56 say substr($str, 2); # 從第二個字符後的全部字符, 23456 say substr($str, 2, 2); # 從第二個字符開始,長度爲 2 的字符串 23 say substr($str, 2, -2); # 從第二個字符開始,直到倒數第二個字符, 234 say substr($str, -4, -2); # 從倒數第4個字符,到倒數第二個字符, 34
獲取字符串中某個字符出現的次數,要用正則表達式:
my @a = ('abcda' =~ /a/g); say scalar(@a);
index 和 rindex 返回的位置是同樣的,一個是從前面找,一個從後面,效率不一樣罷了。 若是用 index 返回的值作判斷,要當心了,沒有找到返回的是 -1, 而不是 0, 0 也是找到了
say index('abcde', 'ab'); # 0 say index('abcde', 'de'); # 3 say rindex('abcde', 'de'); # 3 say "$start start with $str" if index( $str, $start ) == 0; say "$str end with $end" if $str ~~ /$end$/;
用正則表達式能夠製做不少函數:
# trim $str =~ s/^\s+|\s+$//g;
以 utf8 編碼形式讀入文件內容:
sub read_file { my $file = shift; error("file: $file not exists") if not -e $file; local $/; open my ($fh), '<:utf8', $file or die $!; return <$fh>; }