• ベストアンサー

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
  • 回答数3
  • ありがとう数11

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

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

プログラムの内容以前の問題ですが: read を呼出すときに引数に @cols を渡す意味もわからない (read の中では引数を使っていない) ですし, 返り値を %simulation に代入する意味もわかりません (read の中で %simulation に対する実行を行っている). その辺をきれいにしてみてください. なんとなく手元では my %simulation = &read(@cols); の行を分けるだけで動いているように見えますが自身なし.

striatum
質問者

お礼

色々 きれいにしてみたところ 動くようになりました。 ありがとうございました。

その他の回答 (2)

回答No.3

$line=readline(*SIM_FILE); じゃないですか? openのときに$をつけずに open (SIM_FILE, "test.dat") or die "can't open the file\n"; としないといけないかも。 引数や戻り値、ファイルをオープンするタイミングや、リードするタイミングを整理した方が良いのは賛成 (必要があればseekしなければなりません)

striatum
質問者

お礼

整理したところ無事 動きました。 ありがとうございました。

  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

my %simulation = &read(@col); を my %simulation = &read(@cols); に。

striatum
質問者

お礼

回答ありがとうございます。タイプミスしました。 直したのですが、いぜんとして働きません・・・。

関連するQ&A

  • ファイル内で重複している数と重複した回数

    開くファイルの中身は数字のみ。 1行に一つずつ数字が入っており、 それが何行にもわたり続くファイルです。 ファイル内で重複している数と重複した回数を数えたいです。 以下のようなスクリプトを使ったのですが、 結果を表示させようとすると global symbol"$hash" requires explicit package name. にエラーが出ます。 何故なのでしょうか。 use strict; # ファイルを開く my $INPUT_FILE; open ($INPUT_FILE, ">numbers.dat") or die “Can't open. \n”; # それぞれの数をハッシュキーにする。そして対応するバリューを同じ数を見つける度毎にカウントアップする。 my %hash = (); while (my $line = readline($INPUT_FILE)) { chomp $line; $hash{$line}++; } # キーでソートし、結果を表示する。 my @keys = sort keys %hash; foreach my $key (@keys) { print “$key is found $hash{$key} times\n”; } close ($INPUT_FILE) or die “can't close the file\n”;

    • ベストアンサー
    • 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
  • splitの結果をarrayに入れる

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

    • ベストアンサー
    • Perl
  • エクセルで編集したCSVファイルを読み込むときに

    よろしくお願い致します。 エクセルで編集したCSVファイルを読み込み、HTMLとして表示するCGIがあります。 エクセルでCSVファイルを編集すると最後の項目の後にカンマ(,)が付かないのですが、 使用しているCGIでは、カンマがないと行が改行されたとみなされません。 行の最後にカンマがなくても行を改行させるには、どのようなコードを追加すればよいのでしょうか? CGIのCSVファイルの読み込みする部分のコードは以下のようになっています。 # ログファイル読み込み my $LOG_FILE = 'log.csv'; my $io = IO::File->new($LOG_FILE, 'r') or die $!; flock($io, 1); while(my $line = $io->getline) { push @ids, (split(/,/, $line))[0]; push @new_checks, (split(/,/, $line))[1]; push @dates, (split(/,/, $line))[2]; push @contents, (split(/,/, $line))[3]; push @contents2, (split(/,/, $line))[4]; push @contents3, (split(/,/, $line))[5]; push @contents4, (split(/,/, $line))[6]; push @contents5, (split(/,/, $line))[7]; push @contents6, (split(/,/, $line))[8]; } 分かりにくい説明で申し訳ありません。 補足説明も致しますので、どうぞよろしくお願い致します。

    • ベストアンサー
    • CGI
  • javaの配列とファイル読み込みについて。

    javaでゲームを作っておりマップの読み込みでつまってしまったので 質問させてもらいます。 try { BufferedReader br = new BufferedReader( new InputStreamReader(getClass().getResourceAsStream(filename))); // rowを読み込む String line = br.readLine(); row = Integer.parseInt(line); // colを読む line = br.readLine(); col = Integer.parseInt(line); // マップサイズを設定 width = col * CS; height = row * CS; // マップを作成 map = new int[row][col]; for (int i=0; i<row; i++) { line = br.readLine(); for (int j=0; j<col; j++) { map[i][j] = Integer.parseInt(line.charAt(j) + ""); } } } catch (Exception e) { e.printStackTrace(); } これなんですがreadLine()は1行読み込むと見たんですが、 多分ファイルに改行がないために最初から最後まで読み込めたんじゃないかとおもいます。でもそのあとの配列へ入れるやり方がよくわかりません。どうなっているんでしょうか? よろしくお願いします。 ちなみに参考にさせてもらっているページは http://javagame.skr.jp/index.php?%A5%DE%A5%C3%A5%D7%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF です。

    • ベストアンサー
    • Java
  • 二次元配列のつかいかた。

    配列の中に、同じ値があるかどうか、確認して、なければ データを渡すというようなプログラムを書きましたが、どうもうまくいきません.二次元配列が間違っているのだと思いますが、どこがいけないのでしょうか. my @databe=qw(aa:ee:rr:rr aa:rr:tt:aa dd:tt:dd:aa); my @nonumber=qw(ringo mikan tamago susi); my @check=();#not same contents my $p=0; my @array=(); foreach( @databe ){ my @f = split(/:/); my $i=0; foreach(@f){ push( @{$array[$p]}, $_); $i++; } $p++; } for(my $i=2;$i<$#nonumber;$i++){ for(my $p=0;$p<$#databe;$p++){ unless($array[0][$i] eq $array[$p][$i]){ push(@check, $i); } } } foreach( @databe ){ my @f = split(/:/); my %tmp; $tmp{GEBEN1}=$f[$check[0]];#html::template $tmp{GEBEN2}=$f[$check[1]];#html::template push( @alldata,\%tmp); } プログラム初心者です。自分なりに組んでみたのですがどうもうまくいきません. 分かる方御回答よろしくお願いします。

  • SQLServer からのデータ移行(varbinary)

    SQLServer からのデータ移行(varbinary) SQLServer 2000 から PostgreSQL 8.4.3 へデータ移行を考えているのですが、 つまずいて困っています。 ご存知の方がいらっしゃいましたら教えていただけないでしょうか。 あるテーブル上にvarbinary(32)の項目があり、 クエリアナライザで見ると「0x11223344・・・」という値が入っているのですが、 PostgreSQL側ではこの項目のデータ型はどう定義したらよいでしょうか。 character varying(32)としてみましたが、 定義がふさわしくないのか、SQLがまずいのか、思うようにINSERTができませんでした。 たとえば、 insert into ... values(0x1122334455667788990011223344556677889900112233445566778899001122, ...) とすると --- NOTICE: 識別子"x1122334455667788990011223344556677889900112233445566778899001122"を"x11223344556677889900112233445566778899001122334455667788990011"に切り詰めます SQLステート:42601 --- が返りますし insert into ... values(x'1122334455667788990011223344556677889900112233445566778899001122', ...) では --- ERROR: 値は型character varying(32)としては長すぎます SQLステート:22001 --- が返ります。 実際は、.Net C# のプログラムにてDataTableにSQLServerからデータをFillして、それを元にINSERT文を作成しています。 デバッグすると、Byte配列に[0]17,[1]34... という具合に入ってくるので if ((col.DataType == typeof(String)) || (col.DataType == typeof(DateTime)) ||(col.DataType == typeof(Decimal)) ) { valueColumns.AppendFormat("'{0}',", row[col.ColumnName].ToString()); } else if(col.DataType == typeof(Byte[])) { string tmp = ""; for (int i = 0; i < ((Byte[])row[col.ColumnName]).Length; i++) { tmp += (string.Format("{0:X2}", ((Byte[])row[col.ColumnName])[i])); } valueColumns.AppendFormat("x'{0}',", tmp); } else { valueColumns.AppendFormat("{0},", row[col.ColumnName].ToString()); } のようにDataType別に振り分けて、上記else ifが通るようにコーディングしています。 よろしくお願いいたします。

  • MySQLにバイナリデータを正常に保存できない

    ローカルに保存してあるファイルをMySQLにバイナリデータとして格納して保存したいと思ってます。 データは格納できるのですが、文字エンコード?の問題でファイルが壊れてしまっているみたいです。 格納後、出力した際にjpgなどの画像は問題なく表示されるのですが、xlsやpdfなどのファイルが開けなくなります。MySQLの文字コードはUTF8です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect('DBI:mysql:database:localhost:3306', 'user', 'password'); # ファイルパス my $file = '/tmp/test.xls'; # ファイルサイズ my $size = -s $file; # バイナリデータ読み込み my $line; open(IN, $file); binmode(IN); sysread(IN, $line, $size); close(IN); # DBに格納 my $sth = $dbh->prepare(qq|INSERT INTO file_table ( `file_name`, `file_data` ) VALUES (?, ?)|); $sth->execute('test.xls', $line); $dbh->disconnect; 上記のようなコードなのですが、おかしな点があれば教えてください。 よろしくおねがいします。

    • ベストアンサー
    • Perl
  • CGI「Key Search」日付だけ表示したい

    KentWebさんのサイト内検索CGI「Key Search」について、 今は↓このように http://www.kent-web.com/data/ksearch/ksearch.cgi?code=%B4%C1%BB%FA&q=CGI&cond=1&logs=10&sort=1 日付が「日付 : 2014/05/27(Tue) 06:17:11」と時間まで表示されているのですが、 これを「日付 : 2014/05/27(Tue) 」と日付だけにしたいのです。 「ksearch.cgi」の # 結果 my $i = $pg; my $body; foreach (@log) { my ($page,$ttl,$time,$wd,$bk,$nx,$yyyymmdd,$year) = split(/\t/); $i++; my $tmp = $loop; $tmp =~ s/!num!/$i/g; $tmp =~ s/!title!/$ttl/g; $tmp =~ s/!url!/$url$page/g; $tmp =~ s|!doc!|$bk<b>$wd</b>$nx|g; $tmp =~ s/!date!/&date($time)/eg; $body .= $tmp; !date!のあたりをいじればいいんだろうと思っていろいろやりましたが、 ページを更新した日付になってくれません。 どうしたらできるでしょうか…

    • ベストアンサー
    • CGI
  • 重複文字列の消去について

    同じファイル内での重複文字列の消去について教えてください。 以下のようなファイルがあった時に ---text--- 100 フランチャイズ 98 二酸化炭素 76 ワールドカップ ・・・ 4 排出二酸化炭素 3 直営フランチャイズ 3 サッカーワールドカップ 1 2009年ワールドカップ ------- 「排出二酸化炭素、直営フランチャイズ、サッカーワールドカップ、2009年ワールドカップ」はファイル上位のキーワードと重複する部分があるので消去したいと考えています。 まず、以下の処理で不要部分の抽出を考えてみたのですが、ループが一度しか回らずに処理が停止してしまいました。どのようにするとよいでしょうか。 よろしくお願いいたします。 my $file = "text"; open( my $fh, "<", $file ) or die "Cannot open $file: $!"; my $lineheader = ''; while (<>) { $lineheader = (split)[1]; while(my $line = readline $fh){ if($line =~ /$lineheader/){ print $line; } $lineheader = ""; } }

    • ベストアンサー
    • Perl

専門家に質問してみよう