1

YAMLファイルから情報を読み取っています

groceries.yaml

# comment
fruit:
   apples: 1
   oranges: 1
   grapes: 1
vegetables:
   potatoes: 1
   onions: 1
   leeks: 1

perlスクリプトに

myscript.pl

#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;

# Create a YAML file
my $stuff = YAML::Tiny->new;

# Open the config
$stuff = YAML::Tiny->read( 'groceries.yaml' );

print "Fruit: ", %{($stuff->[0]->{fruit})},"\n";
print "Vegetables: ", %{($stuff->[0]->{vegetables})},"\n";

exit

これは問題なく動作しますが、1 つのハッシュfruitと 1 つのハッシュが必要ですvegetables。私の素朴な試みは

my @keys = keys %{($stuff->[0])};
foreach my $key (@keys){
        my %{ $key }  = %{($stuff->[0]->{$key})},"\n";
}

しかし、明らかにこれは機能しません。

自分が間違っていることを理解したいと思っています。また、同じアイデアを実現するさまざまなワークフローを受け入れたいと思っています。:)

4

3 に答える 3

2

これを試して :

#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;
use Data::Dumper;

# Create a YAML file
my $stuff = YAML::Tiny->new;

# Open the config
$stuff = YAML::Tiny->read( 'groceries.yaml' ); 

my %fruits = %{ $stuff->[0]->{fruit} };
my %vegetables = %{ $stuff->[0]->{vegetables} };

コードに括弧を入れる理由がわかりません:

%{($stuff->[0]->{$key})},"\n";

これが問題だと思います。


HASH を反復処理するには、

use Data::Dumper;
# ...
foreach my $key (keys %{ $stuff->[0] }) {
    print Dumper $stuff->[0]->{$key};
}

編集2

#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;
use Data::Dumper;

# Create a YAML file
my $stuff = YAML::Tiny->new;

# Open the config
$stuff = YAML::Tiny->read( 'groceries.yaml' );

my %top_h;

foreach my $key (keys %{ $stuff->[0] }) {
    $top_h{$key} = $stuff->[0]->{$key};
}

print Dumper \%top_h;
于 2013-03-22T00:03:22.363 に答える
2

このソリューションにより%fruit、 およびにアクセスできます%vegetables。これらは を使用してパッケージ グローバル変数として宣言さourれ、シンボル テーブルに含まれるようになります。これにより、シンボリック参照またはグロブ割り当てを使用できるようになります。これを有効にするには、オフにする必要もありますstrict refsこのリファレンスも参照してください。

use strict;
use warnings;
use YAML::Tiny;
use Data::Dumper;

my $stuff = YAML::Tiny->read('groceries.yml');

my %groceries = %{$stuff->[0]};

our %fruit;
our %vegetables;
{
    no strict 'refs'; 
    #no strict 'vars'; # don't need above 'our' declarations with this
    while (my ($key, $val) = each %groceries) {
        %$key = %$val;
        # or *$key = $val;
    }
}

print Dumper \%fruit;

前もってキーがわからない場合は、オフにするstrict vars必要があるため、ハッシュに割り当てる前にハッシュを宣言する必要がありません。ただし、ハッシュを直接使用すると、警告が表示される場合があります。

しかし、それをすべて言ったので、単に使用するのが最も簡単だと思います%groceries

于 2013-03-22T06:57:33.697 に答える
1
my ( $fruit, $vegetables) = @{$stuff->[0]}{ qw<fruit vegetables> };

これをループで実行する場合は、最初に最初の「ドキュメント」をローカル参照に保存します。

my $yaml = $stuff->[0];

その後、while ループで次のようにします。

while ( my ( $k, $v ) = each %$yaml ) {
    say ucfirst( $k ) . ': ' . %$v;
}

これを使用して実行することもできますList::Pairwise

mapp { say ucfirst( $a ) . ': ' . %$b } %{ $stuff->[0] };
于 2013-03-22T00:04:32.157 に答える