如果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
将起作用
答案 0 :(得分:1)
我无法回答实际的编译问题,但让我做一些笔记。
<Edit>
我看到的越多,我认为问题就越多是add
函数的命名空间。当它们位于同一文件中时,该函数在main
命名空间中声明。我认为require
- d文件也是如此,因为没有包声明。无论哪种方式,这些仍然是一些很好的笔记,我希望有所帮助。 </Edit>
strict
和warnings
pragma $a
和$b
,因为它们在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
会更好地改变这些变化;但即使不是,这些都是习惯的好习惯。
答案 1 :(得分:0)
perlcc在版本5.10.0(差不多五年前)中是removed from Perl。 perldelta手册页有这样说:
perlcc,byteloader和支持模块(B :: C,B :: CC, B ::字节码等不再与perl源一起分发。 那些实验工具从来没有可靠地工作,并且,由于 没有志愿者让他们与perl翻译保持一致 发展,决定删除它们而不是运输 那些破碎的版本。
看到这一点,我必须建议使用perlcc与任何版本的Perl可能是一个相当糟糕的主意。这是一个从未真正起作用的实验性功能。您可能希望不再使用它。