Как я могу получить это регулярное выражение, чтобы захватить только выбранную часть - PullRequest
1 голос
/ 03 апреля 2011

Я пытаюсь получить регулярное выражение в этом цикле,

my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /(.+\.vmsn)/xm;
print "$1\n";
}

для захвата имени файла из этой строки,

./vmfs/volumes/4cbcad5b-b51efa39-c3d8-001517585013/MX01/MX01-Snapshot9.vmsn

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

Я попытался использовать выражение, которое было привязано к концу строки с использованием $, но, похоже, это не имело никакого значения.Я также попытался использовать 2 .+ входов, один перед группой захвата и один внутри группы захвата.Еще раз не повезло, это также показалось мне немного беспорядочным, поэтому я не хочу этого делать, если не должен.

Любая идея, как мне получить только имя файла после последнего / доконец строки?

При необходимости можно добавить еще, я не уверен, что мне нужно было опубликовать, чтобы предоставить достаточно информации.

- Обновление -

С5 минут ковырявшись я как будто разобрался.(какой сюрприз)

Так что теперь я остался с этим, (и это работает)

my $vmsn_file = $snapshots{$snapshot_num}{"filename"};
my @current_vmsn_files = $ssh->capture("find -name $vmsn_file");
foreach my $vmsn (@current_vmsn_files) {
$vmsn =~ /.+\/(\w+\-Snapshot\d+\.vmsn)/xm;
print "$1\n";
}

Есть ли способ сделать это лучше?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2011

Вероятно, лучший способ - использовать модуль ядра File :: Basename .Это сделает ваш код максимально переносимым.

Если вы действительно хотите сделать это с помощью регулярных выражений и у вас есть Unix, тогда вы можете использовать:

1 голос
/ 03 апреля 2011

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

... $ssh->capture("find -name $vmsn_file -printf \"%f\n\" ");

Если нет, самый простой способ - split() ваша строка на "/", а затем получить последний элемент. Не нужно регулярных выражений, которые слишком длинные или сложные.

См. perldoc -f split для получения дополнительной информации об использовании

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