2016-09-19 13 views
9

Rozważ następujące dane wejściowe w pliku y.txt (zakodowane w UTF-8).

bar 
föbar 

i plik y.pl, która stawia dwie linie wejściowe na tablicy i przetwarza je, szukając podciąg pozycje startowe.

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; 

Jeśli zadzwonię perl y.pl < y.txt, mam

0 
2 
3 

jako wyjście. Jednak spodziewałbym się, że ostatnia liczba to także 2, ale z jakiegoś powodu drugie wyrażenie regularne /.../ zachowuje się inaczej. czego mi brakuje? Domyślam się, że to kwestia kodowania, ale cokolwiek próbowałem, nie udało mi się. To jest Perl 5.18.2.

+0

W Perlu 5.22.2 pod Cygwin to działa dla mnie. –

+0

Działa na perlu 5.20.1 na x86_64-linux (CentOS 6) –

+0

Działa dobrze pod kontrolą v5.22.1 [Ubuntu 16.04.1 LTS] –

Odpowiedz

2

Wygląda na to, że jest to błąd w wersji 5.18.

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

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

Nie mogę znaleźć obejścia. Dodanie utf8::downgrade($array[0]); lub utf8::downgrade($array[0], 1); działa w przedstawionym przypadku, ale nie można użyć następujących danych ani żadnego innego, w którym wzór interpolowany zawiera znaki> 255.

♠bar 
f♠♠bar 

Wygląda na to, że można to naprawić jedynie poprzez uaktualnienie Perla, co jest całkiem proste. (Wystarczy zainstalować go w innym katalogu niż system perl postępując zgodnie z instrukcjami w INSTALL!)

Powiązane problemy