2013-08-26 120 views
-3

我有一樣的文本文件輸入:的Perl編程存儲列值基於另一個列值

Time(1ps) *_sysclock *hy_dvdd_0 *y_vdd18_0 *s_enabled *lpi_clk_0 
========== ========== ========== ========== ========== ========== 
1000000000 1   1   1   11   1   
1000000045 1   1   1   11   0   
1000008365 1   1   1   11   1   
1000009824 0   1   1   11   1   
1000016685 0   1   1   11   0   
1000025005 0   1   1   11   1   
1000033325 0   1   1   11   0   
1000035828 1   1   1   11   0   
1000041645 1   1   1   11   1   
1000049965 1   1   1   11   0   
1000058285 1   1   1   11   1   
1000061832 0   1   1   11   1   
1000066605 0   1   1   11   0 

什麼,我要在這裏做的是: 第二列指示時鐘邊沿和第一列指示時間..我需要測量時鐘頻率。 所以我的要求是,因爲這個腳本取決於我運行腳本時的第一個值,所以當時鍾值從初始值變化時,在上面的例子中初始值是1,所以當它變成0那一次,我想將第1列的值存儲在一個變量中,並且當時鍾值再次變爲1時,我想存儲第1列的值以獲得時鐘脈衝持續時間。

基於此,我想比較這些時間差異與一些預定義的值來比較它。

你能幫我解決這個問題嗎?

感謝所有提前。

預期O/P爲: 我需要它告訴我..的邊緣之間的差像在上面的例子中的輸出:「1000009824」之間 DIFF其中在時鐘邊緣的第一次變化發生。和 「1000061832」,其中時鐘邊沿值再次變爲0,意味着一個完整的時鐘週期。

+1

歡迎來到SO。你可以編輯這個問題來添加你期望從示例輸入中得到的輸出,並且添加你到目前爲止嘗試過的Perl代碼。謝謝。 –

回答

1

讓我們假設你有你的輸入進入STDIN。您可能要忽略前兩行:

<> for 1..2; 

然後,您可以在一個行數據的讀取:

my $line = <>;     #read line from STDIN 
my @initial = split(' ', $line); #split on whitespace 

,直到你看到一個變化,你可以閱讀更多的行:

my @final; 
while ($line = <>) { 
    @final = split(' ', $line); 
    last if $final[1] != $initial[1]; 
} 

現在你可以比較時間戳:

my $diff = $final[0] - $initial[0]; 
print "$initial[0] to $final[0] is $diff\n"; 

我建議將行讀入散列表,所以你有真正的列名而不是數組索引......但這取決於你。

+0

嗨我試過你的代碼,現在發生了什麼..我得到的輸出像「1000000000到1000009824是9824」這是正確的..但我的要求是要找出時間「1000009824」和「1000061832」之間的區別基本上一個時鐘脈衝。 –

+0

@Pankaj Kumar:rutter給了你所有你需要的部分,但是它缺少爲你編碼的答案 - 這是令人沮喪的,因爲這不是免費的代碼解決方案服務,它是你的一個地方*學會解決代碼問題。你知道有足夠的Perl編寫一個循環,並重覆上述代碼兩次(找到兩個更改)? –

+0

@NeilSlater:我非常清楚,SO不是用於免費代碼服務的。我盡我所能讓代碼完成並且已經完成了。我問Rutter的唯一原因是因爲我認爲他不瞭解我的要求。無論如何非常感謝幫助。 –

相關問題