Perl glob和文件句柄问题

时间:2009-06-15 17:02:05

标签: perl glob filehandle

好的,我在这里有点问题。我意识到我不需要为* :: 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)打印到终端窗口。

5 个答案:

答案 0 :(得分:11)

如果您查看documentation for print,您会看到有三种有效方式可以致电print

  • 打印FILEHANDLE LIST
  • 打印列表
  • 打印

只有最后一个版本隐式打印$_。原因很简单,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 $_);
}

如上所述,该循环包含三个要打印的调用:printprint $handleprint 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;