我試圖用Perl來:
- 等待至少1個位元組到達STDIN
- 讀取所有的 STDIN 并將其保存為二進制檔案(要與 UTF-8 兼容)
我的嘗試:
# 讀取STDIN到一個字串/緩沖區并保存它(也許這只讀一行):
echo hello | perl -e 'open (fh, ">", "my_filename.txt"); print fh <STDIN> ' ;
# or:
echo hello | perl -e 'open STDIN, ">", "my_filename.txt"'.
# 最好能指定檔案名:
echo hello | perl -e 'open STDIN, "> ", $ARGV[0]' my_filename.txt
我不能用shell來做這個echo hello > my_filename.txt,因為shell的一個古老的bug/特性,所有的檔案句柄都是同時打開的,而不是基于一些依賴邏輯的順序。所以我的計劃是等到STDIN上有位元組在等待時再打開目標檔案。
不幸的是,我現在時間很緊,沒有時間重新學習Perl的語法。我認為我的錯誤之處在于,我試圖將 STDIN 作為一個新的變數來參考,而不是實際的輸入流。我已經研究了其他各種緩沖解決方案,但不幸的是,它們在某些方面都不盡如人意(沒有實際作用,不跨平臺,需要安裝額外的可執行檔案,等等)。
如果你直接執行重定向或通過在塊上回圈來減少記憶體的使用,則可獲得獎勵。知道如何從檔案中讀取并寫入 STDOUT 也會有幫助。這在awk之類的東西中也可能實作,但請注意,我正在避免使用sed,因為GNU sed和BSD sed之間的另一個古老的糟糕的語法選擇,常常使我無法在兩個平臺上使用一個命令而不進行調整。所以Perl似乎是個不錯的選擇。
uj5u.com熱心網友回復:
我不能確定,但我認為你要做的是類似于
的事情。cat foo | some_operation > foo
如果是這樣,簡單的解決方法是
cat foo | some_operation | sponge foo
但你直接要求的東西可以通過以下方式實作:
perl -e'
@ARGV 或 die("用法
");
my $qfn = shift;
我的$line = <>。
open(STDOUT, ">", $qfn)
或 die("open $qfn: $!
");
列印$line。
print while <STDIN>;
' file.out
我們可以利用-p的優勢。
perl -pe'
BEGIN {
@ARGV 或 die("用法
");
$qfn = shift(@ARGV);
}
如果($. == 1) {
open(STDOUT, ">", $qfn)
或 die("open $qfn: $!
");
}
' file.out
我們可以扔進-s。
perl -spe'
BEGIN { defined($o) or die("usage
"); }
如果($. == 1) {
open(STDOUT, ">", $o)
或 die("open $o: $!
");
}
' -- -- o=file.out
最后,我們可以擺脫錯誤檢查。
perl -spe'open(STDOUT, ">", $o) if $. == 1' --o=file.out
獎勵:如果你想從一個檔案而不是STDIN中讀取,以上所有的方法都能做到。只要提供要讀取的檔案名作為后續引數。你甚至可以提供一個以上的名字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/310319.html
標籤:
上一篇:python單元測驗沒有覆寫except塊內的代碼。
下一篇:安卓11存盤訪問和Java檔案庫
