怎样在perl中调用自定义模块时使用变量的模块名称和功能名称?

my $func = "$module::$method";no strict \u0026#39;refs\u0026#39;;$func-\u0026gt;(@your_args);补充一句,no strict最好控制在一个比较小的scope里面,以免过度削弱检查。所以采用临时no strict或no warnings的代码实际上往往是类似下面这样的,
blah blah...for my $func (@funcs) { no strict \u0026#39;refs\u0026#39;; $func-\u0026gt;(@args);} 【怎样在perl中调用自定义模块时使用变量的模块名称和功能名称?】 或者这样的,
blah blah...my $func = "$module::$method";{ no strict \u0026#39;refs\u0026#39;; $func-\u0026gt;(@args);}
■网友
我猜你是想要这个:期望访问的包名字和包变量名字,都是放在变量的字符串里。
我不知道怎样简单地达到这一点。不过,Perl是把整个名字空间暴露给你的,在“::”这个哈希表里。所以不管怎样,你总是可以这么做:
use strict;use feature qw/say/;{package Deep::Dark;our $Fantasy = "oh my shoulder";sub Van{ say "fuck you!!!";}}my $pkgname1 = \u0026#39;Deep::\u0026#39;;my $pkgname2 = \u0026#39;Dark::\u0026#39;;my $var_name = \u0026#39;Fantasy\u0026#39;;say ${ $::{$pkgname1}{$pkgname2}{$var_name} };my $func_name = \u0026#39;Van\u0026#39;;say \u0026amp;{ $::{$pkgname1}{$pkgname2}{$func_name} };# 写的更简明一些,是这样的my $deep_package_symbols = $::{ \u0026#39;Deep::\u0026#39; };my $dark_package_symbols = $deep_package_symbols-\u0026gt;{ \u0026#39;Dark::\u0026#39; };my $fantasy_typeglob = $dark_package_symbols-\u0026gt;{ \u0026#39;Fantasy\u0026#39; };my $fantasy_value = https://www.zhihu.com/api/v4/questions/58064429/$$fantasy_typeglob;say $fantasy_value;my $van_func_ref = $dark_package_symbols-/u0026gt;{ /u0026#39;Van/u0026#39; };say /u0026amp;$van_func_ref();这个方法不需要no strict,不需要在你的脚本上开洞。
需要注意几个地方:
存着符号表的hash变量叫“::”,和package的分隔符一样。这里面的每一层里,指向下一层名字空间的键,都是package名字加“::”的形式;其它的都是本名字空间的“our”变量或者函数。由于Perl允许重名(在同一个名字空间里,$var、@var、%var、sub var可以共存),所以符号表里的每一个值都是一个typeglob。你需要使用$、@、%、\u0026amp;对它解引用,才能获得你需要的那个玩意(标量、数组、哈希表、函数)。详见文档:
perlmod中的Symbol Tables部分;perldata中的Typeglobs and Filehandles部分;整个perlref文档。


    推荐阅读