2013-02-20 43 views
0

我编写了一个Perl脚本,用于从文件中读取数据并进行计算。基本上我正在尝试计算网络流量的吞吐量。我是从读取该文件的格式如下:Perl脚本提取部分数字

- 0.152416 1 2 tcp 1040 ------- 2 12.0 2.9 2 13 
r 0.153584 1 2 tcp 1040 ------- 2 12.0 2.9 1 12 
+ 0.154208 1 2 tcp 1040 ------- 2 10.0 2.7 3 15 
- 0.154208 1 2 tcp 1040 ------- 2 11.0 2.8 3 15 
r 0.155248 1 2 tcp 1040 ------- 2 12.0 2.9 2 13 

我提取柱[0],[3],[7],[8],[9]。由于列[8]和[9]以double(即x.y)形式出现,因此我试图仅获得列[8]和[9]的第一部分(即x部分)。换句话说,我不关心在点“之后”出现的第二部分。 。我需要的第一部分。我想,我有两种方法,无论是处理正则表达式,还是添加更多额外的代码来为[8]和[9]中的每一行我将读取的标记定制标记?任何简短的建议。部分脚本:

#input parameters: 
$infile=$ARGV[0]; 
$dest=$ARGV[1]; 
$from=$ARGV[2]; 
$to=$ARGV[3]; 
$fId=$ARGV[4]; 
$TimeShift=$ARGV[5]; 

我想使$和$只包含第一部分。

open (DATA,"<$infile") || die "error in $infile $!"; 
while (<DATA>) 
    { 
    @x = split(' '); Im using space 

回答

1

什么

$from = int $ARGV[2]; 

详见int

或者说,

my ($infile, $dest, $from, $to, $fId, $TimeShift) = @ARGV; 
$_ = int for $from, $to; 
+0

谢谢。但是,这给了我所有节点的零结果,而如果我指定第二部分(不使用整数),则计算吞吐量。 – SimpleNEasy 2013-02-20 22:56:51

+0

@ Eng.Mohd:没有看到脚本,我不知道。 – choroba 2013-02-20 23:04:14

+0

我解决了这个问题。谢谢 – SimpleNEasy 2013-02-20 23:06:21

0

你应该知道,虽然,虽然可以使用int,它有一些危险的警告。

perldoc -f int

你不应该使用这个功能四舍五入:一个是因为它 向0截断,和两个因为机器表示浮点数有时会产生 直观的结果的 。例如,“int(-6.725/0.025)” 产生-268而不是正确的-269;那是因为它实际上更像是-268.99999999999994315658而不是 。通常, “sprintf”,“printf”或“POSIX :: floor”和 “POSIX :: ceil”函数将比int()更好地为您服务。

相反,考虑这样做的:

using POSIX; 
... 
... 

$from = POSIX::floor($ARGV[2]); 
+0

不过,看起来OP并没有四舍五入,正如规范所说的那样:“......我不关心在点之后出现的第二部分”。 “。而OP的数据集不会导致“int”产生“违反直觉的结果”。鉴于此,'int'是一个很好的解决方案。 – Kenosis 2013-02-20 23:58:56

0

如果你只是想扔掉点和以下数字,就可以使用s/[.][0-9]+\z//。这样,就不会涉及浮点转换。

#!/usr/bin/env perl 

use strict; use warnings; 
use Data::Dumper; 

while (my $line = <DATA>) { 
    last unless $line =~ /\S/; 
    my @cols = (split ' ', $line)[0, 3, 7 .. 9]; 
    s/[.][0-9]+\z// for @cols[-2 .. -1]; 
    print Dumper \@cols; 
} 

__DATA__ 
- 0.152416 1 2 tcp 1040 ------- 2 12.0 2.9 2 13 
r 0.153584 1 2 tcp 1040 ------- 2 12.0 2.9 1 12 
+ 0.154208 1 2 tcp 1040 ------- 2 10.0 2.7 3 15 
- 0.154208 1 2 tcp 1040 ------- 2 11.0 2.8 3 15 
r 0.155248 1 2 tcp 1040 ------- 2 12.0 2.9 2 13