2016-09-19 18 views
9

Hãy xem xét dữ liệu đầu vào sau trong tệp y.txt (được mã hóa bằng UTF-8).

bar 
föbar 

và một tệp y.pl, đặt hai dòng nhập vào một mảng và xử lý chúng, tìm vị trí bắt đầu chuỗi con.

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; 

Nếu tôi gọi perl y.pl < y.txt, tôi nhận được

0 
2 
3 

như đầu ra. Tuy nhiên, tôi hy vọng rằng con số cuối cùng cũng là 2, nhưng vì một lý do nào đó, số thứ hai /.../ regexp hoạt động khác nhau. Tôi đang thiếu gì? Tôi đoán đó là một vấn đề mã hóa, nhưng bất cứ điều gì tôi đã cố gắng, tôi đã không thành công. Đây là Perl 5.18.2.

+0

Trên Perl 5.22.2 dưới Cygwin nó hoạt động cho tôi. –

+0

Hoạt động trên Perl 5.20.1 trên x86_64-linux (CentOS 6) –

+0

Hoạt động tốt theo v5.22.1 [Ubuntu 16.04.1 LTS] –

Trả lời

2

Dường như là lỗi trong 5.18.

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

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

Tôi không thể tìm được giải pháp thay thế. Thêm utf8::downgrade($array[0]); hoặc utf8::downgrade($array[0], 1); hoạt động trong trường hợp bạn đã trình bày, nhưng không sử dụng dữ liệu sau hoặc bất kỳ dữ liệu nào khác trong đó mẫu được nội suy chứa các ký tự> 255.

♠bar 
f♠♠bar 

Có vẻ như điều này chỉ có thể được sửa bằng cách nâng cấp Perl của bạn, điều này thực sự khá đơn giản. (Chỉ cần đảm bảo cài đặt nó vào một thư mục khác với hệ thống của bạn perl bằng cách làm theo các hướng dẫn trong INSTALL!)

Các vấn đề liên quan