2014-04-01 75 views
0

我想打印出關聯數組的內容。 爲此,我使用Data :: dumper。在使用data :: dumper打印時不尊重口音PERL

所以,對於爲例,如果關聯數組被稱爲「%W」,我寫:

print OUT Dumper(\%w); 

這裏的問題:有一些話就像被打印出來作爲「R \「最近搜索」 X {E9} CENTE」。

如果我寫的只是:

print OUT %w; 

我沒有問題,所以「最近搜索」會被打印出來作爲「最近搜索」。

腳本使用的所有文本文件都是utf8。 此外我使用模塊「utf8」,我總是指定字符編碼系統。

例如, :

open(IN, '<', $file_in); 
binmode(IN,":utf8"); 

我敢肯定,問題與Data :: dumper有關。有沒有辦法解決這個問題或其他方式來打印關聯數組的內容?

謝謝。

+0

這讓我很擔心你在談論「關聯數組」。自從幾乎二十年前發佈Perl 5以來,我們稱它們爲「哈希」。如果你正在閱讀仍稱爲「關聯數組」的教程或書籍,那麼你所獲得的信息可能會過時。 –

+0

Re「我很確定問題與Data :: dumper有關。」什麼問題?Re「有沒有辦法解決這個問題或其他方式來打印關聯數組的內容?」當然,你可以用任何你想要的方式打印出來。 – ikegami

回答

4

這是故意的。當eval用作Perl代碼時,Data::Dumper的輸出旨在產生相同的數據結構。爲了限制字符編碼的效果,非ASCII字符將被轉義使用轉義。除此之外,設置$Data::Dumper::Useqq = 1以便任何不可打印的字符使用轉義進行轉儲是明智的。

Data::Dumper並不是真正意義上的display數據結構 - 如果您有特定的格式要求,只需自己編寫必要的代碼即可。例如

use utf8; 
use feature 'say'; 
open my $out, ">:utf8", $filename or die "Can't open $filename: $!"; 
my %hash = (
    bárewørdş => '–Uni·code–', 
); 

say { $out } "{"; 
for my $key (sort keys %hash) { 
    say { $out } " $key: $hash{$key}"; 
} 
say { $out } "}"; 

產生

{ 
    bárewørdş: –Uni·code– 
} 
+0

謝謝!你在寫perl 5嗎? – Jurafsky

+0

@ user3025314是的,那是Perl5代碼(perl> = 5.10)。我現在添加了一行以使其實際可運行。 – amon

0

這個工作對我來說:

use strict; 
use warnings; 
use Data::Dumper; 
$Data::Dumper::Useperl = 1; 
binmode STDOUT, ":utf8"; 
{ no warnings 'redefine'; 
    sub Data::Dumper::qquote { 
     my $s = shift; 
     return "'$s'"; 
    } 
} 
my $s = "rcente\x{3a3}"; 
my %w = ($s=>12); 
print Dumper(\%w), "\n"; 
0

數據::自卸車是一個調試工具。它讓你知道字符串包含的內容,而不會使其容易受到編碼錯誤的影響。這不是問題,這是一個功能。它發出的字符("r\x{e9}cente")是您具有足夠可讀性的字符串表示(72 E9 63 65 6E 74 65)。