【发布时间】:2017-02-14 09:26:58
【问题描述】:
我注意到,如果我用三元运算符替换我正在使用的 if-else 语句,我在尝试运行我的代码时会遇到编译错误。我相信罪魁祸首是我在if-else 中的foreach() 循环。你知道为什么在这种情况下三元运算符的行为与 if-else 构造不同吗?
我的代码是这样的
#!/program/perl_v5.6.1/bin/perl5.6.1
use strict;
use warnings;
my $fruits_array_ref = &get_fruits();
if($fruits_array_ref != 0) {
print("$_ is a fruit.\n") foreach(@$fruits_array_ref);
}
else {
print("Maybe you like vegetables?\n");
}
sub get_fruits() {
my @fruit_list;
my $shopping_list = "/home/lr625/grocery_items";
open(my $shopping_list_h, "<", $shopping_list) or die("Couldn't open.\n");
while(my $line = <$shopping_list_h>) {
next if $line =~ /^\#/;
chomp($line);
push(@fruit_list, $line);
}
close($shopping_list_h) or die("Couldn't close.\n");
scalar(@fruit_list) > 0 ? return(\@fruit_list) : return(0);
}
我在购物清单中的数据看起来像
# this is a header
# to my grocery list
apple
banana
grape
orange
我将 if-else 替换为 ?: 运算符,现在在 main 函数中看起来像这样。
my $fruits_array_ref = &get_fruits();
$fruits_array_ref != 0 ? print("$_ is a fruit.\n") foreach(@$fruits_array_ref) : print("Maybe you like vegetables?\n");
另外,作为参考,我的错误说。
test.pl 第 8 行,“) foreach”附近的语法错误
test.pl 的执行由于编译错误而中止。
【问题讨论】:
-
这与您的问题无关,但如果您确实使用 Perl 5.6.1,您应该更新到新版本,例如 5.18 或 5.22 或您的操作系统提供的任何版本。 5.6 真的,真的老了。但是,我用 5.22.1 尝试了您的代码并得到了相同的结果。
-
我愿意,但我坚持做任何能给我的工作。必须用我得到的东西来凑合。 @choroba 很好地解释了我正在尝试将控制结构作为三元运算符中的操作数,所以我可能会尝试使用
do,或者我会坚持使用if-else的可预测行为 -
您可能需要花时间来吸收 Inferno 在他的回答中所说的话。您似乎有接近“聪明”解决方案的危险,而且,维护明智,“聪明”很少是一种美德。
-
是的,我做到了,并且我注意到我在我的子功能中一直在研究一个“聪明”的解决方案,我认为最后。使用我的新知识,我认为最好写成...
return( scalar(@fruit_list) > 0 ? \@fruit_list : 0 );
标签: perl foreach ternary-operator