如何在perl中创建动态子例程名称

问题描述 投票:0回答:1

我想在 perl 中创建一个动态子例程名称,这是试用代码,我收到错误“Bad name after feed_load::”

#!/usr/bin/perl
use strict;
use warnings;

BEGIN {
      push @INC, '/freespace/attlas/data/bin/genericLoader /FeedLoaderLib/'
}

use feed_load;
my type ="L";
my $tempTablefunct  = "Create".$type."Temp_Table";

feed_load::&$tempTablefunct->($tablename); ### pass a dynamic sub name HERE ###
perl function subroutine
1个回答
8
投票
&{ $pkg_name."::".$sub_name }( @args )

( $pkg_name."::".$sub_name )->( @args )

但是,这些都会失败,因为您要求 Perl 通过在程序中放置

use strict;
来禁止您这样做。您可以在本地禁用
use strict;
[1]

my $ref = do { no strict 'refs'; \&{ $pkg_name."::".$sub_name } };
$ref->( @args )

但事实证明

\&$sub_name
已经不受限制,所以你只需要以下:

my $ref = \&{ $pkg_name."::".$sub_name };
$ref->( @args )

如果您需要方法调用而不是子调用,则可以使用

my $ref = $o->can( $method_name );
$o->$ref( @args )

或者只是

$o->$method_name( @args )

  1. 要求 Perl 阻止使用符号引用是明智的,因为很容易意外使用符号引用。但这里我们打算使用符号引用,因此禁用使用符号引用的限制也是明智的。
© www.soinside.com 2019 - 2024. All rights reserved.