2013-07-22 27 views
6

Benim gereksinimim 'xyz' metnine sahip dosyaları, dosya adlarına perl kullanarak yazdırmaktır. ; BURADA $/xyz.xlsx - BURAYA m/* < - aşağıda çalıştı ve şu hata varQuantifier, regex öğesinde hiçbir şeyi izler

Nicelik < damgasını regex hiçbir şey izler Ben grep normal ifadede * eklerken

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"; 
} 

Sorun geliyor. Bunu nasıl başarabilirim?

cevap

6

*, niceleyici adı verilen bir meta karakterdir. "Önceki karakteri veya karakter sınıfını sıfır veya daha fazla kez tekrarla" anlamına gelir. Sizin durumunuzda, hiçbir şey takip etmez ve bu nedenle bir sözdizimi hatasıdır. Muhtemelen denemek istediğiniz şey .*: Wildcard, bir niceleyici ile takip etmektir. Ancak, bu zaten bağlantılı değilse, normal ifadenin varsayılan davranışıdır.

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

Sen dize çapa xlsx$ sizin ucunu tutmak olabilir, ama pek gerekli görünmektedir dosya adlarının sınırlı bir liste, beri: Yani tüm ihtiyaç vardır. Eğer qw() yanlış kullanmış olsa da, virgül ile ayrılarak edilmez, uzay ayrılır:

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

Ancak, dosya adlarının daha büyük bir set var olursa, böyle bir dizinden bir okundu olarak, bir yerleştirebilir ortada joker dize: /i değiştirici kullanımı duyarsızca davayı maç için

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

Not. Ayrıca, başka bir meta karakter olduğundan .'dan kurtulmanız gerektiğini unutmayın.

+0

Evet, tam olarak. Herhangi bir karakteri eşleştirmek için '*' ekledim ve 'xyz' olması ve '.xlsx' ile bitmesi gerekiyor. O zaman ihtiyacım nasıl karşılanabilir – Mari

+0

evet evet anladım. Qw() 'ye virgül ekleyerek bir hata yaptım. Cevabınız için teşekkürler .. – Mari

+0

@Mari Rica ederim. Genellikle, ql() 'yi yanlış kullandığınızda Perl size bir uyarı verir. – TLP