• ベストアンサー

splitの結果をarrayに入れる

use strict; while (my $line = readline($WILD)) { my @lines = (); my ($column1, $column2, $column3, $column4) = split (/\t/, $line); } とした際に $column1~4を同じarrayつまり@linesに入れたいのですが、どうしたらできますか?

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ちょっとよくわからないけど my ($column1, $column2,$column3,$column4) = @lines = split (/\t/, $line); ってことですか?

spring921
質問者

補足

そうです。 そうした場合、@lines[0] = $column1ということになるのですか?

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

その他の回答 (2)

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.3

my @lines = split(/\t/, $line); これではダメなのでしょうか。

spring921
質問者

補足

回答ありがとうございます。 コラム毎に分けたかったので my @lines = split(/\t/, $line); とはしませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>そうした場合、@lines[0] = $column1ということになるのですか? そうですね。 $lines[0] と $column1 は、等しいということになろうかと思います。(コピーされる)

spring921
質問者

お礼

ありがとうございます。 ループ文を書いてもっと面倒な作業をしてしまう所でした。 迅速なアドバイスをありがとうございます。

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

関連するQ&A

  • 変数名(配列)の中の変数

    配列変数の名前の中に変数を入れたい場合、どのように記述すればいいのでしょうか? use strictを用いて、以下のように書いてみましたが、エラーが出て上手く動きません。 ループ x: 1-3 ループ y: 1-2 ${"answer$x"[$y]}=入力値 ←この部分を教えてください。    ループ閉 y ループ閉 x --------------------     answer1[1] answer1[2] answer2[1] answer2[2] answer3[1] answer3[2] とループを通るように、変数名を設定したいのですが、 エラーが出て実行ができません。 エラー:Can't use string ("answer1") as an ARRAY ref while "strict refs" in use at~ -------------------- 実際のプログラムは以下のように書いています。(該当部分のみ) for(my $x=1; $x<$num; $x++) { for (my $y=0; $y<$n; $y++) { my $y = ($x*$n)+$d; my @line = split(/\r/, $data[$y]); my @line0 = split(/\t/, $line[0]); ${"answer$x"[$y]} = $line0[0]; } } よろしくお願いします。

  • @{$protocol_name}

    usr strict; をつかって、 $protocol_name = "pppoe"; @{$protocol_name} のような使い方をしたいと思っていますが、 Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7 のようにエラー表示がでてしまいます。 どうしたら回避できるでしょうか。

    • ベストアンサー
    • Perl
  • パターンマッチ

    The remained line is shown below. Outline Lab's file A and B ファイルの中身は上記のようになっています。 サブルーチンを作り、パターンマッチで1行目以外を新しいarrayに入れようとしています。 以下のように書きましたが、空白行を選択してしまいます。どうしたら目的のように動くようになりますか? 宜しくお願い致します。 use strict; my @new_line = skip(@input) sub skip { my @lines = @_; my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); foreach my $line(@lines) { my $word = join ("|", @skip); if ($word =~ /^\$line$/) { push @new_line, $line; } } return @nnew_line; }

    • ベストアンサー
    • Perl
  • Can't use string ("0") as an ARRAY ref の原因について

    Perl 5.6を使っております。 Perlで原因不明なエラーに直面して困っております。 Can't use string ("0") as an ARRAY ref while "strict refs" というエラーが発生しているのですが これは良くあるミスとして何が原因でしょうか?

    • ベストアンサー
    • Perl
  • splitが思うように動きません助けて下さい。

    文字列から、明細と金額にわけてそこから検索できるプログラムを作っています。 テスト用に下記サンプルを作ったのですが、検索明細($moneyvalue)をコーヒーに した場合のみ、値が戻ってきませんでした。 そこで、中のsplit部分を表示するようにしたところ ★収入=-10000. ★電車=+1000. ★コ=. ★[ヒ=. ★[=+2000. ★雑誌=+240. ★=. ★その他=+500. 0 このように コーヒーの部分だけ上手くsplitが動いていないことが分かりました。 しかしココから手詰まりでどのように直せばいいのか分かりません。 想定される結果 ★収入=-10000. ★電車=+1000. ★コーヒー=+2000. ★雑誌=+240. ★その他=+500. 2000 このようにするにはどうしたらいいのか、分かる方おりましたら教えて下さい。 なお、当方はperl初心者です(涙) ----以下サンプルコードです---- #! /usr/local/bin/perl use Encode qw(encode_utf8); use CGI; my $moneyvalue = "コーヒー"; my $moneyline = "収入-10000,電車+1000,コーヒー+2000,雑誌+240、その他+500"; print &chkmoneyValue($moneyline,$moneyvalue); exit; #==============================================================================  sub chkmoneyValue { my ($moneyline , $moneyvalue)=@_; my $lp=0; my $flg=0; my @data= split(/[、,]/, $moneyline); my $datavalue = 0; foreach my $wdata (@data) { $wdata =~ s/\+/\,\+/; $wdata =~ s/\-/\,\-/; my @data2 = split(/[,]/, $wdata); print "★$data2[0]=$data2[1].\n"; if($data2[0] eq $moneyvalue){ $datavalue=$data2[1]; last; } } return $datavalue; }

    • ベストアンサー
    • Perl
  • split

    $msg = "aa,bb,cc"; という文字列から真ん中だけを取り出したいとき、 正規表現で、$2という風に取り出すのと、splitを使って my($t1,$t2,$t3) = split(/\,/$msg); として$t2で取り出すのとでは、処理の速度やメモリ使用率においてどちらが効率がいいのでしょうか? また、この場合は、$t1と$t3に無駄な代入が起こってしまいますが、これを解消する手立てはありますでしょうか?

    • ベストアンサー
    • Perl
  • join と split で文字列を操作する場合

    にんにちは、 うまく解決する方法を思いつかないので、質問させてください。 以下のスクリプトを実行すると、a から z を * で join して、 その後、* で split するかなと思ったら、split は正規表現として とらえるためでしょうか、エラーになります。 #! /usr/bin/perl -w use strict; my $a = '*'; my $b = join $a , ('a'..'z'); print "$b\n"; my @result = split /$a/,$b; print "$_\n" foreach @result; exit(); $a = '\*'; にすると、split したときに、 余計な \ が残ってしまいます。 任意の(書く時点では分からない)いろんな文字列で 連結したり分割したりする場合のスマートな方法が ありましたら、教えていただけませんか? Perl 5.8 です。お願いします。

    • ベストアンサー
    • Perl
  • not enough argument in 3rd line & does not show the right response

    test.datの中身は以下の通り。 line a b c d 1 1a 1b 1c 1d 2 2a 2b 2c 2d 文字と文字の間の空間はタブです。 open (my $SIM_FILE, "test.dat") or die "can't open the file\n"; my @cols = split /\t/, readline($SIM_FILE); my %simulation = &read(@col); close $SIM_FILE; while ((my $key, my $value) = each(%simulation)) { print "$key : $value\n"; } sub read { while (my $line = readline($SIM_FILE)) { chomp $line; next unless ($line); my @values = split /\t/, $line; if (@values == @cols) { my %tmp_hash; my $year for (my $i = 0; $i<@cols; $i++) { $tmp_hash{$cols[$i]} = $values[$i]; $year = $values[$i] if ($col[$i] =~ /^year$/i); } $simulation{$year} = \%tmp_hash; } } }

    • ベストアンサー
    • Perl
  • プログラムの高速化

    いつもお世話になっております.以下のプログラムをできるだけ高速化したいと思います. use warnings; use strict; my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; while (my $line = <FILE>) { my ($a,$b,$c,$d,$e,$f) = split( /,/ , $line ); my $name = $a.",".$b; open(NEWFILE, ">> ./out/$name.txt") or die "$dir: $!"; print NEWFILE $line; close(NEWFILE); } } close(FILE); closedir(DIR); やっていることは,ディレクトリ内のテキストファイルを読み込んでいって,splitでカンマ区切りにした,$a,$bをファイル名として下のディレクトリのoutに保存していくというものです. ファイル数が数千あり,各ファイルも数千行となるため,このソースを高速化する方法はありますでしょうか.ご回答よろしくお願いします.

    • ベストアンサー
    • Perl
  • Argument "\\n" isn't numeric in numeric comparison (<=>)

    初心者です。よろしくお願いします。 WindowsXP,ProffesionalでApache,LANの中だけでやっています。 以下の(1)、(2)が Apache の error.log に 非常にたくさん出てきて困っています。 (1) Argument "-" isn't numeric in numeric comparison (<=>) at C:/ApacheGroup/--- line 235., referer: http://--- (2) Argument "\\n" isn't numeric in numeric comparison (<=>) at C:/ApacheGroup/--- line 235., referer: http://--- このファイルは、だいたい以下のようになっています。 #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); # 45個のファイルから一行目を取り出します。 open(FILE, "../4k/4k01/+score.txt") or die "$!"; my $line1 = <FILE>; close(FILE); #------------------------------------------ open(FILE, "../4k/4k02/+score.txt") or die "$!"; my $line2 = <FILE>; close(FILE); #------------------------------------------ # これを繰り返します。 #------------------------------------------ open(FILE, "../4k/4k45/+score.txt") or die "$!"; my $line45 = <FILE>; close(FILE); #------------------------------------------ # 取り出した行の例は # 82,問題番号,1548,2009年07月15日 14時11分20秒 ( = $line1) # です。 # この行は、別の cgi ファイルで、以下のように書き込んだものです。 --------------------------------------------- # open(FILE, '<+score.txt') or die "$!"; # my @data = <FILE>;my ($e, $f , $g, $h) = split(/,/, $data[0]); # close(FILE); # my $data2 = $e +1; # open(FILE, '>+score.txt') or die "$!"; # print FILE $data2; # print FILE (",問題番号,$num,$year年$mon月$day日 $hour時$min分$sec秒\n"); ------------------------------------------- # これを @array に 入れます。 my @array = ("$line1,4k01","$line2,4k02", ---繰り返し--,"$line45,4k45"); # ソートして、表示します。 @array = sort { (split(/\,/,$b))[0] <=> (split(/\,/,$a))[0]} @array; #-- line 235 for my $val (@array){ #-- line 236 print $val . "<br>"; #-- line 237 } すると、--- 104,問題番号,1541,2009年07月15日 14時26分46秒 ,4k06 102,問題番号,1541,2009年07月15日 14時29分43秒 ,4k18 94,問題番号,1541,2009年07月15日 14時20分07秒 ,4k20 82,問題番号,1541,2009年07月15日 14時30分14秒 ,4k25 以下省略 --- と 表示されます。 error.log に表示されないようにするには、どうしたら、いいでしょうか? お教えください。

    • ベストアンサー
    • Perl