Perl 一行中的简明foreach表达式

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); 它给了我一个语法错误。我不想写模糊代码,它只是程序中不重要的一部分,所以我想尽可能简洁地表达它 总结答案: 我只能接受一个答案作为被接受的答案,但我最喜欢克里斯

在Perl中,通常可以避免使用控制块,如下所示:

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()。但是,如果您认为上面代码的目的是测试文件的存在,那么并行计算是准确的。这是一个艰难的决定,但我想我更喜欢你的