- ベストアンサー
配列の要素を結合する方法
すごく基本的なことで恥ずかしいのですが、 条件を満たす配列の要素を結合し、元の配列に返す方法がわかりません。 foreach $aa (@aa) { if ($aa =~ /-/){ } } とまでは考えたのですが・・・ どなたかお分かりの方、よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ああ、そういうことをおやりになりたかったんですか。 もちろん、「[」が出てきたときに一時変数に入れ、「]」が 出てきたときにまとめてpushして次の要素に備える…でも できますね。練習としてチャレンジしてみてもよろしいでしょう。 別解として、私なら @aa = (join('', @aa) =~ /\[.*?\]/g); ですかね。 ちょっと古いPerlなら @aa = (join('', @aa) =~ /\[[^\]]*\]/g); かな。わざと1行で書いてみました。解説が必要なら遠慮なく おっしゃってください。しかしいろんな書き方ができますねえ、 Perlは。まさにThere Is More Than One Way To Do Itですな。
その他の回答 (2)
- Head_Syndicate
- ベストアンサー率64% (73/113)
または、条件を満たすものを文字列として「結合」させ、 満たさない要素はそのままコピーする、というのなら foreach $aa (@aa) { if ($aa =~ /-/) { $tmp .= $aa; } else { push(@bb, $aa); } } push(@bb, $tmp); などのやりかたがありますね。文字列結合して貯めていた$tmp を最後に@bbの末尾要素として付け加える方法です。 [余談] これこれこういうデータが、最終的にこうなってほしい、と はっきり書いてあるとすごくわかりやすい質問となると思いますよ。
お礼
すばやい回答ありがとうございます。 pushを使ってできそうですので、考えてみます。
- Head_Syndicate
- ベストアンサー率64% (73/113)
ええと、結合というのがよくわかりませんが、それは @aa = ('aaa', 'abc-d', 'sss', 'xx-yy', 'z-'); だったとき @aa = ('abc-d', 'xx-yy', 'z-'); と/-/にマッチするものだけにしたい、という意味でしょうか? ならば、別の配列を用意してそこに条件が合ったものだけコピーして、 最後に元の配列にまるごと移すようにするのはどうでしょう。 foreach $aa (@aa) { if ($aa =~ /-/) { push(@bb, $aa); } } @aa = @bb; なお、これと同じことを1行で書けるgrepというものがあります。 @aa = grep {/-/} @aa; どちらでもお好きなほうをどうぞ。 もしお使いの本にgrepの解説がないのなら、それはかなり昔の書物なので 廃棄しても基本的に問題ありません。
補足
回答ありがとうございます。 説明不足で申し訳ありません。 具体的にいうと、 @aa = ('[abc', 'def]', '[ghi]', '[jkl', 'nmo', 'pqr]'); を @aa = ('[abcdef]', '[ghi]', '[jklnmopqr]'); にしたいのです。
お礼
無理やりやったらなんとか出来ました(^^; 修正は来週の土日まで持越しです。 こんなのでもプログラミングができるなんて、 ほんとTIMTOWTDIのおかげですね。