Perl范围混淆与格式/写入

时间:2019-01-02 18:23:55

标签: perl scope built-in

如果用$var声明,write为什么mypackage ASDF; use warnings; use strict; use feature 'say'; my $var = 'foo'; format = @<<<<< @>>>>> 'test : ', $var . sub test { say $var; write; } 1; 不可用(超出范围?),如果它的范围几乎是程序包级的呢?

perl -wE 'use ASDF; ASDF::test();'

致电:

foo
Variable "$var" is not available at ASDF.pm line 16.
Use of uninitialized value $var in formline at ASDF.pm line 10.
test :

产生:

say

在同一范围内,my似乎可以使用它...

our代替foo test : foo 可以解决此问题:

write

为什么$var不能正确write上提货?
是范围问题,还是Perl的formatcount(/nuages/nuage/nom[espece='flocus'])的实现方式的问题?

1 个答案:

答案 0 :(得分:2)

Perl format documentation的底部显示:

  

除非在词法变量的范围内声明了格式,否则词法变量(用“ my”声明)在格式中不可见。

读这意味着您正在尝试的内容可以工作,但是当从它们声明所在的包外部调用时,formatwrite的词法作用域变量显然工作方式不同。本文中的示例使用全局变量...

This more modern tutorial about format重复一遍,如果您使用词法范围变量(用my声明的变量),则可能会遇到麻烦,因为write从当前包中选择变量,并且如问题注释中所述,是在Perl没有my关键字或词法作用域的时候编写的。

本文提供的解决方案:

  

当您准备输出某些数据时,可以使用写操作。该设计显示了格式的时代,因为write不使用参数填充图片。它使用范围内的变量。

our( $id, $name, $food, $amount ) = qw( 12 Buster Tuna 1.0 );
write();
  

格式也有点麻烦,因为您没有传递参数来写图片。 Perl依靠范围内具有指定名称的变量。您可以使用词法变量,但是它们必须与格式定义在同一范围内,并且在调用write时必须在范围内。用词法做到这一点是不切实际的,所以最敏捷的方法涉及本地化包变量:

foreach my $record ( @cats ) {
    local( $id, $name, $food ) = @$record;
    write( $fh );
}

还有总结中的建议:

  
      
  • 使用本地化的软件包变量来设置格式的数据
  •   

因此,如果要在现代Perl中继续使用ourlocalformatwrite似乎是可行的方法。