2012-02-17 4 views
1

多分私は愚かですが、これは意味がありません...私は多数のファイルから一意のコードとエラーコードを読み取ってハッシュを構築しています。キー=値のペアを出力しようとすると、改行が直後になければキーは表示されません。ここでPerlのハッシュキーは、改行直後にのみ印刷されます

はコードです:

foreach my $key (keys %codehash){ 
    print "Key: $key\tValue: $codehash{$key}\n"; 
    print "Key: $key\n"; 
    print "Value: $codehash{$key}\n"; 
    print "\n\n"; 
} 

は、ここで出力です:最初の文からプレーンテキスト、ちょうどタブ以降:それも「キー」を印刷していないことを

  Value: NoParamSpecified 
    Key: 016C 
    Value: NoParamSpecified 


     Value: billingAddress.firstName.lengthLong 
    Key: 003M 
    Value: billingAddress.firstName.lengthLong 


     Value: billingAddress.address1.lengthLong 
    Key: 0041 
    Value: billingAddress.address1.lengthLong 

お知らせ。私は以前これを見たことがない。

+2

ポスト出力の進ダンプしてください。 –

答えて

7

この動作は、末尾に"\r"を含むすべてのキーと一致しています。 16進ダンプがこれを確認します。

それをプリントアウトする前に、キーの上に、適切な正規表現置換を実行することですこれを確認する別の方法:

$key =~ s/\s+$//; 
+0

Windowsで生成されたファイルを読んでいますか? 'chomp'や' s/\ s + $ // 'の代わりに' chop'を使っていますか? – mob

+0

データファイルはDOSベースとUnixベースの組み合わせであることが分かります。私はハッシュに追加する前に、キー/値変数に正規表現を適用し、今はすべて正常に動作しています。私が投稿の冒頭に帰したように、それは私がばかだということでした。みんな、ありがとう! –

+0

\ zは\ sですか? (実際に問題を確認するのではなく問題を解決します) – ikegami

3

私は、データに書式設定文字が含まれていて、そのデータをキーデータに含めるというデータを読み込んでいるために賭けています(書式設定文字が「戻る」線の始まりなど)。

この問題を回避するには、base64または16進数でキーを印刷してみてください。それはあなたが思っていたよりずっと長い文字列であることがわかります。

use MIME::Base64; 
# ... 
print "Key: " . encode_base64($key) . "\tValue: $codehash{$key}\n"; 
+0

さて、キーは4文字の英数字しかないので、私は文字を書式設定しているとは思っていません。ここにあなたの提案からの出力があります: 'キー:MDA0MQ0 = 値:billingAddress.address1.lengthLong キー:0041 値:billingAddress.address1.lengthLong' –

+0

@MarkHKrause、その出力は、第1キーは'」で終わることを示していますカーソルが最初の列に戻り、残りの出力がキーを上書きします。 (WesがBase64ではなく 'unpack( 'H *'、$ key)'を提案していた方がより明らかになりました) – cjm

+0

あなたが正しいとすれば、解凍した方が良いでしょう。 –

-4

これは端末I/Oの一部です。これは、行末にのみ印刷されます。それはすべてのprint文の後に印刷するように取得するには、出力自動フラッシュを設定します。

foreach my $key (keys %codehash){ 
    local $| = 1; 
    print "Key: $key\tValue: $codehash{$key}\n"; 
    print "Key: $key\n"; 
    print "Value: $codehash{$key}\n"; 
    print "\n\n"; 
} 

perldoc perlvarを参照してください/ OUTPUT_AUTOFLUSHの/を検索します。

+0

うん。私はそれを試みましたが、私は "ローカル"を使用しませんでした。前と同じ出力が得られます。 –

関連する問題