2017-11-04 20 views
0

私の入力ファイルには露出のパーセンテージがあり、最高の値だけを読み込みます。入力ファイルを読み込んで新しいハッシュを作成する

私が使用中 "はrefs" 中にエラーが無名ハッシュの要素

奇数はARRAYのリファレンスとして文字列を使用することはできません取得保ちます

私は数字を強制的に試してみましたo整数で読み込まれますが、フラットになります。何かアドバイス?キーと最高値を持つハッシュを作成したいと思います。

while (<$DATA_FILE>) { 

     chomp; 
     my @line_values = split(/,/, $_); 
     my $state_id = $line_values[0]; 

     # skip header row 
     next if ($state_id eq $HEADER_VALUE); 

     for (@line_values) { 
      tr/%%//d 
     }; 

     # assign data used as hash keys to variables 
     my $var1 = int($line_values[1]); 
     my $var2 = int($line_values[2]); 

     if ($var1 > $var2) { 
      %report_data = ({ $state_id } => { \@$var1 }) 
     } 
     else { 
      %report_data = ({ $state_id } => { \@$var2 }) 
     } 

    } # end while 

    print \%report_data; 

    # close file 
    close($DATA_FILE) || printf(STDERR "Failed to close $file_path\n"); 
} 
+3

のようになります。入力データと予想される出力を追加するために質問を編集できますか? –

+0

サンプルコードでインデントを修正しようとしました。歓迎ですが、将来は自分でやってください。コードの構造を理解するためには、インデントをクリアすることは重要なツールです。コードを読んで理解できるようにするためには、できるだけ簡単に行うことが丁寧です。あなたの '#end while 'コメントは、あなたの' for'ループの終わりを実際にマークしているので、間違っているようです。それを確認したいかもしれません。 –

+0

そして、私はあなたのコードが元のバージョンで正しいことを確認したので、私は主に私の修正を元に戻しました。 1行のforループを書くつもりなら、postfixバージョン 'tr/%% // d for @ line_values'を使うほうがはっきりしているかもしれません。しかし、あなたは 'tr /.../.../'という誤解をしているかもしれません。なぜなら、2番目の '%'は何も役に立たないからです。 –

答えて

1

これは、入力と期待出力がどうあるべきかの兆候なしに確認するのは難しいですが、推測では、あなたのifブロックは、この

if ($var1 > $var2) { 
    $report_data{$state_id} = $var1; 
} 
else { 
    $report_data{$state_id} = $var2; 
} 

または、より簡単に

$report_data{$state_id} = $var1 > $var2 ? $var1 : $var2; 
0

この行は犯人である:

%report_data = ({$state_id} => {\@$var1}) 

{}は、ハッシュリファレンスを作成します。この行では、%report_dataのキーとして単一のキー($ state_id)を持つハッシュリファレンスを使用し、スカラー$ var1を逆順にして配列内で使用しようとする単一のキー(\@$var1)を持つハッシュリファレンスを使用します。文脈(@$var1)を作成し、それを再び参照に変換しようとします(私は混乱しています。

%report_data = ($state_id => $var1); 

としてより多くの意味を作ると思いますしかし、それはあなたが読んですべての行のハッシュ%のreport_dataをリセットする 。 何がしたいことがちょうどそのハッシュのキーを設定することがあるので、最初、ループの前に変数を定義します。

$report_data{ $state_id } = $var1; # or $var2 

my %report_data =(); 

とあなたのwhileループでは、単に値にキーを設定

最後に、ハッシュへの参照を印刷しようとしていますが、ほとんど意味がありません。私は単純なループをお勧めしたい:ハッシュ内のすべてのキーの上に

for my $key (keys %report_data) { 
    print $key . " = " . $report_data{ $key } . "\n"; 
} 

この反復処理し、その後、それらの値でそれらを印刷し、読みやすく理解しやすい見えるが、私は願っています。

一般的に、動作の仕組みがわからない限り、参照を使用しないでください。彼らはあなたのコードで発射する魔法の弾丸ではなく、すべての問題はうまくいく。かなり反対で、彼らはあなた自身の足で終わるその苦しい弾丸になることができます。しかし、参考文献について学ぶことは良いことです。なぜなら、あなたが前進しPerlでもっと仕事をするときに必要となるからです。 perlreftutは良い出発点です。

関連する問題