2013-07-22 9 views
6

Moim wymaganiem jest wydrukowanie plików o następującej treści: 'xyz' przy użyciu perl. Próbowałem poniżej i mam następujący błądKwantyfikator nie jest zgodny z niczym w regex

kwantyfikatorów następująco nic regex oznaczone < - tu w m/* < - TUTAJ xyz.xlsx $ /;

use strict; 
use warnings; 

my @files = qw(file_xyz.xlsx,file.xlsx); 
my @my_files = grep { /*xyz.xlsx$/ } @files; 
for my $file (@my_files) { 
    print "The output $file \n"; 
} 

Problem przychodzi kiedy dodać * w grep wyrażenie regularne. Jak mogę to osiągnąć?

Odpowiedz

6

* to znak meta, nazywany kwantyfikatorem. Oznacza to "powtórzyć poprzedni znak lub klasę znaków zero lub więcej razy". W twoim przypadku nic nie wynika i dlatego jest błędem składni. Prawdopodobnie próbujesz dopasować wszystko, co jest .*: Symbol wieloznaczny, a następnie kwantyfikator. Jednak jest to już domyślne zachowanie dopasowania do wyrażenia regularnego, chyba że jest ono zakotwiczone. Więc wszystko czego potrzebujesz to:

my @my_files = grep { /xyz/ } @files; 

Można zachować swój koniec kotwicy strun xlsx$, ale ponieważ masz ograniczoną listę nazw plików, które nie wydaje się konieczne. Choć użyłeś qw() źle, to nie jest oddzielone przecinkami, jest przestrzeń oddzielona:

my @files = qw(file_xyz.xlsx file.xlsx); 

Jeśli jednak trzeba mieć większy zestaw nazw plików, takich jak odczytać z katalogu, można umieścić wieloznaczny ciąg w środku:

my @my_files = grep { /xyz.*\.xlsx$/i } @files; 

Uwaga zastosowanie modyfikatora /i dopasować przypadek insensitively. Zauważ też, że musisz uciec ., ponieważ jest to kolejna meta.

+0

Tak, dokładnie. Dodałem "*", aby dopasować dowolne postacie i powinno mieć "xyz", a na końcu ".xlsx". Więc jak mogę osiągnąć moje wymaganie – Mari

+0

tak, mam to. Popełniłem błąd, dodając przecinek w qw() .. Dzięki za odpowiedź ... – Mari

+0

@Mari Nie ma za co. Zwykle Perl wyświetla ostrzeżenie, gdy używasz 'qw()'. – TLP