Perl 一行中的简明foreach表达式
在Perl中,通常可以避免使用控制块,如下所示:Perl 一行中的简明foreach表达式,perl,syntax,foreach,Perl,Syntax,Foreach,在Perl中,通常可以避免使用控制块,如下所示: print "$_\n" foreach(@files); 而不是: foreach(@files){ print "$_\n"; } 在以下更复杂的情况下,该语法如何工作: die("Not a file: $_") unless -f $_ foreach(@files); 它给了我一个语法错误。我不想写模糊代码,它只是程序中不重要的一部分,所以我想尽可能简洁地表达它 总结答案: 我只能接受一个答案作为被接受的答案,但我最喜欢克里斯
print "$_\n" foreach(@files);
而不是:
foreach(@files){
print "$_\n";
}
在以下更复杂的情况下,该语法如何工作:
die("Not a file: $_") unless -f $_ foreach(@files);
它给了我一个语法错误。我不想写模糊代码,它只是程序中不重要的一部分,所以我想尽可能简洁地表达它
总结答案:
我只能接受一个答案作为被接受的答案,但我最喜欢克里斯和乔恩的以下答案
这一个使用了我想要的foreach
,但是没有语法错误
:
-f or die "Not a file: $_" foreach @files;
下面的一个至少也一样好。我喜欢声明开头的die
,因为这是读者应该注意的:
die("Not a file: $_") for grep {!-f} @files;
嗯,您可能不打算编写模糊代码,但我想说的是,您确实在尝试
两条线(甚至一条线上的一个街区,像布伦特。朗伯勒建议的那样)而不是一条线会如此糟糕吗?老实说,这就是我通常不喜欢调试/编辑其他人的perl代码的原因,很多用perl编写的人似乎沉迷于以最“聪明”的方式完成几乎所有事情,不要以其他人阅读时容易理解的方式进行操作。如果您不想编写模糊代码,那么您不应该尝试这样编写。你所做的事情应该是简单的,让人难以理解 你可以使用@Brent.Longborough的答案,或者如果你真的想要后缀,可以:
do { die("Not a file: $_") unless -f $_ } foreach(@files);
然而,我同意其他人的观点,仅仅因为这是“一个不重要的部分”,并不意味着简洁更好可读性计数。如果错误测试是此代码的主要点,那么将主要位置放在行首可能是有意义的。使用
grep
,会有一点小小的改进:
die("Not a file: $_") for grep {!-f} @files;
但是,如果您计划在代码的这一部分中由于其他原因循环文件,那么最好将其添加到循环体中。该死,Jon刚刚打败了我,
grep
但我有一个更大的问题:如果在数组中发现一些非文件,那么如果您真的打算退出,这怎么不重要呢?(比如说,与删除这些项目、警告用户然后处理列表的其余部分相反)我认为杀死整个shebang是程序中相当重要的一部分
在任何情况下,你都不能完全按照你的意愿使用后缀修饰符,因为它们的两边只能有一个东西。所以你不能同时拥有,除非和foreach
。从以下相关位的顶部开始:
任何简单语句都可以选择在结束分号(或块结尾)之前后跟一个修饰符
为了更好(TMTOWTDI),您可以使用逻辑短路:
-f or die "Not a file: $_" foreach @files;
在OSX和works上测试
作为旁注,-f或die
看起来像我在Perl中看到的许多常见的open()或die
构造,而且(我认为)仍然显示了这一行的意图(在某些条件下die
)。这里是一行,没有杂技:
foreach ( @files ) { die( "Not a file!" ) unless -f }
你可能会玩弄区块内的东西,把它打下来,但是移除括号和大括号对你没有任何帮助,而且可能会让下一个必须查看它的程序员感到困惑
你可能有更复杂的事情,这只是一个例子。在现实世界中,这变得更加容易:
not_a_file_die_die_die( \@files );
然后将所有复杂的内容移动到子例程中。真正的诀窍是使想法和意图简洁,而不是实现想法的代码。在很多情况下,机械原理并不重要;你更关心结果。在这种情况下,不要操之过急。+1。我一直不明白为什么有些人会说“clevver==在一行中”。我认为有些例子(比如使用grep
)是“聪明的”,但不是因为它们只是一行。它们很聪明,因为它们只是一行,但清楚地表达了意思。它看起来很不错-一行中嵌套的括号和方括号看起来很糟糕(在我看来(除了Lisp(哈哈))。这到底是怎么搞混的?你会怎么写?我同意Harleqin的观点-这一页上的几个答案表明,写这篇文章的方法既有a)清晰的,也有b)一行。我回应他的评论时说:“我不想写模糊的代码。”他的尝试被Webster定义为模糊:“回避、不清楚或混乱”。我发布时提交的回复不清楚,令人困惑,而后来发布的一些示例看起来还行。我没有说它“不可读”。但是,我断言使用链接后缀控制结构的可读性较差。这当然是主观的。重点是,OP没有说他试图最大限度地提高可读性,但它应该“简洁”,因为它“不重要”。是的。如果只是印刷品,我会说传统的符号更好。但是,如果可能的话,die可能应该是一行中的第一个标记。我同意die()
最好是在行的开头,但在紧要关头,短路逻辑对我来说同样易读。你只是在打高尔夫球吗?否则,为什么把它放在一行上很重要?非常整洁瑞士陆军电锯万岁!我喜欢。与open()或die()的并行性有点差,因为open()的目的通常是打开一个文件,而不是die()。但是,如果您认为上面代码的目的是测试文件的存在,那么并行计算是准确的。这是一个艰难的决定,但我想我更喜欢你的