2010-04-06 35 views
8

我在搞清楚如何在外部模塊文件中引用子例程時遇到了一些問題。現在,我這樣做:我如何參考一個Perl子程序?

外部文件

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

主要

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

但這個結果爲錯誤: 不能使用字符串( 「1」)作爲當使用「strict refs」時的子程序ref

回答

23

perlmodlib所述,您應該用大寫字母開始模塊名稱:

調用另一個包中定義一個子

Perl informally reserves lowercase module names for 'pragma' modules like integer and strict . 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"); 

通過寫作跳過圓括號(必要的,因爲在當前包子在編譯時不知道):

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"; 
在你的第一個例子,`PRINTSCREEN( 「另一個urgen閃\ n」)
+0

;'需要括號 – 2010-04-06 14:19:00

+0

THX很多!學到了一些東西;) – Pmarcoen 2010-04-06 14:21:58

+0

@Eric謝謝!固定。 – 2010-04-06 14:28:57