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

时间:2014-06-06 15:00:51

标签: perl foreach

我的foreach循环不能按照我的意愿运行。我希望它循环遍历数组,并找到一个元素存在的时间和元素不存在的时间。但是,我让所有人都说Not an apple

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

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

3 个答案:

答案 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);来定义一个单词列表。与使用引号和逗号相比,它更清晰,更易于阅读。注意我不会在我的水果名称之间添加逗号。