本を読む

読書やコンピュータなどに関するメモ

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

新機能の参考資料

このへんを参考にしました。

 以下、これらの説明を自分で試してみましたというだけの話です。

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

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/326-66806b5c

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad