2015-07-21 68 views
1

從技術上講,在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}}

回答

1

你可以做類似如下:

#!/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);

+0

是。你是對的@chankey。你能分析一下這個代碼嗎?2DArrayOutputString2 { \t my($ array1)= @_; \t my $ finaloutput =「{」; foreach my $ aref(@ array1){ foreach my $ inner(@ $ aref){ $ finaloutput。=「{」; foreach my $ elem(@ $ inner){$ finaloutput。= $ elem。「,」; } $ finaloutput。=「}」。「,」; } } return $ finaloutput; } my @ array1 = [[1,2,3],[1,2,3],[1,2,3]]; print TwoDArrayOutputString2(\ @ array1);' –

1

單程可能與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}} 
2

首先,無論你的語法錯了(相對於什麼,我想你想他們這樣做):

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}}。

這是一個奇怪的要求。爲什麼你需要創建這樣一個子程序?

如果你想序列化數組作爲字符串,你會更好的利用它做的更標準和可互操作的方式之一,並選擇一個格式,如JSONYAMLXMLData::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}}
相關問題