Perl子函数传参异常:数组后标量参数无法被my声明正确接收
Perl子函数接收参数时无法获取末尾标量值问题
异常复现代码
# 前置逻辑生成$index、$bus、$value三个变量,打印验证均正常 # print输出结果: # index=AA[0] # bus=[2:0] # value=110 busbitFill($bus, @array0, $value); sub busbitFill { my($bus, @array, $val) = @_; print "val1: $val\n"; # 始终无法打印出传入的$value值110 }
问题根因
- Perl子函数没有独立的参数类型边界,所有传入参数会被自动展开为扁平的一维列表,存入特殊数组
@_中。调用时写的busbitFill($bus, @array0, $value),实际存入@_的内容是:$bus的标量值、@array0展开后的所有元素、$value的标量值,三个传入参数的原有边界已经消失。 - Perl列表赋值规则中,如果赋值目标列表中间出现数组或哈希类型的变量,该变量会贪婪吞噬剩余所有待赋值的元素,排在它后面的标量变量拿不到任何值,直接为
undef。示例接收写法my($bus, @array, $val) = @_;里,@array会拿走$bus之后@_里的全部内容(包括原本属于@array0的元素和最后的$value值),$val自然拿不到对应值,和前置变量生成逻辑无关。
修复方案
两种方案二选一即可:
方案1:调整参数顺序,数组类参数放列表末尾
所有标量参数放在数组前面传递,接收时也保持对应顺序,末尾的数组只会接收最后剩余的元素,不会影响前面标量的取值:
# 调用处调整顺序,标量在前,数组放最后 busbitFill($bus, $value, @array0); sub busbitFill { my($bus, $val, @array) = @_; print "val1: $val\n"; # 正常输出110 }
方案2:传递数组引用,不展开数组本体
如果要保留原有参数顺序,不要直接传数组本体,改为传数组引用(标量类型),这时候参数不会被展开,不会出现吞后续参数的问题:
# 调用处给数组加\取引用传入 busbitFill($bus, \@array0, $value); sub busbitFill { my($bus, $array_ref, $val) = @_; # 使用数组时解引用即可:取整个数组写@$array_ref,取单个元素写$array_ref->[索引] print "val1: $val\n"; # 正常输出110 }
内容的提问来源于stack exchange,提问作者blueFish
相关产品推荐
相关产品推荐

