in reply to Re: creating an array of names
in thread creating an array of names

ok.. that's great. one more small question. to read through that array after. can i do:
$i = 0; where 12 is the size of my array. and i is an index, or is there an al +ternative? while($i != 12){ if($month = $array[i]){ print "yes it's a month\n"; } }
thank you soo much

Replies are listed 'Best First'.
Re: Re: Re: creating an array of names
by tachyon (Chancellor) on Nov 11, 2002 at 18:12 UTC

    If this is what you want to do then you could do any of these:

    for my $i ( 0..11 ) { print "yes it's a month\n" if $month eq $monthnames[$i]; } for my $valid_months ( @monthnames ) { print "yes it's a month\n" if $month eq $valid_months; } print "Yes it's a month\n" if grep { $_ eq $month } @monthnames;

    You would be better to use a hash as a lookup table like this:

    my @months = qw( jan feb mar apr may jun jul aug sep oct nov dec); my %monthnames; # create lookup table $monthnames{$_}++ for @months; print "Yes it's a month!" if exists $monthnames{$month};

    Warning

    In your if($month = $array[i]){ statement you have used = which is the assignment operator when what you really wanted was eq the string equality operator. In perl we have:

    $a = 1; # set $a to 1 $a == 1; # returns a true value if $a is numerically equal to 1 $a eq 'foo' # returns a true value if $a is equal to the string value + 'foo'

    Using = when you mean == or eq can be very confusing. The assignmet will always succeed so the conditional statement is generally also always true so you have a nasty bug that not only fails to work as expected but also modifies your data. You also need to make sure you use eq rather than == when you want a string comparison:

    print "What, a string is numerically == 0?" if 'foo' == 0;
    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

      Using = when you mean == or eq can be very confusing.
      Which is why it is a good idea to put the the constant on left-hand side of a numerical comparison
      0 == $foo; # GOOD 0 = $foo; # BAD __output__ Can't modify constant item in scalar assignment at - line 2, near "$fo +o;" Execution of - aborted due to compilation errors.
      So we get a nice compile-time error if we ever slip up with our numerical comparisons, hurrah!
      HTH

      _________
      broquaint

        Cute, don't know if I could ever get into the habit but cute nonethless.

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

        I also exagerate the visible difference by writing assignment with asymetric spacing and equality with symetric spacing.
        $a= 5; if ($a==$b || $c == $d)

        Although I'm familiar with this practice I really don't care for it much. Admittedly, it's just a personal preference. I don't think it flows as well when reading it though. More importantly, there simply is no substitute for learning to be cautious. This trick works nicely when one of the operands is a constant but not at all when they are both variables.

        -sauoq
        "My two cents aren't worth a dime.";
        
Re: Re: Re: creating an array of names
by insensate (Hermit) on Nov 11, 2002 at 18:12 UTC
    See perldoc -f grep... My guess is that you want to compare the value in $month to a set of pre-defined values in your array.
    my @months=qw(jan feb mar); my $month="jan"; print "Found" if grep{$month eq $_}@months;
Re: Re: Re: creating an array of names
by emilford (Friar) on Nov 11, 2002 at 18:07 UTC
    You could also do:
    foreach $month (@array) { print "$month\n"; }
Re: Re: Re: creating an array of names
by John M. Dlugosz (Monsignor) on Nov 11, 2002 at 19:40 UTC
    print "yes it's a month\n" if grep ($_ eq $month, @array);
    The built-in grep function will return all the matches, and you care if the list is not empty.

    More generally, you could use a foreach loop to look at each element in turn.

    Use eq for string comparisons. = is assignment, == is numeric comparison.

    —John

Re: Re: Re: creating an array of names
by jjdraco (Scribe) on Nov 11, 2002 at 18:13 UTC
    $i = 0; where 12 is the size of my array. and i is an index, or is there an al +ternative? while($i != 12){ if($month = $array[i]){ print "yes it's a month\n"; } }
    Well first I'll assume the $array[i] is a typo. second you don't seem to be reading through the array. $i is set to 0 and thats not 12 of course so you will loop through the while forever and depending on wether $month contains jan, since $i is the first element in the array it will print "yes it's a month\n" again,and again, and again......etc

    you could do it this way though
    foreach my $item ($array) { print "its the month of $month\n" if ($month eq $array[$i]; }
    I'm not sure if you're trying to find out if each element is a month or looking for one particular month. I just assumned you where looking for a particular month

    Update: replaced '=' with correct eq in if statement

    jjdraco
    learning Perl one statement at a time.
Re: Re: Re: creating an array of names
by dingus (Friar) on Nov 12, 2002 at 07:52 UTC
    ok.. that's great. one more small question. to read through that array after. can i do:
    $i = 0; where 12 is the size of my array. and i is an index, or is there an al +ternative? while($i != 12){ if($month = $array[i]){ print "yes it's a month\n"; } }
    Well there's one immediate error here, which is that you actually mean $montheq $array[i] as firstly these are strings and secondly you don't want to assign to $month!!

    However you would do better with code like this:

    for $i (0..$#array) { # just in case they change the number of months +:) next unless ($month eq $array[$i]); # skip if not equal print "Yes its a month\n"; last; # no need to check other months so exit loop }

    Dingus


    Enter any 47-digit prime number to continue.