Передать хеш и переменную в подпрограмму - PullRequest
0 голосов
/ 29 июля 2011
my %hash;

my $input2 = "message";

#calling subroutine check_something

$self->check_something (%hash, message => $input2);

sub check_something {

my $self            = shift;
my %p               = @_;
my $message         = $p{message};
my %hash            = @_;

# do some action with the %hash and $input2;

}

Я строю хэш (% hash) и у меня есть другая переменная, которую я хочу передать в подпрограмму. Тем не менее, внутри подпрограммы, то, как я делаю "мой% hash = @_", также получает значение $ input2. Что я должен сделать, чтобы избежать этого?

Ответы [ 3 ]

5 голосов
/ 29 июля 2011

@_ это массив, поэтому настройте свои переменные как таковые. Если вы хотите обратиться к отдельным частям, вы можете обратиться как $ _ [0]; Передайте хеш по ссылке:

$self->check_something (\%hash, {message => $input2});
sub check_something {
my ($self, $ref, $message) = @_;

my %p = %{$ref};
# can reference the value of $input2 through $$message{'message'} or casting $message as a hash my %m = %{$message}; $m{'message'};
# do some action with the %hash and $input2;

}
1 голос
/ 30 июля 2011

Perl объединяет аргументы подпрограммы в один список - Perl автоматически выполняет http://en.wikipedia.org/wiki/Apply для всех вызовов непрототипированных подпрограмм.Так, для случая $self->check_something (%hash, message => $input2); %hash сглаживается.

Так что если:

%hash = ( foo => 1, bar => 2 );

Ваш дополнительный вызов:

   $self->check_something( foo => 1, bar => 2, message => $input2 );

Итак,если вы хотите передать свой хэш как отдельную сущность, вам нужно передать ссылку:

   # Reference to hash:
   $self->check_something( \%hash, message => $input2 );

   # To pass an anonymous copy:    
   $self->check_something( {%hash}, message => $input2 );

   # To expand hash into an anonymous array:
   $self->check_something( [%hash], message => $input2 );

В большинстве случаев вам, вероятно, захочется сделать один из первых двух примеров, которые я показал.

Преимущество поведения сглаживания списков состоит в том, что очень просто создавать списки аргументов программно.Например:

my %args = (
    foo => 'default',
    bar => 'default_bar',
    baz => 23,
);

$args{foo} = 'purple' if $thingy eq 'purple people eater';

my %result = get_more_args();
@args{ keys %result } = values %result;

my_amazing_sub_call( %args );
1 голос
/ 29 июля 2011

Либо вы передаете сначала переменную, затем хеш, либо передаете ссылку на хеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...