1

file1.pl

package ba;
#!/usr/bin/perl

use strict;
use warnings;

our $base_addr = 0x48;

file2.pl

package oa;
#!/usr/bin/perl

use strict;
use warnings;

our $offset_addr = 0;

file3.pl

#!/usr/bin/perl

do "file1.pl"
do "file2.pl"

my $final_val;

$final_val = $ba::base_addr + $oa::offset_addr;

printf "base_addr   = 0x%0x\n", $ba::base_addr;
printf "offset_addr = 0x%0x\n",  $oa::offset_addr;
printf "final addr  = 0x%0x\n", $final_val;

エラー### ->

  1. 引数「0x48」は数値ではありません。
  2. 初期化されていない値の使用。
  3. さらに、初期化されていない値の使用。
4

2 に答える 2

4

2 つの主要なエラー。どちらも を使用して検出されuse strict; use warnings;ます。常にそうしてください。(モジュールでは使用しましたが、スクリプトでは使用しませんでした。)

  1. ある場所で正しく使用しましたが、その後すぐに$ba::base_addr存在しない変数を使用し始めました。$base_addr

    現在のパッケージがである場合、または という名前のエイリアスを作成した$ba::base_addr場合にのみアクセスできます。$base_addrba$base_addr

    $ba::base_addr一貫して使用する必要があるか、変数を using モジュールにエクスポートする必要があります。(これは、私が言及したエイリアスへの 1 つの方法です。)

  2. $ba::base_addrandに値を代入することは決してない$oa::offset_addrので、Perl はそれらを追加しようとすると (「非数値」)、出力しようとすると (「未初期化」) 警告を出します。


同時に修正するその他の問題:

  1. モジュールは真の値を返さなければなりません。つまり、最後に評価された式は何か真に評価されなければなりません。したがって、モジュールを で終了するのが標準です1;(これはdo、信頼性の高いエラー検出のためにも適用されます: do $qfn or die $@ || $!;.)

  2. ファイルには宣言があるため、require代わりに使用する必要があります。に名前を変更して使用するとさらに良いでしょう。dopackage.pmuse

  3. モジュールの名前は、そのパッケージ宣言と一致する必要があります。が含まれている場合package ba;、ファイルの名前はba.pm.

  4. #!1) ファイルの最初の 2 文字であり、2) ファイルが実行のために OS に提​​供されている場合にのみ意味があります。どちらもあなたのモジュールには当てはまりません。


ba.pm:

package ba;

use strict;
use warnings;

our $base_addr = 123;

1;

oa.pm:

package oa;

use strict;
use warnings;

our $offset_addr = 456;

1;

script.pl:

#!/usr/bin/perl

use strict;
use warnings;

use ba qw( );
use oa qw( );

my $final_val = $ba::base_addr + $oa::offset_addr;

print "base_addr   = $ba::base_addr\n";
print "offset_addr = $oa::offset_addr\n";
print "final addr  = $final_val\n";

変数をエクスポートした場合は、パッケージ名をどこにでも言うのを避けることができ、前述のとおりです。

ba.pm:

package ba;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( $base_addr );

our $base_addr = 123;

1;

oa.pm:

package oa;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( $offset_addr );

our $offset_addr = 456;

1;

script.pl:

#!/usr/bin/perl

use strict;
use warnings;

use ba qw( $base_addr );
use oa qw( $offset_addr );

my $final_val = $base_addr + $offset_addr;

print "base_addr   = $base_addr\n";
print "offset_addr = $offset_addr\n";
print "final addr  = $final_val\n";

ただし、変数をエクスポートするのは一般的に悪い形式です。通常は、アクセサーを作成する方がはるかに優れています。

ba.pm:

package ba;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( base_addr );

my $base_addr = 123;

sub base_addr { $base_addr }

1;

oa.pm:

package oa;

use strict;
use warnings;

use Exporter qw( import );
our @EXPORT_OK = qw( offset_addr );

my $offset_addr = 456;

sub base_addr { $base_addr }

1;

script.pl:

#!/usr/bin/perl

use strict;
use warnings;

use ba qw( base_addr );
use oa qw( offset_addr );

my $final_val = base_addr() + offset_addr();

print "base_addr   = ".base_addr()."\n";
print "offset_addr = ".offset_addr()."\n";
print "final addr  = $final_val\n";
于 2013-06-22T17:21:19.487 に答える
0

ファイルの名前を変更し、戻り値を追加して、 を使用してそれらを含める必要がありますuse。ここ:

file1.p m

package ba;

use strict;
use warnings;

our $base_addr = 17;

1;

file2.p m

package oa;

use strict;
use warnings;

our $offset_addr = 19;

1;

file3.pl

#!/usr/bin/perl

use file1;
use file2;

my $final_val;

$final_val = $ba::base_addr + $oa::offset_addr;

print "base_addr = $ba::base_addr\n";
print "offset_addr = $oa::offset_addr\n";
print "final addr = $final_val\n";
于 2013-06-22T17:16:56.603 に答える