在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。但正确地通过arrayarray-refsDumper。您的@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

回到顶部