Как я могу сопоставить пути подкаталогов с помощью регулярных выражений в Perl? - PullRequest
2 голосов
/ 12 сентября 2010

Я бы хотел сопоставить пути типа /this/is/my/dir/name/anything, но не /this/is/my/dir/name/anything/anything2. Другими словами, я хочу сопоставить все файлы и подкаталоги на первом уровне в `` / this / is / my / dir / name / `, но не что-нибудь на более низких уровнях.

Ответы [ 2 ]

8 голосов
/ 12 сентября 2010

Вы можете использовать функцию dirname из File::Basename:

dirname($path) eq '/this/is/my/dir/name' or warn "No match";

UPD: если вы предпочитаете использовать регулярное выражение:

my $dirname = '/this/is/my/dir/name';
$path =~ m|^$dirname/[^/]+/?$| or warn "No match";
3 голосов
/ 12 сентября 2010

Косые черты представляют проблему для разделителей по умолчанию, вы сталкиваетесь с проблемой наклон зубочистки .К счастью, Perl 5 позволяет вам выбрать свой собственный разделитель, если вы используете общую форму: m//.Учитывая, что вы хотите сопоставить всю строку, а не просто подстроку, вы захотите использовать якоря, которые задают начало строки (^) и конец строки ($) :

if ($dirname =~ m{^/this/is/my/dir/name/anything$}) {
}

Примечание: на якоря ^ и $ влияет модификатор /m (вместо этого они означают начало и конец строки).Если вы собираетесь использовать модификатор /m, вы можете использовать \A (начало строки) и \Z (конец строки или перед новой строкой в ​​конце строки) или \z (конец строки) утверждения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...