代码之家  ›  专栏  ›  技术社区  ›  Herms

Perl相当于C的include是什么?[副本]

  •  0
  • Herms  · 技术社区  · 14 年前

    这似乎是一个很简单的问题,但不知怎么的,我的google fu让我失望了。

    在Perl中包含其他文件中的函数的语法是什么?我在找像C的东西 #include "blah.h"

    我看到了使用Perl模块的选项,但这似乎需要对我当前的代码进行一个无关紧要的改写。

    0 回复  |  直到 11 年前
        1
  •  67
  •   daotoad    15 年前

    使用模块。退房 perldoc perlmod Exporter 是的。

    文件foo.pm中

    package Foo;
    use strict;
    use warnings;
    use Exporter;
    
    our @ISA= qw( Exporter );
    
    # these CAN be exported.
    our @EXPORT_OK = qw( export_me export_me_too );
    
    # these are exported by default.
    our @EXPORT = qw( export_me );
    
    sub export_me {
        # stuff
    }
    
    sub export_me_too {
        # stuff
    }
    
    1;
    

    在主程序中:

    use strict;
    use warnings;
    
    use Foo;  # import default list of items.
    
    export_me( 1 );
    

    或者要同时获得这两个功能:

    use strict;
    use warnings;
    
    use Foo qw( export_me export_me_too );  # import listed items
    
    export_me( 1 );
    export_me_too( 1 );
    

    您也可以导入包变量,但强烈建议不要这样做。

        2
  •  47
  •   martin clayton egrunin    15 年前

    Perl语言 require 会完成任务的。你需要通过添加

    1;
    

    在文件的末尾。

    这里有一个小样本:

    $ cat m1.pl 
    use strict;
    sub x { warn "aard"; }
    1;
    
    $ cat m2.pl 
    use strict;
    require "m1.pl";
    x();
    
    $ perl m2.pl 
    aard at m1.pl line 2.
    

    但是迁移到模块 尽快 是的。

    编辑

    将代码从脚本迁移到模块的一些好处:

    • 没有包,所有的东西都占用一个命名空间,所以你可能会遇到一个情况,两个文件中的两个函数需要相同的名称。
    • 包允许您公开某些函数,但隐藏其他函数。如果没有包,所有函数都是可见的。
    • 随附的文件 require 只在运行时加载,而 use 要接受早期的编译时检查。
        3
  •  8
  •   Daniel Plaisted    15 年前

    我相信你在找 require use 关键词。

        4
  •  7
  •   glenn jackman    15 年前

    也, do 'file.pl'; 可以,但模块是更好的解决方案。

        5
  •  5
  •   sdaau    11 年前

    我知道这个问题具体地说“函数”,但是当我寻找“Perl包含”时,我得到了这个高的搜索,并且经常(像现在一样)我想要包含变量(以简单的方式,而不必考虑模块)。因此,我希望可以在这里发布我的示例(另请参见: Perl require and variables ;简而言之:使用 require ,并确保“includeer”和“includee”文件都将变量声明为 our )以下内容:

    $ perl --version
    
    This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...
    
    $ cat inc.pl
    use warnings;
    use strict;
    
    our $xxx = "Testing";
    
    1;
    
    $ cat testA.pl 
    use warnings;
    use strict;
    
    require "inc.pl";
    our $xxx;
    
    print "1-$xxx-\n";
    print "Done\n";
    
    $ perl testA.pl 
    1-Testing-
    Done
    
    
    $ cat testB.pl 
    use warnings;
    use strict;
    
    our $xxx;
    print "1-$xxx-\n";
    
    $xxx="Z";
    print "2-$xxx-\n";
    
    require "inc.pl";
    
    print "3-$xxx-\n";
    print "Done\n";
    
    $ perl testB.pl 
    Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
    1--
    2-Z-
    3-Testing-
    Done
    
        6
  •  4
  •   Benj    15 年前

    不过,您确实应该研究Perl模块,为了快速入门,您可以始终运行“perl-p”,它通过C预处理器运行Perl脚本。这意味着你可以包括和朋友…

    不过,要小心,只是一个快速的攻击;-)

        7
  •  4
  •   aartist    15 年前

    您要查找的是“require file.pl”,但您应该查看的是“use module”。

        8
  •  3
  •   Community Egal    7 年前

    上面的答案都忽略了客户端部分:如何导入模块。

    请参阅此处接受的答案: How do I use a Perl module from a relative location?

    在这个答案中没有诀窍的时候,当你试图获得模块路径时,你会遇到很多麻烦。 use $mymodule;