2010-02-15 37 views
5

Trong Perl, bạn có thể có được một danh sách các tập tin phù hợp với một mẫu:Làm thế nào tôi có thể sử dụng giá trị của một biến như là một mẫu glob trong Perl?

my @list = <*.txt>; 
print "@list"; 

Bây giờ, tôi muốn vượt qua mô hình như là một biến (vì nó được thông qua vào một chức năng). Nhưng điều đó không hoạt động:

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list = <$pattern>; 
    print "@list"; 
} 

readline() on unopened filehandle at ... 

Mọi đề xuất?

Trả lời

12

Sử dụng glob:

use strict; 
use warnings; 

ProcessFiles('*.txt'); 

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list = glob $pattern; 
    print "@list"; 
} 

Dưới đây là một lời giải thích cho lý do tại sao bạn nhận được cảnh báo, từ I/O Operators:

Nếu những gì các dấu ngoặc nhọn chứa là một biến vô hướng đơn giản (ví dụ: $ foo), sau đó biến đó chứa tên của tệp có tay để nhập từ .. . Nó được coi là sạch hơn để gọi hàm nội bộ trực tiếp như glob ($ foo), mà có lẽ đúng cách để có thực hiện nó ở nơi đầu tiên.)

-1

Điều gì về gói nó bằng lệnh "eval"? Như thế này ...

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list; 
    eval "\@list = <$pattern>"; 
    print @list; 
} 
+1

Không bao giờ, bao giờ, bao giờ, bao giờ làm điều này . Toán tử 'glob' là câu trả lời đúng. – friedo

+0

Bạn nói đúng, glob là một câu trả lời tốt hơn nhiều. Cảm ơn vì sự đúng đắn của bạn. Tại sao "không bao giờ, bao giờ, bao giờ, bao giờ" làm điều này? –

+1

Robert, bạn nên tránh chuỗi 'eval' bất cứ khi nào có thể; ai biết được dữ liệu bất chính nào có thể kết thúc bằng '$ pattern', đặc biệt nếu dữ liệu đó bắt nguồn từ đầu vào của người dùng. Ngay cả khi không độc hại, những thứ kỳ lạ tìm đường vào một 'eval' có thể là nguyên nhân gây ra nhiều lỗi đau đớn. – friedo

0

Tại sao không chuyển tham chiếu mảng của danh sách tệp vào hàm?

my @list = <*.txt>; 
ProcessFiles(\@list); 

sub ProcessFiles { 
    my $list_ref = shift; 
    for my $file (@{$list_ref}) { 
     print "$file\n"; 
    } 
} 
+1

Tôi biết ai đó sẽ gợi ý điều này. Vấn đề là nó thực sự là một biến để bắt đầu, như thế này: 'my $ pattern =" test-% d - *. Txt "; ProcessFiles (sprintf ($ pattern, "51")); ' – Frank

0
use File::Basename; 
@ext=(".jpg",".png",".others"); 
while(<*>){ 
my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/); 
if (grep {$_ eq $ftype} @ext) { 
    print "Element '$ftype' found! : $_\n" ; 
} 
} 
Các vấn đề liên quan