Slavatron
Slavatron

Reputation: 2358

Perl - subroutine to translate variables

I wrote the following subroutine:

sub MakeNan {
    my $n = $_;
    if ( $n !~ /^Positive|^Negative/ ) {
            return "N/A";
    }
    else { return "$n"; }
}

I have been calling it in the following context:

open ( FILE, $file);
while (<FILE>) {
    chomp;
    my @a = split("\t", $_);
    my $hr = $a[55];
    $hr = &MakeNan($hr);
    print "$hr\n";
}
close FILE;

Unfortunately, it returns "N/A" for every value it is given despite the fact that there are many instances of values that should return either "Positive..." or "Negative..."

I don't understand what I am doing wrong to make the subroutine return "N/A" each time.

Upvotes: 2

Views: 96

Answers (2)

sebnukem
sebnukem

Reputation: 8323

There are several mistakes. $n doesn't contain your argument because the default variable is not your argument. Your regex is wrong. Do this instead:

sub make_nan {
  my ($n) = @_; # or: my $n = shift;
  return $n =~ /^(Positive|Negative)/ ? $n : 'N/A';
}

And drop the & when calling your function.

But then, you don't need a subroutine since all you need is a ternary operator.

Upvotes: 6

Kenny Grage
Kenny Grage

Reputation: 1124

Since items passed into a subroutine are passed thru @_, your first line in sub MakeNan should be:

my $n = $_[0];

Or, since there is more than one way to do it, you could also make a scalar reference in the first line of the subroutine to $hr like this.

my $hr_ref = \$hr;

Upvotes: 1

Related Questions