brengo has asked for the wisdom of the Perl Monks concerning the following question:

I'm failing badly at trying to store an array into the store of Bot::BasicBot::Pluggable::Module (storage should be provided by Bot::BasicBot::Pluggable::Store). It must be trivial for many of you to just look it up and guide me along but I tried looking into the examples, source and documentation and got nowhere so I'd be thankful for any help and pointers.

I tried in a module which gets loaded by a Bot::BasicBot::Pluggable object:

package Bot::BasicBot::Pluggable::Module::MyModuleName; use warnings; use strict; use base qw(Bot::BasicBot::Pluggable::Module); sub init { my $self = shift; $self->config( { fruit_order => ["apple","lemon"], is_weekend => 0 } ); } sub admin { my ($self, $msg) = @_; my $who = $msg->{who}; my $body = $msg->{body}; if ( $body =~ /^!setorder\s*$/ ) { my @order = ["orange","pea"]; $self->set('fruit_order'=>\@order); return "order set"; } if ( $body =~ /^!getorder\s*$/ ) { my @order = @{ $self->get('fruit_order') || [] }; return @order; } } 1;

...but this doesn't work. The !getorder command never shows any order from the storage - neither when called first (should be filled with "apple" and "lemon") nor when called after the !setorder command (should now be filled with "orange" and "pea").

Setting a scalar value (is_weekend) is straight from the documentation and should work, but how do I set() and get() an array in there? Thanks for your help!

  • Comment on How to store an array in the store of Bot::BasicBot::Pluggable::Module?
  • Download Code

Replies are listed 'Best First'.
Re: How to store an array in the store of Bot::BasicBot::Pluggable::Module?
by jethro (Monsignor) on Jan 21, 2011 at 17:19 UTC

    One bug is in line 22. It should be

    my @order = ("orange","pea");

    because '[]' creates a pointer to a constant array, not a constant array, the pointer gets generated in the next line

      Thanks for your reply. I made that line up and you're right - it would lead to an array reference. Sadly though, this wasn't the problem. Both of the following snippets don't work, they both return 0:

      if ( $body =~ /^!seto\s*$/ ) { my @order = ("pea","plum","banana"); $self->set("fruit_order"=>@order); my @o = @{ $self->get("fruit_order") || [] }; return @o; } if ( $body =~ /^!seto\s*$/ ) { my @order = ("pea","plum","banana"); $self->set("fruit_order"=>\@order); my @o = @{ $self->get("fruit_order") || [] }; return @o; }

      As I digged a bit deeper into the according modules I couldn't find any example of an array being stored and retreived. Could it be possible that storing arrays is not supported by the module?

        If at all, the second of your two snippets should work. And it should even work if storing arrays isn't possible because a reference behaves like a scalar in most situations. For example if you print it, it says "ARRAY(0x...)".

        I notice that you write in your first post "Setting a scalar value (is_weekend) is straight from the documentation and should work". You might test that first, even documentation can have bugs. This should help get some answers:

        # instead of my @o = @{ $self->get("fruit_order") || [] }; my $o= $self->get("fruit_order"); use Data::Dumper; print Dumper($o),"\n"; print ref $o,"\n"; return @$o if (ref $o eq 'ARRAY');