• ベストアンサー

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

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

  • Perl
  • 回答数4
  • ありがとう数5

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

  • ベストアンサー
  • 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

  • ストップ・ザ・XXXの用法と意味

    大きな選挙が近づくと、新聞などマスコミで ストップ・ザ・XXX というタイトルをよく見ます。 東京都知事選にからんでの『ストップ・ザ・石原』などという具合です。 これは、和製英語なのでしょうか、それとも正規の表現なのでしょうか? 例えば、アメリカのマスコミで『Stop the Bush!』という表現は使用されるのでしょうか? また、正しい表現である場合、ここでの『the』の文法的な意味を教えてください

  • 正規表現について

    あるファイルを読み込んで中に変数($xxx)が入っていたら 正規表現にて$xxxの値に変換する事は出来ますでしょうか? 試行錯誤しているのですが、上手くいかず困っています。 変数を正規表現にてマッチングさせるのも上手くいかないです。 ご教授お願いいたします。

    • 締切済み
    • PHP
  • Perlの正規表現

    Perlの正規表現についての質問です。 例) 899 YES Alt 0 0.000 pps 2.000 pps 4.000 pps 0 2 YES Alt 0 1.222 (space)-0.100 (space)3.000(space)0 103 NO Alt 0 3.333 % 0.000 % 0.000 % 0                ^^^^^ =====抜粋======================================== if($_ = ~ / Alt+(\s+)+0+(\s+)+(\S+)+(\s+)+(\S+)+(\s+)+(\S+)+(\s+)+(\S+)+(\s+)+(\S+)+(\s+)+(\S+)+(\s+)+(\S+){ print OUT "\n$5,"; ================================================= 上記のような文字列があるとして"^^^^^"だけを抜き出したい場合の正規表現はどのようにすればよろしいのでしょうか? 考えたif文では当たり前ですが2番目の(-0.100)が抜き出せません。また、検索できた順に抜き出し、出力したいので if文を二つ書くのは避けたいです。 どなたか教示ください。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 言語ではなく、正規表現のみで複数の条件を記述する方法 ?

    一つの条件の正規表現は書けるようになりましたが、 条件が重なった場合の対処の仕方がわかりません。 my $val = "12"; #数字のみ if($val =~ /^[0-9]+$/){ # match! } #0で無い if($val !~ /^0$/){ # match! } # 数字で0でない <---複数条件 ? # 言語でカバーするのではなく、正規表現のみ(1つの正規表現) # でANDやORやXORができるパターンの記述方法が知りたいです。 if($val =~ /^[0-9]+$/) && ($val !~ /^0$/){ # match! }

    • ベストアンサー
    • Perl
  • perlで正規表現(正の数)

    perlで正の数の数値を判定したいと思っています。 $testが0か1しか許容したくないので下記のように正規表現を作成しました。しかし、「-1」 を$testに設定すると何故か下記のif文をスルーしてしまいます。どのようにすればよいでしょうか? if($test !~ /[0-1]/) { # エラー }

    • ベストアンサー
    • Perl
  • pythonでのスクレイピング

    python2.7とBeutifulSoupで特定のHPからHTMLを取ってきて処理するプログラムを作っているのですが、正規表現でちょっと困っています。 soup=BeautifulSoup(HTML) s=soup.findAll("a"[,href=○○○、title=○○○]) でリンク<a>のHTMLを取得でき[]で絞込みが出来ます。さらに○○○には正規表現を使うことが出来ます。私はtilteにAを含まないもの、かつBをも含まないもの。という条件指定をしたいのですが、 正規表現で「もしくは「|」」は見当たるのですが「かつ」がみあたりません。 今は絞込みの後、if:continueを使ってBがあれば処理をパスするようにしていますが他によい方法は無いのでしょうか? beautifulsoupの使い方も合わせて教えていただけるとありがたいです。

  • 正規表現、htmlからリンクの相対パスのみ抜き出したい

    タイトルの通りhtmlから正規表現で 相対パスのリンクだけ抜き出したいです。 現在は「a href="([^/][^\"]+)」のようにやっています でもこれだと a href="http://xxx.xxx---" a href="mailto:---" a href="javascript:---" のような拾いたくないケースにもマッチしてしまいます。 途中に「:」が入るのをマッチさせなければいいんでしょうけど、 うまい表現が思いつきません。 このような条件でマッチさせる正規表現は どのようにすればいいでしょうか? よろしくお願いします。

  • perl:ループのカウンタ変数の値を保持したい。

    While文のループのなかにfor文でループをまわしているスクリプトなのですが、 forの中でカウンタ変数をつくり、ループ回数を計測しております。 またforの中である条件を満たした際に、lastでforを抜け、引き続きWhileのループを継続するという処理をしております。 $i=0; While(○○){ 処理1    for(××){ 処理2 $i++;      if($i >=100){  処理3       last; } } } ここで、一度for文のif文で一度forループを抜け、Whileでループをし、またforループに突入した際に、前回forループでカウントした$iの値を保持したまま、そのつづきから$iのカウンタを動作させたいのですが、$iの値はforループを抜けるとリセットしてしまいます。 このような場合、どうすれば$iの値を保持できますでしょうか。 お詳しい方、宜しくお願い致します。 ※ネストがうまく表現できず、みずらくてスミマセン。

    • ベストアンサー
    • Perl
  • 条件分岐での排他的な論理和について

    $aが 'abc' 'xyz' 以外の時に実行したい場合の条件分岐。 ついついこんな風に書いて間違えてしまいます。 if( $a ne 'abc' || $a ne 'xyz' ){...} 上記だと論理和左側のneが真を返すので、右側の条件を見てくれないから仕方なくunlessを使います。 unless( $a eq 'abc' || $a eq 'xyz' ){...} でも私、unlessが嫌いなんです。 if文で書く最も処理が高速でスマートな方法教えて下さい。 部分一致ではないので正規表現は使いたくありませんが 比較演算子を使うより正規表現を使ったほうが処理が高速な場合は正規表現も有りでお願いします。

    • ベストアンサー
    • Perl
  • 正規表現で単語以外に使われている文字を検索した

    タイトルどおりなのですが、英文のテキストがあり、 OCR処理をしているので、数字のゼロがオーになっている箇所があります。 その部分を検索したいのですが、 正規表現で単語以外に使われている文字(オーやエルなど)を 検索する方法というのはありますでしょうか? いろいろな正規表現サイトを見て勉強はしてみたのですが、 どうしても作ることができず質問させてもらいました。 どなたかご教授願います。

専門家に質問してみよう