2010-11-09 25 views
5
#!/usr/bin/env perl 
use warnings; 
use 5.12.2; 

my $c = 'f'; # could be a number too 

if ($c eq 'd' || $c == 9) { 
    say "Hello, world!"; 
} 

Cách tốt nhất để tránh 'Đối số' f "không phải là số trong số eq (==) tại ./perl.pl dòng 7 .'- cảnh báo?
Tôi giả sử trong trường hợp này tôi có thể sử dụng "eq" hai lần, nhưng điều đó không tốt.Cách tốt nhất để tránh "không phải là số trong số eq (==)" - cảnh báo

+0

tôi sẽ sử dụng "eq". –

Trả lời

16

Không chắc lý do tại sao bạn muốn tránh các cảnh báo. Cảnh báo cho bạn biết rằng có sự cố tiềm ẩn trong chương trình của bạn.

Nếu bạn định so sánh một số với chuỗi chứa dữ liệu không xác định, thì bạn sẽ phải sử dụng 'eq' để so sánh hoặc xóa dữ liệu theo cách nào đó để bạn biết trông giống như một con số.

+0

Bạn đang ở vị trí chủ yếu, tuy nhiên câu hỏi đặt ra là: làm thế nào người ta có thể vô hiệu hóa các tin nhắn. Perls sự khác biệt giữa chuỗi và so sánh số là gây phiền nhiễu tốt nhất. Nó không có vẻ quan trọng nếu so sánh được thực hiện thông qua '==' hoặc 'eq' để có thể tắt cảnh báo. Trong mắt tôi, câu trả lời của Eugene Y là câu trả lời cho câu hỏi này. –

+0

Giả sử rằng việc so sánh được thực hiện thông qua == hoặc eq, cách thích hợp là sử dụng toán tử so sánh chuỗi để so sánh chuỗi. Tắt cảnh báo là tương đối nhiều công việc hơn là sử dụng toán tử đúng để bắt đầu; chưa kể rằng toàn bộ cơ sở cho câu hỏi là ý kiến ​​sơ sài rằng "eq" được sử dụng hai lần "không có vẻ tốt." '$ c' là một chuỗi, và không có môn toán liên quan ở đây. Vì vậy, đối xử với nó như một chuỗi, vì lợi ích của thiên đường, và chỉ trích dẫn chín. :) – dannysauer

4

Cách rõ ràng để tránh cảnh báo về việc so sánh một số không với số là không làm điều đó! Cảnh báo có lợi cho bạn - họ không nên bỏ qua, hoặc làm việc xung quanh.

các tốt nhất cách bạn cần cung cấp bối cảnh nhiều hơn để trả lời là gì - ví dụ: những gì $c đại diện, và tại sao nó cần thiết để so sánh nó làm 'd' hoặc 9 (và tại sao không sử dụng $c eq '9')?

+0

Bởi vì nếu $ c eq "9" hoặc "9.0" hoặc "009" thì sao? Tốt nhất để sử dụng Scalar :: Util 'looks_like_number'; như eugene đã nói ở trên. –

+0

đó là những gì tôi yêu cầu anh ta làm rõ! – Alnitak

23
use Scalar::Util 'looks_like_number';  

if ($c eq 'd' || (looks_like_number($c) && $c == 9)) { 
    say "Hello, world!"; 
} 

Bạn cũng có thể vô hiệu hóa loại này cảnh báo tạm thời:

{ 
    no warnings 'numeric'; 
    # your code 
} 
+0

hoạt động tốt. Cảm ơn! Vì tôi phải sử dụng XMPP để gỡ lỗi cảnh báo vĩnh viễn là một lý do rất tốt để vô hiệu hóa loại này cho tốt. –

0

Sử dụng một biểu thức chính quy để xem nếu đó là một con số:

if(($num=~/\d/) && ($num >= 0) && ($num < 10)) 
{ 
    # to do thing number 
} 
Các vấn đề liên quan