在eval {}语句中的If()语句之后定义empty {}

时间:2016-04-14 06:24:14

标签: perl

我目前正在尝试记录Perl脚本以准备将其转换为.NET。我之前没有Perl的经验,但是我设法通过很多Google-fu来完成它。我遇到了阻止我的一行代码,因为我不确定它的作用。我已经能够弄清楚其中的大部分内容,但我错过了一篇文章而且我不知道它是否真的那么重要。这是代码行:

eval { if(defined $timeEnd && defined $timeStart){}; 1 } or next;

我知道defined正在检查变量$timeEnd$timeStart,看看它们是null / nothing / undef。我还认为eval块被用作Try / Catch块来捕获任何异常。代码行位于foreach循环中,因此我相信next关键字将继续foreach循环的下一次迭代。

I解码困难的部分是{};1位。我的理解是;是Perl中的语句分隔符,因为它没有用反斜杠转义,我不知道它在那里做了什么。我也不知道{}的含义。我认为它与数组有关,但它是一个空数组,我不知道它是否在if()块之后直接表示特殊情况。最后,我不知道1的单个整数意味着什么,并且在eval块的末尾正在做什么。

如果有人可以将这行代码分解为单个部分及其定义,我将非常感激。

奖励:如果你能给我一个.NET转换,以及每个Perl位如何与它相关,我肯定会给你我的互联网尊重。以下是我将如何将其转换为VB.NET的方法:

For each element in xmlList    'This isn't in the Perl code I posted, but it's the `foreach` loop that the code resides in.
    Try
        If Not IsNothing(timeEnd) AND Not IsNothing(timeStart) then 
        End If
    Catch ex as Exception
        Continue For
    End Try
Next

2 个答案:

答案 0 :(得分:7)

忽略elsifelse条款,if语句的语法如下:

if (EXPR) BLOCK

如果EXPR评估为true,则执行该块。块由大括号中的语句列表组成。代码中的{}if语句的块。

对于空的块来说它是完全有效的(包含零语句列表)。例如,

while (s/\s//) { }

是一种效率低下的方式

s/\s//g;

问题是,以下情况没有副作用,所以它没用:

if(defined $timeEnd && defined $timeStart){}

它甚至不能抛出异常! [1] 所以

eval { if(defined $timeEnd && defined $timeStart){}; 1 } or next;

相当于

eval { 1 } or next;

相当于 [2]

1 or next;

相当于

# Nothing to see here...
  1. 从技术上讲,如果变量是神奇的,那就可以了。

    $ perl -MTie::Scalar -e'
       our @ISA = "Tie::StdScalar";
       tie(my $x, __PACKAGE__);
       sub FETCH { die }
       defined($x)
    '
    Died at -e line 4.
    

    我怀疑的目的是检查这个。

  2. 从技术上讲,它也会清除$@

答案 1 :(得分:2)

eval{}返回上次展示的结果(在您的示例中为1)或undef如果有异常。您可以编写相同的代码,

my $ok = eval {
  if (defined $timeEnd && defined $timeStart){};
  1 
};
$ok or next;

来自perldoc -f eval

  

..返回的值是迷你程序中评估的最后一个表达式的值;也可以使用return语句,就像子例程一样。

     

如果存在语法错误或运行时错误,或者执行了die语句,eval将在标量上下文中返回undef或在列表上下文中返回空列表,并将$ @设置为错误消息