我的foreach循环不能按照我的意愿运行。我希望它循环遍历数组,并找到一个元素存在的时间和元素不存在的时间。但是,我让所有人都说Not an apple
。
@fruit = ('apple','orange','pear');
foreach(@fruit){
if(@fruit != 'apple'){
print "Not an apple\n";
}
else{
print "Is an apple\n";
}
}
答案 0 :(得分:7)
使用eq
(相等)和ne
(不相等)比较字符串。 $_
是隐式foreach
变量,应该像
if ($_ ne 'apple')
如果要使用显式循环变量:
foreach my $v (@fruit) {
if($v ne 'apple'){
print "Not an apple\n";
}
else{
print "Is an apple\n";
}
}
现在,为什么要为"Not an apple\n"
的所有元素打印所有@fruit
?首先,!=
导致左侧在标量上下文中进行评估,该上下文给出了@fruit
的元素数,即 3
。另一方面,'apple'
(不是数字)在此数字比较中求值为 0
以获得相等性。因此,对于数组的每个元素,if
条件将减少为:
if (3 != 0) {
当然,无论数组元素是什么,它都适用于数组的每个元素。
答案 1 :(得分:2)
使用模块严格和警告将帮助您避免这些错误。 http://www.perlmonks.org/?node_id=111088
答案 2 :(得分:2)
让我们使用更现代的方式编写Perl:
use strict;
use warnings;
use feature qw(say);
my @fruits = qw( apple orange pear );
for my $fruit ( @fruits ) {
if ( $fruit ne 'apple' ) {
say "$fruit is not an apple";
}
else {
say "This is an apple.";
}
}
您在代码中犯了几个错误,如果您的代码中有use warnings;
,Perl就会告诉您这些错误。这就是应该始终包含use warnings
的原因。 use strict
强制您使用更严格的语法,这意味着您不能使用 barewords (您必须引用字符串并确保函数是属性声明的)。而且,您必须声明您的变量(通常使用my
)。
你有:
foreach (@fruit) {
这意味着每个水果都在$_
变量中,而是使用
if ( @fruit != ... )
在if
陈述中。也就是说,您将整个@fruit
数组与值进行比较。此外,!=
仅用于数字比较。您希望ne
进行字符串比较。 use warnings
会发现这两个错误。
您的if
语句应如下所示:
if ( $_ ne '...' ) {
但是,由于各种原因,我通常不建议使用$_
。它的最初目的是使代码更容易阅读,但它通常会失败。相反,我通常会使用显式变量名称:
for my $fruit ( @fruits ) {
而不是
foreach (@fruit);
另请注意,在命名数组和哈希时使用复数(因为它们通常是对象组),这样,我最终不会得到@fruit
,$fruit
和{ {1}}这可能令人困惑(虽然合法)。您可以添加后缀(即%fruit
)以帮助澄清单个变量中的数组。
我还想使用@fruit_list
代替say
,因为print
会自动将say
添加到打印输出的末尾。当我将pragma \n
添加到我的程序中时,我得到了say
命令。
我也喜欢使用feature qw(say);
来定义一个单词列表。与使用引号和逗号相比,它更清晰,更易于阅读。注意我不会在我的水果名称之间添加逗号。