Perl には頻出するイデオムを短い書き方で代替する ショートカット が多くあります。
ショートカットを集めてみます。
目次
- while ループの条件部に行入力演算子 <STDIN> を置く
- foreach ループで制御変数を省略する
- 正規表現リテラルを単体で評価する
- => は , のシノニム
- デリファレンスのチェーン
- まとめ
while ループの条件部に行入力演算子 <STDIN>
を置く
while (<STDIN>) { print; }
下記のコードと同じ意味になります。
while (defined($_ = <STDIN>)) { print $_; }
いま標準入力 STDIN
からの読み込みを例に挙げましたが、そのほかのファイルハンドラからの読み込みでも同じように扱われます。
foreach ループで制御変数を省略する
foreach (@array) { print; }
下記のコードと同じ意味になります。
foreach my $_ (@array) { print $_; }
foreach ループにおいて制御変数を省略すると、配列の各値が暗黙に $_
に代入されます。
正規表現リテラルを単体で評価する
正規表現マッチは =~
演算子を使って、
$str =~ /^(.*)$/;
と書かれることが多いですが、 正規表現リテラルを単体で書いたときには m
演算子が省略されていると解釈されます。
そして m
演算子はデフォルトで $_
とのマッチを試みます。
my $matched = /^(.*)$/; if (/^(.*)$/) { print $1; } &some_func(/^(.*)$/);
下記のコードと同じ意味になります。
my $matched = $_ =~ m/^(.*)$/; if ($_ =~ m/^(.*)$/) { print $1; } &some_func($_ =~ m/^(.*)$/); # パターンそのものがサブルーチンに渡されるわけではないので注意!
ちなみに、パターンそのものを変数に格納したりサブルーチンの引数として渡したいときには正規表現オブジェクトを使用します。
# 変数に格納できる my $regex = rq/^(.*)$/; # 引数として渡せる &some_func(rq/^(.*)$/);
=>
は ,
のシノニム
=>
は ,
のシノニムです。
なのでコードの中で ,
を使っている箇所を =>
で置き換えることが可能です。
※ =>
は左側のオペランドを文字列としてクォートするので厳密に云うとちょっとだけ振る舞いが違う
my %hash = ( foo => 'bar', hoge => 'fuga' ); my @array = ( 'foo', 'bar', 'hoge', 'fuga' ); print "hoo", "\n", "bar", "\n";
下記のコードと同じ意味になります。
my %hash = ( 'foo', 'bar', 'hoge', 'fuga' ); my @array = ( foo => 'bar', hoge => 'fuga' ); print "hoo", "\n" => "bar", "\n";
ただし、はっきり云って可読性を落とすだけなので闇雲に ,
を =>
で置き換えることはやめましょう。
=>
を使うのはハッシュコンテキストで評価される値を作るときだけにしておくのが無難です。
デリファレンスのチェーン
HashRef をデリファレンスして要素アクセスする ->{}
演算子や ArrayRef をデリファレンスして要素アクセスする ->[]
演算子が連なっているときは間の ->
を省略可能です。
$foo->{bar}[0][2]{hoge};
下記のコードと同じ意味になります。
$foo->{bar}->[0]->[2]->{hoge};
まとめ
(たぶんまだ追記します)
私からは以上です。