Как я могу использовать строку для доступа к элементу массива Perl? - PullRequest
3 голосов
/ 20 января 2010

У меня есть этот код Perl:

@str = qw(a1 a2 a3);
my @array;
$s1 = 'a1';
$s2 = 'a2';
$s3 = 'a3';

Теперь, получив s1, s2, s3, получите ссылки на $array[0], $array[1], $array[2] соответственно. Возможен случай переключения. но как получить это в одном или двух утверждениях.

Ответы [ 2 ]

9 голосов
/ 20 января 2010

То, что вы действительно хотите, это хеш, а не массив.

my %hash = (a1 => 'val 1', a2 => 'val 2', a3 => 'val 3');
my $s1 = 'a2'; # you want to read this from a file?
$hash{$s1} = 'new val 2';

Теперь, если вы все еще хотите использовать массив для имен индексов и другой массив для его значений, ну, это ваше дело, но вы используете неправильный инструмент для задания .

use strict;
my @str = qw(a1 a2 a3);
my @array;

sub search_ref {
    my $s = shift;
    my $i = 0;
    foreach (@str) {
        if ($_ eq $s) {
            return \$array[$i];
        }
        $i++;
    }
    return undef;
}

my $ref = search_ref('a2');
$$ref = 'new val 2';
2 голосов
/ 20 января 2010

Ваш вопрос немного неясен, но я думаю, что вы спрашиваете, как найти индекс элемента в массиве.

Вы можете сделать это, используя grep над списком индексов массива:

my ( $idx ) = grep { $str[$_] eq 'a1' } ( 0 .. $#str );

Вы можете добиться того же с немного более приятным синтаксисом, используя модуль List :: MoreUtils .

use List::MoreUtils 'firstidx';
my $idx = firstidx { $_ eq 'a1' } @str;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...