Perhaps this isn't an error so much as a failure between the dox and me
...

I was trying to reset the 'data' attribute for an 'idle' event. 
Specifically, the event got created without the 'data => $anything'
attribute, and I'm trying to add it later. I get a run-time error because
'splice()' is trying to scrape off more stuff from the parameter list than
is available.


Here's my code:

----start of code----
#!/usr/bin/perl -w
use diagnostics;
use strict;
use Event;
use Carp;
my $event = Event->idle(    min        => 60,
                            max        => 300,
                            cb         => sub { print 'foo' },
                            repeat     => 1,
                            reentrant  => 0,
                       );
$event->configure( data => 'foo' );
-----code ends here------

The affected code from Event occurs in Event::Watcher::configure:

----start of code------
sub configure {
    my $o = shift;
    if (! @_) {
        map { $_, $o->$_() } $o->attributes;
    } else {
        while (my ($k,$v)= splice @_, -2) { $o->$k($v)}
        1 # whatever
    }
}
------code ends here----

The error looks like:

Modification of non-creatable array value attempted, subscript -2 at
        /usr/local/lib/perl5/site_perl/5.6.1/i686-linux/Event/Watcher.pm
line 95 (#1)
    (F) You tried to make an array value spring into existence, and the
    subscript was probably negative, even counting from end of the array
    backwards.
 
Uncaught exception from user code:
        Modification of non-creatable array value attempted, subscript -2
at /usr/local/lib/perl5/site_perl/5.6.1/i686-linux/Event/Watcher.pm line
95.
        Event::Watcher::configure('Event::idle=HASH(0x8235400)') called at
testevent.pl line 16

The problem lies in the while() loop, as it can't end without trying to
reference part of the array that doesn't exist.
I have a dim memory that splice() used to silently ignore references to
negative subscripts that don't exist, and returned an empty list, but now
it does not.


-- 
Jeff Boes                                             vox 616.226.9550
Database Engineer                                     fax 616.349.9076
Nexcerpt, Inc.                                      [EMAIL PROTECTED]

Reply via email to