gpt4 book ai didi

perl foreach 循环与函数关闭规则

转载 作者:行者123 更新时间:2023-12-04 04:52:19 25 4
gpt4 key购买 nike

以下代码

#!/usr/bin/env perl

use strict;
use warnings;

my @foo = (0,1,2,3,4);

foreach my $i (@foo) {
sub printer {
my $blah = shift @_;
print "$blah-$i\n";
}

printer("test");
}

不符合我的预期。

到底发生了什么?
(我希望它打印出“test-0\ntest-1\ntest-2\ntest-3\ntest-4\n”)

最佳答案

问题是 sub name {...}构造不能像 for 那样嵌套。环形。

原因是因为sub name {...}真正的意思是BEGIN {*name = sub {...}}和 begin block 在解析后立即执行。因此,子例程的编译和变量绑定(bind)发生在编译时,在 for 循环有机会运行之前。

您要做的是创建一个匿名子例程,它将在运行时绑定(bind)其变量:

#!/usr/bin/env perl

use strict;
use warnings;

my @foo = (0,1,2,3,4);

foreach my $i (@foo) {
my $printer = sub {
my $blah = shift @_;
print "$blah-$i\n";
};

$printer->("test");
}

哪个打印
test-0
test-1
test-2
test-3
test-4

大概在您的实际用例中,这些闭包将被加载到数组或散列中,以便以后可以访问它们。

您仍然可以在闭包中使用裸字标识符,但是您需要做一些额外的工作以确保名称在编译时可见:
BEGIN {
for my $color (qw(red blue green)) {
no strict 'refs';
*$color = sub {"<font color='$color'>@_</font>"}
}
}

print "Throw the ", red 'ball'; # "Throw the <font color='red'>ball</font>"

关于perl foreach 循环与函数关闭规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6587509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com