Деление имени файла на компоненты

Проблема

Имеется строка, содержащая полное имя файла. Из нее необходимо извлечь компоненты (имя, каталог, расширение (-я)).

Решение

Воспользуйтесь функциями стандартного модуля File::Basename.
use File::Basename;
$base = basename($path);
$dir = dirname($path);
($base, $dir, $ext) = fileparse($path);

Комментарий

Функции деления имени файла присутствуют в стандартном модуле File::Basename. Функции dirname и basename возвращают соответственно каталог и имя файла:
$path = '/usr/lib/libc.a';
$file = basename($path);
$dir = dirname($path);
print "dir is $dir, file is $file\n";
# dir is /usr/lib, file is libc.a
Функция fileparse может использоваться для извлечения расширений. Для этого передайте fileparse полное имя и регулярное выражение для поиска расширения. Шаблон необходим из-за того, что расширения не всегда отделяются точкой. Например, что считать расширением в ".tar.gz" — ".tar", ".gz" или ".tar.gz"? Передавая шаблон, вы определяете, какой из перечисленных вариантов будет возвращен:
$path = '/usr/lib/libc.a';
($name,$dir,$ext) = fileparse($path, '\..*');
print "dir is $dir, name is $name, extension is $ext\n";
# dir is /usr/lib/, name is libc, extension is .a
По умолчанию в работе этих функций используются разделитель, определяемый стандартными правилами вашей операционной системы. Для этого используется переменная $^O; содержащаяся в ней строка идентифицирует текущую систему. Ее значение определяется в момент построения и установки Perl.
Расширение можно получить следующим образом:
sub extension {
  my $path = shift;
  my $ext = (fileparse($path, '\..*'))[2];
  $ext =~ s/^\.//;
  return $ext;
}
Для файла source.c.bak вместо простого "bak" будет возвращено расширение "с.bak". Если вы хотите получить именно "bak", в качестве второго аргумента fileparse используйте '\..*?'.
Если передаваемое полное имя заканчивается разделителем каталогов (например, lib/), fileparse считает, что имя каталога равно "lib/", тогда как dirname считает его равным ".".

См. также




2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: