Зачем изобретать велосипед? Используйте модуль File :: Basename :
use File::Basename;
...
$file = basename($path);
Почему $file=$path=~s/.*\///;
не работает?
=~
имеет более высокий приоритет , чем =
Итак
$file = $path =~s/.*\///;
трактуется как:
$file = ($path =~s/.*\///);
, который выполняет замену в $path
и присваивает 1
(если замена происходит) или ''
(если замена не происходит).
То, что вы хотите:
($file = $path) =~s/.*\///;
, который присваивает значение $path
$file
, а затем выполняет замену в $path
.
Но опять же есть много проблем с этим решением:
Это неверно. Имя файла в Unix-системах (не уверенных в Windows) может содержать символ новой строки. Но .
по умолчанию не соответствует символу новой строки. Поэтому вам придется использовать модификатор s
, чтобы .
также соответствовал символу новой строки:
($file = $path) =~s/.*\///s;
Наиболее важно, что он не переносим, поскольку предполагается, что /
- это разделитель пути, который не имеет место на некоторых платформах, таких как Windows (которая использует \
), Mac (которая использует :
). Так что используйте модуль и позвольте ему решать все эти проблемы за вас.