in reply to terrible code about array matching...

You could simply say:

if(join(',', @car) eq join(',', @cond)) { print "FOUND\n"; } else { print "NOT FOUND\n"; }

Also, instead of saying:

if ($aa=~/^peace$/)

It would be more efficient to say:

if ($aa eq 'peace')

Please clarify what you're try to do if this doesn't help.

Replies are listed 'Best First'.
Re: Re: terrible code about array matching...
by davorg (Chancellor) on Nov 06, 2002 at 10:50 UTC

    That's a bit dangerous isn't it?

    #!/usr/bin/perl use strict; use warnings; my @car = ('a', 'b,c'); my @cond = ('a', 'b', 'c'); if(join(',', @car) eq join(',', @cond)) { print "FOUND\n"; } else { print "NOT FOUND\n"; }

    This indicates that the arrays are the same even tho', clearly, they aren't.

    If you're going to use code like this you have to know what are valid characters in your input arrays and be very careful in choosing your join string.

    --
    <http://www.dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

      That's a bit dangerous isn't it?

      In general yes, it is dangerous and as you suggest it's important to chose a separator that you knew could not occur in the data.

      In the specific case of my suggestion, (which possibly wasn't clear) I was assuming the arrays had been populated by the original posters' code which validated each argument before pushing onto the array. I was merely proposing to replace the loop which compared the arrays.

      The other problem with my code as a general solution is that it doesn't scale well. Once again though, in the context of what the poster was trying to do I think it's reasonable.

Re: Re: terrible code about array matching...
by Discipulus (Canon) on Nov 06, 2002 at 08:51 UTC
    ok maybe i have english level difficulties.. ;)
    thnks for the remark about matching vs eq
    foreach $aa (@ARGV) { if ($aa eq 'peace'){$cond[0]='peace'; push(@numeri,0 )} elsif ($aa eq 'child'){$cond[1]='child'; push(@numeri,1 )} elsif ($aa eq 'free') {$cond[2]='free'; push(@numeri, 2)} elsif ($aa eq 'love') {$cond[3]='love'; push(@numeri, 3)} elsif ($aa eq) {$cond[4]='enjoy'; push(@numeri, 4)} else {print "\n\n$aa wrong argoument!!! I proceed with @cond\n\n"} } #the possible returned arrays from a sub @car=qw(peace child free love enjoy); #1 #or @car=qw(war child -- love enjoy); #2 #or @car=qw(peace song freedom -- xx); #3 ##############here suggestion please################### $bol=1; foreach $num(@numeri) { last if ($bol==undef); if ($car[$num]eq$cond[$num]){$bol=1}else{$bol=undef} } if (defined $bol){print"boleano=$bol FOUND!"} else{print "NOT found!"}
    Example of what I wont:
    you put as INPUT: peace
    ok for the first @car
    wrong for the second
    ok for the third

    you put as INPUT: peace love
    ok for the first occuourence of @car
    wrong for the second and third occourence

    In this way,when I receive 5 times @car, I want print it ONLY if all the option insered in @argv match with the courrent array.
    many thanks
    lor*