如何引用Perl子例程?

时间:2010-04-06 13:48:52

标签: perl reference external subroutine

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

外部文件

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

主要

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

但这会导致错误: 在使用“strict refs”时,不能使用字符串(“1”)作为子程序ref

1 个答案:

答案 0 :(得分:27)

perlmodlib所述,您应该用大写字母开始模块的名称:

  

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

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

SettingsGeneral::printScreen "important message\n";

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

my $subref = \&SettingsGeneral::printScreen;

并使用

之一调用它
&$subref("one\n");
&{$subref}("two\n");
$subref->("three\n");

您可以在当前包中创建alias

*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";