Perl - 翻译变量的子程序

Perl - subroutine to translate variables

我写了下面的子程序:

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;

不幸的是,它 returns "N/A" 对于它给出的每个值,尽管事实上有许多值实例应该 return "Positive..." 或 "Negative..."

我不明白我每次都做子程序return "N/A"做错了什么。

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

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

并在调用您的函数时删除 &

但是,您不需要子例程,因为您只需要一个三元运算符。

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

my $n = $_[0];

或者,由于有不止一种方法,您也可以在子例程的第一行中像这样对 $hr 进行标量引用。

my $hr_ref = $hr;