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;

 

posted @ 2019-03-05 21:55  junywang  阅读(251)  评论(0编辑  收藏  举报