2013-08-03 97 views
1

我在學習引用。在這本書中級Perl(第2版):第5章(參考文獻和範圍界定),下面的代碼是給定:解引用操作符 - >不工作

my $ref; 
{ 
    my @skipper = qw(blue_shirt hat jacket preserver sunscreen); # ref count is 1 
    $ref = \@skipper; # ref count is 2 
    print "$ref−>[2]\n"; # prints jacket\n 
} 
print "$ref−>[2]\n"; # still prints jacket\n # ref count is 1 

當我運行這段代碼,它給輸出:

ARRAY(0x83fc890)−>[2]

ARRAY(0x83fc890)−>[2]

認爲它應該打印夾克。

http://ideone.com/y8ZLsp

當我試圖不帶引號運行它,我得到的輸出:

Unrecognized character \xE2; marked by <-- HERE after print $ref<-- HERE near column 12 at prog.pl line 5.

http://ideone.com/V9GbUe

我嘗試了一些更多:

$$ref[2] #Worked

${$ref}[2] #Worked

所以,

是在書中給出錯誤的代碼? (我被告知這是一本好書 - 我正在讀它,我發現它很棒,不知道是印刷錯誤還是我做錯了什麼)

回答

7

您正在使用減號"−"U+2212 )。這不同於ASCII連字符 - 減號"-"U+002D)。

讓我們看看你的代碼實際上包含:

use Data::Dumper; 
$Data::Dumper::Useqq = 1; 
print Dumper <<'END'; 
my $ref; 
{ 
    my @skipper = qw(blue_shirt hat jacket preserver sunscreen); # ref count is 1 
    $ref = \@skipper; # ref count is 2 
    print "$ref−>[2]\n"; # prints jacket\n 
} 
print "$ref−>[2]\n"; # still prints jacket\n # ref count is 1 
END 

輸出(換行改爲物理換行符):

my \$ref; 
{ 
    my \@skipper = qw(blue_shirt hat jacket preserver sunscreen); # ref count is 1 
    \$ref = \\\@skipper; # ref count is 2 
    print \"\$ref\342\210\222>[2]\\n\"; # prints jacket\\n 
} 
print \"\$ref\342\210\222>[2]\\n\"; # still prints jacket\\n # ref count is 1 
+0

哦。那對我來說太愚蠢了。 :(如何避免這種情況,我使用UTF-8編碼 – GrSrv

+0

你使用的是什麼編輯器?我只需在我的鍵盤上輸入正常的連字符減號,並且一切都可以正常工作 – amon

+0

凱特從來沒有任何問題 – GrSrv