2012-06-14 24 views
5

Dường như các biến trong backticks không được mở rộng khi được truyền vào hàm readpipe. Nếu tôi ghi đè lên hàm readpipe, làm cách nào để mở rộng các biến?Làm cách nào để mở rộng các biến trong trình xử lý readpipe của Perl?

BEGIN { 
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 

Chạy điều này mang lại:

Run:ls /root 
Run:ls $dir 

Tôi cố gắng để thử cuộc gọi bên ngoài cho một mã kiểm tra mà tôi đang viết. Nếu có một mô-đun CPAN ở đâu đó có thể giúp đỡ trong việc chăm sóc của tất cả điều này, điều đó sẽ giúp quá.

Cập nhật:

Tôi đã quyết định sử dụng một cách giải quyết thực sự xấu xí đến vấn đề của tôi. Nó chỉ ra rằng bằng cách sử dụng readpipe() thay vì backticks mở rộng các biến một cách chính xác. Tôi đang sử dụng một trình dọn dẹp tập lệnh tự động trước khi chạy các thử nghiệm của mình để chuyển đổi tất cả các lần trả về thành readpipe() trước khi chạy thử nghiệm.

ví dụ Chạy:

$ cat t.pl 

BEGIN { 
    *CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 
readpipe("ls $dir"); 

Cung cấp:

$ perl t.pl 
Run:ls /root 
Run:ls $dir 
Run:ls /var 

tôi vẫn đang tìm ra một giải pháp sạch hơn mặc dù.

Trả lời

3

Điều đó dường như là một lỗi trong Perl. Sử dụng perlbug để báo cáo.

1

Bạn có thể muốn sử dụng IPC::Run để thay thế.

use IPC::Run 'run'; 

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!"; 

Hoặc nếu bạn không muốn nắm bắt đầu ra, system() có thể tốt hơn

system("ls", $dir) == 0 or die "Cannot system - $!"; 
+1

Cảm ơn ref module. Tuy nhiên, tôi đang tìm kiếm một cách dễ dàng để loại bỏ các cuộc gọi hệ thống như backticks và system() để chạy các yêu cầu hủy của tôi về một mã cũ. –

+0

@SandipBhattacharya Tôi chắc chắn không phải tôi hiểu vấn đề. backticks và exec không trả lại bất kỳ đầu ra trong khi hệ thống nào. sẽ eval và qx phù hợp với hóa đơn? – shinronin

+0

@shinronin Tôi đang cố gắng ghi đè/thử nghiệm các câu trả lời trong mã cũ hiện có để tôi có thể kiểm tra chúng một cách an toàn. Trong khi tôi có thể thay thế '* CORE :: GLOBAL :: readpipe' thành mô phỏng, chúng không hoạt động trong trường hợp đối số bao gồm các biến được mở rộng. Bởi vì hành vi không nhất quán này giữa backticks và 'readpipe()' rất khó để giả lập mã như vậy. Tôi không cố gắng viết mã mới. Nếu tôi đã làm, tôi đã sử dụng 'readpipe()' thay vì backticks để tôi có thể giả lập mã nếu tôi muốn. –

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