map操作符
1. 用map切片
读取三维坐标数据,假若该文件内容为:
#点坐标数据 1 2 3 4 5 6 9 8 7
#将文件中的三维坐标载入读取,用空格分开坐标值 open my ($points), '<', 'points' or die "coundn't read points data"; while (<$points>) { next if /^\s*#.*$/; push @xyz, [split]; } foreach my $pt (@xyz) { print "point ", $i++, ": x = $pt->[0], y = $pt->[1], ", "z = $pt->[3]\n"; } ###结果为 point 1: x = 1, y = 2, z = 3 point 2: x = 4, y = 5, z = 6 point 3: x = 9, y = 8, z = 7
如果只取坐标点的x值,该如何做:
方法一: for循环
for ($i = 0 ; $i < @xyz ; $i++ ) { push @x, $xyz[$i][0]; }
方法一:map操作符
my @x = map {$_->[0]} @xyz;
2. 用map嵌套数据
假若我们有三个数组,分别包含每个点在三个方向的向量值。如:
@x = qw(1 4 9); @y = qw(2 5 8); @y = qw(3 6 7);
如果将数据组合成一个三维数据,采用的方法有:
方法一:普通循环实现,但此方式既慢又麻烦
for ( $i = 0 ; $i < @x ; $i++ ) { $xyz[$i][0] = $x[$i]; $xyz[$i][1] = $y[$i]; $xyz[$i][2] = $z[$i]; }
方法二:直接在map里用 [ ] 构造内层数据,代码简洁优雅
my @xyz = map { [ $x[$_], $y[$_], $z[$_] ] } 0..$#x;
使用map,可以容易的实现嵌套和排列
#交换x和y坐标的位置 my @xyz = map { [ $_->[1], $_->[0], $_->[3] ] } @xyz; my @xyz = map { [ @$_[ 1, 0, 2] ]} @xyz;
#衍生出坐标到原点距离的列表 my @mag = map { sqrt{ $_->[0] * $_->[0] + $_->[0] * $_->[0] + $_->[0] * $_->[0] + } } @xyz;