0

如果 sub 在另一个 file.pl 中,如何制作 perl 字节码,以便我可以将所有 perl 脚本放入二进制文件以供使用,但我收到 codedump 警告。

这是我如何做的例子!

文件: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 

将工作

4

2 回答 2

1

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

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

  1. 你真的应该使用strictwarnings编译指示
  2. 你不应该使用$aand $b,因为它们在 Perl 中是半魔法的,应该避免使用(是的,这很奇怪)
  3. Perl 原型与大多数语言不同,即使这样(),您的add函数上的空原型也不正确,最好不要使用它

这里所说的就是我将如何格式化我的文件。

文件: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会更喜欢这些变化;但即使没有,这些也是习惯的好习惯。

于 2012-09-28T14:07:47.813 回答
0

perlcc在版本 5.10.0(大约五年前)中从 Perl 中删除。perldelta 手册页有这样的说法:

perlcc、字节加载器和支持模块(B::C、B::CC、B::Bytecode 等)不再随 perl 源分发。那些实验性工具从来没有可靠地工作过,并且由于缺乏志愿者来使它们与 perl 解释器的开发保持一致,因此决定删除它们而不是发布那些损坏的版本。

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

于 2012-09-28T16:24:39.650 回答