2013-10-18 13 views
8

Câu hỏi này được đòi hỏi ra khỏi sự lười biếng trên một phần của tôi, bởi vì tôi có hàng chục kịch bản được thực hiện trong các cấu trúc đơn giản:Làm thế nào để stdin ống thành một kịch bản perl đó là tìm kiếm đầu vào là tham số duy nhất?

perl my_script.pl my_input_file 

... và sản lượng được in để stdout. Tuy nhiên, bây giờ tôi nhận ra rằng tôi có tình huống nhất định mà tôi muốn đầu vào đường ống vào các kịch bản này. Vì vậy, một cái gì đó như thế này:

perl my_script.pl my_input_file | perl my_next_script.pl | perl third_script.pl > output 

Có ai biết cách để làm điều này mà không cần phải mã hóa tất cả các tập lệnh của tôi để chấp nhận stdin thay vì tệp đầu vào do người dùng xác định? Các tập lệnh của tôi tìm kiếm tên tệp theo một tuyên bố như sau:

open(INPUT,$ARGV[0]) || die("Can't open the input file"); 

Cảm ơn bạn đã đề xuất!

Trả lời

12

Sử dụng - như filename

perl my_script.pl my_input_file | perl my_next_script.pl - | perl third_script.pl - > output 
7

mpapec đã cung cấp các giải pháp đơn giản nhất. Tôi muốn giới thiệu nhà khai thác kim cương: <>.

Trong một kịch bản mà bạn sẽ làm gì

open my $fh, "<", $ARGV[0] or die $!; 
while (<$fh>) { 
    ... 

Bạn có thể sử dụng toán tử kim cương để thay thế hầu hết các mã mà

while (<>) { 
    ... 

Hồ sơ xử lý tên sẽ ARGV nếu bạn sử dụng tên tập tin lý luận hoặc STDIN nếu không. Tên tệp sẽ được tìm thấy trong $ARGV.

Toán tử này gọi một hành vi trong đó Perl tìm đầu vào từ đối số tên tệp hoặc từ đầu vào chuẩn.

Điều đó có nghĩa rằng cho dù bạn làm

inputpipe | script.pl 

hoặc

script.pl inputfile.txt 

Nhà điều hành viên kim cương sẽ mất đầu vào tốt.

Lưu ý: Tuyên bố open của bạn là nguy hiểm. Bạn nên sử dụng ba đối số mở với chế độ rõ ràng và xử lý tệp từ vựng. Tuyên bố die được kết nối với nó phải chứa biến lỗi $! để cung cấp thông tin về lý do mở không thành công.

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