- ベストアンサー
正規表現を使ってコードを短くしたいのですが
宜しくお願いします 正規表現を使って以下のコードを短く書くにはどうしたらいいか教えて下さい $_ = "$in{'arg_0'}<>$in{'arg_1'}<>$in{'arg_2'}<>$in{'arg_3'}<>$in{'arg_4'}<>$in{'arg_5'}<>$in{'arg_6'}<>$in{'arg_7'}<>$in{'arg_8'}<>$in{'arg_9'}<>$in{'arg_10'}<>\n";
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
自分ならこんな感じで。 $_ = join('<>', $no, (map{$in{'arg_'.$_}} (0..10)), $in{P1}, $in{P2}, $in{P3}, "\n", ); P1~P3は仮称なのかなと、思ってバラで書きましたが arg_Xと同じように本当にそういう名前なら (map{$in{'P'.$_}} (1..3)), みたいにまとめる事もできます。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
1つのハッシュから複数の値を取り出すには、「スライス」を使うのも手です。 ハッシュのスライスは「@ハッシュ名{キーのリスト}」というもので、 キーリストに対応する値のリストが得られます。 例えば、%in から a,b,c の値を取り出す場合、単純に書くと @abc = ($in{a}, $in{b}, $in{c}); ですが、スライスを使うと @abc = @in{qw/a b c/}; と書けます。 ※ qw/a b c/ で、('a', 'b', 'c') と同じ意味になります。 質問のコードでスライスを使うと、次のように書けます。 $_ = join "<>", $no, @in{ map("arg_$_", 0..10), qw/P1 P2 P3/ }, "\n"; キーリストのうち、"arg_0"~"arg10" は map を使って生成していますが、 "P1"~"P3" のように数が少ない場合や、特定のパターンでないものは、 前述の qw/ / を使うとよいでしょう。 また、このようなコードが点在する場合、キーリストは予め配列として 用意しておくとよいでしょう。 # 前準備 @keys1 = (map("arg_$_", 0..10), qw/P1 P2 P3/); # 使用ヶ所 $_ = join "<>", $no, @in{@keys1}, "\n";
お礼
leaz024さん、又違った着眼点からのご意見ありがとうございます さすがPerlという印象を受けました、変数の扱いには色んなスタイルで柔軟に 対応できるんですね、キーリストの多少にあわせて使い分けするという方法等 大変参考になりました。
- trisagion
- ベストアンサー率68% (15/22)
正規表現では良い案が浮かばなかったので、他の方法です。参考にでもなれば良いのですが。 $_ = join("<>",map{$in{$_}}sort{(split(/_/,$a))[1] <=> (split(/_/,$b))[1]}keys %in); ハッシュのキーを連番部分でソートして、そのキー配列を元にハッシュの値の配列にし、"<>"で連結させる方法です。 解り易く記述すると下のコードみたいな感じです。 @key = sort{(split(/_/,$a))[1] <=> (split(/_/,$b))[1]}keys %in; @value = (); foreach my $key(@key){ push @value,$in{$key}; } $_ = join("<>",@value); どれもコードはあまり短くなってないですね。
補足
どうもありがとうございます 十分コード自体は短くなっていると思います 正規表現が使えるかもしれないという考えで質問させて頂いたので、少し質問の内容 が変わるかもしれませんがご勘弁下さい 実は$_に代入したい変数は連番部分だけではありませんでして $_ = "$no<>$in{'arg_0'}<>$in{'arg_1'}<>$in{'arg_2'}<>$in{'arg_3'}<>$in{'arg_4'}<>$in{'arg_5'}<>$in{'arg_6'}<>$in{'arg_7'}<>$in{'arg_8'}<>$in{'arg_9'}<>$in{'arg_10'}<>$in{'P1'}<>$in{'P2'}<>$in{'P3'}<>\n"; と前後に$noと$in{'P1'}<>$in{'P2'}<>$in{'P3'}がついておりますので もしこの場合でしたらどのようなコードの書き方になるのか、御教授お願いします
お礼
steel_grayさんご丁寧に解説して頂きまして本当にありがとうございました 思い通りの結果を得る事ができました、 <>をjoinコマンドで連結すれば出来るかも、そこまでは思いついたのですが 各々の要素をどうして切り出したらよいのか分かりませんでした mapコマンドの使い方大変参考になりました、一つの要素から複数の戻り値を得られ ますね勉強になりました_(--)_