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]はdouble(iexy)であるため、列[8]と[9]の最初の部分(つまりx部分)のみを取得しようとしました。つまり、ドット「。」の後に続く2番目の部分は気にしません。。最初の部分が必要です。正規表現を処理する方法と、[8]と[9]のトークンをカスタマイズするためのコードを追加して、読み取る行ごとに2つの方法があると思います。短い提案。スクリプトの一部:

#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

ただし、使用することはできますがint、いくつかの危険な警告があることに注意してください。

差出人perldoc -f int

この関数を丸めに使用しないでください。1つは0に向かって切り捨てられるため、2つは浮動小数点数のマシン表現が直感に反する結果を生成する可能性があるためです。たとえば、「int(-6.725 / 0.025)」は正しい-269ではなく-268を生成します。代わりに-268.99999999999994315658のようになっているからです。通常、「sprintf」、「printf」、または「POSIX::floor」および「POSIX::ceil」関数は、int()よりも優れたサービスを提供します。

代わりに、次のことを検討してください。

using POSIX;
...
...

$from = POSIX::floor($ARGV[2]);
于 2013-02-20T23:21:25.380 に答える
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 に答える