如果用$var
声明,write
为什么my
对package 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的format
或count(/nuages/nuage/nom[espece='flocus'])
的实现方式的问题?
答案 0 :(得分:2)
在Perl format documentation的底部显示:
除非在词法变量的范围内声明了格式,否则词法变量(用“ my”声明)在格式中不可见。
读这意味着您正在尝试的内容可以工作,但是当从它们声明所在的包外部调用时,format
和write
的词法作用域变量显然工作方式不同。本文中的示例使用全局变量...
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中继续使用our
和local
,format
和write
似乎是可行的方法。