chr*_*rth 16 arrays perl hashmap
将多个数组,变量,哈希发送到子程序的最佳方法是什么?
简单的形式,工作.
my $msg = &getMsg(1,2,3);
print $msg;
sub getMsg {
my($a, $b, $c) = @_;
}
Run Code Online (Sandbox Code Playgroud)
我对这个版本有困难,并且不确定如何在不使用全局的情况下将数据安全地发送到子例程,这不是我想要做的.
my @array = ('a','b','c');
my $str = "Hello";
my %hash = (
'a' => ['100','nuts'],
'b' => ['200','bolts'],
'c' => ['300','screws'],
);
my $msg = getMsg(@array, $str, %hash);
print $msg;
sub getMsg {
my (@a, $s, %h) = @_;
my $MSG;
foreach my $x (@a) {
$MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]";
}
return $MSG
}
Run Code Online (Sandbox Code Playgroud)
TLP*_*TLP 22
您可以使用参考:
getMsg(\@array, \%hash, $scalar);
sub getMsg {
my ($aref, $href, $foo) = @_;
for my $elem (@$aref) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
请注意您尝试的作业:
my (@a, $s, %h) = @_;
Run Code Online (Sandbox Code Playgroud)
不起作用,因为@a- 作为一个阵列 - 会淹没整个列表,留下$s和%h未初始化.
我更喜欢TLP的答案,但您也可以使用原型:
getMsg(@array, %hash, $scalar);
sub getMsg (\@\%$) {
my ($aref, $href, $foo) = @_;
for my $elem (@$aref) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在参数被展平并加载到参数之前(\@\%$),原型强制子程序调用参数,列表引用,散列引用和标量.在子例程中,您将收到列表引用和哈希引用,而不是数组和哈希.@_
但通常不要使用原型.