如何引用Perl子例程?

Pma*_*oen 10 perl reference external subroutine

我在搞清楚如何引用外部模块文件中的子例程时遇到了一些麻烦.现在,我这样做:

外部文件

package settingsGeneral;    
sub printScreen {
    print $_[0];
}
Run Code Online (Sandbox Code Playgroud)

主要

use settingsGeneral;    
my $printScreen = settingsGeneral::printScreen;
&$printScreen("test");
Run Code Online (Sandbox Code Playgroud)

但这导致错误:不能使用字符串("1")作为子程序ref,而"strict refs"在使用中

Gre*_*con 27

perlmodlib中所述,您应该使用大写字母开始模块的名称:

Perl非正式地为'pragma'模块保留小写模块名称,例如integerstrict.其他模块通常以大写字母开头,并使用不带下划线的混合大小写(需要简短和便携).

调用另一个包中定义的子的一种方法是在调用它时完全限定该子名称:

SettingsGeneral::printScreen "important message\n";
Run Code Online (Sandbox Code Playgroud)

如果您只想要引用printScreen,请使用反斜杠运算符

my $subref = \&SettingsGeneral::printScreen;
Run Code Online (Sandbox Code Playgroud)

并用其中一个调用它

&$subref("one\n");
&{$subref}("two\n");
$subref->("three\n");
Run Code Online (Sandbox Code Playgroud)

您可以在当前包中创建别名:

*printScreen = \&SettingsGeneral::printScreen;
printScreen("another urgent flash\n");
Run Code Online (Sandbox Code Playgroud)

通过编写以下内容来跳过括号(必要,因为编译时未知当前包中的sub):

use subs 'printScreen';
*printScreen = \&SettingsGeneral::printScreen;
printScreen "the sky is falling!\n";
Run Code Online (Sandbox Code Playgroud)

出口商模块可以为你做这项工作羁:

SettingsGeneral.pm:

package SettingsGeneral;

use Exporter 'import';

our @EXPORT = qw/ printScreen /;

sub printScreen {
  print $_[0];
}

1;
Run Code Online (Sandbox Code Playgroud)

主要:

#! /usr/bin/perl

use warnings;
use strict;

use SettingsGeneral;

printScreen "foo!\n";
Run Code Online (Sandbox Code Playgroud)