2012-08-27 145 views
1

我有一個哈希數組要返回。Perl - 返回哈希數組

在返回數組之前我交叉檢查它。它工作正常。

但在hashess數組返回給調用子之後,我無法讀取它。

PLZ找到referrence下面的代碼..而且不要讓我知道如何讀/返回哈希

由於數組... :)

#!/usr/bin/perl 
use strict; 
use warnings; 

# Subroutine prototypes 
sub get_two_arrays(); 


my @one=(); 
@one = get_array_Hashes(); 
print "\n First: @one->{Version}\n"; // Printing the return array of hashes 


sub get_array_Hashes() { 



my @dotNetHashArray =(); 

    my $dotNetHash1 = {Version => "Test-1 Version", SP => "installedSp", Build => "installedBuild"};         
    push @dotNetHashArray, $dotNetHash1; 

    my $dotNetHash2 = {Version => "Test-2 Version", SP => "installedSp", Build => "installedBuild"};         
    push @dotNetHashArray, $dotNetHash2; 

    my $dotNetHash3 = {Version => "Test-3 Version", SP => "installedSp", Build => "installedBuild"};         
    push @dotNetHashArray, $dotNetHash3; 


    print "Test Array of hashes before return"; 
    for(my $i=0; $i<@dotNetHashArray; $i++) 
    { 
     print("\n Hash Value : ".$dotNetHashArray[$i]->{Version}); 
    } 


    return \@dotNetHashArray 
} 
+1

您返回對數組的引用,而不是數組。 –

+0

然後你的打印值的方式也不起作用,你在某處省略了一個循環。 –

+0

側面。如果你是5.10或更高版本,我寧願打印「\ n」,特別是如果\ n在行首 – justintime

回答

2

Perl是不是C,和原型都是爲了一些非常不同的,特殊的。如果你不知道他們服務的目的是什麼,那麼從來沒有使用它們

同樣,沒有理由在調用它之前預先聲明子例程。只要你不要使用原型Perl會做正確的事

當你聲明它們,如果你希望它們爲空,也沒有理由初始化數組。這就是Perl默認的功能

熟悉Perl的人會感謝您爲變量和子例程使用小寫字母和下劃線標識符。駱駝案例通常是爲包名保留的

正如其他人所說的,您正在返回一個參考到一個數組。但是,如果將其作爲參考並將其作爲參考使用,則可能不是取消引用返回值而是更好。必要的唯一的變化是迭代時返回

這裏是你的程序更規範的形式,我希望這將有助於在陣列上

use strict; 
use warnings; 

my $one = get_array_Hashes(); 
print "\nArray of hashes after return\n"; 
print "First: $_->{Version}\n" for @$one; 

sub get_array_Hashes { 

    my @dotnet_hash_array; 

    my $dotnet_hash1 = { 
     Version => "Test-1 Version", 
     SP => "installedSp", 
     Build => "installedBuild" 
    };         
    push @dotnet_hash_array, $dotnet_hash1; 

    my $dotnet_hash2 = { 
     Version => "Test-2 Version", 
     SP => "installedSp", 
     Build => "installedBuild" 
    };         
    push @dotnet_hash_array, $dotnet_hash2; 

    my $dotnet_hash3 = { 
     Version => "Test-3 Version", 
     SP => "installedSp", 
     Build => "installedBuild" 
    };         
    push @dotnet_hash_array, $dotnet_hash3; 

    print "Test Array of hashes before return\n"; 
    for my $i (0 .. $#dotnet_hash_array) { 
     print "Hash Value : $dotnet_hash_array[$i]->{Version}\n"; 
    } 

    return \@dotnet_hash_array 
} 

輸出

Test Array of hashes before return 
Hash Value : Test-1 Version 
Hash Value : Test-2 Version 
Hash Value : Test-3 Version 

Array of hashes after return 
First: Test-1 Version 
First: Test-2 Version 
First: Test-3 Version 
+0

thanxs很多u' r回覆它真的幫助我理解參考/取消參考...:)\ – user1335978

1

您在返回參考數組:

return \@dotNetHashArray 

你必須

@one = @{ get_array_Hashes() }; 

將其解除引用。

此外

  • //評論將無法正常工作(使用#

  • 通常你不需要在Perl使用原型(見Why are Perl 5's function prototypes bad?

  • 你會在返回後還需要一個循環打印出數值

  • 你並不需要一個遊標變量數組遍歷在Perl

    for my $item (@dotNetHashArray) { 
        print "\n Hash Value: $item->{Version}"; 
    } 
    
  • ,如果你需要有\n在你打印的開頭你是缺少循環後\n

您將結束:

#!/usr/bin/perl 

use strict; 
use warnings; 

# do not use function prototypes 
# perl subroutines are usually all lowercase (no camel-case) 
sub get_array_hashes { 

    my @dot_net_hash_array =(); 

    # actually you don't need to create a local variable for each item you push 

    push @dot_net_hash_array, { 

# avoid unncessary string interpolation (use ' if no variables in the string have to be interpolated) 
     version => 'Test-1 Version', 
     sp  => 'installedSp', 
     build => 'installedBuild' 
    }; 

    push @dot_net_hash_array, 
     { 
     version => 'Test-2 Version', 
     sp  => 'installedSp', 
     build => 'installedBuild' 
     }; 

    push @dot_net_hash_array, 
     { 
     version => 'Test-3 Version', 
     sp  => 'installedSp', 
     build => 'installedBuild' 
     }; 

    print "Test Array of hashes before return\n"; 
    for my $item (@dot_net_hash_array) { 
     print "Hash Value : $item->{version}\n"; 
    } 

    return \@dot_net_hash_array; 
} 

my @one = @{ get_array_hashes() }; 

# Use # for comments 

# Printing the return array of hashes 
print "Test Array of hashes after return\n"; 
for my $item (@one) { 
    print "Hash Value : $item->{version}\n"; 
} 
+0

沒有反對downvotes,但他們沒有真正有用的,沒有理由評論... – Matteo