Perl 5.10の新機能を試した話
先週の土曜に、仲間うちの活動報告会でPerl 5.10 RC2の新機能についてプレゼンしたところ、ちょうど今週に正式版がリリースされました。資料を捨てるのももったいないので、メモとして残しておきます。下にも書いてあるとおり、参考資料に書いてあることを試してみただけの内容です。
インストール
RC2の場合なので注意
% wget http://search.cpan.org/CPAN/authors/id/R/RG/RGARCIA/perl-5.10.0-RC2.tar.gz % tar xf perl-5.10.0-RC2.tar.gz % cd perl-5.10.0-RC2 % sh Configure -des -Dprefix=/opt/perl -Doptimize=-O3 % make % make test % sudo make install
新機能の参考資料
このへんを参考にしました。
- perldelta - perl 5.10.0 の新機能
http://fleur.hio.jp/perldoc/perl/5.10.0/pod/perl5100delta.mix.html - Re: Why should I use perl 5.10?
http://perlmonks.org/?node_id=654086 - LL::魂::2007 - An Ordinary Perl 5.10 Guide
http://www.dan.co.jp/~dankogai/llspirit2007/perl5.10.html
以下、これらの説明を自分で試してみましたというだけの話です。
say
改行つきprint
print "スライムがあらわれた\n"; say "スライムがあらわれた";
変数を表示するときにより便利
print $i, "\n"; say $i;
新機能がみんなデフォルトで使えるわけじゃない
use feature qw( say );
あるいは、全部指定。
use feature qw( :5.10 );
ワンライナーで新機能を使う場合
-Eオプションを使う
-eとほぼ同じ機能だが、use feature qw( :5.10 );したのと同じになる
//演算子
||演算子に似たもの
$a || $bの場合:
0や""は偽
$a // $bの場合:
||と同じ使い方で、undefのときだけ偽
state変数
Cでいうstatic変数
sub hoge { state $a = 0; $a++; }
スコープはmy/local変数と同じ、寿命はグローバル変数と同じ
グローバル変数やクロージャを使うまでもない場合
when
Cとかのswitch文相当
given ($a) { when (/xyz/) { say 'matched xyz'; } when (/bbc/) { say 'matched bbc'; } default { say 'matched default'; } }
いままでもSwitch.pmはあった
が、動的にソースフィルタリングしていた
forでも使える
for (@a) { when (/xyz/) { say 'matched xyz'; } when (/bbc/) { say 'matched bbc'; } default { say 'matched default'; } }
スマートマッチ
whenの条件はこれで比較
=~は、比較演算子としては使い方が特殊だよね
「~~」
==みたいに使える
$text ~~ /def/ # =~と同じ使い方 /def/ ~~ $text # 逆順。最近の言語はこっちが多い? 100 ~~ 100 # ==相当の使い方も /def/ ~~ @ary # 配列もOK
正規表現
いろいろ新機能など
パターンの再帰
(?番号)でパターンの再帰を表せる
/^(<(?:(?>[^<>]+)|(?1))*>)$/
対応する<>にマッチ
名前つき後方参照
\1とか$1とかのかわりに名前を使える
s/(?<moji>[a-zA-Z])\k<moji>//e s/(?<moji>[a-z]+)/uc $+{moji}/e
%+というハッシュから参照できる
$text =~ /(?<moji>[a-zA-Z]+)(?<suji>\d+)/; for my $key (keys %+) { say "$key: $+{$key}"; }
相対番号で後方参照
/(.)(.)(.)\3\2\1/ /(.)(.)(.)\g{-1}\g{-2}\g{-3}/
\K
後読み言明の簡単なやつ
$text =~ s/[a-z]+\K\d+//;
量指定子+
行ったきりの最大マッチ
'aaaa' =~ /a*a/ # マッチします 'aaaa' =~ /a*?a/ # マッチします 'aaaa' =~ /a*+a/ # マッチしません
バックトラックしないことで効率化?(よくわからない)
その他
バックトラック制御とかTRIE化とかあるらしいけど
よくわかりません ><
ファイルテスト演算子を重ねられる
&&で条件を重ねなくてもいい
if ((-w '/path/to/file') && (-x '/path/to/file')) { ...
↓
if (-w -x '/path/to/file') { ...
レキシカルな$_
ブロック内で$_をmy変数にできる
元の$_は$::_でアクセス
while (<DATA>) { my $_ = 'ABC'; s/A/#/; print $_, ':', $::_; }
_プロトタイプ
プロトタイプ宣言の引数に「_」が追加された
「$」とほぼ同じで、省略時に$_を受け取る
sub hoge(_) { ... } hoge;
``を再定義
readpipe()を再定義
BEGIN { *CORE::GLOBAL::readpipe = sub($) { $_[0] . ' ignored'; }; }
標準モジュールにいろいろ追加
とりあえず目立ったもの
- Digest::SHA
- Module::Build
- Module::Pluggable
- CPANPLUS
コメント
コメントの投稿
トラックバック
https://emasaka.blog.fc2.com/tb.php/326-66806b5c