从Perl中的不同文件中访问变量

时间:2013-06-22 17:00:24

标签: perl file package

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. 另外使用未初始化的值。

2 个答案:

答案 0 :(得分:4)

两个主要错误,都是使用use strict; use warnings;找到的。总是这样做。 (您在模块中使用它,但在脚本中没有使用它。)

  1. 您在一个位置正确使用$ba::base_addr,但之后不久您继续使用不存在的变量$base_addr

    如果当前软件包为$ba::base_addr,或者您为其创建名为$base_addr的别名,则只能ba $base_addr

    您需要始终使用$ba::base_addr,或者需要将变量导出到using模块。 (这是我提到的别名的一种方式。)

  2. 您永远不会为$ba::base_addr$oa::offset_addr分配值,因此当您尝试添加它们(“非数字”)并尝试打印时,Perl会向您发出警告(“未初始化的“)。


  3. 我们将同时解决的其他一些问题:

    1. 模块必须返回一个真值,也就是说评估的最后一个表达式必须求值为true。因此,使用1;结束模块是标准的(这也适用于do,以便进行可靠的错误检测:do $qfn or die $@ || $!;。)

    2. 由于文件具有require声明,因此您应该使用do而不是package。如果您将它们重命名为.pm并使用use,情况会更好。

    3. 模块的名称应与其包声明匹配。如果它包含package ba;,则该文件应命名为ba.pm

    4. #!仅在以下情况下才有意义:1)它们是文件的前两个字符,以及2)如果将文件提供给OS执行。你的模块都不是这种情况。


    5. 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";