首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用perl plack中的子例程不返回任何内容

调用perl plack中的子例程不返回任何内容
EN

Stack Overflow用户
提问于 2018-04-29 11:19:23
回答 2查看 149关注 0票数 0

我是perl plack/psgi的新手。我想访问plack/psgi循环中的一个子例程,但是如果子程序没有被执行,它看起来就像。每个父变量(如$number )都应该自动传递,就像编写常规perl脚本时一样。我是不是错过了什么,这有可能吗?

代码语言:javascript
复制
..
my $app = sub {

  my $number = 10;

  &count_number;
  sub count_number {
    $number +=10;
  }


  return ['200',[  'Content-Type' => 'application/json' ],
  [ "{\"number\":$number} ]];     

}
.. 

10正在返回,而不是20 :(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-29 12:11:42

如果我修复了return语句中字符串上的引号(您缺少一个结束的双引号),那么我将收到警告。

变量"$number“在source_file.pl第7行中不可用。

原因是词法值$app$number是在运行时定义的,而子例程count_number在编译期间定义得更早。

解决方案是将count_number的定义推迟到运行时,代之以匿名子程序。调用$count_number->()还需要移到定义后的

代码语言:javascript
复制
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->();

输出

代码语言:javascript
复制
$VAR1 = [
            '200',
            [
                'Content-Type',
                'application/json'
            ],
            [
                '{"number":20}'
            ]
        ];

有一个相关的警告

变量"$number“不会保持共享

有着相似的解决方案。您可以在perldoc perldiag中阅读这两个方面的内容。这些消息按字母顺序列出和描述。

票数 1
EN

Stack Overflow用户

发布于 2018-04-29 12:11:58

my操作符有两个效果:

  • 在编译时,它引入一个标量变量。
  • 在运行时,它为该变量创建一个新的标量对象。

本质上,这两个标量是不同的变量,尽管它们的名称相同。

sub name { ... }运算符只具有编译时间效果。它在编译时将子例程分配给给定的名称。因此,当子被编译时,它会看到原始的编译时变量,而不是稍后创建的运行时变量。

因此,你不应该嵌套命名的潜艇。实际上,如果您use warnings,就会收到这样的警告:“变量”"$number“不会保持共享”。

你有两个选择:

  • 可以使用查看运行时变量的闭包。它使用匿名子程序: ..。我的$number = 10;$count_number =sub{ $number += 10;};$count_number->();.
  • 或者,将这些值作为显式参数传递给单独的子例程。是的,这确实会使事情变得复杂一些,但它也会使单独的事情分开。清晰的数据流是一个良好的设计特点。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50085988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档