perl - eval{} 语句中 If() 语句后空 {} 的定义

标签 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 的下一次迭代中继续环形。

我难以破译的部分是 {};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

最佳答案

忽略 elsifelse子句中,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/

    相关文章:

    perl - Moose 与 MooseX::Declare

    Perl 脚本从两个日期范围之间的日志文件中提取数据,文件中不需要输入日期

    perl - 使用 Perl 访问 50 万页

    perl - sv_catpv() 和 sv_catpvs() 有什么区别?

    arrays - 如何获取数组的最后一个元素并显示其余元素?

    perl - Perl 正则表达式匹配中的数字符号 (#) 是什么意思?

    可由文件控制的C调试器

    perl - 在 perl 中使用一个值声明多个键是否有简单的语法?

    perl - 当发生冲突时,这是否保证用 %hash2 覆盖 %hash1 ?

    perl - 如何在 Perl 中通过 ssh 从 cat 获取输入