0

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 

動作します

4

2 に答える 2

1

実際のコンパイラの問題については答えられませんが、いくつかメモを残しておきます。

<Edit>これを見れば見るほど、関数の名前空間が問題だと思いますadd。それらが同じファイルにある場合、関数はmain名前空間で宣言されます。requireパッケージ宣言がなかったので、-dファイルにも当てはまると思います。いずれにせよ、これらはまだ私が助けてくれることを願っているいくつかの良いメモです。</Edit>

  1. あなたは本当にプラグマstrictを使うべきですwarnings
  2. とはPerlで半魔法的であり、避ける必要があるため、使用$aしない$bでください(ええ、それは奇妙なものです)
  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(ほぼ5年前)でPerlから削除されました。perldeltaのマニュアルページには次のように書かれています。

perlcc、バイトローダー、およびサポートモジュール(B :: C、B :: CC、B :: Bytecodeなど)は、perlソースとともに配布されなくなりました。これらの実験ツールは決して確実に機能することはなく、perlインタープリターの開発に合わせて維持するボランティアが不足しているため、壊れたバージョンを出荷する代わりに削除することにしました。

それを見て、Perlccを任意のバージョンのPerlで使用することはおそらくかなり悪い考えであることを示唆しなければなりません。これは実験的な機能であり、実際には機能しませんでした。あなたはおそらくそれを使うのをやめたいでしょう。

于 2012-09-28T16:24:39.650 に答える