我注意到如果我用三元运算符代替if-else
语句,当我尝试运行我的代码时,我最终得到编译错误。我相信罪魁祸首是我在if-else
内部的foreach()
循环。你知道为什么三元运算符在这个例子中的行为与if-else构造不一样吗?三元运算符不允许迭代运算符,但是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
现在这个样子的主要功能。
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
语法错误,test.pl近 “)的foreach”
执行由于编译错误中止。
它与你的问题无关,但如果你的确在使用Perl 5.6.1,你应该更新到一个新的版本,比如5.18或5.22或者你的操作系统提供的任何东西。 5.6真的很老。不过,我用5.22.1试过了你的代码,得到了同样的结果。 – PerlDuck
我会,但我坚持任何工作会给我。要把我得到的东西做好。我很想解释一下,我正在试图将一个控制结构变成三元运算符中的一个操作数,所以我可能会尝试使用'do',或者我会坚持'if-else'的可预测行为 –
你可能需要花时间来吸收Inferno在他的回答中所说的话。您似乎处于接近“聪明”解决方案的危险之中,而且,明智的维护“聪明”很少是一种美德。 – tjd