• ベストアンサー

if($key){ ($key eq 'aaa') || ~~を複数縦に記述したい

sub AAA {my($key)=@_; if($key){ ($key eq "aaa") || ($key eq "bbb") || ($key eq "ccc") || ($key eq "ddd") || &Error("$keyが不正です。"); } } のような形があるとして、$key eq "" の数が50個近くあるような場合、横に表示するのではなく縦に ($key eq "aaa") || ($key eq "bbb") || ($key eq "ccc") || ($key eq "ddd") || と、見栄えよく表示させたいのですが どのように記述すればよいのでしょうか。 また代替案などありましたらあわせてご教授頂けますと幸いです。

  • taku0
  • お礼率80% (160/199)
  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

正規表現で $key =~ /^( aaa| bbb| ccc| ddd)$/x || &Error("$keyが不正です。");

taku0
質問者

お礼

正規表現を使う方法をご掲示頂けまして有難うございます。 縦に表示し簡素に見やすくて分かりやすいですね。 なるほどー。と思わされる感じで勉強になります。 有難うございました。

その他の回答 (2)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

自分なら、連想配列にキーとして代入しておき、目的のキーで連想配列に値があるかで判定させます。 こんな感じ: %valid_key_table = map { $_ => 1; } qw|aaa bbb ccc ddd|; &Error() unless defined $valid_key_table{ $key };

taku0
質問者

お礼

連想配列に入れておいたのを、目的のキーで値があるかを判定させるんですね。 参考になります。 mapの使い方が分かったような気がします。 ご教授頂きまして有難うございます。

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

例えば $key として有効な文字列を @validkeys という配列に入れて if (grep($_ eq $key, @validkeys)) { ... } がみやすいんじゃないでしょうか.

taku0
質問者

お礼

配列に入れておいたkeyをgrepで検索する形でも可能なんですね。そのようにも出来るとは思いませんでした。 参考にさせていただきます。有難うございました。

関連するQ&A

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • 正規表現で一つ目の区切り文字で区切りたいのですが・・・

    aaa/bbb/ccc/ddd aaa/bbb/ccc/ddd/eee aaa/ccc/ddd $a=~/(.*)\/(.*)/; $1はそれぞれ aaa/bbb/ccc aaa/bbb/ccc/ddd aaa/ccc と成ってしまいます。 このように 「最後の/」で分けられてしまいます。 一つ目の/で分けるにはどうしたらよいでしょうか。

    • ベストアンサー
    • Perl
  • 【エクセル】空セルを埋める方法

    お世話になります。 下記のような表があります。 1行目:AAA,BBB,CCC,DDD 2行目:空セル,BBB,CCC,DDD 3行目:空セル,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:空セル,BBB,CCC,DDD ・・・ こんなパターンの行が結構あります。 空セル部分を下記のように埋めたいのですが 1行目:AAA,BBB,CCC,DDD 2行目:AAA,BBB,CCC,DDD 3行目:AAA,BBB,CCC,DDD 4行目:aaa,BBB,CCC,DDD 5行目:aaa,BBB,CCC,DDD てっとり早く埋める方法ありませんか? いまは、【ctrl+↓】 ⇒【↑】⇒【ctrl+D】を延々繰り返しています。 宜しくお願いいたします。

  • Excelの関数に詳しい方、お願いします。

    わかりづらい説明かもしれませんが、よろしくお願いします。 例として、 AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF AAA*BBB*CCC*DDD*EEE*FFF ・ ・ ・ といった文字列がエクセルの先頭列A1~A100までずらりと並んでいるとします。 各アルファベットには任意の数字(日付など)が入るとして、この並んだ百件のデータからCCCの部分の最大値を表示するための適切な関数があれば教えていただけないでしょうか? 現在少々急いでいるため言葉足らずで申し訳ありませんが、よろしくお願いいたします.

  • MySQLで1つの項目に対しての集計

    1つの項目内にカンマ等で区切られたデータがあります。その数を下の2種類のように集計する事って可能でしょうか? 例) KEY  項目 ----------------- 1   AAA,BBB,CCC 2   AAA,CCC 3   CCC,DDD 1) ----------------- 1  3(件) 2  2(件) 3  2(件) 2) ----------------- AAA  2(回) BBB  1(回) CCC  3(回) DDD  1(回) よろしくお願いします。

  • 正規表現

    正規表現 a=/home/aaa/bbb/ccc/ddd.abc echo ${a%.abc}実行したら /home/aaa/bbb/ccc/ddd が表示されますが、 home/aaa/bbb/ccc/ddd に表示したいですがうまくいきません。 ネットで正規表現さがしてみたけど理解できませんでした。 教えていただきたいです。なお 説明文も簡単に記入していただいたら幸いです。

  • GoogleMap API キー取得について

    お世話になります。 GoogleMapをひとつのサイトで複数利用したいので、APIページでフォルダごとに申し込みました。 たとえは、 http://aaa.jp/bbb/ccc/ccc.html http://aaa.jp/bbb/ddd/ddd.html といった具合です。 GoogleMapを作るのは初めてなので、ひとつずつ確実にと、まず、ccc.htmlを作り、マーカーもインフォウインドもうまくできました。 次に、ddd.htmlのためにAPI Keyをとり貼り付けたのですが 「使用されているキーは他のウェブサイトに登録されています。このサイト用のキーを取得してください。」 と表示されます。 キー取得の注意事項に同一フォルダ内で複数ファイルには利用できないとあったのでフォルダ分けしているのですが・・・ どうしたらいいでしょうか?

  • 異なるキーで取得したデータの合成

    SQLに関して質問です。 以下のようなテーブルA、Bがあった場合、 【テーブルA】  カラム1  カラム2  ------------------------  AAA   CCC  BBB   DDD 【テーブルB】  カラム3  カラム4  ------------------------  AAA   1  BBB   2  CCC   3  DDD   4 次のような結果を得るにはどのようなSQL文を記述すれば良いでしょうか? 【求める結果】  カラム1  カラム2 カラム4(1) カラム4(2)  ---------------------------------------------------  AAA   CCC    1      3  BBB   DDD    2      4 非常に初歩的な質問かもしれませんが宜しくお願いいたします。

  • 【ruby】subの使い方

    文字列から最初の/~/までを切り取りたいです。 たとえば、"/aaa/bbb/ccc"の場合、"/aaa/"です。 そこで、subを使って以下の様に書いてみました。 puts "/aaa/bbb/ccc".sub(/(\/.*?\/)/,'\1') しかし、/aaa/bbb/cccと表示され、期待した結果が得られません。 以下の様にすると、 /(\/.*?\/)/=~"/aaa/bbb/ccc" puts $1 期待通り/aaa/が表示されるのですが、正規表現はsubのときと同じだし、 subの使い方の何が悪いのかわからなくなってしまいました。 ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • Perlの正規表現について

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

    • ベストアンサー
    • Perl