2013-08-26 92 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的唯一原因是因为我认为他不了解我的要求。无论如何非常感谢帮助。 –

相关问题