2 つの主要なエラー。どちらも を使用して検出されuse strict; use warnings;
ます。常にそうしてください。(モジュールでは使用しましたが、スクリプトでは使用しませんでした。)
ある場所で正しく使用しましたが、その後すぐに$ba::base_addr
存在しない変数を使用し始めました。$base_addr
現在のパッケージがである場合、または という名前のエイリアスを作成した$ba::base_addr
場合にのみアクセスできます。$base_addr
ba
$base_addr
$ba::base_addr
一貫して使用する必要があるか、変数を using モジュールにエクスポートする必要があります。(これは、私が言及したエイリアスへの 1 つの方法です。)
$ba::base_addr
andに値を代入することは決してない$oa::offset_addr
ので、Perl はそれらを追加しようとすると (「非数値」)、出力しようとすると (「未初期化」) 警告を出します。
同時に修正するその他の問題:
モジュールは真の値を返さなければなりません。つまり、最後に評価された式は何か真に評価されなければなりません。したがって、モジュールを で終了するのが標準です1;
(これはdo
、信頼性の高いエラー検出のためにも適用されます: do $qfn or die $@ || $!;
.)
ファイルには宣言があるため、require
代わりに使用する必要があります。に名前を変更して使用するとさらに良いでしょう。do
package
.pm
use
モジュールの名前は、そのパッケージ宣言と一致する必要があります。が含まれている場合package ba;
、ファイルの名前はba.pm
.
#!
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";