您的位置:程序门 -> 其他开发语言 -> 脚本语言(perl ,python)



perl菜鸟请高手帮忙,急


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


perl菜鸟请高手帮忙,急
发表于:2007-12-15 02:28:30 楼主
    1   #!/usr/bin/perl   -w
    2
    3   my   %storage;
    4   open(fileout,   " <updates");
    5
    6   while   ($line   =   <fileout> )
    7   {
    8             @tocken=split(" ¦",$line);
    9             %storage   =   {$tocken[3]:$tocken[4]:$tocken[5]};
  10
  11
  12   }

我所要做的任务是分析bgp的更新文件(updates.gz),更新文件是由很多行组成的,每一行的格式如下:  
protocol ¦time ¦type ¦peerip ¦peeras ¦prefix

例如:
            1   bgp4mp ¦1088611220 ¦w ¦195.69.144.34 ¦1103 ¦207.132.38.0/24
          2   bgp4mp ¦1088611220 ¦w ¦195.69.144.34 ¦1103 ¦204.222.250.0/23
          3   bgp4mp ¦1088611220 ¦w ¦195.69.144.34 ¦1103 ¦198.17.191.0/24
          4   bgp4mp ¦1088611220 ¦w ¦202.12.28.190 ¦4777 ¦200.41.13.0/24
          5   bgp4mp ¦1088611220 ¦w ¦202.12.28.190 ¦4777 ¦200.41.56.0/24
          6   bgp4mp ¦1088611220 ¦w ¦202.12.28.190 ¦4777 ¦209.114.254.0/24
          7   bgp4mp ¦1088611220 ¦w ¦202.12.28.190 ¦4777 ¦217.28.244.0/24
          8   bgp4mp ¦1088611220 ¦a ¦192.65.184.3 ¦513 ¦193.194.20.0/24 ¦513   3320   3549   12874                 12839 ¦igp ¦192.65.184.3 ¦0 ¦0 ¦ ¦nag ¦ ¦
          9   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦164.128.234.0/24
        10   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦195.218.176.0/24
        11   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦195.239.204.0/24
        12   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦198.17.191.0/24
        13   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦204.222.250.0/23
        14   bgp4mp ¦1088611220 ¦w ¦212.47.190.1 ¦9177 ¦207.132.38.0/24
        15   bgp4mp ¦1088611220 ¦a ¦64.211.147.146 ¦3549 ¦208.137.239.0/24 ¦3549   3561   30184 ¦               igp ¦64.211.147.146 ¦0 ¦505 ¦3549:2006   3549:30840 ¦nag ¦ ¦
        16   bgp4mp ¦1088611220 ¦a ¦64.211.147.146 ¦3549 ¦208.155.158.0/24 ¦3549   3561   30184 ¦               igp ¦64.211.147.146 ¦0 ¦505 ¦3549:2006   3549:30840 ¦nag ¦ ¦
        17   bgp4mp ¦1088611220 ¦a ¦129.250.0.232 ¦2914 ¦192.135.183.0/24 ¦2914   1239   3701   10               876   5637 ¦igp ¦129.250.0.232 ¦0 ¦234 ¦2914:420   2914:2203   2914:3200   65504:1239 ¦               nag ¦10.40.110.0 ¦

当type=a   (即announcement),会有附加信息,如15,16,17,8,行。格式描述如下:

¦aspath ¦origin ¦nexthop ¦localpref ¦med ¦community ¦aggregation ¦aggregator  

题目的要求为:找出几对连续的更新(即prefix,peerip,peeras相同)。

请问应该如何写比较语句和循环语句,我写到第9行的时候不知道该如何进行下去了。
小弟初学perl,请高手帮忙。

 
 
发表于:2007-12-15 12:47:121楼 得分:0
csdn经常会搅乱贴出来的文本。
所以请楼主先看下自己贴出来的文件内容,确认这里显示出来的和实际内容相符。
发表于:2007-12-15 15:52:512楼 得分:0
显示的内容和实际内容是相符的,谢谢。
发表于:2007-12-15 21:02:133楼 得分:0
perl code
use strict; open (in, "your-file-path.log") or die "open error: $!"; my @lines ="", <in>, ""); formy $i = 1; $i < @lines-1; $i++) { if ( compare_line($lines[$i-1], $lines[$i]) || compare_line($lines[$i], $lines[$i+1]) ) { print $lines[$i]; } } sub compare_line { my @v1 = extract_fields(shift); my @v2 = extract_fields(shift); return unless @v1 && @v2; return compare_fields(\@v1, \@v2); } sub compare_fields { my$x, $y) = @_; return$x->[2] eq $y->[2]) &&$x->[3] eq $y->[3]) &&$x->[4] eq $y->[4]); } sub extract_fields { my $line = shift; return$line =~ /&brvbar(\s+)/g); }
发表于:2007-12-26 11:59:274楼 得分:0
49167832,可以去这群,希望和大家一起交流,顺便接分.
发表于:2007-12-26 11:59:485楼 得分:0
use   strict;

open   (in,   "your-file-path.log")   or   die   "open   error:   $!";

my   @lines   =   ("",   <in> ,   "");


for   (my   $i   =   1;   $i   <   @lines-1;   $i++)   {
        if   (   compare_line($lines[$i-1],   $lines[$i])
                ¦ ¦   compare_line($lines[$i],   $lines[$i+1])   )   {
                print   $lines[$i];
        }
}


sub   compare_line   {
        my   @v1   =   extract_fields(shift);
        my   @v2   =   extract_fields(shift);
        return   unless   @v1   &&   @v2;
        return   compare_fields(\@v1,   \@v2);
}

sub   compare_fields   {
        my   ($x,   $y)   =   @_;
        return   ($x-> [2]   eq   $y-> [2])   &&   ($x-> [3]   eq   $y-> [3])   &&   ($x-> [4]   eq   $y-> [4]);
}

sub   extract_fields   {
        my   $line   =   shift;
        return   ($line   =~   /&brvbar(\s+)/g);
}


快速检索

最新资讯
热门点击