Как мне извлечь последний элемент списка в Perl?

#perl

#perl

Вопрос:

У меня есть следующее в переменной в Perl.

 my $test = *             file/test/ttt/rrr/aaa/abc.fff.ter.yyy:myfilename.txt
 

Я хочу извлечь

 myfilename.txt
 

Начальный путь с / изменится (может быть много каталогов, которые не являются фиксированными), и мне нужно только последнее имя файла.

Как я могу это сделать?

Я пытался использовать:

 $filename= (split ///, $test)[4] ;
 

Ответ №1:

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

 use File::Basename;
my $filename = basename($test);
 

Другие решения, вероятно, основаны на регулярных выражениях:

Если вы хотите извлечь часть строки, которая находится после двоеточия, как в этой строке, вы могли бы сделать:

 my ($filename) = $test =~ /:(. )/;
 

Или, если вы хотите извлечь базовое имя расширение в конце

 my ($filename) = $test =~ /(w .w )$/;
 

Или split решение на основе

 my $filename = (split /:/, $test)[-1];
 

Ответ №2:

Вы можете вести обратный отсчет от конца списка с отрицательным индексом. Последним элементом списка является -1 предпоследний -2 и так далее:

 $filename= (split ///, $test)[-1];
 

Если у вас есть список в массиве, $#array_name это индекс последнего элемента. Это немного более неуклюже, чем просто использовать -1 :

 my @array = qw( 1 3 7 );
my $last = $array[$#array];
 

Если вам не важен массив, вы можете удалить последний элемент с pop помощью , который возвращает это значение:

 my $last = pop @array
 

Ответ №3:

Добавлен один из методов из приведенных выше ответов:

 $fullpath = $ARGV[0];

my ($filename) = $fullpath=~m/(?:\|/)(?:[^:] ):([^/\] )$/;

print $filename;
 

Приведенный выше код должен работать в Windows или Linux.