我可以将混合类型的可选参数传递给子例程吗?

时间:2018-09-04 07:25:54

标签: perl hash subroutine

我正在尝试将哈希和变量的可选列表传递给哈希中的子例程,但是它不起作用。您能否更正下面的示例代码以帮助我采用该方法?

我的示例代码如下

#!/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;

3 个答案:

答案 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"
    }
]