Это точно то, что я бы ожидать, что она сохранить в данной подстановки. Вы говорите, что ничего не меняете самую длинную строку косых черт и слов. Таким образом, он захватывает все символы до тех пор, пока первый символ, который вы не сделал, указывает и удаляет их.
Это делает то, что вы просите об этом. Я присоединяюсь к другим, говоря, что использую File::Basename
за то, что вы пытаетесь сделать.
Но здесь это самый быстрый способ сделать то же самое:
my $fname = substr($out_fname, rindex($out_fname, '/') + 1);
Здесь, говорит найти последнее появления '/'
в строке, и дать мне текст, начинающийся один за эту позицию. Я не против регулярного выражения, но это простое выражение того, что вы на самом деле хотите сделать. Я должен был делать такие вещи, как это так долго, я написал last_after
суб:
sub last_after {
my ($string, $delim) = @_;
unless (length($string) and my $ln = length($delim)) {
return $string // '';
}
my $ri = rindex($string, $delim);
return $ri == -1 ? $string : substr($string, $ri + $ln);
}
другой альтернативой является привязка в конце строки и соответствие всем, что не является разделителем каталогов (с использованием отрицаемого класса, '[^ ...]'), между разделителем каталогов и концом строки, например '$ out_fname = ~ m {[\/\\] ([^ \/\\] +) $}; my $ filename_only = $ 1; ' – plusplus