2010-04-06 1 views
8

У меня возникли проблемы с выяснением того, как сделать ссылку на подпрограмму во внешнем файле модуля. Прямо сейчас, я это делаю:Как я могу ссылаться на подпрограмму Perl?

Внешний файл

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

Главная

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

, но этот результат в ошибке: Невозможно использовать строку ("1") в качестве подпрограмма 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"; 
+0

в первом примере, 'PrintScreen ("другой флэш-Юрген \ п");' потребности Паренс –

+0

THx много! узнал что-то;) – Pmarcoen

+0

@ Eric Спасибо! Исправлена. –