在Perl中,人们通常可以避免使用控制块,如下所示:
print "$_\n" foreach(@files);
代替:
foreach(@files){ print "$_\n"; }
该语法如何在以下更复杂的情况下工作:
die("Not a file: $_") unless -f $_ foreach(@files);
它给我一个语法错误.我不是要编写混淆代码,它只是程序中不重要的部分,所以我想尽可能简洁地表达它.
概括的答案:
我只接受一个答案作为接受的答案,但我最喜欢克里斯和乔恩的以下答案.
这个foreach
按照我的意图使用,但没有syntax error
:
-f or die "Not a file: $_" foreach @files;
以下一个至少同样好.我喜欢这die
是在声明的开头,因为这是读者应该注意的:
die("Not a file: $_") for grep {!-f} @files;
Chris Lutz.. 13
只是要Perlish(TMTOWTDI)你可以使用逻辑短路:
-f or die "Not a file: $_" foreach @files;
在OS X上测试并且有效.
作为旁注,-f or die
看起来像open() or die
我在Perl中看到的许多常见结构,并且仍然(我认为)显示了该行的意图(die
在某些条件下).
只是要Perlish(TMTOWTDI)你可以使用逻辑短路:
-f or die "Not a file: $_" foreach @files;
在OS X上测试并且有效.
作为旁注,-f or die
看起来像open() or die
我在Perl中看到的许多常见结构,并且仍然(我认为)显示了该行的意图(die
在某些条件下).
您可以使用@ Brent.Longborough的答案,或者如果您真的想要postfix,请执行以下操作:
do { die("Not a file: $_") unless -f $_ } foreach(@files);
但是,我同意其他人,只是因为这是"一个不重要的部分"并不意味着简洁更好. 可读性很重要.
好吧,你可能不打算写出混淆代码,但我会说你肯定会尝试.
两条线(或者甚至是一条线上的一块,就像Brent.Longborough所暗示的那样)而不是一条线那么糟糕吗?老实说,这就是我一般不喜欢尝试调试/编辑其他人的perl代码的原因,大量用perl编写的人似乎都沉迷于以最"聪明"的方式做几乎所有事情,而不是去做以一种易于理解的方式阅读其他人.
如果错误测试是此代码的主要部分,那么将它放在行的开头可能是有意义的.使用时略有改进grep
:
die("Not a file: $_") for grep {!-f} @files;
但是如果你计划在代码的那一部分出于某些其他原因循环遍历文件,那么最好将它添加到循环体中.