2011-07-18 79 views
1

我在solaris上運行此腳本。我試圖將真實的,用戶的和系統的時間寫入一個文件,每一個都在一個單獨的行上。但是,這段代碼將它們與一堆未知字符框一起寫入同一行。我怎樣才能在他們自己的獨立線路上獲得每一次?在Perl中寫入文件的問題

#!/usr/local/bin/perl -w 

use strict; 
use warnings; 

my $command = "time echo 'hi' 2>&1 | tee -a runtimes.log"; 
system ($command); 
+0

嘗試使用\ r \ n? –

+0

實際上,它有效,即時編輯我的問題 –

+0

re:編輯:你是否期待'open'做任何事情?因爲它不是。另外,在腳本結尾處,您不需要「close」或「exit」,因爲腳本結束時會自動完成這些操作。 – TLP

回答

0

如果爲獲取系統/用戶的時間使用Perl代碼(或者timesPOSIX::times)你可能會得到更好的效果,以及更易於維護的代碼。

$command="ls -lR"; 
@before{real,user,system,chuser,chsystem}=(time(),times()); 
system $command; 
@after{real,user,system,chuser,chsystem}=(time(),times()); 
print "real @{[ $after{real}-$before{real} ]}\n"; 
print "user @{[ $after{chuser}-$before{chuser} ]}\n"; 
print "sys @{[ $after{chsystem}-$before{chsystem} ]}\n"; 

或POSIX版本:

use POSIX qw(times sysconf); 
$clocks_per_second=POSIX::sysconf(&POSIX::_SC_CLK_TCK); 
$command="ls -lR"; 
@before{real,user,system,chuser,chsystem}=(POSIX::times()); 
system $command; 
@after{real,user,system,chuser,chsystem}=(POSIX::times()); 
printf "real %2.2f\n", ($after{real}-$before{real})/$clocks_per_second; 
printf "user %2.2f\n", ($after{chuser}-$before{chuser})/$clocks_per_second; 
printf "sys %2.2f\n", ($after{chsystem}-$before{chsystem})/$clocks_per_second; 
+0

我真的很喜歡這個解決方案。但是我不能讓它在我的機器上運行。我確實添加了'使用POSIX';'在頂部,沒有運氣。當代碼完全正常工作時,代碼的外觀如何?謝謝。 –

+0

「時間」和「次數」是內置函數,所以這個_應該按原樣工作。 posix版本會返回稍微不同的值(時鐘滴答而不是秒),因此需要進行轉換,但作爲交換,您將獲得更高的實時編號分辨率。對於POSIX版本,添加'使用POSIX qw(times sysconf);'並將'(time(),times())'改爲'(POSIX :: times())'。要轉換爲秒,用'$ POSIX :: sysconf(&POSIX :: _ SC_CLK_TCK);'(每秒時鐘滴答的sysconf值)來區分差異 –

+0

是的,posix的方法更精確。對於我的問題,我唯一要做的就是用「\ r \ n」替換「\ n」。但這絕對是最有用的答案。非常感謝 –

0

Solaris標準行分隔符是\n,所以你的代碼看起來不錯。也請看here

可能您的問題與你正在使用,以查看該文件的文本編輯器...

0

兩件事情:

  • 同時檢查您的opensystem命令的輸出。
  • 在關閉文件之前,打印一個額外的空白行。

試試這個:

#!/usr/bin/env perl 

use strict; 
use warnings; #No need for -w when using this 

my $command = "time ls 2>&1 | tee -a runtimes.log"; 
open (FILE, '>>runtimes.log') 
    or die qq(Can't open "runtimes.log for writing\n); 

my $error = system ($command); 
if ($error) { 
    die qq(Error in executing command "$command": $?\n); 
} 
print "\n"; 
close FILE; 
exit 0;