Perl glob和文件句柄问题

use*_*033 2 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;
Run Code Online (Sandbox Code Playgroud)

file.html保留输出"what",GLOB(0x6278b0)GLOB(0x6278b0)打印到终端窗口.

Cha*_*ens 11

如果您查看文档,print您将看到有三种有效的方法可以调用print:

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

只有最后一个版本$_隐式打印.原因很简单,Perl无法判断您是否打印文件句柄或文件句柄而没有更多信息(将文件句柄和列表分隔开的空格).打印文件句柄(而不是它)是最灵活的方法,因此他们选择了模糊情况的解决方案.

  • 实际上,"print HANDLE"也使用$ _,但是perl会将一个模糊的标量解析为"print LIST".(并且"print {$ fh}"是语法错误.) (2认同)

Mic*_*man 5

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

print STDOUT $var;  # print the contents of $var to STDOUT
print {$var} $_;    # print the contents of $_ to the handle $var
Run Code Online (Sandbox Code Playgroud)

Perl选择了前者.如果你想要后者,你需要通过将文件句柄括起来消除歧义来明确它.

此外,$_当您不为要打印的内容提供任何参数时,Perl仅使用默认变量.因为如何print $var解释,$_不使用.