Я не понимаю этот синтаксис Perl, у кого-нибудь есть идеи? - PullRequest
3 голосов
/ 17 ноября 2011

Я получил эту часть из плагина Perl. Я не понимаю, что это делает. Это массив ассоциативных массивов? Если так, то не следует ли начинать с @? Кто-нибудь может пролить свет на этот вопрос?

my $arguments =
  [ { 'name' => "process_exp",
    'desc' => "{BasePlugin.process_exp}",
    'type' => "regexp",
    'deft' => &get_default_process_exp(),
    'reqd' => "no" },
  { 'name' => "assoc_images",
    'desc' => "{MP4Plugin.assoc_images}",
    'type' => "flag",
    'deft' => "",
    'reqd' => "no" },
  { 'name' => "applet_metadata",
    'desc' => "{MP4Plugin.applet_metadata}",
    'type' => "flag",
    'deft' => "" },
  { 'name' => "metadata_fields",
    'desc' => "{MP4Plugin.metadata_fields}",
    'type' => "string",
    'deft' => "Title,Artist,Genre" },
  { 'name' => "file_rename_method",
    'desc' => "{BasePlugin.file_rename_method}",
    'type' => "enum",
    'deft' => &get_default_file_rename_method(), # by default rename imported files and assoc files using this encoding
    'list' => $BasePlugin::file_rename_method_list,
    'reqd' => "no"
  } ];

Ответы [ 3 ]

6 голосов
/ 17 ноября 2011

Как сказал Бвмат, это ссылка на массив массивов ссылок.Прочитайте

$ man perlref

или

$ man perlreftut     # this is a bit more straightforward

, если вы хотите узнать больше о ссылках.

Кстати, в fiew словах в Perl вы можете сделать:

@array = ( 1, 2 );          # declare an array
$array_reference = \@array; # take the reference to that array
$array_reference->[0] = 2;  # overwrite 1st position of @array

$numbers = [ 3, 4 ];        # this is another valid array ref declaration. Note [ ] instead of ( )

то же самое происходит с хешами.

Кстати, в fiew словах в Perl вы можете сделать:

%hash = ( foo => 1, bar => 2 );
$hash_reference = \%hash; 
$hash_reference->{foo} = 2;

$langs = { perl => 'cool', php => 'ugly' }; # this is another valid hash ref declaration. Note { } instead of ( )

И ... да, вы можете разыменоватьэти ссылки.

%{ $hash_reference }

будет обрабатываться как хэш, поэтому, если вы хотите напечатать ключи $langs выше, вы можете сделать:

print $_, "\n" foreach ( keys %{ $langs } );

Для разыменованияссылка на массив использовать @{ } вместо %{ }.Даже sub может быть разыменовано.

sub foo
{
  print "hello world\n";
}

my %hash = ( call => \&foo );

&{ $hash{call} }; # this allows you to call the sub foo
1 голос
/ 17 ноября 2011

$arguments является ссылкой на массив (ссылка / указатель на массив)

Вы инициализируете массивы с помощью (), а ссылки на массивы - с []

my @array = ( 1, 2, 3 );
my $array_ref = [ 1, 2, 3 ];

Вы можетесоздайте ссылку с помощью \

my $other_array_ref = \@array;

Когда вы используете ссылку на массив, вы можете разыменовать ее при использовании:

for my $element ( @{$array_ref} )

или

print ${$array_ref}[0];

См. man perlref

. Возврат к вашему вопросу: $arguments - это ссылка на массив ссылок на хеш (инициализируется {})

.
0 голосов
/ 17 ноября 2011

Похоже на хеш хеша ссылка.

вам может понадобиться разыменование как

%newhash = %{$arguments}

и распечатайте данные как

print $newhash{'name'}

...