![](/img/trans.png)
[英]How can I check if a Perl scalar holds a reference to a certain subroutine?
[英]How can I take a reference to a Perl subroutine?
我在搞清楚如何引用外部模塊文件中的子例程時遇到了一些麻煩。 現在,我這樣做:
外部文件
package settingsGeneral;
sub printScreen {
print $_[0];
}
主要
use settingsGeneral;
my $printScreen = settingsGeneral::printScreen;
&$printScreen("test");
但這導致錯誤:不能使用字符串(“1”)作為子程序ref,而“strict refs”在使用中
如perlmodlib中所述 ,您應該使用大寫字母開始模塊的名稱:
Perl非正式地保留了“pragma”模塊的小寫模塊名稱,如
integer
和strict
。 其他模塊通常以大寫字母開頭,並使用不帶下划線的混合大小寫(需要簡短和便攜)。
調用另一個包中定義的子的一種方法是在調用它時完全限定該子名稱:
SettingsGeneral::printScreen "important message\n";
如果你想要的只是printScreen
的引用, printScreen
使用反斜杠操作符來獲取它
my $subref = \&SettingsGeneral::printScreen;
並用其中一個調用它
&$subref("one\n");
&{$subref}("two\n");
$subref->("three\n");
您可以在當前包中創建別名 :
*printScreen = \&SettingsGeneral::printScreen;
printScreen("another urgent flash\n");
通過編寫以下內容來跳過括號(必要,因為編譯時未知當前包中的sub):
use subs 'printScreen';
*printScreen = \&SettingsGeneral::printScreen;
printScreen "the sky is falling!\n";
Exporter模塊可以為您執行此保管工作:
SettingsGeneral.pm:
package SettingsGeneral;
use Exporter 'import';
our @EXPORT = qw/ printScreen /;
sub printScreen {
print $_[0];
}
1;
主要:
#! /usr/bin/perl
use warnings;
use strict;
use SettingsGeneral;
printScreen "foo!\n";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.