Perl中如何让变量接收子例程返回值并输出预期内容?
解决Perl子例程输出与存储问题
你的代码里$testvar没有输出,核心原因是第二次调用thesub()时没有传递任何参数,子例程里的$self变量拿到的是undef,自然打印不出内容。另外你提到的“Perl标量无法直接存储子例程”是个小误解——Perl其实支持将子例程引用存储在标量中,只是用法需要注意,下面针对你的需求给出几种解决方案:
方案1:直接修正调用与子例程逻辑
如果你的目标只是让$testvar输出"hello",最简单的方式是调整子例程的参数处理,或者在调用时传递正确的参数。比如你的子例程里定义了$class和$self两个参数,但第一次调用只传了一个值,这个值会被$class接收,而$self还是空的。可以去掉不必要的$class参数(如果不需要面向对象的写法):
#!/usr/bin/perl use strict; use warnings; sub thesub { my $self = shift; # 移除多余的$class参数 return $self; } my $testvar = thesub("hello"); # 调用时传入"hello" print $testvar; # 现在会输出hello
方案2:将子例程引用存储到标量并调用
如果你确实想把子例程存储到标量变量中,Perl允许通过子例程引用实现。你之前尝试的\&thesub是正确的引用写法,但问题在于你没有调用这个引用——直接打印引用的话,Perl只会输出子例程的内存地址(比如CODE(0xabc123)),必须用->()语法调用引用才能拿到返回值:
#!/usr/bin/perl use strict; use warnings; sub thesub { my $self = shift; return $self; } # 将子例程引用存储到标量变量 my $sub_ref = \&thesub; # 调用引用并传递参数 my $testvar = $sub_ref->("hello"); print $testvar; # 输出hello
如果你希望子例程不需要传参数就能返回"hello",可以用闭包让子例程记住固定值:
#!/usr/bin/perl use strict; use warnings; # 创建闭包,返回固定的"hello" my $hello_sub = sub { return "hello"; }; my $testvar = $hello_sub->(); # 调用闭包 print $testvar; # 输出hello
总结一下:你之前用\&thesub得到的是子例程的引用,不是返回值,必须调用这个引用才能拿到你想要的"hello"。
内容的提问来源于stack exchange,提问作者Imylor
相关产品推荐
相关产品推荐

