我正在尝试创建一个脚本,该脚本将从模板生成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,而不是写到文件--没有抛出错误。在添加文件处理和接收此错误之后,我尝试只使用一个裸文件句柄--同样没有抛出错误。
因此,如果我只是将"$fh“替换为"FH”,脚本就会像预期的那样工作。是什么原因导致这个词的文件句柄窒息?
发布于 2017-04-18 22:06:03
Perl是一种模糊语言。这意味着它并不总是清楚应该如何解析。在某些情况下,perl必须猜测如何解析某些内容。有一个语法歧义
print $fh << "MODULE";具体来说,<<可以是左移位操作符,也可以是here-doc的开头。
要解决这个问题,您可以遵循两条途径。
打印$fh (<<“模块”);
打印{ $fh } <<“模块”;
$fh->print(<<“模块”);
perl猜对了:
打印$fh <<“模块”;请注意,print $fh +<< "MODULE";引入了另一个歧义。+是二进制或一元+运算符吗?谢天谢地,它被解释为一元-+,如所需。
顺便说一下,<<"MODULE"可以缩短为<<MODULE。
发布于 2017-04-18 20:28:33
在<<标记这里的文档之后,应该没有空格,所以
print $fh << "MODULE";应该是
print $fh <<"MODULE";或者更整洁
print $fh <<MODULE;或者也许
print $fh (<< "MODULE");实际上,<<被视为左移操作符,Perl继续试图编译package语句。找不到有效的包名,它尝试使用$name作为版本号,并抱怨因为它不是一个
https://stackoverflow.com/questions/43481030
复制相似问题