加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl代码块

发布时间:2020-12-15 21:53:20 所属栏目:大数据 来源:网络整理
导读:我对perl中的代码块有疑问.给出以下代码: my @newArr = sort { $a = $b } @oldArr; 使用代码块作为参数. 我可以把它重写为: sub sortFunc { return $a = $b; } my @newArr = sort sortFunc @oldArr; 我试图弄清楚这种机制是如何工作的. 目前我需要实现一种
我对perl中的代码块有疑问.给出以下代码:
my @newArr = sort { $a <=> $b } @oldArr;

使用代码块作为参数.

我可以把它重写为:

sub sortFunc {
        return $a <=> $b;
    }
    my @newArr = sort sortFunc @oldArr;

我试图弄清楚这种机制是如何工作的.
目前我需要实现一种复杂的排序函数,它在代码块中看起来很混乱,但它取决于一些局部变量.
例如:

foreach my $val (@values){
       my @newArr = sort { $hash{$a}{$val}<=> $hash{$b}{$val} } @oldArr;
       ...
   }

但我们假设sort函数更复杂,因此它不能完全适合上面的代码.

如果我尝试使用一个函数(在for循环的范围内本地定义),我会不断获得“在hash元素中使用未初始化的值”.

我假设这是因为sub被解析一次,而不是为for循环的evry迭代重新创建.我试图了解如何实现每次迭代将重新解释的代码块,或者可能如何传递参数

解决方法

由于某些原因你没有显示有问题的代码,但我认为它是类似的
for my $val (@values) {
   sub sort_func {
      return $hash{$a}{$val} <=> $hash{$b}{$val};
   }

   my @newArr = sort sort_func @oldArr;
}

I am trying to figure out how this mechanism works. […] I assume that’s because the sub is parsed once,and not recreated for evry iteration of the for loop.

不完全的.以下只解析和编译sub一次,但它有效:

for my $val (@values) {
   my $cmp_func = sub {
      return $hash{$a}{$val} <=> $hash{$b}{$val};
   };

   my @newArr = sort $cmp_func @oldArr;
}

重要的是什么时候捕获$val.在评估子{…}时捕获$val.记住这一点

sub foo { ... }

在这方面与以下相同,

BEGIN { *foo = sub { ... }; }

在我的代码中,它从foreach循环中捕获$val.在你的程序中,它在编译时捕获,因此它捕获编译时存在的$val.这不是你想要的变量.

现在您知道如何使其工作,您可以根据需要将复杂代码移出(循环外).

sub make_cmp_func {
   my ($hash,$val) = @_;
   return sub {
      return $hash->{$a}{$val} <=> $hash{$b}{$val};
   };
}

for my $val (@values) {
   my $cmp_func = make_cmp_func(%hash,$val);
   my @newArr = sort $cmp_func @oldArr;
}

或者,您可以将必要的值传递给比较函数,而不是捕获它们.

sub cmp_func {
   my ($hash,$val,$a,$b) = @_;
   return $hash->{$a}{$val} <=> $hash{$b}{$val};
}

for my $val (@values) {
   my @newArr = sort { cmp_func(%hash,$b) } @oldArr;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读