Perl 基于第三列对数据进行排序
我一直在到处寻找,但就是找不到我要找的答案 如何按上面输出的第3列进行排序 这是我的代码:Perl 基于第三列对数据进行排序,perl,Perl,我一直在到处寻找,但就是找不到我要找的答案 如何按上面输出的第3列进行排序 这是我的代码: 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 FFFFFFF
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
那么,我怎样才能按第三列对@row中的数据进行排序呢
感谢您的帮助 将从数据库提取和打印分开,并在打印前进行排序:
#!/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);
}
您可以将表放入哈希表中,其中键是行,值是要排序的字段的值,然后按值对哈希表进行排序:
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>";
}
这段代码创建一个新的排序数组,并打印排序后的行。您的sql只得到两列;第三列来自哪里?@ysth-第三列来自unshift@row,$data\u行命令
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);
}