perl字节码生成的file.pl太多了

时间:2012-09-28 11:29:55

标签: linux perl

如果sub存在于另一个file.pl中,如何制作perl字节码,这样我就可以将所有perl脚本输入到二进制文件中以供使用,但我收到了编码警告。

以下是我如何做的示例!

文件:add.pl

require "util.pl";

$a = 1;

$b = 2;

$res = add($a,$b);

print $res;

文件:util.pl

sub add()

{

my ($a,$b) = @_;


my $c = $a + $b;

return $c;

}

1; #to return true

然后当我跑:

perlcc add.pl

./a.out

我得到了

Segmentation fault (core dumped)

我也试过

perlcc add.pl util.pl

但它说

/usr/bin/perlcc: using add.pl as input file, ignoring util.pl

注意:

如果两者都在单个文件中

perlcc file.pl 

./a.out 

将起作用

2 个答案:

答案 0 :(得分:1)

我无法回答实际的编译问题,但让我做一些笔记。

<Edit>我看到的越多,我认为问题就越多是add函数的命名空间。当它们位于同一文件中时,该函数在main命名空间中声明。我认为require - d文件也是如此,因为没有包声明。无论哪种方式,这些仍然是一些很好的笔记,我希望有所帮助。 </Edit>

  1. 您真的应该使用strictwarnings pragma
  2. 你不应该使用$a$b,因为它们在Perl中是半神奇的,应该避免(是的,这很奇怪)
  3. Perl原型与大多数语言不同,即使这样,()函数上的空原型add也不正确,最好将其关闭
  4. 这里说的是我如何格式化文件。

    文件:add.pl

    use strict;
    use warnings;
    
    use MyUtils;
    
    my $x = 1;
    
    my $y = 2;
    
    my $res = add($a,$b);
    
    print $res;
    

    文件:MyUtils.pm

    package MyUtils;
    
    use strict;
    use warnings
    
    use parent 'Exporter';
    our @EXPORT = ('add');
    
    sub add
    
    {
    
    my ($x,$y) = @_;
    
    
    my $c = $x + $y;
    
    return $c;
    
    }
    
    1;
    

    这为可重用库使用了更现代的模块/包形式。 use指令包含require指令,但是在编译时而不是运行时指令。

    Exporter模块(和@EXPORT变量)正确地将函数导入脚本的命名空间(通常为main)。

    或许perlcc会更好地改变这些变化;但即使不是,这些都是习惯的好习惯。

答案 1 :(得分:0)

perlcc在版本5.10.0(差不多五年前)中是removed from Perl。 perldelta手册页有这样说:

  

perlcc,byteloader和支持模块(B :: C,B :: CC,   B ::字节码等不再与perl源一起分发。   那些实验工具从来没有可靠地工作,并且,由于   没有志愿者让他们与perl翻译保持一致   发展,决定删除它们而不是运输   那些破碎的版本。

看到这一点,我必须建议使用perlcc与任何版本的Perl可能是一个相当糟糕的主意。这是一个从未真正起作用的实验性功能。您可能希望不再使用它。