2010-04-06 19 views
8

Tengo algunos problemas para averiguar cómo hacer una referencia a una subrutina en un archivo de módulo externo. Ahora mismo, estoy haciendo esto:¿Cómo puedo hacer una referencia a una subrutina de Perl?

Archivo externo

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

principal

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

pero este resultado en un error: No se puede utilizar cadena ("1") como una ref de subrutina mientras se usan "referencias estrictas"

Respuesta

23

Como se indica en perlmodlib, debe comenzar el nombre de su módulo con una letra mayúscula:

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).

Una forma de llamar a un sub definido en otro paquete es calificar totalmente el nombre de esa sub cuando usted lo llama:

SettingsGeneral::printScreen "important message\n"; 

Si lo que quieres es una referencia a printScreen, agarrarlo con la barra invertida operador

my $subref = \&SettingsGeneral::printScreen; 

y llamarlo con uno de

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

Se puede crear un alias en su paquete actual:

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

Saltar los paréntesis (necesario porque el sub en el paquete actual no se conoce en tiempo de compilación) escribiendo:

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

El Exporter módulo puede hacer este trabajo de custodia para usted:

SettingsGeneral.pm:

package SettingsGeneral; 

use Exporter 'import'; 

our @EXPORT = qw/ printScreen /; 

sub printScreen { 
    print $_[0]; 
} 

1; 

principal:

#! /usr/bin/perl 

use warnings; 
use strict; 

use SettingsGeneral; 

printScreen "foo!\n"; 
+0

en su primer ejemplo, 'printscreen ("flash de otra Jürgen \ n");' necesita parens –

+0

mucho thx! aprendí algo;) – Pmarcoen

+0

@Eric ¡Gracias! Fijo. –

Cuestiones relacionadas