【问题标题】:How can I take a reference to a Perl subroutine?如何引用 Perl 子例程?
【发布时间】:2010-04-06 13:48:52
【问题描述】:

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

外部文件

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

主要

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

但这会导致错误: 在使用“strict refs”时,不能使用字符串(“1”)作为子例程 ref

【问题讨论】:

    标签: perl reference external subroutine


    【解决方案1】:

    perlmodlib 中所述,您的模块名称应以大写字母开头:

    Perl 非正式地为“pragma”模块保留小写的模块名称,例如integerstrict。其他模块通常以大写字母开头,并使用大小写混合,没有下划线(需要简短且可移植)。

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

    SettingsGeneral::printScreen "important message\n";
    

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

    my $subref = \&SettingsGeneral::printScreen;
    

    并用其中之一调用它

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

    您可以在当前包中创建alias

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多