2016-09-19 40 views
9

考慮文件y.txt(以UTF-8編碼)中的以下輸入數據。

bar 
föbar 

和文件y.pl,這使兩個輸入線到一個數組並處理它們,尋找子串的起始位置。

use open qw(:std :utf8); 

my @array; 

while (<>) { 
    push @array, $_; 
    print $-[0] . "\n" if /bar/; 
} 

# $array[0] = "bar", $array[1] = "föbar" 
print $-[0] . "\n" if $array[1] =~ /$array[0]/u; 

如果我打電話perl y.pl < y.txt,我得到

0 
2 
3 

作爲輸出。但是,我預計最後一個數字也是2,但由於某種原因,第二個/.../正則表達式的行爲有所不同。我錯過了什麼?我想這是一個編碼問題,但無論我嘗試了什麼,我都沒有成功。這是Perl 5.18.2。

+0

在Cygwin下的Perl 5.22.2上,它適用於我。 –

+0

適用於x86_64-linux上的Perl 5.20.1(CentOS 6) –

+0

在v5.22.1下工作正常[Ubuntu 16.04.1 LTS] –

回答

2

它似乎是5.18中的一個錯誤。

$ 5.18.2t/bin/perl a.pl a 
0 
2 
3 

$ 5.20.1t/bin/perl a.pl a 
0 
2 
2 

我無法找到解決方法。在您提交的案例中,添加utf8::downgrade($array[0]);utf8::downgrade($array[0], 1);作品,但不使用以下數據或其他插值圖案包含大於255的字符的其他數據。

♠bar 
f♠♠bar 

看來這隻能通過升級你的Perl,這實際上很簡單。 (只需確保按照INSTALL中的說明將它安裝到與您的系統perl不同的目錄!)