2013-04-30 38 views
1

所以我有一個這樣的數組:打印在單行與連續元素

W,X,Y,Z 
-7,6,101,15 
-7,6,101,16 
-7,6,101,17 
-7,6,101,78 
-7,6,101,79 
-7,6,101,84 
-7,6,101,92 
-7,9,615,49 
-7,9,615,50 
-7,10,759,38 
-7,10,759,39 

現在,我想打印時,W = X = Y和Z是連續的數字線。

預期輸出:

W,X,Y,Z 
-7,6,101,15-16-17 
-7,6,101,78-79 
-7,6,101,84 
-7,6,101,92 
-7,9,615,49-50 
-7,10,759,38-39 

如何實現這個Perl的?

感謝, 藝術

這裏是我的腳本:

while ($output_line = <FILE_C>) {                   
    chomp $output_line;                      
    my ($W, $X, $Y, $C, $D, $E, $F, $Z) = (split /\s/, $output_line);          
    if ($Y == $Block_previous) {                   
     print("Yes\t$Block_previous\t$Y\t$Z\n");                
     push(@Z_array, $Z);                     
     push(@Y_array, $Y);                     
     next;                         
    }                           
    else {                         
     push(@Z_array_nonblkmatch, $Z);                  
    }                           
    foreach $Z_printer (@Z_array) {                   
     print("$Y_array[0]\t$Z_printer\n");                 

     if (($Z_delta == 1) || ($Z_delta == -1)) {              
      push(@Z_adj, $Z_printer, $Z_printer_prev);              

      #~ print ("pair: $Z_printer_prev-$Z_printer\n");             
     }                          
     else {                        
      #~ print ("$Z_printer\n");                  
     }                          
     $Z_printer_prev = $Z_printer;                   
    }                           
    @Z_adj    =();                    
    @Z_array    =();                    
    @Y_array    =();                    
    @Z_array_nonblkmatch =();                    
    $Block_previous  = $Y;                    

    #~ <STDIN>;                        
}                            
close(FILE_C);  

謝謝,raina77ow!然而,這是輸出的樣子: -7,6,101,15-16-17-79

-7,6,101,16-17-79

-7,6,101,17-79

-7,6,101,78-79

-7,6,101,79-50

-7,6,101,84-50

-7,6,101,92

-7,6,615,49-50-39

-7,6,615,50

+0

我基本上是從文件中調用這些元素,並在Z等於先前的值時使用push。但這是我得到的。 -7,6,101,15-16-17 -7,6,101,16-17 -7,6,101,17 -7,6,101,78-79 – AREYES 2013-04-30 19:51:41

+0

向我們顯示您的數據結構,其中W,X,Y,Z是存儲 – 2013-04-30 19:51:56

回答

0

一種可能的方法(ideone demo):

use warnings; 
use strict; 

my $prev; 
while (<DATA>) { 
    chomp; 
    next unless /\S/; 
    my @numbers = split /,/; 
    if (defined $prev && $numbers[3] == $prev + 1) { 
    print '-' . ++$prev; 
    next; 
    } 
    print "\n" if defined $prev; 
    print join ',', @numbers; 
    $prev = $numbers[3]; 
} 

__DATA__ 
-7,6,101,15 
-7,6,101,16 
-7,6,101,17 
-7,6,101,78 
-7,6,101,79 
-7,6,101,84 
-7,6,101,92 
-7,9,615,49 
-7,9,615,50 
-7,10,759,38 
-7,10,759,39 

我選擇不收集這些數據轉換成中間陣列,正如你所做的那樣,問題很簡單:打印它分組。關鍵是存儲最後(Z)列的值,然後檢查每條新行:如果匹配,則只打印增加的值(這是print '-' . ++$prev行的值),如果不是,則結束此行(全部但第一種情況),並用此行的數字開始新的情況。

+0

謝謝,raina77ow!然而,這是輸出的樣子: -7,6,101,15-16-17-79 -7,6,101,16-17-79 -7,6,101,17-79 -7 ,6,101,78-79 -7,6,101,79-50 -7,6,101,84-50 -7,6,101,92 -7,6,615,49-50-39 -7 ,6,615,50 – AREYES 2013-04-30 21:03:20

+0

呃..不,它不是。你有沒有檢查過演示(通過我提供的鏈接)? – raina77ow 2013-04-30 21:18:19

+0

好吧,我不知道演示功能,直到我嘗試它。我會盡快嘗試一下!非常感謝! – AREYES 2013-04-30 22:09:31