電子書籍の厳選無料作品が豊富!

要素のない配列を消したいです。

do\n
be\n
usual\n
become\n
get\n
look\n
watch\n

このような複数行の文があり"a"が入っている行だけ配列に突っ込みたいと思っています。

自分が試した方法として。

@line = split(/\n/,$content);

とりあえず改行で区切り配列にぶち込んでいき。

foreach $line (@line){
      unless ($line =~/a/){
      $line = undef;
}
}

その次に"a"が入っている以外の配列にundefを入れるようにしていました。

しかしこれだとundefが入っている配列がたくさん出来てしまい納得がいきません。

要素のない配列を消したいです。

どなたかご教授お願いします。

A 回答 (5件)

私なら、結果保存用配列作って該当行をpushします。


@line = split(/\n/,$content);
@result = () ;
foreach $line (@line){
  if ($line =~/a/){
    push @result, $line ;
  }
}
    • good
    • 0
この回答へのお礼

非常に感謝です。ありがとうございます。
こんなに簡単にできるなんて感激です。

お礼日時:2011/11/06 10:26

配列に収めたときの\n の扱いが気になりますが(要素に含まれる含まれない?)、


含まれないものとして、

use strict;
use warnings;
use v5.12;

my $content = "
do
be
usual
become
get
look
watch
";

my @ary = grep {index($_, 'a') >= 0} split "\n", $content;
say join(':', @ary);

usual:watch

とこんな感じ。
    • good
    • 0
この回答へのお礼

お答えいただきありがとうございます。
いろいろなやりかたがあるもんだと勉強になります。

お礼日時:2011/11/06 10:31

本題は終わっていると思うので余談だけ.



「要素のない配列」っていうと, 普通は
@emptyArray = ();
の @emptyArray のようなものを想像するよね.

あと, 「undefが入っている配列」だと
@array = (undef);
とか
@array = (undef, 'a', undef, undef, 3.4);
はそうだね. で, こういうのがたくさんある状況が「undefが入っている配列がたくさん」でしょ?
    • good
    • 0
この回答へのお礼

回答有難う御座います。
自分の勉強不足です。
もう少しスマートに質問できればよかったですね。

お礼日時:2011/11/06 10:35

「undefが入っている配列がたくさん出来る」というのが何を意味するのかわからんし「要素のない配列を消したい」というのもなんのこと

やらだが grep?

この回答への補足

grep演算子勉強になりましたありがとうございます。

質問文が少し変なのでしょうか。申し訳ありません。
上の例で言いますと。

do\n
be\n
usual\n
become\n
get\n
look\n
watch\n


を配列にすべて入れ、"a"を含まないものにundefを入れていきます
foreachで改行しながら配列の中身をprintしていくと


usual



watch
このように表示されてしまいます。

usual
watch
↑理想はこの形です

質問のようなやりかただと配列の要素の数が7になります。
私がやりたいのはこの場合だと要素の数が2になり、ほかの要素は削除したいのです。文章が汚くて申し訳ないです。

grepで完結出来そうですがもう少し質問受付ます。

補足日時:2011/11/06 00:26
    • good
    • 0
この回答へのお礼

質問文少しおかしな文章になっていたみたいです。お許し下さい。
回答ありがとうございます。感謝です。

お礼日時:2011/11/06 10:39

indexで負が戻れば文字が無いと判断してよいのでは?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
小生勉強になりました。

お礼日時:2011/11/06 10:40

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