2015-07-02 31 views
16

Khi tôi sử dụng <stdin> trong mô-đun Perl (*.pm) tệp không đọc đầu vào từ bàn phím, nhưng khi tôi sử dụng <STDIN> ở cùng một vị trí, nó hoạt động tốt.Sự khác nhau giữa <stdin> và <STDIN> là gì?

Tại sao nó không nhận được đầu vào khi tôi sử dụng <stdin>?

+2

'stdin': Gotta yêu các tính năng không có giấy tờ. Gắn bó với 'STDIN' – tjd

Trả lời

21

STDIN là tệp được ghi tài liệu. Có tồn tại stdin, được đặt tên là STDIN, nhưng nó chỉ hoạt động trong gói main::: main::stdin giống với main::STDIN (như được ghi trong perlop - Perl operators and precedence).

Trong một gói, do đó,

package My::Package; 
sub xx { 
    print while <stdin>; 
} 

stdin được hiểu như là My::Package::stdin, mà không tồn tại. Bạn có thể sử dụng main::stdin từ một gói, nhưng sử dụng tiêu chuẩn STDIN (mà luôn luôn trỏ đến main::STDIN, ngay cả từ một gói) là sạch hơn nhiều.

+2

wow, không biết về' stdin'! – ikegami

12

Không biết về điều này, nhưng tìm thấy nó ghi lại trong một đoạn ném-xa trong perlop

Các filehandles STDIN, STDOUT, và STDERR là xác định trước. (Filehandles stdin, stdoutstderr cũng sẽ hoạt động ngoại trừ trong các gói, nơi chúng sẽ được hiểu là số nhận dạng cục bộ chứ không phải toàn cục.) Các tệp có thể được tạo bằng hàm open(), trong số các tệp khác. Xem perlopentut và "open" trong perlfunc để biết chi tiết về điều này.

+2

Tại sao mọi người biết điều này? – mob

+0

Tôi thực sự đang cố gắng suy nghĩ về điểm làm việc đó ngay từ đầu. Ý tôi là, tôi chỉ có thể xem tại sao có một bí danh chữ thường có thể có ý nghĩa nào đó, nhưng không phải là một hành vi khác. – Sobrique

+3

Đây có thể là một điều lịch sử cũ hơn gói, và không ai bị làm phiền đủ để sửa chữa hành vi của nó khi các gói được giới thiệu. – choroba

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