什么"持续"在Perl做什么?

时间:2016-07-03 13:28:34

标签: perl

在下面的代码中,last在while循环中做了什么?我知道,如果$matrix[$i][$j]{pointer}变量等于"none",则会调用last,但它会做什么?

为什么$ matrix变量包含使用花括号的分数和指针? {score},我把它读作数组中的第三维,但这是别的吗?无法在Google上找到关于此的任何内容。谢谢!

my @matrix;
$matrix[0][0]{score}   = 0;
$matrix[0][0]{pointer} = "none";
#populate $matrix with more stuff

while (1) {
  last if $matrix[$i][$j]{pointer} eq "none"; #<-what is this "last" doing?
  #do some more stuff here
}

3 个答案:

答案 0 :(得分:9)

last命令的可用用途:

  • 最后一次LABEL

  • 最后EXPR

  • 最后

根据Perl的documentation

  

last命令类似于C中的break语句(如中所用)   循环);它会立即退出有问题的循环。如果LABEL是   省略,该命令指的是最里面的封闭循环。最后   从Perl 5.18.0开始提供的EXPR表单允许使用标签名称   在运行时计算,并且在其他方​​面与最后一个LABEL相同。   如果有的话,继续块不会被执行:

 LINE: while (<STDIN>) {
        last LINE if /^$/;  # exit when done with header
        #...
    }
  

last不能用于退出返回eval等值的块   {},sub {}或do {},不应该用于退出grep或map   操作。注意,块本身在语义上与a相同   执行一次的循环。因此,最后可以用于实现提前退出   走出这样一个街区。

答案 1 :(得分:6)

您有一个关于last的答案,但我想我会分享此图片,说明nextlastredo如何影响Perl中的逻辑流程循环:

enter image description here

可以选择将continue块添加到循环中以定义一些语句,这些语句将在循环返回到顶部之前在每次迭代时运行以重新评估循环条件。如果没有continue块,next将直接返回到循环条件。

答案 2 :(得分:1)

由于您已经得到.data(data)的答案,我将解答您问题的第二部分。 Perl有数组和哈希表(也称为字典)。顶层的last是一个数组,但随后用另一个数组初始化,第二个数组中的元素用哈希表初始化。

如果您使用Data :: Dumper将其打印出来,或将其导出为JSON,您会看到以下内容:

@matrix