我正在尝试创建一个将从模板中生成perl代码的脚本,并且我很难理解丢弃的错误以及为什么我的解决方法将其修复。
这个示例是人为的,但它证明了问题:
use strict;
use warnings;
my $name = shift; # from @ARGV
my $file = sprintf "%s.pm", $name;
open my $fh, ">", $file
or die "error: open(>, '$file'): $!";
print $fh << "MODULE";
package $name;
#
# blah blah
#
use strict;
use warnings;
require Exporter;
our @ISA = qw| Exporter |;
our @EXPORT = qw| |; # automatic exports
our @EXPORT_OK = qw| |; # on-demand exports
# CODE
1;
MODULE
close $fh;
运行此脚本时,我会收到以下错误:
$ perl script.pl Foo
Invalid version format (non-numeric data) at script.pl line 11, near "package "
syntax error at script.pl line 11, near "package $name"
BEGIN not safe after errors--compilation aborted at script.pl line 17.
最初,此脚本只是打印到stdout而不是写入文件 - 没有错误的错误。添加文件处理并收到此错误后,我尝试只使用裸露的filehandle-又不丢弃错误。
因此,如果我只用" fh"替换" $ fh",则脚本可以按预期工作。词汇filehandle是什么导致此扼流的?
<<
标记此处文档后不应有空间,所以
print $fh << "MODULE";
应该是
print $fh <<"MODULE";
或更整齐的
print $fh <<MODULE;
或
print $fh (<< "MODULE");
是<<
被视为左移操作员,Perl继续尝试编译package
语句。找到没有有效的软件包名称,它试图将$name
用作版本编号,并抱怨,因为它不是一个
perl是一种模棱两可的语言。这意味着并不总是清楚应该如何解析它。在某些情况下,perl
必须猜测如何解析某些东西。
print $fh << "MODULE";
具体来说,<<
可以是左移动运算符,也可以是此处的开端。
您可以遵循两条路径来解决该问题。
您可以消除歧义:
print $fh +<< "MODULE";
&#x20;
print $fh (<< "MODULE");
&#x20;
print { $fh } << "MODULE";
&#x20;
$fh->print(<< "MODULE");
您可以欺骗
perl
正确猜测:print $fh <<"MODULE";
请注意,print $fh +<< "MODULE";
引入了替代歧义。+
是二进制或一元+
操作员吗?值得庆幸的是,它被解释为所需的一单位 +
。
顺便说一句,<<"MODULE"
可以缩短为<<MODULE
。