アプリ版:「スタンプのみでお礼する」機能のリリースについて

すごく基本的なことで恥ずかしいのですが、
条件を満たす配列の要素を結合し、元の配列に返す方法がわかりません。

foreach $aa (@aa) {
if ($aa =~ /-/){

}
}
とまでは考えたのですが・・・
どなたかお分かりの方、よろしくおねがいします。

A 回答 (3件)

ええと、結合というのがよくわかりませんが、それは


@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]');
にしたいのです。

補足日時:2001/05/13 19:23
    • good
    • 0

または、条件を満たすものを文字列として「結合」させ、


満たさない要素はそのままコピーする、というのなら
foreach $aa (@aa) {
if ($aa =~ /-/) {
$tmp .= $aa;
} else {
push(@bb, $aa);
}
}
push(@bb, $tmp);
などのやりかたがありますね。文字列結合して貯めていた$tmp
を最後に@bbの末尾要素として付け加える方法です。

[余談]
これこれこういうデータが、最終的にこうなってほしい、と
はっきり書いてあるとすごくわかりやすい質問となると思いますよ。
    • good
    • 0
この回答へのお礼

すばやい回答ありがとうございます。
pushを使ってできそうですので、考えてみます。

お礼日時:2001/05/13 19:44

ああ、そういうことをおやりになりたかったんですか。


もちろん、「[」が出てきたときに一時変数に入れ、「]」が
出てきたときにまとめてpushして次の要素に備える…でも
できますね。練習としてチャレンジしてみてもよろしいでしょう。

別解として、私なら
@aa = (join('', @aa) =~ /\[.*?\]/g);
ですかね。
ちょっと古いPerlなら
@aa = (join('', @aa) =~ /\[[^\]]*\]/g);
かな。わざと1行で書いてみました。解説が必要なら遠慮なく
おっしゃってください。しかしいろんな書き方ができますねえ、
Perlは。まさにThere Is More Than One Way To Do Itですな。
    • good
    • 0
この回答へのお礼

無理やりやったらなんとか出来ました(^^;
修正は来週の土日まで持越しです。
こんなのでもプログラミングができるなんて、
ほんとTIMTOWTDIのおかげですね。

お礼日時:2001/05/13 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!