• ベストアンサー

正規表現を使ってコードを短くしたいのですが

宜しくお願いします 正規表現を使って以下のコードを短く書くにはどうしたらいいか教えて下さい $_ = "$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";

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.2

自分ならこんな感じで。 $_ = join('<>', $no, (map{$in{'arg_'.$_}} (0..10)), $in{P1}, $in{P2}, $in{P3}, "\n", ); P1~P3は仮称なのかなと、思ってバラで書きましたが arg_Xと同じように本当にそういう名前なら (map{$in{'P'.$_}} (1..3)), みたいにまとめる事もできます。

goodjob_001
質問者

お礼

steel_grayさんご丁寧に解説して頂きまして本当にありがとうございました 思い通りの結果を得る事ができました、 <>をjoinコマンドで連結すれば出来るかも、そこまでは思いついたのですが 各々の要素をどうして切り出したらよいのか分かりませんでした mapコマンドの使い方大変参考になりました、一つの要素から複数の戻り値を得られ ますね勉強になりました_(--)_

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

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";

goodjob_001
質問者

お礼

leaz024さん、又違った着眼点からのご意見ありがとうございます さすがPerlという印象を受けました、変数の扱いには色んなスタイルで柔軟に 対応できるんですね、キーリストの多少にあわせて使い分けするという方法等 大変参考になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • trisagion
  • ベストアンサー率68% (15/22)
回答No.1

正規表現では良い案が浮かばなかったので、他の方法です。参考にでもなれば良いのですが。 $_ = 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); どれもコードはあまり短くなってないですね。

goodjob_001
質問者

補足

どうもありがとうございます 十分コード自体は短くなっていると思います 正規表現が使えるかもしれないという考えで質問させて頂いたので、少し質問の内容 が変わるかもしれませんがご勘弁下さい 実は$_に代入したい変数は連番部分だけではありませんでして $_ = "$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'}がついておりますので もしこの場合でしたらどのようなコードの書き方になるのか、御教授お願いします

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 正規表現について教えてください。

    正規表現について教えてください。 JavaScriptでプログラミングを行っています。 その中で文字列に対しゼロサプレスを行いたいと思い 調べた結果、正規表現を使用する以下のコードで 実現可能なことが分かりました。 val.replace(/^0+([0-9]+.*)/, "$1") コードを記述し実行すると確かに可能なのですが 正規表現を調べてみても何故これでゼロサプレスが可能なのか よく理解できませんでした。 申し訳ありませんが初心者でも理解できるように説明して頂けないでしょうか。 宜しくお願いします。

  • 正規表現について

    以下のようなファイル名にマッチする正規表現は [ファイル名] 20080303_001test.txt 20080303_002test.txt [正規表現] ^20080303_(001|002)test\.txt$ であってますでしょうか。 ※特に()内の、"001"と"002)test\.txt"のどちらかにマッチすれば良いという条件になってないか心配です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • (?:系の正規表現

    perlの正規表現で以下の意味は、ABC01かABC99のみマッチするということでよいでしょうか? /^ABC(?:01|99)$/ (?:は$1など使用しない場合に用いるで正しいでしょうか? (?系の正規表現について知識不足ですが、一覧や詳しい書籍がありましたら教えてください。 昔、 /^ABC01|99$/ とかいて、ABC99がマッチせず、99がマッチしたので、|を使うときは、()を書いたのですが$1など変に作用させたくなかったので、最近(?:系の存在を知ってもっと詳しく知りたくなりました。 (?:はPerlの正規表現特有のものでしょうか?

    • ベストアンサー
    • Perl
  • [vb.net]正規表現でスクリプトを解析したい

    自前のスクリプト言語を記載した次の様なテキストファイルをSub毎に処理するために Script.txt ------------------------------------------------- #sub1{ code { code }; }; #sub2{ code }; #sub3{ }; ------------------------------------------------- [EOF] 正規表現を使って次の様に配列に分解できれば熱いと思ってやってみたのですが、なかなかうまくできません。方法などありましたら、ご教授ください。 ↓望むすがた… dim$(0)=" #sub1{ code { code }; }; " dim$(1)=" #sub2{ code }; " dim$(2)=" #sub3{ }; " 駄目だった正規表現:(\#.*\{)(\s*.*) なかなかうまくいきません。よろしくお願いします。開発言語はVB.net 2003です。

  • 正規表現について

    正規表現'|^(.+?)((.*?))$|'の^の前の|と$の後の|にはどんな意味があるのでしょうか。

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

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

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

    if(str.match(/^[-+]?\d+$/)) alert("matched !"); この正規表現(先頭に+か-かをつけてあとは数字という表現です。)で 全体が//で囲まれてますがどうしてでしょうか? オプションとしてgとかiがあるのならわかるのですがないみたいです。 また^と$をつかった表現で例えば^AB$とした場合どうしてACBは含まれないのでしょうか?

  • 正規表現の\Gの使い方

    正規表現の\Gの使い方で質問です。 ものの本によると、\Gをつけるとパターンマッチは前回の処理の続きから行われるとのこと。すると以下のようなコードなら、 ta tb tc td te となるべきと思われます。 ところが実際は ta ta ta ta ta 明らかに\Gは無視されて、毎回$testの先頭から処理が行われています。 どこに間違いがあるのでしょうか。 #! c:/perl/bin/perl $test='tatbtctdtetftg'; for($i=0;$i<5;$i++) { $test=~/(\Gt.)/; print $1."\n"; }

  • 正規表現で

    例えば 1234# 2345$ 2467# 2579$ 等の4桁の数値の後、#か$がくる文字列があるとして この数値の部分だけを抜き出す正規表現って可能でしょうか? 記号を含めていいなら [\d]{4}[#|\$] な感じになると思うのですが 数値のみ、1234,2345,2467,2579といった感じで選択したいのです。 宜しくお願いします。

  • 漢字コードの正規表現は?

    SJISコードのテキストファイルをエディタで開いているのですが 漢字コードの正規表現はどのようにかくのでしょうか? 一応第一水準のみのつもりで ([ぁ-腕| ])+ ([亜-腕| ])+ とかやっているのですがこれだと「澤」など簡単な漢字が含まれなかったりします。どのように判別したらよいでしょうか?

写真を印刷できない
このQ&Aのポイント
  • Excelなどの文章は印刷できるが、スマホからダウンロードした画像をPCに取り込んでの印刷ができない
  • お使いの環境はWindows10で、接続はUSBケーブルで行っています
  • 質問はブラザー製品に関するものです
回答を見る