• ベストアンサー

[perl] $xxx == 1 or $xxx == 5 or $xxx == 11 などと書くが面倒です

タイトルの通りです if文などで長々と書くのが面倒なのですが何かいい方法はないのでしょうか? 以前はif($xxx =~ /^1$|^5$|^11$/)などと書いていたのですが、正規表現を使うと処理が遅いんですね なるべく処理が軽くて簡潔な書き方がありましたら紹介してください

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

配列なら 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 でサポートされる予定になっています. いつのことかは知りませんが.

Googlegle
質問者

お礼

遅くなりました そういえばgrepがありましたね 最近mapの方ばかり使っていたので存在を忘れていました 今のところ簡略な書き方はできないようなので、記述が長くなりそうならgrepで対応しようと思います ありがとうございました

その他の回答 (3)

  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.4

Perl 5.10.0では、switch文が新規導入されてます。 given ($foo) { when (/^abc/) { $abc = 1; } when (/^def/) { $def = 1; } when (/^xyz/) { $xyz = 1; } default { $nothing = 1; } }

Googlegle
質問者

お礼

今までなんでないんだろうと思っていたswitch文が導入されていたんですね ...の前にそもそもperl5.10が出ていたことすら知りませんでした ありがとうございました

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

モジュールを追加してもいいのなら。 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 速度的にどうなのかは知らない。

Googlegle
質問者

お礼

プログラムを提供する相手方がデフォルトのままで、と言われましたのでモジュールを追加することはできないようです 初めに書いておくべきでしたね、すみません Perl6からは上記の記述が使えるとのことなのでリリースが待ち遠しいです ありがとうございました

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

配列なりハッシュなりを使う... のかなぁ?

Googlegle
質問者

お礼

やっぱりそうなんですかね? if文の条件式のなかではforやforeachが使えない(?)みたいなので今のところ確認できていませんでしたがおそらくそれが正解なのでしょうね 個人的にはif($xxx == ( 1 or 5 or 11))のようなことができれば最高だったんですが^^; ハッシュはできるのかどうか確認していませんが記述が長くなりそうなので今のところ考えていません ありがとうございました

関連するQ&A