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見ると、次の3つの有効な呼び出し方法があることがわかります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への3つの呼び出し、、、printおよびprint $handleが含まれていますprint 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 に答える