Interesting Error - Can't use string ("1909") as an ARRAY ref while "strict refs" in use

Rick Cooper rcooper at dwford.com
Tue Mar 10 16:10:08 GMT 2009


 

> -----Original Message-----
> From: mailscanner-bounces at lists.mailscanner.info 
> [mailto:mailscanner-bounces at lists.mailscanner.info] On Behalf 
> Of Julian Field
> Sent: Tuesday, March 10, 2009 11:01 AM
> To: MailScanner discussion
> Subject: Re: Interesting Error - Can't use string ("1909") as 
> an ARRAY ref while "strict refs" in use
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> 
> 
> On 10/3/09 13:55, Julian Field wrote:
> > * PGP Signed: 03/10/09 at 13:55:53
> >
> >
> >
> > On 10/3/09 13:40, Drew Marshall wrote:
> >>
> >> On 10 Mar 2009, at 12:00, Julian Field wrote:
> >>>>>>> Jules
> >>>>>>>
> >>>>>>   And if that doesn't work wouldn't this do the same thing?
> >>>>>>
> >>>>>> my @bodycheck = @{$body};
> >>>>>>
> >>>>> This will involve making a copy of the entire message in
> >>>>> memory. *Very*
> >>>>> expensive thing to do, need to avoid this at all costs.
> >>>>>> for ($i=(@bodycheck-1);$i>= 0; $i--){
> >>>>>>     last if @bodycheck[$i] =~ /^\s*$/;
> >>>>>>
> >>>>> you don't really mean @bodycheck[$i] do you? Surely you mean
> >>>>> $bodycheck[$i]?
> >>>>>>     print "Line is ****". at bodycheck[$i]."****\n";
> >>>>>>     pop @{$body};
> >>>>>> }
> >>>>>>
> >>>>> So yes, it would do the same thing, but it will take a 
> hell of a lot
> >>>>> longer to do, and will use a lot more memory too.
> >>>>>> Rick
> >>>>>>
> >>>>>>
> >>>>
> >>>> Well really I doubt the need to make the copy, just 
> seems somehow 
> >>>> wrong to
> >>>> use a for loop on something that we are shortening with each 
> >>>> iteration but
> >>>> since the loop is bottom up and the pop is from the bottom you 
> >>>> could just
> >>>> use $body because you are effectively just operating on the last 
> >>>> item at a
> >>>> given moment.
> >>>>
> >>>> And, pardon my lack of ability to wrap my head around perl's 
> >>>> handling of
> >>>> arrays (yes I don't care what perl thinks, a hash is an 
> associative 
> >>>> array so
> >>>> it should be able to be addressed directly by index or by key 
> >>>> without all
> >>>> the machinations) I think I would then mean
> >>>>
> >>>> for ($i=(@{$body}-1);$i>= 0; $i--){
> >>>>     last if @{$body}[$i] =~ /^\s*$/;
> >>>>
> >>> You can't do @array[$index] to access the index'th 
> element of array.
> >>> You mean $body->[$i] I *think*. I must admit I get a bit 
> lost in all 
> >>> the
> >>> redirections at times myself :-)
> >>>
> >>> for ($i=(@{$body}-1); $i>=0 $i--) {
> >>>   last if $body->[$i] =~ /^\s*$/;
> >>>   pop @{$body};
> >>> }
> >>>
> >>> definitely looks possible.
> >>>
> >>>>     print "Line $i is ****".@{$body}[$i]."****\n";
> >>>>     pop @{$body};
> >>>> }
> >>>>
> >>>> If we are trying to do this by index->value not 
> key->value. Again I am
> >>>> assuming the point is to pop off the body info from the 
> end forward 
> >>>> until
> >>>> reaching either a blank line or a line of nothing but 
> white space.
> >>>>
> >>>> ??
> >>>>
> >>>> Rick
> >>
> >>
> >> Ok, I'm lost but as and when you would like me to do 
> something, don't 
> >> hesitate to shout :-)
> >>
> > Yes, please try this version of the loop:
> > for ($i=(@{$body}-1); $i>=0 $i--) {
> >   last if $body->[$i] =~ /^\s*$/;
> >   pop @{$body};
> > }
> You'll probably need a quick
>      my $i;
> before that code. So the final version looks like this:
> 
>    if ($configwords[1] =~ /tr[ua]/i) {
>      my $i;
>      for ($i=(@{$body}-1); $i>=0; $i++) {
>        last if $body->[$i] =~ /^\s*$/i;
>        pop @{$body};
>      }
>      $b->Done();
>      return;
>    }
> 
> Jules

Julian, I believe you want for ($i=(@{$body}-1); $i>=0; $i--) { #decrement
not increment

Do you not?? Want to go from $body[length] to $body[0] bottom up right?
Otherwise you are looking at array[0] and poping array[last_elememt] and it
would suck if you meet in the middle.

Rick


--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.




More information about the MailScanner mailing list