2011-03-17 91 views
0
AAAAAAAA 0.0.0.0 hs01.stuff.net 
BBBBBBBB 0.0.0.0 hs01.morestuff.net 
CCCCCCCC 0.0.0.0 hs01.evenmorestuff.net 
DDDDDDDD 0.0.0.0 hs01.stuff.net 
EEEEEEEE 0.0.0.0 hs01.stuff.net 
FFFFFFFF 0.0.0.0 hs01.evenmorestuff.net 
GGGGGGGG 0.0.0.0 hs01.stuff.net 
HHHHHHHH 0.0.0.0 hs01.evenmorestuff.net 

我一直在搜索,但我找不到我正在寻找的答案。基于第三列的数据排序

如何按上述输出的第3列进行排序?

这是我的代码:

#!/usr/local/bin/perl 
use warnings; 
use DBI; 
use DBD::Oracle; 
use HTML::Template; 
use List::MoreUtils 'uniq'; 

######################### Open File and Split The Data Into An Array #################################### 
$input_data_file = 'C:\wamp\www\input_corrolation_file.txt'; 
open (DAT, $input_data_file) 
     or die ("Could not open file!"); 

@raw_data = <DAT>; 

close(DAT); 
######################################################################################################### 


$dbh_source2 = DBI->connect("dbi:Oracle:host=????;port=????;sid=????",'????','????'); 
$SEL = "SELECT DISTINCT PE_LOOPBACK_IP,PE_FQDN FROM TABLE_NAME WHERE SITE_NAME = ?"; 
$sth = $dbh_source2->prepare($SEL); 
print '<table border=1>'; 
print '<tr>'; 
print '<th>Tower name</th>'; 
print '<th>SUR IP</th>'; 
print '<th>SUR FQDN</th>'; 
print '</tr>'; 



foreach my $data_line (@raw_data) { 
     chomp $data_line; 
     $sth->execute($data_line); 

     my @row = $sth->fetchrow_array; 
     unshift (@row, $data_line); 
       #Print data into cells# 
       print "<tr>"; 
       foreach (@row) { 
       print "<td>$_</td>"; 
       } 
       print "</tr>"; 
       #print "<$data_line>\t @row\n"; 



} 

print "</table>"; 
END { 
      $dbh_source2->disconnect if defined($dbh_source2); 
} 

所以,我怎么会是能够通过第三列于@row对数据进行排序?

所有帮助表示赞赏!

+0

你的sql只能得到两列;第三个从哪里来? – ysth 2011-03-17 00:47:29

+0

@ysth - 第三列来自unshift(@ row,$ data_line)命令 – jmg0880 2011-03-17 00:51:53

+0

啊,错过了,谢谢 – ysth 2011-03-17 01:17:24

回答

2

单独从数据库和打印的取和排序,然后打印:

my @rows; 
foreach my $data_line (@raw_data) { 
    chomp $data_line; 
    $sth->execute($data_line); 

    my @row = $sth->fetchrow_array; 
    unshift (@row, $data_line); 
    push @rows, \@row; 
} 

@rows = sort { $a->[2] cmp $b->[2] } @rows; 

foreach my $row (@rows) { 
    print "<tr>"; 
    foreach (@$row) { 
     print "<td>$_</td>"; 
    } 
    print "</tr>"; 
} 
+0

谢谢你这么多人!它完美的作品! – jmg0880 2011-03-17 01:27:38

0

你可以把表到一个哈希,其中键是线和值的字段的值要排序,然后由值进行排序哈希:

my @arr; 
my @sorted_arr; 
my $key; 
my %hash_sort; 
my @broken_line; 

push (@arr,"last\t222222\tzrf.bcd.cde"); 
push (@arr,"first\t999999\tabc.poi.pko"); 
push (@arr,"second\t444444\tjko.drt.xdf"); 
push (@arr,"third\t111111\tmno.lkn.tyf"); 

foreach $key (@arr){ 
    # print "$key\n"; 
    @broken_line = split("\t",$key);  
    $hash_sort{$key}=$broken_line[2]; 
} 

foreach $key (sort {$hash_sort{$a} cmp $hash_sort{$b}} (keys(%hash_sort))){ 
    print "$key\n"; 
    push (@sorted_arr,$key); 
} 

此代码创建一个新的有序阵列,以及打印排序线。