好的,我在这里有点问题。我意识到我不需要为* :: HTML设置一个$ handle来使这个代码片段起作用,但是这个代码从它的使用中脱离了上下文,我确实需要这个来处理$ 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)打印到终端窗口。
答案 0 :(得分:11)
如果您查看documentation for print
,您会看到有三种有效方式可以致电print
:
只有最后一个版本隐式打印$_
。原因很简单,Perl无法判断您是否打印文件句柄或文件句柄而没有更多信息(将文件句柄和列表分隔开的空格)。打印文件句柄(而不是它)是最灵活的方法,因此他们选择了不明确的案例的解决方案。
答案 1 :(得分:5)
当您使用标量变量来保存文件句柄时,您必须帮助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
的方式,因此未使用$_
。
答案 2 :(得分:3)
Perl的print operator确实允许在所有情况下遗漏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
,print $handle
和print STDOUT
。
要接近您想要的内容,您可以使用select:
my $oldfh = select $handle;
while(<READ>)
{
print;
}
select $oldfh;
请注意,select返回先前选择的文件句柄,上面的代码将其保存,以便将事物放回到我们之后找到它们的位置。
答案 3 :(得分:1)
我明白了;我需要$_
之后的$handle
。
答案 4 :(得分: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;