Использование локальной переменной блока карты Perl - PullRequest
5 голосов
/ 19 мая 2011

Этот код компилирует набор с помощью хеш-ключей уникальных заглушек базовых имен в наборе путей.

%stubs = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)\./ ; $1=>() } @pathlist;

Зачем мне нужны ссылки $f здесь? Я думал, что все будет в порядке с:

%stubs = map { basename; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;

Но у меня нет совпадений. Разрешено ли мне изменять $ _ в блоке карты?



Для тех, кто интересуется, что делает код:

Для каждого $ path (@pathlist) он получает базовое имя, совпадает с первой последовательностью букв и цифр, а затем возвращает первое совпадение скобок в качестве ключа для пустого значения списка. Пример:

/some/dir/foo123.adfjijoijb
/some/dir/foo123.oibhobihe
/some/dir/bar789.popjpoj

возвращает

foo123 => ()
bar789 => ()

После чего я использую ключи карты в качестве набора значений для обработки.

Ответы [ 3 ]

13 голосов
/ 19 мая 2011

basename по умолчанию не действует на $_. Но вы можете сопоставить его с возвращаемым значением вместо использования $ f:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./; $1 => undef } @pathlist;

Обратите внимание, что () в списке не создает элемент, он просто сглаживается; Вы должны предоставить значение, даже если только undef. При $1 => () итерации карты будут чередоваться, создавая ключ и значение для% stubs.

Хорошо всегда проверять, успешно ли выполнено ваше регулярное выражение, прежде чем использовать $ 1:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./ ? ($1 => undef) : () } @pathlist;

хотя, если вы не возражаете, что хеш-значения являются пустой строкой, а не undef, вы можете просто заставить регулярное выражение возвращать нужный список:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)()\./ } @pathlist;
6 голосов
/ 19 мая 2011

В map и grep $ _ является псевдонимом для значений в массиве.Если вы измените их, вы фактически измените значения в массиве.Вероятно, это не то, что вам нужно, и, вероятно, что идет не так, но отладка ключей печати% stubs и @pathlist впоследствии в обоих случаях и дайте нам знать, что там написано.

Также: Базовое имя файла :: Basename делаетнеявно работать на $ _.Это выдает ошибку для меня.

#!/usr/bin/perl
use feature say;
use File::Basename;

@pathlist=("/some/dir/foo123.adfjijoijb","/some/dir/foo123.oibhobihe","/some/dir/bar789.popjpoj");
%stubs1 = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)\./ ; $1=>() } @pathlist;
say join(',',keys %stubs1);
say "---";
say join(',',@pathlist);
say "---";

%stubs = map { $_=basename $_; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;
say join(',',keys %stubs);
say "---";
say join(',',@pathlist);
say "---";

%stubs = map {basename; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;
0 голосов
/ 19 мая 2011

Альтернативная реализация:

my %stubs =
   map { $_ => undef }
   map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./ }
   @pathlist;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...