2016-02-24 2 views
2

У меня есть эти 3 строки кода в суб и я пытаюсь записать их вместе только на одной линии .. но я совершенно потерялPerl хэш-массивов, а также ссылки

my %p = @_; 
    my $arr = $p{name}; 
    my @a = @$arr; 

что правильно способ сделать это?

спасибо!

+2

'my% p = @_; my $ arr = $ p {name}; my @a = @ $ arr; ': P – simbabque

+0

Большинство пропустит выполнение' my @a = @ $ arr; 'как ненужную трату времени. – ikegami

ответ

3
my %p = @_; 

@_ предполагается, содержат пары ключ-значение, которые затем используются для построения хэш %p.

my $arr = $p{name}; 

Предполагается, что список аргументов, чтобы содержали что-то вдоль линий name, [1, 2, 3,] так что $p{name} является ссылкой на массив.

my @a = @$arr; 

Dereference, что ссылка на массив, чтобы получить массив @.

Вот вызов, который может работать с этой прелюдии в sub:

func(this => 'that', name => [1, 2, 3]); 

Если вы хотите, чтобы свести всю прелюдию к одной инструкции, вы можете использовать:

my @a = @{ { @_ }->{name} }; 

, как в:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use YAML::XS; 

func(this => 'that', name => [1, 2, 3]); 

sub func { 
    my @a = @{ { @_ }->{name} }; 
    print Dump \@a; 
} 

Выход:

--- 
- 1 
- 2 
- 3

Если массив, на который указывает name велик, и если вы не нужна неполную копию, однако, это может быть лучше просто придерживаться ссылок:

my $aref = { @_ }->{ name }; 
+2

Вправо, превращая его в справочную работу. Я об этом не думал. – simbabque

0

ОК так, что вы делаете это:

  • Назначить список элементов, переданных суб, в хэш.
  • извлечь значение из этого хэша (что, как представляется, ссылка на массив)
  • разыменовать , что в автономный массив.

Теперь я буду иметь, чтобы сделать некоторые предположения относительно того, что вы кладете в :

#!/usr/bin/perl 

use warnings; 
use strict; 

use Data::Dumper; 

sub test { 
    my %p = @_; 
    my $arr = $p{name}; 
    my @a = @$arr; 
    print Dumper \@a; 
} 

my %input = (fish => [ "value", "another value" ], 
       name => [ "more", "less" ],); 

test (%input); 

Так с этим в виду:

sub test { 
    print join "\n", @{{@_}->{name}},"\n"; 
} 

Но на самом деле, я бы предложил то, что вы возможно хотите сделать, это передать в hashref в первую очередь:

#!/usr/bin/perl 

use warnings; 
use strict; 

use Data::Dumper; 

sub test { 
    my ($input_hashref) = @_; 
    print Dumper \@{$input_hashref -> {name}}; 
} 

my %input = (fish => [ "value", "another value" ], 
       name => [ "more", "less" ],); 
test (\%input); 

также:

  • Не используйте имена переменных одной буквы. Это плохой стиль.
  • , который подходит для a и b, поскольку $a и $b предназначены для сортировки. (И использование @a сбивает с толку).
Смежные вопросы