Maw*_*ter 1 arrays perl matrix
如何使用STDIN构建二维矩阵?
如果我输入这样的矩阵:
1 2 3
4 5 6
7 5 6
7 8 9
4 5 6
3 3 3
Run Code Online (Sandbox Code Playgroud)
我如何输入这个并创建两个矩阵?
到目前为止,这是我的代码
while (defined ($a=<STDIN>)) {
chomp ($a);
push @a,($a);
}
Run Code Online (Sandbox Code Playgroud)
这只是输入.
我的理解是我可以将每一行添加到堆栈中.当矩阵全部放入时我可以取每一行,按空格分解以创建一个数组.然后我需要创建一个数组引用并将此引用推送到数组中以创建我的矩阵.我怎么做到这一点?有没有更简单的方法?我一直在为此抨击我3天.我觉得现在真该死的傻瓜......
让我们让你的代码更多Perl-y,我们将在一遍中完成你需要做的一切:
my @a = ();
while(<>) {
push @a, [ split ];
}
Run Code Online (Sandbox Code Playgroud)
这很大程度上取决于你的答案,所以我会选择解释它,而不是针对约翰韦恩的回答反应.我们先从您的行开始:
while(defined(my $a = <STDIN>))
Run Code Online (Sandbox Code Playgroud)
Perl用户知道许多循环将隐式使用该$_变量.如果你需要很多嵌套循环,你应该避免使用那个变量,并为每个循环级别使用命名良好的变量,但在这种情况下我们只有一个级别,所以让我们继续使用它:
while(defined($_ = <STDIN>))
Run Code Online (Sandbox Code Playgroud)
现在,Perl非常友好地了解我们想要测试defined()很多,所以它可以让我们缩短到这个:
while(<STDIN>)
Run Code Online (Sandbox Code Playgroud)
这由Perl隐式转换为将行读取分配给$_并返回true,只要定义了结果(因此直到文件结束发生).但是,Perl为我们提供了另一个技巧:
while(<>)
Run Code Online (Sandbox Code Playgroud)
这将循环STDIN 或,如果在命令行上给出参数,它将打开它们作为文件并循环它们.所以这仍然是从STDIN:
./myscript.pl
Run Code Online (Sandbox Code Playgroud)
但我们也可以从一个或多个文件中读取:
./myscript.pl myfile [myfile2 [myfile3 ...]]
Run Code Online (Sandbox Code Playgroud)
它比使用shell做同样容易且更直观(尽管这仍然有效):
cat myfile [myfile2 [myfile3 ...]] | ./myscript.pl
Run Code Online (Sandbox Code Playgroud)
如果您不想要此行为,可以将其更改回<STDIN>,但请考虑保留它.
循环是:
push @a, [ split ];
Run Code Online (Sandbox Code Playgroud)
首先,split()没有参数是相同的split /\s+/, $_(即它$_在出现空格字符时拆分字符串),并且由于split空尾随字段的细微之处被删除,因此a chomp()是不必要的.然后,[]创建一个匿名数组引用(在本例中,它包含我们的拆分$_字符串的内容).然后,我们将该数组引用推送到@a.简单来说,你现在有一个标准输入的二维矩阵.
试试这个:
use strict;
use warnings;
use Data::Dumper;
my @matrix;
while (my $line = <>) {
chomp $line;
my @row = split /\s+/, $line, 3;
push @matrix, \@row;
}
print Dumper(\@matrix);
Run Code Online (Sandbox Code Playgroud)
<STDIN>您可以从stdin或管道文件中读取,而不是显式使用<>.输入一个矩阵给出结果:
$VAR1 = [
[
'1',
'2',
'3'
],
[
'4',
'5',
'6'
],
[
'7',
'8',
'9'
]
];
Run Code Online (Sandbox Code Playgroud)
从这里你应该能够看到你需要做什么来阅读两个矩阵.