2009-05-20 9 views
3

Je lis une expression régulière d'un fichier de configuration, qui peut contenir ou non une syntaxe invalide. (Il est verrouillé derrière un pare-feu, alors n'entrons pas dans la sécurité.) J'ai été capable de tester un certain nombre d'erreurs et de donner un message amical.Puis-je capturer l'avertissement "Evasion non reconnue" lors de la compilation d'une regex?

Pas de chance sur celui-ci:

Unrecognized escape \Q passed through in regex

Je sais quelles sont les causes, je veux juste savoir si je peux capturer en Perl 5.8. Jusqu'à présent, il a résisté à mes efforts pour vérifier cette condition. Donc, la question est: est-ce que quelqu'un sait comment capturer ceci? Dois-je rediriger STDERR?

Répondre

3

Vous pouvez faire l'avertissement bloc FATAL et l'utilisation eval:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $s = '\M'; 

my $r = eval { 
    use warnings FATAL => qw(regexp); 
    qr/$s/; 
}; 

$r or die "Runtime regexp compilation produced:\[email protected]\n"; 
+0

travaillé pour moi, merci. – Axeman

1

Voici comment transformer cet avertissement à une erreur:

sub un { 
    local $SIG{__WARN__} = sub { 
    die $_[0] if $_[0]=~/^Unrecognized escape /; 
    print STDERR $_[0] 
    }; 
    qr{$_[0]} 
} 
un('al\Fa'); 
print "Not reached.\n"; 

Voici comment ignorer cet avertissement:

sub un { 
    local $SIG{__WARN__} = sub { 
    print STDERR $_[0] if $_[0]!~/^Unrecognized escape /; 
    }; 
    qr{$_[0]} 
} 
un('al\Fa'); 
print "Reached.\n"; 
+0

d'ignorer un avertissement, il est préférable d'utiliser « aucun avertissement de la warning_category '; » –

0

Comme il est un avertissement, vous aurez besoin de rediriger STDERR comme bien.

Je suppose que vous obtenez l'avertissement parce que vous interpolez la chaîne regex que vous obtenez du fichier de configuration - essayez s/\\/\\\\/g sur la chaîne regex avant de l'utiliser.

+0

Oups, c'est ce que je voulais dire: STDERR - en fait, lors de la première frappe, c'était STOUT. : D – Axeman

Questions connexes