簡體   English   中英

Perl:STDOUT /直接將shell命令輸出到數組

[英]Perl: STDOUT/the output of shell command to an array directly

我必須訪問一個shell命令-Perl腳本中的hive,所以我使用`...`。 假設“ hive ... ...”的結果包含100000000行,大小為20GB。 我想要實現的是這樣的:

@array = `hive ... ...`;

``是否自動知道使用“ \\ n”作為分隔符將每一行划分為@array?

我可以想到的2種方法是(但在這種情況下有問題):

$temp = `hive ... ...`;
@array = split ( "\n", $temp );
undef $temp;

這種方式的問題是,如果在這種情況下hive的輸出太大,則$ temp無法存儲輸出,從而導致分段故障核心轉儲。

要么

`hive ... ... 1>temp.txt`;
open ( FP, <, "temp.txt" );
while (<FP>)
{
    chomp;
    push @array, $_;
}
close FP;
`rm temp.txt`;

但是這種方式太慢了,因為它首先將結果寫入硬盤。

有沒有一種方法可以在不使用任何“臨時容器”的情況下直接將shell命令的輸出寫入數組?

非常感謝您的幫助。

@array = `command`;

實際上,確實將command的輸出的每一行都放在其自己的@array元素中。 無需將輸出加載到標量並將其自己split

但是,存儲在陣列中的20GB輸出(由於Perl存儲數據的方式可能是該輸出的2-3倍)仍然會對您的系統造成很大的壓力。

解決問題的真正方法是通過IO句柄流式傳輸命令的輸出,並一次處理一行,而不必一次將所有輸出加載到內存中。 使用Perl的open命令可以做到這一點:

open my $fh, "-|", "command";
open my $fh, "command |";

-| 文件模式或| 附加在命令后的命令告訴Perl運行外部命令,並在文件句柄$fh提供該命令的輸出。

現在,在文件句柄上進行迭代以一次接收一行輸出。

while (<$fh>) {
    # one line of output is now in $_
    do_something($_);
}
close $fh;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM