Perl 如何使用foreach循环检查数组的哪些元素等于给定字符串?
我的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(相等
不是苹果
@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
在的左侧=代码>计算为数组中的元素数。