Вот мое решение, основанное на том, о чем я думал, когда оставлял комментарий к вашему вопросу:
use strict;
use warnings;
my $str = '/home/users/cheeseconqueso/perl.pl';
my @arr = split('/',$str);
my $newstr = join('/', @arr[0..(@arr-2)], '.', $arr[-1]);
Редактировать: Если вы действительно заинтересованы в использовании регулярных выражений, это самое простое, что я нашел:
$str =~ s|(.*/)(.*)|$1./$2|;
Используется преимущество жадности начального *
в первой группе, чтобы поднять каждого персонажа до последнего /
, а затем сопоставить все остальное во второй группе. Чуть проще читать с разделителями |
, чтобы избежать синдрома наклоняющейся зубочистки.