我正在尝试将哈希和变量的可选列表传递给哈希中的子例程,但是它不起作用。您能否更正下面的示例代码以帮助我采用该方法?
我的示例代码如下
#!/bin/env perl
use warnings;
use strict;
use Data::Dumper;
my %h1 = ( a=> 2, b=>3);
sub sum {
my $var1=shift;
my $var2=shift;
my %hash1=@_;
#my($a,$b)=@_;
my $i=0;
foreach my $val (keys %hash1) {
$i=$i+$hash1{$val};
}
if ( not defined $var2 ) {
return ($i+$var1);
} else {
return ($i+$var1+$var2);
}
}
my $c=sum(3,%h1);
print $c;
答案 0 :(得分:4)
您可以像这样调用子例程:
my $c=sum(3,%h1);
在子例程中,您可以像这样访问参数:
my $var1=shift;
my $var2=shift;
my %hash1=@_;
这里似乎有明显的差异。您正在向子例程传递标量和哈希,但是在子例程内部,您期望的是两个标量和哈希。
因此,如果您删除my $var2 = shift
行,它也许会按预期工作。
目前还不清楚您的子程序应该做什么。如果您要解释这一点,那么我们可能会有所帮助。
更新:您的代码中包含Data::Dumper
。为什么不使用它来尝试了解发生了什么。
print Dumper(\@_), "\n";
my $var1=shift;
my $var2=shift;
my %hash1=@_;
print Dumper($var1, $var2, \%hash1), "\n";
我得到:
$VAR1 = [
3,
'b',
3,
'a',
2
];
Odd number of elements in hash assignment at test line 11.
$VAR1 = 3;
$VAR2 = 'b';
$VAR3 = {
'3' => 'a',
'2' => undef
};
其中显示了一些有趣的事情:
@_
。%hash1
变量具有错误的键和值。答案 1 :(得分:0)
谢谢大家。这就是我们如何将可选参数传递给混合类型的perl中的子例程
#!/bin/env perl
use warnings;
use strict;
use Data::Dumper;
my %h1 = ( a=> 2, b=>3);
sub sum {
my ($hash1,$var1,$var2)=@_;
#my($a,$b)=@_;
my $i=0;
foreach my $val (keys %{$hash1}) {
$i=$i+$hash1->{$val};
}
if (defined $var2 ) {
return ($i+$var1+$var2);
} else {
return ($i+$var1);
}
}
my $c=sum(\%h1,3);
print $c;
如果我错过了什么,请纠正我。
关于, 天真
答案 2 :(得分:0)
#!/usr/bin/perl
use warnings;
use strict;
use JSON;
use feature qw(say);
args_in( 'test', { foo => 'bar' }, ["one", "two", "three"] );
sub args_in {
my $args_aref = parse_args( @_ );
say to_json $args_aref;
}
sub parse_args {
my @ary;
foreach( @_ ) {
my %hash;
if (ref $_) {
$hash{type} = ref $_;
} else {
$hash{type} = 'SCALAR';
}
$hash{value} = $_;
push @ary, \%hash;
}
return \@ary;
}
结果:
[
{
"value": "test",
"type": "SCALAR"
},
{
"value": {
"foo": "bar"
},
"type": "HASH"
},
{
"value": [
"one",
"two",
"three"
],
"type": "ARRAY"
}
]