这个Perl foreach做了什么?

时间:2011-04-26 12:41:49

标签: perl

我很难理解这个foreach的作用,我是perl编程的新手

-e && print ("$_\n") foreach $base_name, "build/$base_name";

这里构建是目录。感谢

4 个答案:

答案 0 :(得分:11)

不是很漂亮的代码,有人把你留在那里。 :(

中的任何一个
for ($basename, "build/$basename") { say if -e }

for my $file ($basename, "build/$basename") {
     say $file if -e $file;
}

会更清楚。

答案 1 :(得分:6)

检查文件是否存在,如果存在,则打印其名称。

可以用更清晰的方式编写。

迭代$ base_name然后构建/ $ base_name,而文件名在$ base_name

答案 2 :(得分:4)

它基本上与:

相同
foreach( $base_name, "build/$base_name" ){
  if( -e ){ 
    print ("$_\n");
  }
}

答案 3 :(得分:2)

我希望无论谁写的都不多产。

以更清晰的方式做同样事情有多少种方式?

的grep

grep过滤列表并删除任何对检查条件返回false的内容。 正在考虑的当前值设置为$_,因此使用文件测试运算符非常方便。

由于sayprint都能很好地处理字符串列表,因此在将输出传递给它们之前对其进行过滤是有意义的。

say grep -e, $base_name, "build/$base_name";

在没有say的较旧的perls上,map有时用于在打印前将新行应用于输出。

print map "$_\n", grep -e, $base_name, "build/$base_name";

这里我们安全地使用语句修饰符if。恕我直言,只要LHS保持非常简单,语句修饰符形式就会非常方便。

表示我的$ dir($ base_name,“build / $ base_name”){     打印“$ dir \ n”if -e $ dir; }

标点符号

仍然像罪一样丑陋,但是分手并使用一些额外的parens有助于识别循环的内容并将其与循环代码分开。

-e && print("$_\n")
    foreach( $base_name, "build/$base_name" );

这样更好,但请不要这样做。如果你想($foo if $bar) for @baz; DON“T 。使用一个完整大小的块。我可以在我的生活中计算一次使用$bar and $foo for @baz这样的sub print_existing_files { -e && print ("$_\n") foreach @_; } 构造一个 - 使用它可能是错误的

OP的神秘代码如果仅仅包含在一个有良好名字的子代中则更好。

我会以最熟悉的方式写下这个:

until

潜艇的主体仍然是一个谜题,但至少在名称中有某种线索。

结论

我确信我遗漏了很多关于如何做到这一点的变化(我没有任何使用{{1}}的东西,并且附近任何非故意混淆的东西都会更清楚)。但这不是重点。

关键在于,在任何语言中都有很多方法可以实现任何给定的任务。因此,重要的是,在系统上工作的每个程序员都要留意那些关注的人。

代码的存在有两个目的:与未来的程序员沟通,并按顺序指示计算机如何操作。