gpt4 book ai didi

perl - `print $fh <<' EOF 中的 here-doc 问题'` : Perl executing the here doc

转载 作者:行者123 更新时间:2023-12-04 00:55:45 24 4
gpt4 key购买 nike

(根据 https://stackoverflow.com/a/17479551/6607497 它应该工作,但没有)我有一些这样的代码:

use strict;
use warnings;
if (open(my $fh, '>', '/tmp/test')) {
print $fh << 'TAG';
BEGIN {
something;
}
TAG
close($fh);
}

如果我遗漏了 $fh(这是一个为输出而打开的文件句柄,顺便说一句),BEGIN block 会正确输出(到 STDOUT)。然而,当我添加 $fh 时,Perl (5.18, 5.26) 试图执行 something 导致运行时错误:

Bareword "something" not allowed while "strict subs" in use at /tmp/heredoc2.pl line 6.
syntax error at /tmp/heredoc2.pl line 9, near "FOO
close"
Execution of /tmp/heredoc2.pl aborted due to compilation errors.

怎么了?

最佳答案

这个问题的细节很有趣(原来的 Perl 是 5.18.2,但是用 5.26.1 作为例子):

首先是一些没有 $fh 的代码:

#!/usr/bin/perl
use strict;
use warnings;
if (open(my $fh, '>', '/tmp/test')) {
print << 'FOO_BAR';
BEGIN {
something;
}
FOO_BAR
close($fh);
}

perl -c说:/tmp/heredoc.pl syntax OK , 但没有任何输出!

如果我添加 $fh之前<< ,我得到这个错误:

Bareword "something" not allowed while "strict subs" in use at /tmp/heredoc.pl line 7.
syntax error at /tmp/heredoc.pl line 10, near "FOO_BAR
close"
/tmp/heredoc.pl had compilation errors.

最后,如果我删除 'FOO_BAR' 之前的空格, 它有效:

#!/usr/bin/perl
use strict;
use warnings;
if (open(my $fh, '>', '/tmp/test')) {
print $fh <<'FOO_BAR';
BEGIN {
something;
}
FOO_BAR
close($fh);
}

> perl -c /tmp/heredoc.pl
/tmp/heredoc.pl syntax OK
> perl /tmp/heredoc.pl
> cat /tmp/test
BEGIN {
something;
}

也许真正的陷阱是 perlop(1) 中的声明:

           There may not be a space between the "<<" and the identifier,
unless the identifier is explicitly quoted. (...)

关于perl - `print $fh <<' EOF 中的 here-doc 问题'` : Perl executing the here doc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62636057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com