我目前正在尝试记录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
答案 0 :(得分:7)
忽略elsif
和else
条款,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...
从技术上讲,如果变量是神奇的,那就可以了。
$ perl -MTie::Scalar -e'
our @ISA = "Tie::StdScalar";
tie(my $x, __PACKAGE__);
sub FETCH { die }
defined($x)
'
Died at -e line 4.
我怀疑的目的是检查这个。
从技术上讲,它也会清除$@
。
答案 1 :(得分:2)
eval{}
返回上次展示的结果(在您的示例中为1)或undef
如果有异常。您可以编写相同的代码,
my $ok = eval {
if (defined $timeEnd && defined $timeStart){};
1
};
$ok or next;
..返回的值是迷你程序中评估的最后一个表达式的值;也可以使用return语句,就像子例程一样。
如果存在语法错误或运行时错误,或者执行了die语句,eval将在标量上下文中返回undef或在列表上下文中返回空列表,并将$ @设置为错误消息