Нужна помощь в создании простого регулярного выражения в Perl - PullRequest
3 голосов
/ 28 сентября 2011

Я все еще бесполезен, когда дело доходит до создания шаблонов регулярных выражений. Это должно быть действительно легко.

С учетом строки: /home/users/cheeseconqueso/perl.pl

Я хочу поместить строку ./ прямо перед самой последней / в исходной строке, чтобы получить: /home/users/cheeseconqueso/./perl.pl

Заранее спасибо - я уверен, что этот простой пример поможет мне для многих других глупостей, которых здесь быть не должно!

Ответы [ 7 ]

4 голосов
/ 28 сентября 2011

Вот мое решение, основанное на том, о чем я думал, когда оставлял комментарий к вашему вопросу:

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|;

Используется преимущество жадности начального * в первой группе, чтобы поднять каждого персонажа до последнего /, а затем сопоставить все остальное во второй группе. Чуть проще читать с разделителями |, чтобы избежать синдрома наклоняющейся зубочистки.

4 голосов
/ 28 сентября 2011
my $variable = "/home/users/cheeseconqueso/perl.pl";

$variable =~ s/(.*\/)([^\/]+)$/$1\.\/$2/;
3 голосов
/ 29 сентября 2011

это использует File :: Basename, а не regex, вы можете использовать этот модуль cpan, если вам трудно писать regex.

use File::Basename;
$path = '/home/users/cheeseconqueso/perl.pl';
$newpath = dirname($path) . './'.basename($path);
1 голос
/ 28 сентября 2011

На самом деле вам не нужно регулярное выражение, вы можете просто split строка:

my $str='/home/users/cheeseconqueso/perl.pl';

#Array: ('','home','users','cheeseconqueso','perl.pl')
my @arr=split(/\//,$str); 

my $output=join('/',@arr[0..($#arr-2)]); # '/home/users/cheeseconqueso'
$output.='/./' . $arr[$#arr]; #Pops on the '/./' and the last element of @arr.
0 голосов
/ 29 сентября 2011

Regex? Нам не нужно вонючее регулярное выражение.

l-значение substr () на помощь!

#!/usr/bin/perl
use warnings;
use strict;

$_ = "/home/users/cheeseconqueso/perl.pl\n";
substr($_, rindex($_, '/'), 0) = '/.';
print;
0 голосов
/ 28 сентября 2011

Попробуйте это:

my $str = "/home/users/cheeseconqueso/perl.pl";
if($str =~ /^(.*)(\/)(\w+\.\w+)$/) {
    $str = $1.'/.'.$2.$3;
}
0 голосов
/ 28 сентября 2011
s/(.*)\/(.*)/\1.\/\2/

Как отмечает CanSpice, сплит работает и здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...