Chinaunix
标题:
perl数组排序!
[打印本页]
作者:
zhangfenyun
时间:
2013-07-25 01:40
标题:
perl数组排序!
大家好,我有这样的一个问题!想请教,如果不明白我的意思的话,请QQ:251546505 联系我!
下面是一个文本文件 我想对他进行排序
#字母C后面表示直径 0.3,如果最后面的尾数是1的,表示槽; 尾数是0的表示孔
%后面的T01到T02之间的坐标是T01的坐标,
T02到T03之间的坐标是T02的坐标,
T03到T04之间的坐标是T03的坐标 依次内催,
排列规则:要把C3.175排在最前面即T01C3.175,3.175对应的坐标也要排在最前面
接着要排列孔,按照由小到大排列,相应的坐标也要改
最后接着排列槽,按照由小到大排列,相应的坐标也要改
M48
T01C.30
T02C.80
T03C.60
T04C3.175
T05C1.0
T06C1.051
%
T01
X0338Y031199
X0349Y028301
T02
X044699Y0332
X029799Y035499
X028801
T03
X029799Y030701
T04
X029799Y032901
T05
Y028499
T06
作者:
rubyish
时间:
2013-07-25 05:58
本帖最后由 rubyish 于 2013-07-25 03:07 编辑
这样的:
#!/usr/bin/perl
use 5.018;
my ( $sep, @TO, %DIA, %COR, $T );
print $sep = <DATA>;
$sep = 0;
while (<DATA>) {
unless ($sep) {
my ( $t, $cha, $dia, $pat ) = /(\w\d+)(\D)(\S+)(\d)/;
$t or ( $sep = $_ ) and next;
$DIA{"$pat"}{$t} = { DIA => $dia, DAT => "$cha$dia$pat" };
push @TO, $t;
}
else {
/^T/ ? ( ($T) = /(\w+)/ ) : ( $COR{$T} .= $_ );
}
}
my @SORT = map {
my $p = $_;
map { T => shift @TO, DAT => $DIA{$p}{$_}{DAT}, XY => $COR{$_} },
sort { $DIA{$p}{$a}{DIA} <=> $DIA{$p}{$b}{DIA} } keys $DIA{$p};
} 5, 0, 1;
print map { $_->{T}, $_->{DAT}, $/ } @SORT;
print $sep;
print map { $_->{T}, $/, $_->{XY} // '' } @SORT;
__DATA__
M48
T01C.30
T02C.80
T03C.60
T04C3.175
T05C1.0
T06C1.051
%
T01
X0338Y031199
X0349Y028301
T02
X044699Y0332
X029799Y035499
X028801
T03
X029799Y030701
T04
X029799Y032901
T05
Y028499
T06
复制代码
作者:
rubyish
时间:
2013-07-25 06:00
M48
T01C3.175
T02C.30
T03C.60
T04C.80
T05C1.0
T06C1.051
%
T01
X029799Y032901
T02
X0338Y031199
X0349Y028301
T03
X029799Y030701
T04
X044699Y0332
X029799Y035499
X028801
T05
Y028499
T06
复制代码
作者:
rubyish
时间:
2013-07-25 06:17
1 的,表示槽
0 的表示孔 !
lol
作者:
kk861123
时间:
2013-07-25 10:15
回复
1#
zhangfenyun
机械钻孔坐标,呵呵~
@首天
你也来试试吧,呵呵
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $tool_sep_flag = 0;
my %hToolInfo;
my $sCurrTool;
while ( my $line = <DATA> ) {
next if $line =~ /^\s*$/;
chomp($line);
if ( $line eq '%' ) {
$tool_sep_flag = 1;
next;
}
if ( $tool_sep_flag == 0 ) {
if ( $line =~ /^(T\d+)C([\d.]+)\s*$/ ) {
my ($tool,$size) = ($1,$2);
$size=~ s/^(?=\.)/0/;
$hToolInfo{$tool} = {
size => $size,
type => $size == 3.175 ? '1_spec' : substr($size,-1,1) == 1 ? '3_slot' : '2_hole',
};
}
} else {
if ( $line =~ /^(T\d+)\s*$/ ) {
$sCurrTool = $1;
next;
}
if ( exists $hToolInfo{$sCurrTool} ) {
push @{ $hToolInfo{$sCurrTool}{coord} }, $line;
}
}
}
# print Dumper \%hToolInfo;
my %hNewToolInfo;
my @aToolArray;
my $ToolIndex = 'T01';
for my $tool ( sort { $hToolInfo{$a}{type} cmp $hToolInfo{$b}{type}
or $hToolInfo{$a}{size} <=> $hToolInfo{$b}{size} } keys %hToolInfo ) {
$hNewToolInfo{$ToolIndex++} = $hToolInfo{$tool};
}
print "M48\n";
for my $tool ( sort keys %hNewToolInfo ) {
print "${tool}C$hNewToolInfo{$tool}{size}\n";
}
print "%\n";
for my $tool ( sort keys %hNewToolInfo ) {
print "$tool\n";
print "$_\n" for @{ $hNewToolInfo{$tool}{coord} };
}
__DATA__
M48
T01C.30
T02C.80
T03C.60
T04C3.175
T05C1.0
T06C1.051
%
T01
X0338Y031199
X0349Y028301
T02
X044699Y0332
X029799Y035499
X028801
T03
X029799Y030701
T04
X029799Y032901
T05
Y028499
T06
复制代码
作者:
zhangfenyun
时间:
2013-07-25 12:16
富足长乐 谢谢您 高!
我想加你的QQ, 我已经加你了!
我的QQ:251546505
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2