O significado desta classe de caractere em perl?

2

Eu sou novo no PERL (embora tenha um bom background no reg-ex), eu estava passando por um script perl e ele tem uma classe de caracteres

$alwayssep = "[\?!()\";/\|‘]";

Alguém pode me explicar qual é o significado disso? Eu posso ver isso significa qualquer caractere, incluindo ?, !, (,),",;,/,|,' , mas eu não entendo por que existem duas barras invertidas antes de ponto de interrogação e pipe? Normalmente usamos apenas uma barra invertida para escapar, é diferente em perl?

    
por Dude 07.09.2015 / 02:49

1 resposta

4

O código é uma bagunça devido ao uso infeliz da interpolação de aspas duplas para definir o regex; Em vez disso, o operador qr/.../ deve ser usado. Em vez de descobrir as regras de interpolação como parte de uma limpeza de código, é possível depurar o regex:

#!/usr/bin/env perl
use strict;
use warnings;

use re 'debugcolor';

my $blah = "[\?!()\";/\|‘]";

print "something\n" if "not important" =~ m/$blah/;

Esta corrida mostra o regex como [\?!()%";/\|%x{e2}%x{80}%x{98}] , com o %x bits maluco indicando que o é realmente uma aspa inteligente; algum software ao longo do caminho (provavelmente) corrompeu esse código. Diversão! Quanto à correção, reescreva o código para usar qr e, em seguida, verifique o novo código com re :

#!/usr/bin/env perl
use strict;
use warnings;

use re 'debugcolor';

my $blah = qr#[?!()";/|']#;
use Data::Dumper; warn Dumper $blah;

print "something\n" if "not important" =~ m/$blah/;

Deixarei para você decidir se \ deve fazer parte da regex e ponderar por que ela aparece listada duas vezes. Existem testes de unidade e documentação para este código, certo?

    
por 07.09.2015 / 17:07