为什么在Perl中使用"do {} if"块?

Mar*_*ald 6 syntax perl

在浏览CPAN时,我遇到了这个模块中的一段代码,让我感到难过.

sub import {
  for my $mod (keys %INC) {
    do {
      delete $INC{$mod};
      $mod =~ s/\.pm$//; $mod =~ s/\//::/g;
      delete_package($mod);
    } if $mod =~ m/^SOAP/;
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么作者会使用do {} if块而不是常规if块?

Kei*_*win 5

因为他们觉得这样.没有真正的区别.Perl有十几种方法可以做任何事情.这就是语言的方式.


Eri*_*ikR 5

一个区别是do { ... }返回值而if语句没有(尽管请参阅下面的注释.)

例如:

my $x = 3;
my $z = do { warn "in the do block"; 10 } if $x == 3;
Run Code Online (Sandbox Code Playgroud)

您可以使用三元运算符完成几乎相同的操作,尽管您无法对三元运算符的分支内的语句进行排序.

  • 如果语句也返回值.由于语法有点棘手,你无法直接分配它们.但是如果你正确地嵌入它,你可以看到if返回一个值.这是一段相同的代码:`my $ z = do {if($ x == 3){warn'in do block"; 10}}`你的代码更简洁,所以我仍然认为这是合理的回答,但技术上并不完全正确. (2认同)