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

Rick Cooper rcooper at dwford.com
Mon Mar 9 19:49:44 GMT 2009


 

 > -----Original Message-----
 > From: mailscanner-bounces at lists.mailscanner.info 
 > [mailto:mailscanner-bounces at lists.mailscanner.info] On 
 > Behalf Of Julian Field
 > Sent: Monday, March 09, 2009 3:13 PM
 > 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 9/3/09 13:52, Rick Cooper wrote:
 > >
 > >
 > >   >  -----Original Message-----
 > >   >  From: mailscanner-bounces at lists.mailscanner.info
 > >   >  [mailto:mailscanner-bounces at lists.mailscanner.info] On
 > >   >  Behalf Of Julian Field
 > >   >  Sent: Sunday, March 08, 2009 11:35 AM
 > >   >  To: MailScanner discussion
 > >   >  Subject: Re: Interesting Error - Can't use string ("1909")
 > >   >  as an ARRAY ref while "strict refs" in use
 > >   >
 > >   >
 > >   >
 > >   >  On 3/8/09 3:25 PM, Drew Marshall wrote:
 > >   >  >  ----- "Julian Field"<MailScanner at ecs.soton.ac.uk>   wrote:
 > >   >  >
 > >   >  >
 > >   >  >>  Okay, try changing your line 509 to say this instead:
 > >   >  >>  while(${@{$body}}[$#{@$body}] !~ /^\s*$/) {
 > >   >  >>  That does at least compile ( sorry about that :-(
 > >   >  >>
 > >   >  >  No worries. You are right it does compile but..
 > >   >  >
 > >   >  >  MailScanner --debug
 > >   >  >  In Debugging mode, not forking...
 > >   >  >  Trying to setlogsock(unix)
 > >   >  >  Building a message batch to scan...
 > >   >  >  Have a batch of 5 messages.
 > >   >  >  max message size is '250000 trackback'
 > >   >  >  Can't use string ("76") as an ARRAY ref while "strict
 > >   >  refs" in use at
 > >   >  /usr/share/MailScanner//MailScanner/PFDiskStore.pm line 509.
 > >   >  >
 > >   >  How about this then? (He says, desperately trying to work
 > >   >  around a nast
 > >   >  bug in Perl 5.10)
 > >   >
 > >   >  my $bodysize = $#{@$body}+0;
 > >   >  while (${@{$body}}[$bodysize+0] !~ /^\s*@/) {
 > >   >
 > >   >  If that doesn't work either, I give up.
 > >   >
 > >   >  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*$/;
	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



--
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