Perl 如何使用foreach循环检查数组的哪些元素等于给定字符串?

Perl 如何使用foreach循环检查数组的哪些元素等于给定字符串?,perl,foreach,Perl,Foreach,我的foreach循环没有按我希望的那样工作。我想让它在数组中循环,找出一个元素何时存在,何时不存在。然而,我听到他们都说不是苹果 @fruit = ('apple','orange','pear'); foreach(@fruit){ if(@fruit != 'apple'){ print "Not an apple\n"; } else{ print "Is an apple\n"; } } 使用eq(相等

我的foreach循环没有按我希望的那样工作。我想让它在数组中循环,找出一个元素何时存在,何时不存在。然而,我听到他们都说
不是苹果

@fruit = ('apple','orange','pear');

foreach(@fruit){
     if(@fruit != 'apple'){
          print "Not an apple\n";
     }
     else{
          print "Is an apple\n";
     }
}

使用
eq
(相等)和
ne
(不相等)比较字符串
$\uu0
是隐式的
foreach
变量,它的用法如下:

if ($_ ne 'apple')
如果要使用显式循环变量:

foreach my $v (@fruit) {

     if($v ne 'apple'){
          print "Not an apple\n";
     }
     else{
          print "Is an apple\n";
     }
}
现在,为什么要为
@fruit
的所有元素打印所有
“不是苹果”
?首先是
=
的结果是在标量上下文中对左侧进行求值,从而给出
@fruit
的元素数,即
3
。另一方面,
'apple'
不是数字,在这个数值比较中计算为
0
。因此,数组中每个元素的
if
条件减少为:

if (3 != 0) {

当然,这适用于数组的每个元素,无论该数组元素是什么。

使用模块和警告将帮助您避免这些错误

让我们使用更现代的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.";
   }
}
您在代码中犯了几个错误,如果您有
则使用警告
在您的代码中,Perl会告诉您关于它们的信息。这就是为什么应始终包括
使用警告的原因。
use strict
强制您使用更严格的语法,这意味着您不能使用裸字(必须引用字符串并确保函数已声明属性)。而且,您必须声明变量(通常使用
my

你有:

foreach (@fruit) {
这意味着每个水果都将位于
$\ucode>变量中,但是您使用的是

if ( @fruit != ... )
if
语句中。也就是说,您正在将整个
@fruit
数组与值进行比较。还有,
=仅用于数值比较。您需要
ne
进行字符串比较。
use warnings
将捕获这两个错误

您的
if
语句应该如下所示:

if ( $_ ne '...' ) {
但是,出于各种原因,我通常不建议使用
$\uuu
。它最初的目的是使代码更易于阅读,但通常无法做到这一点。相反,我通常会使用显式变量名:

for my $fruit ( @fruits ) {
而不是

foreach (@fruit);
还要注意的是,我在命名数组和散列时使用复数(因为它们通常都是对象组),这样一来,我就不会得到可能令人困惑的
@fruit
$fruit
%fruit
(虽然合法)。您也可以添加后缀(即
@fruit\u list
)来帮助从单个变量中澄清数组

我还喜欢使用
say
而不是
print
,因为
say
会自动将
\n
添加到打印输出的末尾。当我添加pragma
功能qw(say)时,我得到了
say
命令到我的程序


我还喜欢使用
qw(…)
来定义一个单词列表。它比使用引号和逗号更简洁易读。注意:我不会在我的水果名称之间添加逗号。

始终使用
使用strict;使用警告+1您可能想指出
@fruit
的左侧=计算为数组中的元素数。