Как я могу взять ссылку на подпрограмму Perl? - PullRequest
9 голосов
/ 06 апреля 2010

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

Внешний файл

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

Main

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

, но это приводит к ошибке: Невозможно использовать строку ("1 ") в качестве ссылки на подпрограмму при использовании" строгих ссылок "

1 Ответ

27 голосов
/ 06 апреля 2010

Как отмечено в perlmodlib , имя вашего модуля следует начинать с заглавной буквы:

Perl неофициально резервирует имена модулей в нижнем регистре для таких модулей, как integer и strict. Другие модули обычно начинаются с заглавной буквы и используют смешанный регистр без подчеркивания (должны быть короткими и переносными).

Одним из способов вызова подпрограммы, определенной в другом пакете, является полное определение имени этого подпрограммы при его вызове:

SettingsGeneral::printScreen "important message\n";

Если вам нужна только ссылка на printScreen, возьмите ее с помощью оператора обратной косой черты

my $subref = \&SettingsGeneral::printScreen;

и назовите его одним из

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

Вы можете создать псевдоним в вашем текущем пакете:

*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";
...