我是perl plack/psgi的新手。我想访问plack/psgi循环中的一个子例程,但是如果子程序没有被执行,它看起来就像。每个父变量(如$number )都应该自动传递,就像编写常规perl脚本时一样。我是不是错过了什么,这有可能吗?
..
my $app = sub {
my $number = 10;
&count_number;
sub count_number {
$number +=10;
}
return ['200',[ 'Content-Type' => 'application/json' ],
[ "{\"number\":$number} ]];
}
.. 10正在返回,而不是20 :(
发布于 2018-04-29 12:11:42
如果我修复了return语句中字符串上的引号(您缺少一个结束的双引号),那么我将收到警告。
变量"$number“在source_file.pl第7行中不可用。
原因是词法值$app和$number是在运行时定义的,而子例程count_number在编译期间定义得更早。
解决方案是将count_number的定义推迟到运行时,代之以匿名子程序。调用$count_number->()还需要移到定义后的
my $app = sub {
my $number = 10;
my $count_number = sub {
$number +=10;
};
$count_number->();
return [
'200',
[ 'Content-Type' => 'application/json' ],
[ "{\"number\":$number}" ]
];
};
use Data::Dumper;
print Dumper $app->();输出
$VAR1 = [
'200',
[
'Content-Type',
'application/json'
],
[
'{"number":20}'
]
];有一个相关的警告
变量"$number“不会保持共享
有着相似的解决方案。您可以在perldoc perldiag中阅读这两个方面的内容。这些消息按字母顺序列出和描述。
发布于 2018-04-29 12:11:58
my操作符有两个效果:
本质上,这两个标量是不同的变量,尽管它们的名称相同。
sub name { ... }运算符只具有编译时间效果。它在编译时将子例程分配给给定的名称。因此,当子被编译时,它会看到原始的编译时变量,而不是稍后创建的运行时变量。
因此,你不应该嵌套命名的潜艇。实际上,如果您use warnings,就会收到这样的警告:“变量”"$number“不会保持共享”。
你有两个选择:
https://stackoverflow.com/questions/50085988
复制相似问题