在Perl中,如何将二维数组串起来?
从技术上讲,在Perl中不存在多维数组,但是您可以在Perl中使用单维数组来操作,就好像它们具有多个维度一样。在Perl中,如何将二维数组串起来?
在Perl中,数组中的每个元素可以是对另一个数组的引用,但在语法上它们看起来像是一个二维数组。
我想在Perl中将2维整数数组转换为字符串。我宣布2维整数数组如下:
my @array1=[[1,2,3],[1,2,3],[1,2,3]];
OR
my @array2=((1,2,3),(1,2,3),(1,2,3));
现在我需要创建一个子程序,将返回字符串作为"{{1,2,3},{1,2,3},{1,2,3}}"
。我曾尝试以下子程序:
sub TwoDArrayOutputString { my ($outputs)= @_;
my $finaloutput="{";
foreach my $output ($outputs) {
foreach my $out (@$output) {
$finaloutput.="{"."}";
#$finaloutput.="{".join(',',@output)."}";
}
$finaloutput.=",";
}
$finaloutput.="}";
return $finaloutput;
}
sub TwoDArrayOutputString1 {
my ($outputs)= @_;
if (ref($outputs) eq "REF") {$outputs = ${$outputs};}
my $finaloutput="{";
foreach my $output ($outputs) {
foreach my $out (@$output) {
$finaloutput.="{"."}";
#$finaloutput.="{".join(',',@output)."}";
}
$finaloutput.=",";
}
$finaloutput.="}";
return $finaloutput;
}
sub TwoDArrayOutputString2{
my ($array)= @_;
my $finaloutput="{";
for my $row (0..$#array) {
my @columns = @{ $array[$row] }; # Dereferencing my array reference
$finaloutput.="{";
for my $column (@columns) {
$finaloutput.=$column.",";
}
$finaloutput=substr($finaloutput,0,length($finaloutput)-1);
$finaloutput.="}".",";
}
$finaloutput=substr($finaloutput,0,length($finaloutput)-1);
$finaloutput.="}";
return $finaloutput;
}
print TwoDArrayOutputString(@array1)."\n";
print TwoDArrayOutputString1(@array1)."\n";
print TwoDArrayOutputString2(@array1)."\n"."\n"."\n"."\n";
print TwoDArrayOutputString(@array2)."\n";
print TwoDArrayOutputString1(@array2)."\n";
print TwoDArrayOutputString2(@array2)."\n"."\n"."\n"."\n";
输出:
{{}{}{},} {{}{}{},}
}
{,}
{,}
}
和我的预期输出是{{1,2,3},{1,2,3},{1,2,3}}
。
回答:
你可以做类似如下:
#!/usr/bin/perl use strict;
use warnings;
my @array1=[[1,2,3],[1,2,3],[1,2,3]];
foreach my $aref (@array1){
foreach my $inner (@$aref){
print "{";
foreach my $elem (@$inner){
print "$elem";
print ",";
}
print "}";
}
}
PS:我没有在你的例子即my @array2=((1,2,3),(1,2,3),(1,2,3));
理解第二阵列。它基本上只是my @array2=(1,2,3,1,2,3,1,2,3);
。
回答:
单程可能与Data::Dumper
。但正确地通过array
或array-refs
到Dumper
。您的@array2
是一维数组。
#!/usr/bin/perl use strict;
use warnings;
use Data::Dumper;
my @array1=[[1,2,3],[1,2,3],[1,2,3]];
my $string = Dumper(@array1);
$string =~ s/\n|\s+|.*?=|;//g;
$string =~ s/\[/\{/g;
$string =~ s/\]/\}/g;
print $string."\n";
输出:
{{1,2,3},{1,2,3},{1,2,3}}
回答:
首先,无论你的语法错了(相对于什么,我想你想他们这样做):
my @array1=[[1,2,3],[1,2,3],[1,2,3]];
这导致@array1
持有对anonymou的单个引用列数组,当你想我想这还保持三个引用到三个匿名数组是:
my $array1 = [[1,2,3],[1,2,3],[1,2,3]];
$array1
现在是持有三个引用到三个匿名数组的数组的引用。
my @array2=((1,2,3),(1,2,3),(1,2,3));
在这种情况下,你只是在愚弄自己所有的额外的括号:所有你必须是一个数组,其元素是1, 2, 3, 1, 2, 3, 1, 2, 3
。
你说
现在我需要创建一个子程序,将返回字符串{{1,2,3},{1,2,3},{1,2,3}}。
这是一个奇怪的要求。为什么你需要创建这样一个子程序?
如果你想序列化数组作为字符串,你会更好的利用它做的更标准和可互操作的方式之一,并选择一个格式,如JSON,YAML,XML,Data::Dumper,什么其他。
例如:
$ perl -MJSON::MaybeXS=encode_json -E '@array1=([1,2,3],[1,2,3],[1,2,3]); say encode_json \@array1'[[1,2,3],[1,2,3],[1,2,3]]
或
$ perl -MData::Dumper -E '@array1=([1,2,3],[1,2,3],[1,2,3]); say Dumper \@array1'$VAR1 = [
[
1,
2,
3
],
[
1,
2,
3
],
[
1,
2,
3
]
];
或
$ perl -MYAML::XS -E '@array1=([1,2,3],[1,2,3],[1,2,3]); say Dump \@array1'---
- - 1
- 2
- 3
- - 1
- 2
- 3
- - 1
- 2
- 3
或
$ perl -MXML::Simple -E '@array1=([1,2,3],[1,2,3],[1,2,3]); say XMLout(\@array1)'
<opt> <anon>
<anon>1</anon>
<anon>2</anon>
<anon>3</anon>
</anon>
<anon>
<anon>1</anon>
<anon>2</anon>
<anon>3</anon>
</anon>
<anon>
<anon>1</anon>
<anon>2</anon>
<anon>3</anon>
</anon>
</opt>
如果您的目的是要学习如何遍历多维结构并打印出来,正确地执行它需要注意一些细节。你可以学习的YAML::Tiny来源:
sub _dump_array { my ($self, $array, $indent, $seen) = @_;
if ($seen->{refaddr($array)}++) {
die \"YAML::Tiny does not support circular references";
}
my @lines =();
foreach my $el (@$array) {
my $line = (' ' x $indent) . '-';
my $type = ref $el;
if (! $type) {
$line .= ' ' . $self->_dump_scalar($el);
push @lines, $line;
} elsif ($type eq 'ARRAY') {
if (@$el) {
push @lines, $line;
push @lines, $self->_dump_array($el, $indent + 1, $seen);
} else {
$line .= ' []';
push @lines, $line;
}
} elsif ($type eq 'HASH') {
if (keys %$el) {
push @lines, $line;
push @lines, $self->_dump_hash($el, $indent + 1, $seen);
} else {
$line .= ' {}';
push @lines, $line;
}
} else {
die \"YAML::Tiny does not support $type references";
}
}
@lines;
}
现在,为您简单的例子,你可以做这样的事情:
#!/usr/bin/env perl use feature 'say';
use strict;
use warnings;
my @array = ([1, 2, 3], [4, 5, 6], [7, 8, 9]);
say arrayref_to_string([ map arrayref_to_string($_), @array]);
sub arrayref_to_string { sprintf '{%s}', join(q{,}, @{$_[0]}) }
输出:
{{1,2,3},{4,5,6},{7,8,9}}
以上是 在Perl中,如何将二维数组串起来? 的全部内容, 来源链接: utcz.com/qa/258536.html