Perl: Using a conditional with an array

So I'll start of by saying I'm not very familiar with Perl. I have a project that I've been handed at work that requires quite a bit of Perl work. Most of it makes sense but I'm stuck on a very simple issue.

I've simplified my code for example purposes. If I can get this to work I can code the rest of the project no problem, but for some reason I can't seem to get something as simple as the following to work for me:

#!/usr/local/bin/perl
@names = ('Harry','Larry','Moe');
foreach $name (@names){
    if($name == 'Harry'){
        print $name;
    }
}

Any help is greatly appreciated!

Edit: fyi the output of the above is the following:

HarryLarryMoe

Answers


String comparisons in Perl aren't done with == but with eq. Perl is does not consider the integer 13 different than the string '13' until you operate on them. String values that don't represent numbers in any obvious way (e.g. 'Harry') are coerced to a numeric value of zero. Thus, $name=='Harry' will always hold, but $name eq 'Harry' won't.

Take a look at perldoc perlop for more information.

Edited to add: If you had enabled the warnings pragma, then the interpreter would have pointed this out to you. In fact, it's always a good idea to use strict and use warnings in pretty much any Perl code that you write. In particular, this code (executed as a one-liner from the command line via perl -e):

use strict;
use warnings;
my @names=("Harry","Larry","Moe");

foreach my $name(@names)
{
  if($name=="Harry")
  {
    print "$name\n";
  }
}

produces the output

Argument "Harry" isn't numeric in numeric eq (==) at -e line 7.
Argument "Harry" isn't numeric in numeric eq (==) at -e line 7.
Harry
Argument "Larry" isn't numeric in numeric eq (==) at -e line 7.
Larry
Argument "Moe" isn't numeric in numeric eq (==) at -e line 7.
Moe

It is this way because you use numerical comparison but should use string one (eq). $name and Harry evaluate both to 0, so your comparision is in your example always true.


Need Your Help

Assign one row of 2d array to 1d array

c++ arrays

I want to assign one row of 2d array to 1d array this is what i want to do.