Perl子例程中的变量更改

Perl子例程中的变量更改,perl,Perl,我是Perl编程新手,尝试在Perl子例程中传递单个参数并在子例程中修改它。问题是,在子例程中,变量仍然保留其原始值。只有当它返回并退出子例程时,它才会反映其新的/更改的值 @arr1 = qw(166 2 3 4); $a, $b, $c, $d; ($a, $b, $c, $d) = @arr1; $mnop = &oneparam("$a"); print "mnop returned from oneparam is :", $mnop,

我是Perl编程新手,尝试在Perl子例程中传递单个参数并在子例程中修改它。问题是,在子例程中,变量仍然保留其原始值。只有当它返回并退出子例程时,它才会反映其新的/更改的值

    @arr1 = qw(166 2 3 4);
    $a, $b, $c, $d;
    ($a, $b, $c, $d) = @arr1;
    $mnop = &oneparam("$a");
    print "mnop returned from oneparam is :", $mnop, "\n";

    sub oneparam{

         $qrst = shift;
         print "param passed is ", $qrst, "\n";
         $qsrt = 166 + 1;
         print "qrst inside method ", $qrst, "\n";
        return $qsrt;
  }
  print "qsrt outside method, ", $qsrt, "\n";
它给出了以下o/p:

param passed is 166
**qrst inside method 166**
mnop returned from oneparam is :167
qsrt outside method, 167

粗体的行(qrst…166)应该是167。有人能帮我理解为什么是166吗

您没有定义任何变量的范围。您应该使用
my
声明变量以限制其范围

始终使用
严格使用;使用警告。当您忘记声明变量时,它会给出一个错误

use strict;
use warnings;

sub oneparam {
     my $qrst = shift;
     $qsrt = $qrst + 1;
     return $qsrt;
}

for my $n (qw(166 2 3 4)) {
    my $mnop = oneparam($n);
    print "oneparam($a) = $mnop\n";
}

虽然你的答案为找到问题指明了方向,但实际上并没有指出问题所在(打字错误
$qrst
$qsrt
)。@amon,我错过了问题的这一部分。然后再次,
使用strict
会找到那个错误,所以我很好:)@amon非常感谢您指出类型