转置元素数组

时间:2016-04-02 21:11:00

标签: perl perl-data-structures

我正在尝试转置一个数组。

我尝试了以下代码......

#! /usr/bin/perl

use strict;
use warnings;
use autodie;

open my $fh, '<',"op.txt" || die "$!";
open my $wh , '>',"pwl.txt" || die "$!"; 
select ($wh);
while (my $line = <$fh>) { 
  my @rows = $line;
  my @transposed;
  for my $row (@rows) {
    for my $column (0 .. $#{$row}) {
      push(@{$transposed[$column]}, $row->[$column]);
    }
  }
  for my $new_row (@transposed) {
    for my $new_col (@{$new_row}) {
      print $new_col, " ";
    }
    print "\n"; 
  }
}

********** INPUT FILE ******

1 2 3
4 5 6
7 8 9

**********预期输出文件*******

1 4 7
2 5 8
3 6 9

********生成的输出文件*******

目前无法打印任何内容。脚本显示错误 &#34;不能使用字符串(&#34; 1 4 7&#34;)作为数组引用,而#34; strict refs&#34;在使用中

参考: 使用以下参考... Transpose in perl 但是在这个参考示例中,数组输入行是手动声明的,因为我正在尝试处理文本文件中的数组

任何人都可以在我错误的地方帮助我吗?

非常感谢

4 个答案:

答案 0 :(得分:1)

必须将输入行拆分为@dland建议。但是,还有一些其他问题。

这是更正后的代码[请原谅无偿风格的清理]:

#! /usr/bin/perl

use strict;
use warnings;
use autodie;

open my $fh, '<',"op.txt" || die "$!";
open my $wh , '>',"pwl.txt" || die "$!";

my @rows;
while (my $line = <$fh>) {
  my @line = split(" ",$line);
  push(@rows,\@line);
}
close($fh);

my @transposed;
for my $row (@rows) {
  push(@transposed,[]);
}

my $rowidx = -1;
for my $rowptr (@rows) {
  ++$rowidx;
  my $colidx = -1;
  for my $rowval (@$rowptr) {
    ++$colidx;
    ###printf("R=%d C=%d\n",$rowidx,$colidx);
    my $colptr = $transposed[$colidx];
    $colptr->[$rowidx] = $rowval;
  }
}

for my $new_row (@transposed) {
  for my $new_col (@$new_row) {
    print $wh $new_col, " ";
  }
  print $wh "\n";
}

close($wh);

注意:转置非方矩阵稍微困难一些。上面的代码可能需要稍微扩展一下。

答案 1 :(得分:0)

你试图将一个标量推入一个数组:

my @row = $line;

我认为你真正想要的是分隔空格:

my @row = split / /, $line;

答案 2 :(得分:0)

这是一种更简单的方法。它假设所有行都具有相同的长度,并且文件中的所有行都包含数据 - 即没有空行

输入文件的名称应作为命令行上的参数,输出发送到STDOUT,以便可以在命令行上重定向。例如

perl transpose.pl op.txt > pwl.txt


use strict;
use warnings 'all';

my @matrix = map [ split ], <>;

print "@$_\n" for @matrix;
print "\n";

my @transpose;

for my $i ( 0 .. $#{ $matrix[0] } ) {
    $transpose[$i] = [ map { $_->[$i] } @matrix ]
}

print "@$_\n" for @transpose;
print "\n";

输出

1 2 3
4 5 6
7 8 9

1 4 7
2 5 8
3 6 9

答案 3 :(得分:0)

在我的初始代码中添加my @row =map [ split], $line有助于将数据打印到pwl.txt。

然而它不是并排打印..而是打印到新行。 我想因为这样,波罗丁先生并没有在循环中包含矩阵!

1
2
3

4
5
6

7
8
9