我写了一个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
答案 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