Как я могу взять ссылку на подпрограмму Perl?

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

Внешний файл

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

Основной

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

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

10
задан brian d foy 7 April 2010 в 18:15
поделиться

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";
27
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: