【问题标题】:in Perl, how to assign the print function to a variable?在 Perl 中,如何将打印函数分配给变量?
【发布时间】:2021-09-17 16:00:39
【问题描述】:

我需要使用变量来控制打印方法

我的代码在下面

#!/usr/bin/perl

# test_assign_func.pl
use strict;
use warnings;

sub echo {
   my ($string) = @_;
   print "from echo: $string\n\n";
}  

my $myprint = \&echo;
$myprint->("hello");

$myprint = \&print;
$myprint->("world");

当我运行时,我得到以下打印功能分配的错误

$ test_assign_func.pl
from echo: hello

Undefined subroutine &main::print called at test_assign_func.pl line 17.

看起来我需要为打印函数添加名称空间前缀,但我找不到名称空间。谢谢你的建议!

【问题讨论】:

  • 您有什么可能的理由这样做?似乎是一个 XY 问题。
  • @TLP 和人们问我为什么问这个问题。当我编写所​​谓的高阶 Perl 编程,即 Dispatcher Pattern 时,我偶然发现了这一点。我很难分派到打印“功能”。我将我的程序简化为上面的代码。现在我知道 print 不是函数,既不是 sub 也不是通用运算符。

标签: perl namespaces


【解决方案1】:

print 是运算符,而不是子。

perlfunc:

本节中的函数可以用作表达式中的术语。它们分为两大类:列表运算符和命名一元运算符。

Perl 为命名操作符提供了一个子类,它可以被带有原型的子类复制。可以使用\&CORE::name 获得对这些的引用。

my $f = \&CORE::length;
say $f->("abc");   # 3

print 不是这样的运算符(因为它接受文件句柄的方式)。对于这些,您需要创建一个调用约定更有限的 sub。

my $f = sub { print @_ };
$f->("abc\n");

相关:

【讨论】:

    【解决方案2】:

    正如CORE 中提到的,有些函数不能作为子例程调用,只能作为裸字调用。 print 就是其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多