文モディファイアとしての foreach

文の最後に if や unless をつけて条件が合致するときのみその文を実行する構文

print "OK" if $msg eq 'YES';
# is equivalent to: if ($msg eq 'YES') { print "OK"; }
return unless defined $msg;
# is equivalent to: unless (defined $msg) { return; }

については知っていたのですが,foreach についてもそのように修飾節として使えるということを知りませんでした。

print $_, "\n" foreach ('a', 'b', 'c');
# is equivalent to: foreach ('a', 'b', 'c') { print $_, "\n"; }

foreach は for と等価なので,for を使った方が英語的に収まりがいいかもしれません。実際にこれを知ったのは,Class::Data::Inheritable の使い方で,

use base qw(Class::Data::Inheritable);
__PACKAGE__->mk_classdata($_) for qw(prices weights);

のような感じで使っていました(何で使われているかは忘れてしまいましたが)。Class::Data::Inheritable::mk_classdata() は Class::Data::Accessor::mk_accessors() と違ってアクセサを一つずつしかとらないので,このような書き方で複数のアクセサを登録できるんですね。

ただし,「sentence foreach LIST;」という構文なので,

print my $c foreach qw(a b c);  # Error
my $s;
print "$s\n" for qw(x y z);  # Error

のような書き方はできません。あくまでイテレータは $_ です。


ついでに。
Class::Data::Inheritable はパッケージ自身にデータを格納したいときに便利なモジュールなんですが,Apache(2)::Reload と相性が悪いらしいです。Apache(2)::Reload は,モジュールファイルが更新されていると自動的に再読込してくれるのですが,その際にクラスデータが空になってしまう。

package MyClass;
use base qw(Class::Data::Inheritable);
MyClass->mk_classdata('Value');
MyClass->Value('hello, world!');
1;

のようなモジュールを書いていて,Apache(2)::Reload でリロードされると,MyClass->Value() は空になってしまいます。空というか個人的な経験ではそもそも「Not a CODE reference ...」って怒られました。
そのような場合,Class::Data::Reloadable を使うと,きちんとリロードしてくれる,らしい,です。ただ,これがきちんと面倒をみてくれた状況に遭遇したことがないので,検証できていません。ごめんなさい。
perldoc に書いてありますが,

package Class::Data::Inheritable;
use base qw(Class::Data::Reloadable);
1;

というファイル Class/Data/Inheritable.pm を作成し,mod_perl から見えるローカルな Perl クラスツリーに放り込むとシームレスに移行できます。
Class::Data::Reloadable は Inheritable と違って AUTOLOAD を定義しているため(しかもその実装がいまいちなのか)モジュールで存在しないメソッドを呼び出してもきちんとトラップできなくなりました。少なくとも現状ではおすすめできません。