10

我在弄清楚如何引用外部模块文件中的子例程时遇到了一些麻烦。现在,我正在这样做:

外部文件

package settingsGeneral;    
sub printScreen {
    print $_[0];
}

主要的

use settingsGeneral;    
my $printScreen = settingsGeneral::printScreen;
&$printScreen("test");

但这会导致错误:Can't use string ("1") as a subroutine ref while "strict refs" in use

4

1 回答 1

28

perlmodlib中所述,您应该以大写字母开头模块名称:

Perl 非正式地为 'pragma' 模块保留小写的模块名称,例如integerstrict。其他模块通常以大写字母开头并使用不带下划线的混合大小写(需要简短且可移植)。

调用另一个包中定义的子的一种方法是在调用它时完全限定该子的名称:

SettingsGeneral::printScreen "important message\n";

如果您想要的只是对 的引用printScreen,请使用反斜杠运算符获取它

my $subref = \&SettingsGeneral::printScreen;

并用其中之一调用它

&$subref("one\n");
&{$subref}("two\n");
$subref->("three\n");

您可以在当前包中创建别名:

*printScreen = \&SettingsGeneral::printScreen;
printScreen("another urgent flash\n");

跳过括号(这是必要的,因为当前包中的子在编译时是未知的)通过编写:

use subs 'printScreen';
*printScreen = \&SettingsGeneral::printScreen;
printScreen "the sky is falling!\n";

Exporter模块可以为您完成这项保管工作:

设置General.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";
于 2010-04-06T13:53:58.287 回答