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?