2010-04-06 12 views
8

Je rencontre des problèmes pour trouver une référence à un sous-programme dans un fichier de module externe. En ce moment, je fais ceci:Comment puis-je prendre une référence à un sous-programme Perl?

fichier externe

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

principal

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

mais ce résultat dans une erreur: Impossible d'utiliser la chaîne ("1") en tant que ref sous-programme en « strict refs » dans l'utilisation

Répondre

23

Comme indiqué dans perlmodlib, vous devriez commencer le nom de votre module avec une lettre majuscule:

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

Une façon d'appeler un sous défini dans un autre paquet est de se qualifier pleinement le nom de ce sous lorsque vous l'appelez:

SettingsGeneral::printScreen "important message\n"; 

Si tout ce que vous voulez est une référence à printScreen, saisir la barre oblique inverse opérateur

my $subref = \&SettingsGeneral::printScreen; 

et l'appeler l'un des

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

Vous pouvez créer un alias dans votre forfait actuel:

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

Passer les parenthèses (nécessaire parce que le sous dans le paquet en cours n'a pas été connu au moment de la compilation) en écrivant:

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

Le Module Exporter peut faire ce travail de garde pour vous:

SettingsGeneral.pm:

package SettingsGeneral; 

use Exporter 'import'; 

our @EXPORT = qw/ printScreen /; 

sub printScreen { 
    print $_[0]; 
} 

1; 

principale:

#! /usr/bin/perl 

use warnings; 
use strict; 

use SettingsGeneral; 

printScreen "foo!\n"; 
+0

dans votre premier exemple, 'Impr ("un autre flash Urgen \ n");' a besoin parens –

+0

beaucoup thx! appris quelque chose;) – Pmarcoen

+0

@Eric Merci! Fixé. –