2010-03-30 31 views
8

Tôi chỉ thấy một số mã trong cơ sở mã của chúng tôi (và nó là mã OLD, như trong Perl 3 hoặc Perl 4 ngày) trông như thế này (tôi đơn giản hóa đáng kể):Perl đang làm gì với lập luận này để thúc đẩy trong trường hợp này?

@array; 
push(array, $some_scalar); 

Chú ý rằng array trong số push() không có số @. Tôi sẽ giả định rằng các mã phía sau đẩy biết rằng đối số đầu tiên được coi là mảng để lấy mảng từ các typ = array typeglob. Đó là nhiều hay ít nó? Nếu Perl có thể làm điều đó mà không có vấn đề, tại sao bạn cần phải bao gồm các @ ở tất cả?

+1

Chạy mã này bằng 'sử dụng cảnh báo' và xem câu trả lời có phù hợp với câu hỏi của bạn hay không. – mob

+1

Bật cảnh báo cho mã cũ này sẽ là một thảm họa không được xác nhận, nhưng tôi hiểu rõ vấn đề của bạn. – Morinar

+2

@Monirar: nếu bạn phải duy trì mã này, cải thiện nó để chạy với cảnh báo được kích hoạt có thể bằng chứng rất hữu ích mặc dù. –

Trả lời

9

Đây là 'tính năng' cũ của trình phân tích cú pháp. @ Không bắt buộc phải đẩy nếu biến là biến gói. Điều này được coi là nhiều như là một lỗi mà nên được cố định mặc dù. Bạn thực sự không nên làm điều này.

+0

Hm, nó có vẻ không thực sự thực hiện việc đẩy, mặc dù. Với điều này: 'perl -e 'my @array =(); đẩy (mảng, "foo"); in "@array \ n"; ''Tôi không nhận được kết quả đầu ra. Tôi làm điều gì đó ngu ngốc? – Cascabel

+2

Có thể nó có liên quan đến typeglobs. Mã mẫu của Jefromi ở trên không xuất ra bất cứ thứ gì, nhưng nếu bạn loại bỏ 'my', thì nó sẽ xuất hiện. – mob

+1

Vâng, bạn nói đúng. Nó chỉ có vẻ làm việc cho các biến gói. –

4

Đây là một "tính năng" đáng ngờ của perl, hành vi không được chấp nhận; nó phải là một lỗi, nhưng nó hoạt động.

Nếu bạn bật những lời cảnh báo của trình biên dịch (perl -W, rất khuyến khích), nó cảnh báo:

Array @aa missing the @ in argument 1 of push() at xx.pl line 2. 
Các vấn đề liên quan