Perl中如何对已预先声明的多个变量进行多重赋值
Perl 批量给预声明变量赋值方法
你在示例里写的列表赋值语法,本身就是Perl原生支持的批量给多个变量赋值的标准写法,不需要调用特殊函数或者用额外语法。你运行后得到空值,问题出在子例程的返回值不符合预期,不是赋值写法本身有错。
可正常运行的验证示例
use strict; use warnings; sub first_assign { return ("a", "b", "c"); } sub second_assign { return ("aa", "bb", "cc"); } my ($a, $b, $c) = first_assign(); # 此时 $a = "a", $b = "b", $c = "c" ($a, $b, $c) = second_assign(); # 此时 $a = "aa", $b = "bb", $c = "cc"
直接运行上面的代码就能得到你预期的赋值结果。
变量被赋值为空的常见原因
- 子例程没有返回预期的3个有效值:Perl子例程如果没有显式写
return语句,会默认返回子例程内最后一条执行语句的运算结果,如果最后执行的语句求值为空、条件判断为假、返回空列表,就会导致赋值为空 - 子例程逻辑分支存在漏洞:比如部分判断分支下没有写返回值,运行时走到了无返回的分支
- 子例程显式返回了
undef或者空列表(),接收赋值的变量自然会被置为未定义或空
额外注意事项
不建议使用
$a、$b作为自定义变量名,这两个是Perl内置sort函数预留的特殊包变量,即使开启strict模式也不会报未声明错误,很容易引发隐蔽的逻辑问题,日常开发建议替换为有实际语义的变量名。
关于列表赋值的几个实用技巧:
- 如果不需要接收某个位置的返回值,可以直接用
undef占位,比如(my $name, undef, my $age) = get_user_info();就会跳过第二个返回值 - 如果子例程返回值的数量少于左侧接收变量的数量,多出来的左侧变量会被赋值为
undef,不会保留之前的旧值,写逻辑时要注意这个特性
内容的提问来源于stack exchange,提问作者melkun
相关产品推荐
相关产品推荐

