perl's $ - [0] produz resultados inesperados para dados não ASCII

9

Considere os seguintes dados de entrada no arquivo y.txt (codificado em UTF-8).

bar
föbar

e um arquivo y.pl , que coloca as duas linhas de entrada em uma matriz e as processa, procurando por posições iniciais de substring.

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;

Se eu chamar perl y.pl < y.txt , obtenho

0
2
3

como saída. No entanto, eu esperaria que o último número seja 2 também, mas por algum motivo o segundo /.../ regexp se comporta de maneira diferente. o que estou perdendo? Eu acho que é um problema de codificação, mas o que eu tentei, não consegui. Este é o Perl 5.18.2.

    
por lemzwerg 19.09.2016 в 07:34
fonte

1 resposta

2

Parece ser um bug no 5.18.

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

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

Não consigo encontrar uma solução alternativa. A adição de utf8::downgrade($array[0]); ou utf8::downgrade($array[0], 1); funciona no caso que você apresentou, mas não usa os seguintes dados ou qualquer outro em que o padrão interpolado contenha caracteres > 255.

♠bar
f♠♠bar

Parece que isso só pode ser corrigido atualizando seu Perl, o que é bem simples. (Apenas certifique-se de instalá-lo em um diretório diferente do seu sistema perl seguindo as instruções em INSTALL !)

    
por ikegami 19.09.2016 / 16:56
fonte