我正在尝试转置一个数组。
我尝试了以下代码......
#! /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 但是在这个参考示例中,数组输入行是手动声明的,因为我正在尝试处理文本文件中的数组
任何人都可以在我错误的地方帮助我吗?
非常感谢
答案 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