所以我想要類似的東西:
模塊0.pl
sub fun {
print "fun $_[0] from 0\n"
}
1
模塊1.pl
sub fun {
print "fun $_[0] from 1\n"
}
1
主檔案
BEGIN{push @INC, "."};
require "module0.pl";
require "module1.pl";
fun("test")
哪個會列印(以任何順序 - 我不在乎):
fun test from 0
fun test from 1
有可能嗎?最優雅的語法是什么?
uj5u.com熱心網友回復:
所以你想從各種包(這里同樣命名)中呼叫一個潛艇串列?
一種方法,使用普通包
package Pack1;
use warnings;
use strict;
use feature 'say';
sub fun { say "fun $_[0] from ", __PACKAGE__ }
1;
呼叫程式,與此包(及其對應程式)在同一目錄Pack2中
use warnings;
use strict;
use feature 'say';
use FindBin qw($RealBin);
use lib $RealBin;
use Pack1;
use Pack2;
for my $packname (qw(Pack1 Pack2)) {
MAKENAME: {
no strict 'refs';
my $fun_name = $packname . '::' . 'fun';
$fun_name->("hi") if exists &{$fun_name};
}
}
我將它no strict 'refs'放在另一個塊中,并命名該塊,就這樣;如果這就是回圈中完成的全部,則無需引入另一個范圍。? 我們需要將refs其用作子例程參考的限制,但名稱本身的范圍也是有意義的。
幾點注意事項
我不知道為什么那些是-ed的
.pl檔案;require它們應該是包,我就是這樣寫的。讓我知道他們是否真的有一個特定的(和無與倫比的)理由讓他們成為require-ed 程式添加目錄以
@INC使用帶有$FindBin::RealBin的lib pragma,而不是通過黑客攻擊@INC
?或復制代碼參考
for my $packname (qw(Pack1 Pack2)) {
my $fun = \&{ $packname . '::' . 'fun' };
$fun->('hi');
}
但是,如果我們確實需要檢查是否存在,那應該是
for my $packname (qw(Pack1 Pack2)) {
my $fun_name = $packname . '::' . 'fun';
next if not exists &{$fun_name};
my $fun = \&{$fun_name};
$fun->('hi');
}
uj5u.com熱心網友回復:
一種相當穩健的方法是使用注冊表進行回呼。
# main.pl
{
package MyApp;
my
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521576.html
標籤:perl堆子程序
