0

我写了一个 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] 是双列(iexy),我试图只获取列 [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];

我想让 $from 和 $to 只包含第一部分。

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

3 回答 3

1

关于什么

$from = int $ARGV[2];

有关详细信息,请参见int

更确切地说,

my ($infile, $dest, $from, $to, $fId, $TimeShift) = @ARGV;
$_ = int for $from, $to;
于 2013-02-20T22:47:35.893 回答
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
于 2013-02-20T23:43:00.133 回答
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]);
于 2013-02-20T23:21:25.380 回答