4

好的,我这里有点问题。我意识到我不需要将 $handle 设置为 *::HTML 以使此代码段正常工作,但是此代码在使用时脱离了上下文,实际上我确实需要它与 $handle 一起使用。我收到的输出位于代码段下方,但我想要的输出是 file.html 包含“what\nsometext1\nsometext2\n”。

open(HTML, ">file.html");
$handle = \*::HTML;
print $handle "what\n";

open(READ, "< somefile.txt"); #somefile.txt contains sometext1\nsometext2\n
while(<READ>)
{
    print $handle;
}
close READ;
close HTML;

file.html 留下输出“what”,并将 GLOB(0x6278b0)GLOB(0x6278b0) 打印到终端窗口。

4

5 回答 5

13

如果您查看文档,print您会发现有三种有效的调用方式print

  • 打印文件句柄列表
  • 打印清单
  • 打印

只有最后一个版本$_隐式打印。原因很简单,Perl 无法判断您是要打印文件句柄还是打印到文件句柄而不需要更多信息(分隔文件句柄和列表的空格)。打印文件句柄(而不是打印文件句柄)是最灵活的方法,因此他们选择了模棱两可的情况的解决方案。

于 2009-06-15T17:18:23.967 回答
6

当您使用标量变量来保存文件句柄时,您必须帮助 Perl 理解如何解析表达式。说法print $var含糊。它可能意味着以下任何一种:

print STDOUT $var;  # print the contents of $var to STDOUT
print {$var} $_;    # print the contents of $_ to the handle $var

Perl 选择了前者。如果您想要后者,则需要通过将文件句柄括起来以消除歧义来使其明确。

此外,Perl 仅$_在您没有为要打印的内容提供任何参数时才使用默认变量。由于如何print $var解释,$_不使用。

于 2009-06-15T17:20:33.357 回答
3

Perl 的打印操作符在所有情况下都允许省略 LIST。考虑:

$ perl -le '$_ = "foo!"; print STDOUT'
foo!

但在解析器看来,这就像一个文件句柄——不像print $scalar,它在运行时可以是任何东西。如果您不确定一些代码的解析,请通过B::Deparse提供它,如

$ perl -MO=Deparse,-p try
while (defined(($_ = <READ>))) {
    print($_);
    print($handle);
    print(STDOUT $_);
}

如所写,循环包含三个对 print 的调用:printprint $handleprint STDOUT

要接近您想要的,您可以使用select

my $oldfh = select $handle;

while(<READ>)
{
    print;
}

select $oldfh;

请注意,select 返回先前选择的文件句柄,上面的代码将其保存,以便将内容放回我们后来找到它们的地方。

于 2009-06-15T17:33:17.047 回答
2

我想到了; 我需要这个$_之后$handle

于 2009-06-15T17:03:08.867 回答
1
use strict;
use warnings;

open( my $html, '>', "file.html" );
print $html "what\n";

open( my $read, '<', "somefile.txt" ); #somefile.txt contains sometext1\nsometext2\n

while( my $line = <$read> )    {
    print {$handle} $line;
}

close $read;
close $html;
于 2009-06-15T17:44:39.797 回答