$#retval gives the index of the last element in the array. If an array is empty this will be -1. If it is zero then the array contains one element. Here is a demo:
my @retval;
print "the last index of \@retval is $#retval\n";
print "the number of *elements* in \@retval is ", scalar @retval, "\n"
+;
push @retval, 'one value';
print "the last index of \@retval is $#retval\n";
print "the number of *elements* in \@retval is ", scalar @retval, "\n"
+;
push @retval, 'another value';
print "the last index of \@retval is $#retval\n";
print "the number of *elements* in \@retval is ", scalar @retval, "\n"
+;
I fully understand the shorthand BTW ;-) The longhand is for your debugging benefit as your code craps out after this as you demonstrate! Also as noted you do not show the method where the error actually occurs. While using OO perl is a great idea your data structures are poor and do not take full advantage of the usual anonymous hash structure. Here is a very brief demo of how I might approach the problem:
package Item;
use Data::Dumper;
my @items;
# initialise an array of item objects from our data
while (<DATA>) {
chomp;
next unless $_;
my $item = new Item;
my ($id, $quant ) = split ',';
$item->id($id);
$item->quant($quant);
push @items, $item;
}
print Dumper \@items;
# now sell one of each item
for my $item (@items) {
$item->quant(-1);
}
print Dumper \@items;
# now print out the id and quantities
print "\n\nid quant\n";
for my $item (@items) {
print $item->id, "\t", $item->quant, "\n";
}
##############################
sub new {
my $self = shift;
return bless {}, $self;
}
# get or set id
sub id {
my ($self, $cid) = @_;
$self->{'id'} = $cid if defined $cid;
return $self->{'id'};
}
# get or set numbers in stock
sub quant {
my ($self, $change) = @_;
$self->{'quant'} += $change if defined $change;
return $self->{'quant'}
}
__DATA__
item 1,10
item 2,20
item 3,30
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.