我写了以下子程序:
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”。
答案 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;