Michael Alipio wrote:
Hi,

Suppose I have this code:

#/usr/local/bin/perl use warnings; use strict; use subs 'verify';

my %where=( Gary => "Dallas", Lucy => "Exeter", Ian => "Reading", Samantha => "Oregon" );

# Then i open a logfile

open FH, '<', $logfile or die "Can't open $logfile!: $!";

# Now, for every line in the logfile, I will retrive a particular
string, let's say a person's name and verify if it exists in my hash
above:

while (<FH>){ (my $person) = $_ =~ /person=(\S+)/; my $personstatus =
verify(\%where,$person);

# And do anything if the personstatus is this and that.


# Now,  on my sub "verify", I would like to know if the person exists
in my hash.

sub verify { my $where = shift @_; my $person = shift @_; my
$personstatus;

if (exists $$where{$person}){

$personstatus =1; }else { $personstatus = 0; }

$personstatus; }

Am I thinking as this is how it should be done when passing hashes to
a subroutine? My program doesn't work and I know it has something to
do with the "my $personstatus" line as well as "if (exists
$$where{$person} line. Can you show me the right way of passing
hashes to subroutines? Thanks.

I also tried declaring %where as 'our' so that I can use "if (exists
%where{$person}" instead of "if(exists $$where{person}) but i still
can't make it work.


Do you know if I am making any sense here?

Thanks

Why pass a reference to the same hash for every line of the <FH>? You have declared the %where hash at the top so it's already available to the sub-routine. Much simpler:

while (<FH>) {
  my ($person) = $_ =~ /person=(\S+)/; # are you sure this works?
  my $personstatus = verify($person);
}

sub verify {
  local $_ = shift; # $_ contains $person from while loop

  return $where{$_} ? 1 : 0;
}


Or even simpler, dispose of verify() and just do:

while (<FH>){
  my ($person) = $_ =~ /person=(\S+)/;
  my $personstatus = $where{$person} ? 1 : 0;
}

The correct way to accept a hashref in a sub-routine is:

sub my_subroutine {
  my $hashref = shift;
  my $something_else = shift;

  # OR:
  my ($hashref, $something_else) = @_;
}
--
ra(dot)jones(at)dpw(dot)clara(dot)co(dot)uk


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to