perl编程以基于另一列值存储列值

时间:2013-08-26 06:17:47

标签: 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  

我在这里要做的是: 第2列表示时钟边沿,第1列表示时间..我需要测量时钟频率。 所以我的要求是什么,因为这个脚本取第一个值取决于我运行脚本的时间,所以当时钟值从初始值改变时,在上面的例子中初始值是1,所以当它变为0时,那个时候我想将第1列值存储在一个变量中,当时钟值再次变为1时,我想存储第1列值以获得时钟脉冲持续时间。

基于我想比较这些时间差与某些预定义值进行比较。

你可以帮助我解决这个问题。

提前感谢所有人。

预期的O / P是: 我需要输出,告诉我边缘之间的差异..就像在上面的例子中: 差异在" 1000009824"时钟边沿发生第一次变化的地方。和  " 1000061832"其中时钟边沿值再次为0,表示完整的时钟周期。

1 个答案:

答案 0 :(得分: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";

我建议将该行读入哈希值,因此您可以使用真正的列名而不是数组索引...但这取决于您。