2009-02-06 17 views
9

Tôi đang cố gắng xử lý khả năng không có đối số và không có dữ liệu đường ống nào được chuyển đến tập lệnh Perl. Tôi giả định rằng nếu không có đối số thì đầu vào sẽ được truyền qua STDIN. Tuy nhiên, nếu người dùng không cung cấp đối số và không đặt bất kỳ thứ gì vào tập lệnh, nó sẽ cố gắng lấy đầu vào bàn phím. Mục tiêu của tôi là cung cấp một thông báo lỗi thay thế.Làm thế nào tôi có thể kiểm tra (peek) STDIN cho dữ liệu đường ống trong Perl mà không sử dụng lựa chọn?

Thật không may, select() không thể chuyển sang một số hệ thống không phải POSIX. Có cách nào khác để thực hiện điều này với tính di động tối đa không?

Trả lời

19

Perl đi kèm với các nhà điều hành -t tập tin kiểm tra, mà cho bạn biết nếu một filehandle đặc biệt là mở cửa cho một TTY. Vì vậy, bạn sẽ có thể làm điều này:

if (-t STDIN and not @ARGV) { 
    # We're talking to a terminal, but have no command line arguments. 
    # Complain loudly. 
} 
else { 
    # We're either reading from a file or pipe, or we have arguments in 
    # @ARGV to process. 
} 

Xét nghiệm nhanh chóng cho thấy làm việc tốt này trên Windows với Perl 5.10.0, và Linux với Perl 5.8.8, vì vậy nó nên được cầm tay trên Perl phổ biến nhất môi trường.

Như những người khác đã đề cập, select sẽ không phải là lựa chọn đáng tin cậy vì có thể có những lúc bạn đọc từ một quy trình, nhưng quá trình đó chưa bắt đầu viết.

All the best,

Paul

+0

Xác nhận để làm việc trên Mac OS X. +5 nếu tôi có thể, nhưng tôi không thể, vì vậy +1. –

5
use POSIX 'isatty'; 
if (! @ARGV && isatty(*STDIN)) { 
    die "usage: ..."; 
} 

Xem: http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

Lưu ý rằng chọn sẽ không giúp ích nhiều cho dù sao, vì nó sẽ tạo ra kết quả sai nếu các thông tin đường ống là chưa sẵn sàng. Ví dụ:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)' 
+0

Đây không phải là tốt hơn hơn 'chọn()', bạn đang sử dụng POSIX quá. OP nói cụ thể: * Thật không may, select() không thể di chuyển đến một số hệ thống không POSIX. * – nyuszika7h

+0

Tôi đang giải thích điều gì sẽ tốt hơn lựa chọn nơi không có tính di động không phải POSIX. – ysth

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