一个小排序问题,诚心求教!

一个小排序问题,诚心求教!

ip.txt文件内容如下:
张三    172.16.70.3     00-AA-BB-CC-DD
李四    172.16.70.4     AA-CC-DD-EE-GG
王二    172.16.70.2     EM-GG-DD-BB-HH

1.如何用perl写个程序,按如下方式排序:

王二    172.16.70.2     EM-GG-DD-BB-HH
张三    172.16.70.3     00-AA-BB-CC-DD
李四    172.16.70.4     AA-CC-DD-EE-GG

2.如果按PC用户姓氏拼音/姓氏笔画排序呢?

我折腾了好一会,总是有问题,请同志们指教!
1. 按IP最后一段排序

    sub by_ip {
        my $aa = $1 if ($a =~ /\.(\d+)\s/);
        my $bb = $1 if ($b =~ /\.(\d+)\s/);
     
        $aa <=> $bb;
    }
   
    my @ip_txt = (
                  '张三    172.16.70.23     00-AA-BB-CC-DD',
                  '李四    172.16.70.4      AA-CC-DD-EE-GG',
                  '王二    172.16.70.1      EM-GG-DD-BB-HH',
                 );
    print join("\n", sort by_ip @ip_txt);


2. 拼音排序
我只知道GB2312前3000多一级汉字是按拼音排序的, 二级就是按笔画了....
也许借助Excel或数据库的API?

3. 笔画排序
自定义个字库数组吧, 网上很多的, GB2312能满足大部分场合了
1.

[Copy to clipboard] [ - ]
CODE:
open(WJ,"ip.txt")||die;
while(<WJ>)
{
        my($name,$ip,$other)=split(/\s+/);
        $hash{$ip}="$name|$other";
}
foreach $tmp (sort keys %hash)
{
        my($name,$other)=split(/\|/,$hash{$tmp});
        print "$name\t$tmp\t$other\n";
}
close(WJ);

不知可否?
2.我也不知道

sub by_ip {
        my $aa = $1 if ($a =~ /\.(\d+)\s/);
        my $bb = $1 if ($b =~ /\.(\d+)\s/);
     
        $aa <=> $bb;
    }
   
    my @ip_txt = (
                  '张三    172.16.70.23     00-AA-BB-CC-DD',
                  '李四    172.16.70.4      AA-CC-DD-EE-GG',
                  '王二    172.16.70.1      EM-GG-DD-BB-HH',
                 );
    print join("\n", sort by_ip @ip_txt);

2楼老大程序中最后一句##print join("\n", sort by_ip @ip_txt);##偶看不大明白,谁能帮分解下,用2句或3句写写,谢谢了!
sort by_ip @ip_txt;
$_=join("\n",@ip_txt);
print $_;
老大,这样不行呀!若如此分解后,得不到预期结果了,再帮斟酌下,谢谢了!
@ip_txt = sort by_ip @ip_txt;
$_=join("\n",@ip_txt);
print $_;
先把汉字转化成拼音,然后按字母排序就可以了,如果第一个汉字拼音一样,再比较第二个汉字。

http://search.cpan.org/~fayland/ ... ingua/Han/PinYin.pm

  use Lingua::Han::PinYin;
  
  my $h2p = new Lingua::Han::PinYin();
  print $h2p->han2pinyin("我"); # wo

  my @result = $h2p->han2pinyin("爱你"); # @result = ('ai', 'ni');

  
  # we can set the tone up

  my $h2p = new Lingua::Han::PinYin(tone => 1);
  print $h2p->han2pinyin("我"); #wo3

  my @result = $h2p->han2pinyin("爱你"); # @result = ('ai4', 'ni3');

  print $h2p->han2pinyin("林道"); #lin2dao4

  print $h2p->han2pinyin("I love 余瑞华 a");


用笔画排序用这个包:http://search.cpan.org/~fayland/ ... ingua/Han/Stroke.pm
得到每个汉字的笔画数。然后数字排序。
谢谢兄弟们的解答!
大家学perl都多久啦?我接触perl3个月了(每天3小时学习),怎么感觉没什么长进呀~痛苦中......