Каков наилучший способ получить несколько значений из массива Perl? - PullRequest
1 голос
/ 10 сентября 2011

Например,

Сначала я получаю dataRecord в массив, подобный этому,

  my @dataRecord = split(/\n/);

Затем я фильтрую запись данных массива, чтобы получить тестовые строки, подобные этой,

  @dataRecord = grep(/test_names/,@dataRecord);

Далее мне нужно получить имена тестов из тестовой строки, например:

   my ($test1_name,$test2_name,$test3_name)  = getTestName(@dataRecord);

   sub getTestName
   {
       my $str = shift @_;
       # testing the str for data and 
       print str,"\n"; # This test point works in that I see the whole test line.
       $str =~ m{/^test1 (.*), test2 (.*), test3 (.)/};
       print $1, "\n"; # This test point does not work. 
       return ($1,$2,$3);
    }

Есть ли лучший способ для меня выполнить эту задачу?

Ответы [ 2 ]

4 голосов
/ 10 сентября 2011

Вы можете объединять операции в цепочку, одновременно уменьшая необходимый синтаксис. Это имеет то преимущество, что подчеркивает важные части программы, одновременно снижая синтаксический шум.

my @test = map m{/^test1 (.*), test2 (.*), test3 (.)/},
           grep /test_names/,
           split /\n/;

# use $test[0], $test[1], $test[2] here

Если вы пытаетесь отладить проблему, map и grep могут брать блоки, что упрощает вставку кода проверки ошибок:

my @test = map {
               if (my @match = m{/^test1 (.*), test2 (.*), test3 (.)/}) {
                   @match
               } else {
                   die "regex did not match for: $_"
               }
           } # no comma here
           grep /test_names/,
           split /\n/;

Вот несколько разных способов присвоения из массива, которые не имеют прямого отношения к вашему вопросу, но, вероятно, полезны:

my ($zero, $one,  $two) = @array;
my (undef, $one,  $two) = @array;
my (undef, undef, $two) = @array;  # better written `my $two = $array[2];`

my ($one, $two) = @array[1, 2];    # note that 'array' is prefixed with a @
my ($one, $two) = @array[1 .. 2];  # indicating that you are requesting a list
                                   # in turn, the [subscript] sees list context
my @slice = @array[$start .. $stop];  # which lets you select ranges

Чтобы распаковать аргументы в подпрограмму:

my ($first, $second, @rest) = @_;

В методе, который принимает name => value пар:

my ($self, %pairs) = @_;
0 голосов
/ 10 сентября 2011

Вы можете получить список подходящих подвыражений, используя оператор m// в контексте списка, например, присваивая его возвращаемое значение списку переменных (как вы в настоящее время делаете с вызовом подпрограммы). Таким образом, вы можете заменить подпрограмму гораздо более простой конструкцией:

my $str = shift @dataRecord;
my ($test1_name, $test2_name, $test3_name) =
    $str =~ m/^test1 (.*), test2 (.*), test3 (.)/;

Или цикл for, если вы хотите сделать это для каждого элемента массива @dataRecord:

for my $str (@dataRecord) {
    my ($test1_name, $test2_name, $test3_name) =
        $str =~ m/^test1 (.*), test2 (.*), test3 (.)/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...