1

返されるハッシュの配列があります。

配列を返す前に、クロスチェックしました。それはうまく機能していました。

しかし、hashessの配列を呼び出し元のサブに返した後、それを読み取ることができません。

plzは参照用に以下のコードを見つけます..そしてハッシュの配列を読み取る/返す方法を教えてください

ありがとう... :)

#!/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
}
4

2 に答える 2

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
于 2012-08-27T08:18:01.357 に答える
1

配列への参照を返しています:

return \@dotNetHashArray

必ず

@one = @{ get_array_Hashes() }; 

それを逆参照します。

加えて

  • コメントは機能し//ません (使用#)

  • 通常、Perl でプロトタイプを使用する必要はありません (なぜ Perl 5 の関数プロトタイプが悪いのですか?を参照してください) 。

  • 値を出力するために戻った後もループが必要になります

  • Perl で配列を反復処理するためにカーソル変数は必要ありません

    for my $item (@dotNetHashArray) {
        print "\n Hash Value: $item->{Version}";
    }
    
  • \nプリントの先頭にが必要な場合は\n、ループの後にa がありません

最終的には次のようになります。

#!/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"; 
} 
于 2012-08-27T07:43:08.320 に答える