2013-07-19 5 views
1

J'essaie de lire à partir du fichier. Voici ce que mes fichiers ressemble ..Perl Wildcards-Regex

abc123 
     abdef012 
    fedabc_23 
     xyz12 
    12345 

Maintenant, ce que je suis en train de faire est, d'obtenir une option de ligne de commande et selon le wildchar entré comme, *,?, + Lignes appropriées ci-dessus le fichier devrait être imprimé. Mais je suis coincé ici. Je connais. Comment * fonctionne, mais pas sûr d'autres wildchars .. S'il vous plaît aidez-moi.

#/perl/bin/perl 
use Getopt::Long; 
open (DATA, "filname.txt") || die "Can't open the file:$!"; 

my $fil=''; 

my $res= GetOptions (
"f=s" =>\$fil 
); 
$fil=~ s/[\*]//g; #Works only if '*' is at the end 

/(\w*$fil\w*)/ && !$seen{$1}++ && push @arr, $1 while <DATA>; 

Comment utiliser d'autres caractères génériques? Comment généraliser cela?

Répondre

3

Permettez-moi d'obtenir ce droit:

Vous disposez d'un fichier et que vous voulez saisir une expression régulière et imprimer toutes les lignes qui correspondent à cette expression? Quelque chose comme grep?

use strict; 
use warnings; 
use autodie; 

my $regex = shift; 
my $file = shift; 

open my $fh, "<", $file; #Autodie will handle not being able to open files... 
while (my $line = <$fh>) { 
    print $line if $line =~ /$regex/; 
} 
close $fh; 

Ou, vous essayez d'utiliser globbing et expressions régulières?

Il existe un module Perl appelé Text::Glob qui correspond aux globes ou convertit un glob en une expression régulière.

Je ne ai jamais utilisé, mais il semble assez simple:

use strict; 
use warnings; 
use autodie; 
use Text::Glob qw(match_glob); 

my $glob = shift; 
my $file = shift; 

open my $fh, "<", $file; #Autodie will handle not being able to open files... 
while (my $line = <$fh>) { 
    print $line if match_glob($glob, $line); 
} 
close $fh; 
1

Le symbole * signifie 0 ou plusieurs des caractères précédents, de sorte que d*x pourrait correspondre ddddddddx ou dx ou ddx.

Le symbole + moyens pour correspondre à une ou plusieurs des caractères précédents, SOT d+x sera également correspondre ddddddx ou dx ou ddx

crochets définissent une classe de caractères de sorte [\*] signifie correspondre soit à une barre oblique arrière ou le * symbole. Beaucoup de caractères spéciaux dans regex perdent leur signification à l'intérieur d'une classe de caractères carrés. Donc, [\*]x correspondra à \x ou *x. Le ? signifie correspondre le caractère 0 ou 1 précédent. Donc, d?x correspondra dx ou x

Le . correspond à n'importe quel caractère. Ces idées peuvent être combinées de façon à correspondre à n'importe quel caractère entre guillemets. Vous pouvez utiliser '.*' pour trouver tous les caractères entre la première citation de la chaîne et la dernière citation de la chaîne (y compris les guillemets). Ou pour faire correspondre juste le texte entre deux guillemets, vous pouvez faire le * non gourmand en incluant un ? comme dans '.*?'.

Vous pouvez en savoir plus sur le fonctionnement de ces quantificateurs possessifs à http://www.regular-expressions.info/possessive.html.

+0

« d * x » ne correspondra pas à une chaîne vide, il correspondra toutefois un « x » – doubleDown

+0

bon appel, je voulais supprimer ce peu mais oublié –