perl - 关于现有 perl 子程序的三个问题

标签 perl

我正在尝试使用以下perl函数,但我对三点不是很清楚:

sub inittwiddle { 
    my ($m,$n,$aref) = @_; 
    my $i; 
    $$aref[0] = $n+1; 
    for ($i=1; $i != $n-$m+1; $i++) { 
       $$aref[$i] = 0; 
    } 
    while($i != $n+1) { 
       $$aref[$i] = $i+$m-$n; 
       $i++; 
    } 
    $$aref[$n+1] = -2; 
    $$aref[1] = 1 if ( $m == 0 ); 
} 

一、什么是my ($m,$n,$aref) = @_;代表?

二、如何理解$$喜欢的东西$$aref[0] = $n+1;
这个函数被调用为 inittwiddle($M,$N,\@p);\@p 代表什么?

最佳答案

  • @_是传递给函数的参数列表。通过做 my ($m,$n,$aref) = @_;您正在分配 $_[0]$m , $_[1]$n , 和 $_[2]$aref .
  • $aref是保存对数组的引用的标量值。要引用数组中的元素,您可以通过 $aref->[0] 访问它们。 (这是更惯用的),或者通过取消引用数组引用。通过添加 @在前面,您将引用数组(即 @$aref )。然而,你想要数组中的第一个元素,它是一个标量,所以它是通过 $$aref[0] 获得的。 .添加括号( ${$aref}[0] )或使用箭头符号( $aref->[0] )稍微澄清了这一点。
  • \@p是对数组 @p 的引用.由于您的函数将标量作为第三个参数,因此您必须传入标量。 \@p就是这样。当您将数组引用传递给这样的函数时,重要的是要注意对数组的任何更改(例如执行 $$aref[0] = $n+1 )都是对原始数组的更改。如果您想避免这种情况,您可以将数组取消引用为临时数组,可能通过执行 my @tmparr = @$aref;函数内。
  • 关于perl - 关于现有 perl 子程序的三个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219643/

    相关文章:

    perl - 如果 getcwd() 无权访问,为什么要回退到 cwd()?

    regex - Perl 正则表达式 : Modification of a read-only value attempted

    mysql - RT 4.0.3 到 4.4.3 由于 ACL 检查导致性能问题

    multithreading - Perl 多线程程序偶尔崩溃

    perl - 如何从我的 perl 脚本非阻塞地写入 gzip 文件?

    perl - Elasticsearch : use filter and should bool query

    javascript 获取 : can't get POST response data from perl script

    perl - 在 for 循环中声明变量不好?

    perl - 使用 Perl 的 eval 时常见的陷阱是什么?

    linux - 如何检测脚本是否在虚拟机上运行?