2010-02-02 24 views
6

thể trùng lặp:
How do I pass parameters to the File::Find subroutine that processes each file?Làm cách nào để chuyển một tham số đến hàm mong muốn khi sử dụng Tệp của Perl :: Tìm?

Người ta có thể sử dụng mô-đun File::Find Perl như thế này:

find(\&wanted, @directories); 

Làm thế nào chúng ta có thể thêm một tham số để các wanted chức năng?

Ví dụ: tôi muốn duyệt các tệp trong /tmp trích xuất một số thông tin từ mỗi tệp và kết quả sẽ được lưu vào một thư mục khác. Các dir đầu ra nên được đưa ra như một tham số.

+0

Vui lòng mô tả cụ thể hơn những gì bạn đang cố gắng làm và tôi sẽ cập nhật câu trả lời của tôi. –

+0

Xem thêm http://stackoverflow.com/questions/2056649/how-do-i-pass-parameters-to-the-filefind-subroutine-that-processes-each-file –

+0

@ Sinan Ünür nhận xét của bạn http://stackoverflow.com/questions/2056649/how-do-i-pass-parameters-to-the-filefind-subroutine-that-processes-each-file giải quyết được câu hỏi của tôi. nếu bạn đăng nó như một câu trả lời tôi sẽ đánh dấu là được chấp nhận – jojo

Trả lời

10

Bạn sử dụng một đóng cửa:

use File::Copy; 

my $outdir= "/home/me/saved_from_tmp"; 
find(sub { copy_to($outdir, $_); }, '/tmp'); 

sub copy_to 
    { my($destination_dir, $file)= @_; 
    copy $file, "$destination_dir/$file" 
     or die "could not copy '$file' to '$destination_dir/$file': $!"; 
    } 
3

Hợp đồng của File::Find chỉ định thông tin nào được chuyển đến &wanted.

Hàm mong muốn không có đối số mà thay vào đó nó hoạt động thông qua tập hợp các biến.

  • $File::Find::dir là tên thư mục hiện hành,
  • $_ là tên tập tin hiện tại trong thư mục đó
  • $File::Find::name là tên đường dẫn đầy đủ đến tập tin.

Nếu có thêm thông tin bạn muốn cung cấp trong cuộc gọi lại, bạn có thể create a sub reference that calls your wanted sub with the desired parameters.

+0

Cảm ơn, Tôi đang nhận thức về tùy chọn này, nhưng tôi muốn biết nếu có một số hack để truyền tham số (không sử dụng toàn cục). – jojo

4

Bạn có thể tạo bất kỳ loại tham chiếu mã nào bạn muốn. Bạn không phải sử dụng tham chiếu đến một chương trình con được đặt tên. Đối với nhiều ví dụ về cách thực hiện việc này, hãy xem mô-đun File::Find::Closures của tôi. Tôi đã tạo ra mô-đun đó để trả lời chính xác câu hỏi này.

+0

Điều này có thể phù hợp với tôi – jojo

Các vấn đề liên quan