用sort进行比较时 如何先匹配 $a $b 在比较

用sort进行比较时 如何先匹配 $a $b 在比较

班主曾经回复过一个问题  
解答比较的问题: 就是文件 如何按照第二列进行排列的问题
open(FF,”aaa.dat”) or die $!;  
print sort {(split(/<>/,$a))[4] <=> (split(/<>/,$b))[4]} <FF>;  
close(FF);

我现在想先让 (split(/<>/,$a))[4] 匹配成   =~ s/[^0-9]//g; 然后再比较  不知道要怎么写?

(我的文件中有时间列 2008年1月22日 我想先匹配成2008122 这样用sort)

能不能把文件贴出两行来看看
文件如下   
3<>0<>test<>障害<>2008年1月22日10:56:59<><>test-3<><pre>test-3</pre>
2<>0<>test<>障害<>2008年1月22日10:56:49<><>test-2<><pre>test-2</pre>
用 sort {(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]} <FF>;  
排列光含有数字的列没有任何问题

我的程序如果改成以下的形式
3<>0<>test<>障害<>2008122105659<><>test-3<><pre>test-3</pre>
2<>0<>test<>障害<>2008122105649<><>test-2<><pre>test-2</pre>
排序没有任何问题
但是我的程序需要输出时间 2008122105659 这种看着太不好了  还是想要2008年1月22日10:56:59这种输出
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的


QUOTE:
原帖由 Nosferatu 于 2008-1-22 14:46 发表
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的

不好意思能 说的详细些吗   
比如怎将 2008122 变成2008年1月22日


QUOTE:
原帖由 Nosferatu 于 2008-1-22 14:46 发表
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的

我用 substr 进行取字符  实现了 2008122变成2008年1月22日  不过这个办法觉得太那个了吧   那位朋友能帮忙 解决一下匹配后 再比较  这里不胜感激!!!


QUOTE:
原帖由 hitsubunnu 于 2008-1-22 15:55 发表

我用 substr 进行取字符  实现了 2008122变成2008年1月22日  不过这个办法觉得太那个了吧   那位朋友能帮忙 解决一下匹配后 再比较  这里不胜感激!!!

2008122 既可以写成2008年1月22日 也可以写成2008年12月2日

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122

我不知道如何控制,呵呵

另外能不能告诉我
print sort {((split('<>',$a))[4]) =~ s/[^0-9]//g <=> ((split('<>',$b))[4])=~ s/[^0-9]//g} <FILE>;  # 这个编译不过,不知道你是怎么加进去这个s//的


QUOTE:
原帖由 CU_wanglijun 于 2008-1-22 16:04 发表


2008122 既可以写成2008年1月22日 也可以写成2008年12月2日

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122

我不知道如何控制,呵呵

另外能不能告诉我
print  ...

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122
------- 这个我没写清楚  我的实际程序是按照  这个 xxxx年xx月xx日  这种格式的    文件格式问题跟我写的例子无关可以不考虑。

print sort {((split('<>',$a))[4]) =~ s/[^0-9]//g <=> ((split('<>',$b))[4])=~ s/[^0-9]//g} <FILE>;  # 这个编译不过,不知道你是怎么加进去这个s//的

--------我的问题就是 想知道 如何加进去?        

可能是我的问题没有写清楚  在此表示抱歉!
这个意思?
perl -F'<>' -lane '$F[4]=~s/\D+//g;$h{$F[4]}=$_;END{print $h{$_} for(sort keys %h)}' aaa.dat
写这麽复杂的代码...如果哪天你要修改的话...
你可能会累死日後的自己....

20080122可以用
my($year,$mon,$day,) = unpack("A4A2A2",$date);

如果是2008年12月12日..则可以用
my($year,$mon,$day) = $string=~/(\d+).*?(\d+).*?(\d+)/;