Perl5 語言精粹

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>;
}
相關文章
相關標籤/搜索