我目前正在尝试记录 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
的下一次迭代中继续环形。我难以破译的部分是
{};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
最佳答案
忽略 elsif
和 else
子句中,if 语句的语法如下:
if (EXPR) BLOCK
如果 EXPR 的计算结果为真,则执行该块。块由花括号中的语句列表组成。
{}
在您的代码中是 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.
我怀疑目的是检查这一点。
$@
. 关于perl - eval{} 语句中 If() 语句后空 {} 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36615247/