Perl - 翻译变量的子程序

时间:2015-02-19 21:29:39

标签: perl subroutine

我写了以下子程序:

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

我在以下背景下一直在调用它:

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

不幸的是,它为每个给出的值返回“N / A”,尽管有很多值的实例应该返回“Positive ...”或“Negative ......”

我不明白我做错了什么让子程序每次都返回“N / A”。

2 个答案:

答案 0 :(得分:6)

有几个错误。 $n不包含您的参数,因为默认变量不是您的参数。你的正则表达式是错的。这样做:

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

在调用你的函数时放下&

但是,你不需要子程序,因为你需要的只是一个三元运算符。

答案 1 :(得分:1)

由于传递到子例程的项目是通过@_传递的,因此子MakeNan中的第一行应该是:

my $n = $_[0];

或者,因为有多种方法可以做到这一点,你也可以在子程序的第一行中将标量引用设为$ hr。

my $hr_ref = \$hr;