in reply to Access elements of $_

$id = 1; # <--- semicolon was missing open(MYFILE,"/var/tmp/mylist.dat") or die "Cant open mylist.dat" while (<MYFILE>) { # <--- wrong file handle fixed chomp; die "Request Id $id already present in file\n" if $_ eq $id; } close MYFILE;

$_, which gets assigned to by <MYFILE> in a while loop, is a scalar.
As such, it can hold a string or a number. The line is not magically split at the comma*. So, $_ just holds the entire line.

The operator eq compares its operands stringwise and returns true if both are equal. Perhaps you want to match?

die "Request Id $id already present in file\n" if /$id/;

The match operator m// is by default bound to $_; to match against something else you need the binding operator =~:

while (my $line = <MYFILE>) { chomp $line; die "Request Id $id already present in file\n" if $line =~ /$id/ +; }

If you really want an array and compare $id against its first element, you have to split the line into an array:

my @array = split /,/, $_; die "Request Id $id already present in file\n" if $array[0] eq $id +;

Note that split by default splits into the array @_ whose first element is $_[0] - but this usage is deprecated.

*) for magical split, look up the -a, -n, -p and -F switches, and the array @F in perlrun.

Replies are listed 'Best First'.
Re^2: Access elements of $_
by Anonymous Monk on Aug 12, 2010 at 14:18 UTC
    I'm a bit puzzled now. I tried your solution and it works fine but so does this
    $id = 1; # <--- semicolon was missing open(MYFILE,"/var/tmp/mylist.dat") or die "Cant open mylist.dat" while (<MYFILE>) { # <--- wrong file handle fixed chomp; split /,/; die "Request Id $id already present in file\n" if $_[0] eq $id; } close MYFILE;
    What is the difference in using an array or doing it as above ? I thought split will split a string into an array of strings anyway. Hence I'm a bit puzzled as to why I explicitly have to use an array as per your example. Is this better programming practice ?
      Hence I'm a bit puzzled as to why I explicitly have to use an array as per your example. Is this better programming practice ?

      Yes, it is - and precisely because you are puzzled :-)

      As I said above, split by default splits into the array @_ whose first element is $_[0] - and it's a deprecated usage because it leads people to be puzzled, and because @_ also is the argument array inside subroutines; so using implicit split inside subs is probably a bad idea.

      Oops just realised you answered that by saying it's deprecated. Apologies I should have seen this earlier