用于提取部分数字的Perl脚本

时间:2013-02-20 22:42:13

标签: 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]是双(即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 

3 个答案:

答案 0 :(得分:1)

怎么样?
$from = int $ARGV[2];

有关详细信息,请参阅int

或者更确切地说,

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

答案 1 :(得分: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]);

答案 2 :(得分: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