我在搞清楚如何在外部模块文件中引用子例程时遇到了一些麻烦.现在,我这样做:
外部文件
package settingsGeneral; sub printScreen { print $_[0]; }
主要
use settingsGeneral; my $printScreen = settingsGeneral::printScreen; &$printScreen("test");
但这会导致错误:
在使用“strict refs”时,不能使用字符串(“1”)作为子程序ref
解决方法
如
perlmodlib所述,您应该使用大写字母开始模块的名称:
Perl informally reserves lowercase module names for ‘pragma’ modules like
integer
andstrict
. Other modules normally begin with a capital letter and use mixed case with no underscores (need to be short and portable).
调用另一个包中定义的子的一种方法是在调用它时完全限定该子名称:
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";