+ -
当前位置:首页 → 问答吧 → 求程序,怎么用perl在3级结构中,判断小区状态? 谢谢

求程序,怎么用perl在3级结构中,判断小区状态? 谢谢

时间:2010-08-29

来源:互联网

BCF-0001  BTSPLUS-M    U WO                     
  09238 11451 BTS-0001  U WO                                               
      DAXING1          RF/-                                                   
         EDGE TRX-001  U WO     
         EDGE TRX-002  U WO     
  09238 11452 BTS-0002  U WO                                    
      DAXING2          RF/-                                                   
         EDGE TRX-003  U BL-TRX  
         EDGE TRX-004  U WO     
         EDGE TRX-005  U WO      
  09238 11453 BTS-0003  U WO                              
      DAXING3          RF/-                                                        
         EDGE TRX-006  U BL-TRX

以上的一组数据有3级结构,第1级,关键字是"BCF-",它的状态是同行的“U WO”;第2级,关键字是"BTS-",它的状态是同行的“U WO”;第3级,关键字是"TRX-",它的状态是同行的“U WO”.
每个第一级(BCF-)下有最少1个,最多4个第二级(BTS-),每个第二级下最少1个,最多10个第三级(TRX-)
    现在想根据这3级的状态来输出第二级(BTS-)的状态。如果第一级是“U WO" 并且 第二级是"U WO" 并且第三级至少有1个TRX-是“U WO”,则第二级(BTS-) (用每个BTS-之前的5位数字表示)的最后状态为ok,否则为bad。(循环判断,文件中有很多组这种结构)
    最后想得到如下结构
11451   ok
11452   ok
11453   bad

作者: blackantt   发布时间: 2010-08-29

用很笨的方法实现了,唯一的优点是如果数据量很大,不会耗内存。仅供参考
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my ($c1,$c2,$c3,$lable);
  5. while (<DATA>) {
  6.         if (/BCF-/i) {
  7.                  $c1 = (/U WO/i)?1:0;
  8.          }
  9.          elsif (/.*(\d{5}).*?BTS-/i) {
  10.                  if ($c1 && $c2 && $c3 >= 1) { print "$lable\tOK!\n"; }
  11.                  elsif ($lable) { print "$lable\tBAD!\n"; }
  12.                  $lable = $1;
  13.                  $c3 = 0;
  14.                  $c2 = (/U WO/i)?1:0;
  15.          }
  16.          elsif (/TRX-.*?U WO/i) { $c3++; }
  17. }
  18. if ($c1 && $c2 && $c3 >= 1) { print "$lable\tOK!\n"; }
  19. elsif ($lable) { print "$lable\tBAD!\n"; }

  20. <STDIN>;

  21. __DATA__

  22. BCF-0001  BTSPLUS-M    U WO
  23.   09238 11451 BTS-0001  U WO
  24.       DAXING1          RF/-
  25.          EDGE TRX-001  U WO
  26.          EDGE TRX-002  U WO
  27.   09238 11452 BTS-0002  U WO
  28.       DAXING2          RF/-
  29.          EDGE TRX-003  U BL-TRX
  30.          EDGE TRX-004  U W O
  31.          EDGE TRX-005  U W O
  32.   09238 11453 BTS-0003  U WO
  33.       DAXING3          RF/-
  34.          EDGE TRX-006  U BL-TRX
  35. BCF-0002  BTSPLUS-M    U W O
  36.   09239 11454 BTS-0001  U WO
  37.       DAXING1          RF/-
  38.          EDGE TRX-001  U WO
  39.          EDGE TRX-002  U WO
  40.   09239 11455 BTS-0002  U WO
  41.       DAXING2          RF/-
  42.          EDGE TRX-003  U BL-TRX
  43.          EDGE TRX-004  U WO
  44.          EDGE TRX-005  U WO
  45.   09239 11456 BTS-0003  U WO
  46.       DAXING3          RF/-
  47.          EDGE TRX-006  U BL-TRX
  48. BCF-0003  BTSPLUS-M    U WO
  49.   09237 11457 BTS-0001  U WO
  50.       DAXING1          RF/-
  51.          EDGE TRX-001  U WO
  52.          EDGE TRX-002  U WO
  53.   09237 11458 BTS-0002  U WO
  54.       DAXING2          RF/-
  55.          EDGE TRX-003  U BL-TRX
  56.          EDGE TRX-004  U WO
  57.          EDGE TRX-005  U WO
  58.   09237 11459 BTS-0003  U WO
  59.       DAXING3          RF/-
  60.          EDGE TRX-006  U BL-TRX
复制代码
如果使用范围操作符,然后正则判断一下,应该能写出更简洁高效的代码。暂时没掌握,等待高手出招。

作者: iamlimeng   发布时间: 2010-08-29