Perlで要素のない配列を削除したい方法

このQ&Aのポイント
  • Perlで要素のない配列を削除する方法について教えてください。
  • 以下のようなコードを試しましたが、うまく動作しませんでした。
  • 要素のない配列を削除する効果的な方法を教えてください。
回答を見る
  • ベストアンサー

要らない配列を無くしたい。Perl

要素のない配列を消したいです。 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が入っている配列がたくさん出来てしまい納得がいきません。 要素のない配列を消したいです。 どなたかご教授お願いします。

  • Perl
  • 回答数5
  • ありがとう数6

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

私なら、結果保存用配列作って該当行をpushします。 @line = split(/\n/,$content); @result = () ; foreach $line (@line){   if ($line =~/a/){     push @result, $line ;   } }

teachmegoogle
質問者

お礼

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

その他の回答 (4)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

配列に収めたときの\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 とこんな感じ。

teachmegoogle
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

本題は終わっていると思うので余談だけ. 「要素のない配列」っていうと, 普通は @emptyArray = (); の @emptyArray のようなものを想像するよね. あと, 「undefが入っている配列」だと @array = (undef); とか @array = (undef, 'a', undef, undef, 3.4); はそうだね. で, こういうのがたくさんある状況が「undefが入っている配列がたくさん」でしょ?

teachmegoogle
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

teachmegoogle
質問者

お礼

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

teachmegoogle
質問者

補足

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で完結出来そうですがもう少し質問受付ます。

  • u-bot
  • ベストアンサー率58% (1736/2988)
回答No.1

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

teachmegoogle
質問者

お礼

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

関連するQ&A

  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • Perl 配列の質問です

    @a=(); 配列@aに空を代入する。 print $#a+1."\n"; 配列名aの前に$#があるので要素の添え字の最大値がくるが空なので-1がかわりに入り-1+1で0となり改行が入る。 @a[5]=10; ここの訳がわかりません。 @a[5]とはどのように読むのでしょうか。 意味はどのような意味になるのでしょうか。

    • ベストアンサー
    • Perl
  • perlでの配列について

    配列の配列について教えてください。 以下のようなテキストから値を取得し、A,B,Cの値をそれぞれ別の配列に格納し、A,B,Cの平均値を出す処理を行っているとします。 ----- A=100 B=200 C=300 A=110 B=210 : ----- 現状、以下のような状態です。 @arrayA=(); @arrayB=(); @arrayC=(); : (テキストを読み込み) : ・読み込んだ行がA=XXXならarrayAにpush push(@arrayA,"100"); ・読み込んだっ行がB=XXXならarrayBにpush push(@arrayB,"100"); : (各配列の要素の平均値を出す) このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。 Webで初期値を入れた形で説明しているのはよくみるのですが、今回のように空の配列に値をいれていくにはどうすればよいのでしょうか?(そもそも宣言の仕方もわかりません)。 また、配列の配列?とした場合、以下のような処理はできるのでしょうか? (1)配列の1つ目の要素(の配列)にpushする(現状でのarrayAにpushに該当) push(@arrayAll[0],"test");

  • perlのpushについてです。

    お世話になります。perlのpushについてです。 データファイルを読み@XXに入れます。 実際はもうちょっと複雑なのですが、 foreach $DATA (@XX){$CHECK=''; ($A,$B)=split(/\,/$DATA); # $Bには改行コードを含んでいます。 if ($A==1){$A=2;$CHECK=1;} if ($A==2){$A=3;$CHECK=1;} if ($A==3 and $B==1){$A=1;$B=9;$CHECK=1;} if ($CHECK==1){ push(@N,"$A,$B");}else{ push(@N,"$DATA"9;} } として、@Nをファイルに出力すると1行目を除き、 行の先頭になぜか空白が付いてしまいます。 別のスクリプトで読むときに数字以外は削除というような 文を加えても削除できず、 if ( $A eq '1'){・・・・ としたときにマッチしてくれません。 よって、この最初にファイルに書き出す際に空白が付かないように したいのですが、何故付いてしまうのか?、回避方法は? ご指導頂けたら幸いです。 付いてしまいます。

    • ベストアンサー
    • Perl
  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • [python] 関数から配列を戻すには?

    グローバル変数(配列)の値を変えたいと思います。 ------------- line = [] def tmp_read(self, *out_line): f = open('tmp.txt') lines2 = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる) f.close() # lines2: リスト。要素は1行の文字列データ for line in lines2: print line, print *out_line = lines2 return *out_line tmp_read(self, *line) print line     ← 配列Lineの内容を確認する ------------- この「line」には、文字列を含む配列を入れる予定です。 lines2で得られた値を、戻せば出来そうな気もしますが巧くいきません。 どのように修正すれば酔いか、教えて頂けませんか。

  • Perlで早いプログラムを作りたい

    perlの初心者です。 一つの配列の構成要素が100~1000のものが1000個ほどあります。 ある配列の一つの要素が他の配列に何個づつあるかを調べています。 作ったプログラムは次の三つですがとても遅く、もっと早い方法があれば 教えてください。 1.foreach $a(@hairetsu1){     $n=0;     foreach $b(@hairetsu2){       $n++ if $a =~ $b;     }   } 2. foreach $a(@hairetsu1){     $n=grep(/$a/,@hairetsu2);  } 3. for($i=0;$i<length(@hairetsu1);$i++){    $n=0;    for($j=0;$j<length(@hairetsu2);$j++)      $n++ if $hairetsu1($i) =~ $hairetsu2($j);    }  } 上が一番早く下に行くほど遅いですがあまり違いはありません。 よろしくお願いします。

  • Rubyで配列をソートする

    15(tab)5634(改行) 24(tab)4446(改行) 24(tab)8357(改行) 24(tab)3287(改行) 56(tab)5465(改行) 56(tab)1324(改行) 56(tab)7544(改行) 上記のように1行にtabで区切られた2つの数値が並んでいるテキストファイルがあります。 このファイルを、Rubyを使って1列目が同じ数字の行ごとにソートしたいのですが、できなくて困っています。 上の例でしたら、1列目が24の3行を2列目の数値をキーとしてソート、1列目が56の3行を2列目の数値をキーとしてソートするということです。 一行ずつ読み込んで、array = line.split(/\t/)でタブでくぎって配列に格納するスクリプトを書いていたのですが、どうしてもできないので、力を貸していただけないでしょうか。 よろしくお願いします。

  • 配列の使い方について

    二つ教えてください。 1.二次元配列で例えばファイルの一行目をグループ[1]に、二行目はグループ[2]に、三行目はグループ[1]に、四行目はグループ[3]に、みたいな感じでファイルの値を任意のグループ[n]に代入していきグループ分けする方法を教えてください。 2.上のような方法で作った配列を例えばグループ[2]にグループ[5]の要素をすべてつけたし、グループ[5]は削除する方法を教えてください。

  • 改行コードから改行コードまでをスプリットして配列に取り込む方法を教えて

    改行コードから改行コードまでをスプリットして配列に取り込む方法を教えてください。 ファイル「sample.txt」の中に 文字列A 文字列B 文字列C 文字列D 文字列E 文字列F 文字列G と書かれていたとします。このファイルを開き、配列@listに @list = 文字列A\r\n文字列B\r\n文字列C\r\n,文字列D\r\n文字列E\r\n,文字列F\r\n文字列G\r\n となるようなコードを教えてください。 要は二重改行コード\r\n\r\nをスプリッタとして複数の行を配列に取り込む方法です。 よろしくお願いします。

    • ベストアンサー
    • Perl