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

Julian Field MailScanner at ecs.soton.ac.uk
Tue Mar 10 17:55:24 GMT 2009



On 10/3/09 16:10, 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: 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
>    
Of course I do, well done for spotting the intentional error, just 
making sure you guys are kept on your toes ;-)

Jules

-- 
Julian Field MEng CITP CEng
www.MailScanner.info
Buy the MailScanner book at www.MailScanner.info/store

MailScanner customisation, or any advanced system administration help?
Contact me at Jules at Jules.FM

PGP footprint: EE81 D763 3DB0 0BFD E1DC 7222 11F6 5947 1415 B654
PGP public key: http://www.jules.fm/julesfm.asc


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