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;
答案 0 :(得分:4)
两个主要错误,都是使用use strict; use warnings;
找到的。总是这样做。 (您在模块中使用它,但在脚本中没有使用它。)
您在一个位置正确使用$ba::base_addr
,但之后不久您继续使用不存在的变量$base_addr
。
如果当前软件包为$ba::base_addr
,或者您为其创建名为$base_addr
的别名,则只能ba
$base_addr
。
您需要始终使用$ba::base_addr
,或者需要将变量导出到using模块。 (这是我提到的别名的一种方式。)
您永远不会为$ba::base_addr
和$oa::offset_addr
分配值,因此当您尝试添加它们(“非数字”)并尝试打印时,Perl会向您发出警告(“未初始化的“)。
我们将同时解决的其他一些问题:
模块必须返回一个真值,也就是说评估的最后一个表达式必须求值为true。因此,使用1;
结束模块是标准的(这也适用于do
,以便进行可靠的错误检测:do $qfn or die $@ || $!;
。)
由于文件具有require
声明,因此您应该使用do
而不是package
。如果您将它们重命名为.pm
并使用use
,情况会更好。
模块的名称应与其包声明匹配。如果它包含package ba;
,则该文件应命名为ba.pm
。
#!
仅在以下情况下才有意义:1)它们是文件的前两个字符,以及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";
答案 1 :(得分:0)
您需要重命名文件,添加返回值并使用use
包含它们。这里:
file1.p的米
package ba;
use strict;
use warnings;
our $base_addr = 17;
1;
file2.p的米
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";