Я испытываю некоторые затруднения при выяснении, как сделать ссылку на подпрограмму во внешнем файле модуля. Прямо сейчас я делаю это:
Внешний файл
package settingsGeneral;
sub printScreen {
print $_[0];
}
Основной
use settingsGeneral;
my $printScreen = settingsGeneral::printScreen;
&$printScreen("test");
но этот результат в ошибку: не Может использовать строку ("1") в качестве подпрограммы касательно в то время как "строгие судьи", используемые
Как отмечено в perlmodlib , вы должны начинать имя вашего модуля с заглавной буквы:
Perl неофициально резервирует имена модулей в нижнем регистре для модули 'pragma', такие как
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;
main:
#! /usr/bin/perl
use warnings;
use strict;
use SettingsGeneral;
printScreen "foo!\n";