2015-01-28 23 views
8

Tôi đã viết một mô-đun như một phần của ứng dụng khi tôi nhận thấy kết quả kiểm tra cú pháp trong cảnh báo về việc sử dụng vô số hằng số (1). Tại sao vậy?Tại sao Perl cảnh báo về "hằng số vô dụng 1" khi sử dụng bigint?

Hằng số là bắt buộc 1 ở phần cuối của các mô-đun mà thường bị bỏ qua bởi những cảnh báo như perldoc perldiag nói:

Cảnh báo này sẽ không được cấp cho các hằng số bằng 0 hoặc 1 vì chúng là thường được sử dụng trong báo cáo như

1 while sub_with_side_effects(); 

(có lẽ một nguồn thậm chí tốt hơn cho điều đó. Sau khi tất cả 1 ở phần cuối của file là hoàn toàn mong muốn và không phải là Warne d.)

Nhưng cảnh báo được tạo ngay cả đối với các mô-đun gần như trống nếu chúng use bigint.

package Foo; 

use bigint; 

1; 

Đối với cú pháp kiểm tra tập tin đơn giản này tạo ra các cảnh báo sau đây:

$> perl -Wc Foo.pm 
Useless use of a constant (1) in void context at Foo.pm line 5. 
Foo.pm syntax OK 

tôi không thể tìm thấy bất kỳ tài liệu tham khảo để bigint và thông điệp cảnh báo trừ Put long hex numbers in sqlite nhưng điều này không thực sự giải quyết vấn đề của tôi, tôi suy nghĩ.

Perl của tôi là v5.14.4 trên Cygwin với bigint 0.36.

+2

[Nghe có vẻ giống như một lỗi.] (Http://perldoc.perl.org/perlbug.html) – Dan

+1

Thú vị find. Tôi đoán đó là bởi vì nó không còn '1' và do đó có thể bỏ qua, và thay vào đó là một loại đặc biệt '1'. – Sobrique

Trả lời

8

Có hai vấn đề hiện tại đây.

  1. Tại sao use bigint; 1; cảnh báo trong ngữ cảnh trống?
  2. Tại sao hằng số được thực thi trong ngữ cảnh trống ở vị trí đầu tiên?

$ perl -c -we'1 while sub_with_side_effects();' 
-e syntax OK 

$ perl -c -we'use bigint; 1 while sub_with_side_effects();' 
Useless use of a constant (1) in void context at -e line 1. 
-e syntax OK 

Tại sao use bigint; 1; cảnh báo trong khoảng trống bối cảnh?

use bigint; cài đặt một callback mà được gọi là khi một chữ liên tục bắt gặp bởi các phân tích cú pháp, và giá trị trả về bởi khi gọi lại được sử dụng như hằng số để thay thế. Như vậy, dưới use bigint;, 1 không còn thực sự đơn giản chỉ là 0 hoặc 1 nữa.

Nhưng bạn không làm gì sai, vì vậy cảnh báo này là giả mạo.Bạn có thể làm việc xung quanh nó bằng cách sử dụng () hoặc undef thay vì 1.

undef while sub_with_side_effects(); 

Trừ khi tôi cần phải sử dụng nó trong suốt cơ sở mã của tôi, tôi sẽ ủng hộ như sau:

while (sub_with_side_effects()) { } 

$ cat Module.pm 
package Module; 
use bigint; 
1; 

$ perl -c -w Module.pm 
Useless use of a constant (1) in void context at Module.pm line 3. 
Module.pm syntax OK 

Tại sao hằng số được thực hiện trong khoảng trống bối cảnh?

Khi Perl thực hiện mô-đun , Perl dự kiến ​​mô-đun trả về giá trị vô hướng, vì vậy Perl sẽ thực thi mô-đun theo ngữ cảnh vô hướng.

Tuy nhiên, bạn đã yêu cầu Perl biên dịch mã số Module.pm. Khi Perl thực hiện một kịch bản lệnh, Perl không yêu cầu bất kỳ giá trị nào được trả về, vì vậy Perl thực thi kịch bản trong ngữ cảnh void.

Sử dụng mô-đun làm tập lệnh có thể gây ra cảnh báo và lỗi giả mạo và do đó có thể vượt qua -W. Thử nghiệm một mô-đun sử dụng như sau:

perl -we'use Module' 

Trên thực tế, bạn không nên thậm chí không cần -w kể từ khi bạn đã cần phải có use warnings; trong mô-đun. Tất cả các bạn thực sự cần là

perl -e'use Module' 
6

-W thay vì use warnings; trong mô-đun của bạn hoặc kiểm tra mô-đun bằng -c thay vì perl -MFoo -e0 có thể hiển thị lỗi giả mạo. Đây là một ví dụ về sau này.

Khi bạn tải mô-đun thông thường, nó không phải là trong ngữ cảnh trống, bởi vì nó đang kiểm tra kết quả là đúng.

(Lưu ý rằng khi tôi cố gắng sử dụng nó 5.20.1, các -W cũng dẫn đến một giả mạo overload arg '..' is invalid at /usr/share/perl/5.20/Math/BigInt.pm line 155.)

+0

Trớ trêu thay, 'perl -MFoo-we0' thất bại khi kiểm tra bigint. 'perl-we'use bigint; '' làm như vậy mà không cần cảnh báo. – ikegami

+0

@ikegami: không thành công? Điều đó giống như thế nào? nó hoạt động cho tôi – ysth

+1

ah, bạn có nghĩa là -Migigint; có, đó là mỉa mai. 'perl -MFoo -we #' hoạt động – ysth

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