2013-02-20 77 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