我假設你想重新打開STDOUT以使write
函數起作用。但是,正確的解決方案是指定文件句柄或使用select
。
write FILEHANDLE;
或
select FILEHANDLE;
write;
不幸的是,它似乎的perlform的IO有點神祕,似乎並沒有允許詞法文件句柄。
你的問題是你不能在程序中重複使用格式化文本,所以需要一些三元編程。你可以做的是打開一個打印到標量的文件句柄。這是另一個有點神祕的Perl功能,但在這種情況下,它可能是直接執行此操作的唯一方法。
# Using FOO as format to avoid destroying STDOUT
format FOO =
VARIABLE @<<<<<< @<<<<<< @<<<<<<
$x $y $z
.
my $foo;
use autodie; # save yourself some typing
open INPUT, '<', "text.txt"; # normally, we would add "or die $!" on these
open FOO, '>', \$foo; # but now autodie handles that for us
open my $output, '>', "output.txt";
while (<FILE>) {
$foo = ""; # we need to reset $foo each iteration
write FOO; # write to the file handle instead
print $output $foo; # this now prints $foo to output.txt
do_something($foo); # now you can also process the text at the same time
}
正如你會發現,我們現在先打印格式化的行標$foo
。雖然它在那裏,但我們可以將它作爲常規數據處理,因此不需要保存到文件並重新打開它以獲取數據。
每次迭代,數據連接到$foo
的末尾,所以爲了避免積累,我們需要重置$foo
。 最好的方式來處理這將是在範圍內使$foo
詞彙,但不幸的是我們需要$foo
聲明在while循環之外,以便能夠在open
語句中使用它。
它可能在while循環內部可以使用local $foo
,但我認爲這是對這個已經非常糟糕的黑客攻擊添加更多不良做法。
結論:
有了這一切說和做,我懷疑來處理,這是在其他一些方式不使用perlform可言,和格式化數據的最佳方式。雖然perlform可能非常適合打印到文件,但它並不適合您的想法。我從前面回憶起這個問題,也許還有其他答案會更好。如使用sprintf
,如Jonathan suggested
來源
2012-01-11 15:42:00
TLP
我想你是在這裏走了一條糟糕的道路。如果您需要在同一個程序中進一步處理數據,使用perlform可能不是最好的選擇。 – TLP 2012-01-11 15:42:55