开发者

How do you get MotherDogRobot to birth an array of puppy objects using map and a hash of hashes?

开发者 https://www.devze.com 2023-04-12 17:04 出处:网络
Puppy meta data gets read in from config file using (General::Config) and creates this hash of hashes

Puppy meta data gets read in from config file using (General::Config) and creates this hash of hashes

$puppy_hashes = {
 puppy_blue => { name => 'charlie', age => 4 },
 puppy_red  => { name => 'sam', age => 9 },
 puppy_yellow  => { name => 'jerry', age => 2 },
 puppy_green  => { name => 'phil', age => 5 },
}

the MotherDogRobot package consumes the puppies hash to birth an array of puppy objects (lol)

package MotherDogRobot;  
use Moose;
use Puppy;
use Data::Dumper;
#moose includes warn and strict

sub init_puppy{
  my($self,%options) = @_;
  my $puppy = Puppy->new( %options );
  return ($puppy);
}

sub birth_puppies{
  my($self,$puppy_hashes) = @_;
  my @keys = keys %{$puppy_hashes};
  my @puppies = map { $self->init_puppy( $puppy_hashes->{$_} ) } @keys;
  return(@puppies);
}

sub show_me_new_puppies{
  my($self,$puppy_hashes) @_;
  print Dumper($self->birth_puppies($puppy_hashes));
}

Error odd number of arguments

passing %options to Puppy->new(%options)

no luck birthing puppies -- which means I can't put lasers on their heads =/

UPDATE开发者_运维知识库

I think the problem is that I'm passing a Hash Ref to init_puppy() instead of an array or hash, so when I try to pass %options to the new constructor, it's not getting a proper ( key => value) pair -- hence the odd number of arguments error.

But from this standpoint I've been looking at this code too long I cant figure out how to dereference this properly.

btw this is my official day 22 of using Perl!


you're using empty variables as if they're not empty, that is, you're not doing anything at all

print "hi $_ " for my @foo;

This assumes that the incomplete snippet you've shown is what you're really using

update: Similarly in sub init_puppy, you never initialize my($self,%options)=@_;

#!/usr/bin/perl --
use strict;
use warnings;
Main( @ARGV );
exit( 0 );
sub Main {
    my $puppy_hashes = {
        puppy_blue   => { name => 'charlie', age => 4 },
        puppy_red    => { name => 'sam',     age => 9 },
        puppy_yellow => { name => 'jerry',   age => 2 },
        puppy_green  => { name => 'phil',    age => 5 },
    };

    for my $puppy ( MotherDogRobot->birth_puppies($puppy_hashes) ) {
        print join ' ', $puppy, $puppy->name, $puppy->age, $puppy->dump, "\n";
    }
}

BEGIN {
    package Puppy;
    BEGIN { $INC{'Puppy.pm'} = __FILE__; }
    use Any::Moose;
    has 'name' => ( is => 'rw', isa => 'Str' );
    has 'age'  => ( is => 'rw', isa => 'Int' );

    package MotherDogRobot;
    BEGIN { $INC{'MotherDogRobot.pm'} = __FILE__; }
    use Moose;
    use Puppy;

    sub init_puppy {
        my ( $self, %options ) = @_;
        my $puppy = Puppy->new(%options);
        return ($puppy);
    }

    sub birth_puppies {
        my ( $self, $puppy_hashes ) = @_;
        my @puppies = map { $self->init_puppy( %{$_} ) } values %$puppy_hashes;
        return (@puppies);
    }
    no Moose;
}


The standard Moose constructor will accept both

->new( %{ $puppy_hashes->{$_} } )

and

->new( $puppy_hashes->{$_} )

if $puppy_hashes contains what you say it does, and $_ is an existing key.

Furthermore, Moose will not give the error Error odd number of argments when you pass no arguments. (You're not assigning anything to %config.)

I can't tell which part of what you said is wrong, but what you said doesn't add up.

0

精彩评论

暂无评论...
验证码 换一张
取 消