如何打印嵌入在此处的词汇中的代码到词汇fileHandle



我正在尝试创建一个将从模板中生成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

相关内容

  • 没有找到相关文章

最新更新