- ベストアンサー
[perl] $xxx == 1 or $xxx == 5 or $xxx == 11 などと書くが面倒です
タイトルの通りです if文などで長々と書くのが面倒なのですが何かいい方法はないのでしょうか? 以前はif($xxx =~ /^1$|^5$|^11$/)などと書いていたのですが、正規表現を使うと処理が遅いんですね なるべく処理が軽くて簡潔な書き方がありましたら紹介してください
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
配列なら my @array = (1, 5, 11); if (grep {$_ == $xxx } @array) { ... } とかかな. ハッシュなら my %valid = ( 1 => 1, 5 => 1, 11 => 1 ); if ($valid{$xxx}) { ... } のような感じ (「ハッシュを使った重複チェック」のバリエーション). あ, if ($xxx == (1 or 5 or 11)) { ... } のような形は, (そのままじゃないけど) Perl6 でサポートされる予定になっています. いつのことかは知りませんが.
その他の回答 (3)
- guci-ok
- ベストアンサー率33% (49/146)
Perl 5.10.0では、switch文が新規導入されてます。 given ($foo) { when (/^abc/) { $abc = 1; } when (/^def/) { $def = 1; } when (/^xyz/) { $xyz = 1; } default { $nothing = 1; } }
お礼
今までなんでないんだろうと思っていたswitch文が導入されていたんですね ...の前にそもそもperl5.10が出ていたことすら知りませんでした ありがとうございました
- sakusaker7
- ベストアンサー率62% (800/1280)
モジュールを追加してもいいのなら。 use Perl::Junction qw(any); my @nums = (1, 5, 11); if ($xxx == any(@nums)) { } Perl6::Junction - Perl6 style Junction operators in Perl5. - search.cpan.org http://search.cpan.org/~cfranks/Perl6-Junction-1.30000/lib/Perl6/Junction.pm 速度的にどうなのかは知らない。
お礼
プログラムを提供する相手方がデフォルトのままで、と言われましたのでモジュールを追加することはできないようです 初めに書いておくべきでしたね、すみません Perl6からは上記の記述が使えるとのことなのでリリースが待ち遠しいです ありがとうございました
- Tacosan
- ベストアンサー率23% (3656/15482)
配列なりハッシュなりを使う... のかなぁ?
お礼
やっぱりそうなんですかね? if文の条件式のなかではforやforeachが使えない(?)みたいなので今のところ確認できていませんでしたがおそらくそれが正解なのでしょうね 個人的にはif($xxx == ( 1 or 5 or 11))のようなことができれば最高だったんですが^^; ハッシュはできるのかどうか確認していませんが記述が長くなりそうなので今のところ考えていません ありがとうございました
お礼
遅くなりました そういえばgrepがありましたね 最近mapの方ばかり使っていたので存在を忘れていました 今のところ簡略な書き方はできないようなので、記述が長くなりそうならgrepで対応しようと思います ありがとうございました