首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何打印嵌入在here-doc到词法文件句柄中的代码

如何打印嵌入在here-doc到词法文件句柄中的代码
EN

Stack Overflow用户
提问于 2017-04-18 19:52:34
回答 2查看 307关注 0票数 1

我正在尝试创建一个脚本,该脚本将从模板生成perl代码,而我很难理解抛出的错误以及我的解决办法为什么要修复它。

这个例子是人为的,但它演示了这个问题:

代码语言:javascript
复制
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;

在运行此脚本时,我会得到以下错误:

代码语言:javascript
复制
$ 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”,脚本就会像预期的那样工作。是什么原因导致这个词的文件句柄窒息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-18 22:06:03

Perl是一种模糊语言。这意味着它并不总是清楚应该如何解析。在某些情况下,perl必须猜测如何解析某些内容。有一个语法歧义

代码语言:javascript
复制
print $fh << "MODULE";

具体来说,<<可以是左移位操作符,也可以是here-doc的开头。

要解决这个问题,您可以遵循两条途径。

  • 您可以消除歧义: 打印$fh +<<“模块”;

打印$fh (<<“模块”);

打印{ $fh } <<“模块”;

$fh->print(<<“模块”);

  • 您可以诱使perl猜对了: 打印$fh <<“模块”;

请注意,print $fh +<< "MODULE";引入了另一个歧义。+是二进制或一元+运算符吗?谢天谢地,它被解释为一元-+,如所需。

顺便说一下,<<"MODULE"可以缩短为<<MODULE

票数 1
EN

Stack Overflow用户

发布于 2017-04-18 20:28:33

<<标记这里的文档之后,应该没有空格,所以

代码语言:javascript
复制
print $fh << "MODULE";

应该是

代码语言:javascript
复制
print $fh <<"MODULE";

或者更整洁

代码语言:javascript
复制
print $fh <<MODULE;

或者也许

代码语言:javascript
复制
print $fh (<< "MODULE");

实际上,<<被视为左移操作符,Perl继续试图编译package语句。找不到有效的包名,它尝试使用$name作为版本号,并抱怨因为它不是一个

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43481030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档