Могу ли я передать смешанный тип необязательных аргументов в подпрограмму? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь передать хэш и необязательный список переменных подпрограмме в хэш, но она не работает. Не могли бы вы исправить приведенный ниже пример кода, чтобы помочь мне с подходом?

Мой пример кода выглядит как

#!/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 голосов
/ 04 сентября 2018

Спасибо всем. Вот как мы можем передавать необязательные аргументы подпрограмме в perl с типом mixed

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

Пожалуйста, поправьте меня, если я что-то пропустил.

С уважением, Divesh

0 голосов
/ 12 октября 2018
#!/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"
    }
]
0 голосов
/ 04 сентября 2018

Вы называете свою подпрограмму так:

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 с неверными ключами и значениями.
...