如何将STDOUT重定向到Perl脚本中的文件后还原?

use*_*686 1 perl

下面是我的代码的一部分,我的代码进入"if loop",$value =1进程输出iperf.exe正在进入my_output.txt.由于我在alarm(20sec)一段时间后超时,所以也只想捕获此过程的输出.

然后我想继续命令提示符,但我无法返回到命令提示符.

不仅这个代码本身在命令提示符下不是PRINT,而是在my_output.txt文件上打印

(我正在循环这个,如果阻塞我的代码)

output.txt的

inside value loop2
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 8.00 KByte (default)
------------------------------------------------------------
[160] local 10.232.62.151 port 5001 connected with 10.232.62.151 port 1505
[ ID] Interval       Transfer     Bandwidth       Jitter   Lost/Total Datagrams
[160]  0.0- 5.0 sec  2.14 MBytes  3.59 Mbits/sec  0.000 ms    0/ 1528 (0%)
inside value loop3
clue1
clue2
inside value loop4
one iperf completed
Transfer

Transfer Starting: Intent { act=android.settings.APN_SETTINGS }

******AUTOMATION COMPLETED******

看起来像重新初始化的一些问题STDOUT.

我试图使用,close(STDOUT);但它再次没有返回STDOUT.

if($value)
{    
my $file = 'my_output.txt';

use Win32::Process;

print"inside value loop\n";
# redirect stdout to a file

open STDOUT, '>', $file
  or die "can't redirect STDOUT to <$file> $!";

Win32::Process::Create(my $ProcessObj,
                       "iperf.exe",
                       "iperf.exe -u -s -p 5001",
                       0,
                       NORMAL_PRIORITY_CLASS,
                       ".") || die ErrorReport();

$alarm_time = $IPERF_RUN_TIME+2; #20sec            

print"inside value loop2\n";
sleep $alarm_time;    

$ProcessObj->Kill(0);

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

print"inside value loop3\n";
print"clue1\n";
#close(STDOUT);
print"clue2\n";
print"inside value loop4\n";
print"one iperf completed\n";
}

my $data_file="my_output.txt";

open(ROCK, $data_file)|| die("Could not open file!");
@raw_data=<ROCK>; 

@COUNT_PS =split(/ /,$raw_data[7]);
my $LOOP_COUNT_PS_4 = $COUNT_PS[9];
my $LOOP_COUNT_PS_5 = $COUNT_PS[10];

print "$LOOP_COUNT_PS_4\n";
print "$LOOP_COUNT_PS_5\n";

my $tput_value = "$LOOP_COUNT_PS_4"." $LOOP_COUNT_PS_5";
print "$tput_value";
close(ROCK);
print FH1 "\n $count    \| $tput_value \n";
Run Code Online (Sandbox Code Playgroud)

geo*_*car 7

您需要STDOUT在重新打开之前保存:

open(SAVE, ">&STDOUT") || die "Can't save STDOUT\n"; 
...
open(STDOUT, ">&SAVE") || die "Can't restore STDOUT\n"; 
Run Code Online (Sandbox Code Playgroud)

您还可以使用动态变量来"保存"STDOUT(但这可能需要重新组织您的代码):

do {
  local *STDOUT;
  open(STDOUT, "...");
  ...
}; # STDOUT is restored here
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用反引号来捕获完整的输出:

$x = `iperf.exe ...`;
Run Code Online (Sandbox Code Playgroud)


Sin*_*nür 5

使用本地:

{
    local *STDOUT;
    open STDOUT, '>', $file
        or die "can't redirect STDOUT to <$file> $!";

    Win32::Process::Create(my $ProcessObj,
                       "iperf.exe",
                       "iperf.exe -u -s -p 5001",
                       0,
                       NORMAL_PRIORITY_CLASS,
                       ".") || die ErrorReport();

    $alarm_time = $IPERF_RUN_TIME+2; #20sec            

    print"inside value loop2\n";
    sleep $alarm_time;
    $ProcessObj->Kill(0);
}
Run Code Online (Sandbox Code Playgroud)