3

Data::Dumper を使用して、大量のデータ リストをハッシュにインポートしているかどうかを確認しようとしているときに、奇妙な問題が発生します。

私のデータは別のファイルでこのように見えます。

##Product ID => Market for product
ABC => Euro
XYZ => USA
PQR => India

次に、スクリプトで、データのリストを次のようにハッシュに読み取ろうとしています。

open(CONFIG_DAT_H, "<", $config_data);       
while(my $line = <CONFIG_DAT_H>) {
    if($line !~ /^\#/) {
        chomp($line);
        my @words = split(/\s*\=\>\s/, $line);
        %product_names->{$words[0]} = $words[1];
    }
}
close(CONFIG_DAT_H);
print Dumper (%product_names);

私の解析は、ハッシュ内のすべてのデータを見つけることができるほとんどの部分で機能していますが、Data::Dumper を使用してそれを印刷すると、正しく印刷されません。これが私の出力です。

$VAR1 = 'ABC';
';AR2 = 'Euro
$VAR3 = 'XYZ';
';AR4 = 'USA
$VAR5 = 'PQR';
';AR6 = 'India

ダンパーが '; を出力している理由を知っている人はいますか? データの 2 番目の列の最初の 2 文字を超える文字は?

4

3 に答える 3

1

うーん... Perl6を使っていても、これは私には間違っているようです:

%product_names->{$words[0]} = $words[1];

Perl6 についてはよくわかりませんが、Perl5 では、%product_names が存在し、宣言されていることを考えると、参照は次のようになります。

$product_names{...} = ... ;

コード全体を公開していただければ、この問題の解決をお手伝いできます。

于 2016-09-30T21:32:57.123 に答える
0

ファイルは行末として CR LF を使用します。これは、コードに次を追加することで明らかになります。

local $Data::Dumper::Useqq = 1;

ファイルを変換して、UNIX の行末を使用することができます (UNIX システムを使用しているように見えます)。これは、dos2unixユーティリティを使用して実現できます。

dos2unix config.dat

または、置き換えます

chomp($line);

より柔軟に

$line =~ s/\s+\z//;

  • 注:%product_names->{$words[0]}意味がありません。古いバージョンの Perl ではたまたまやりたいことを実行しますが、新しいバージョンでは当然のことながらエラーがスローされます。$product_names{$words[0]}ハッシュの要素の値にアクセスするための適切な構文です。
  • print Dumper(\%product_names);ヒント:の代わりに使用する必要がありprint Dumper(%product_names);ます。
  • ヒント: あなたも役に立つかもしれませんlocal $Data::Dumper::Sortkeys = 1;。Data::Dumper のデフォルトはとても悪い :(
  • ヒント:split(/\s*=>\s*/, $line, 2)の代わりに使用split(/\s*=>\s*/, $line)すると、値に を含めることができます=>
  • ヒント: 理由もなくグローバル変数を使用しないでください。open(my $CONFIG_DAT_H, ...)の代わりに使用しopen(CONFIG_DAT_H, ...)、 の他のインスタンスを に置き換えCONFIG_DAT_Hます$CONFIG_DAT_H
  • ヒント: を使用next if $line =~ /^#/;すると、多くのインデントを回避できます。
于 2016-09-30T21:15:14.710 に答える