|
Тема
|
Брой прилагания на regexp substitutuion
|
|
Автор | Perl newbie (Нерегистриран) |
Публикувано | 17.02.05 10:01 |
|
Здравейте,
Абсолютен новак съм с Perl, това е първата ми програма. Програмата трябва да работи върху стрингове (които са файлови имена, но това няма значение). Всеки стринг в себе си има 1 или повече точки "." . Програмата трябва да замества всички точки без най-дясната с подчертавки "_" (и след това да променя името на файла с новополученото). Решението, което измислих след ровене по мрежата, е
## begin here
opendir DH, "." or die "Cannot open the current directory!\n";
my $i;
my $num;
my $old;
while ( $old = $_ = readdir(DH) )
{
next if $_ eq "." or $_ eq "..";
$num = tr/[.]/[.]/;
next if $num <= 1;
$num --;
$i = 1;
while ( $i <= $num )
{
s/[.]/_/;
$i ++;
}
rename $old, $_ ;
}
## end here
Това работи, но не ми харесва. Вътрешният цикъл "while ( $i <= $num )" сканира от началото на стринга при всяка итерация, за да замени всяка следваща точка, и така сканира части, които вече са били прегледани. Не че има видимо забавяне, но би трябвало до може да се направи по-добре.
Въпросът ми е дали няма някакъв модификатор за брой изпълнения на субституцията, нещо като (измислям си синтаксис)
s/[.]/_/t{i}
където "t{i}" указва субституцията да се направи точно i пъти.
| |
Тема
|
Re: Брой прилагания на regexp substitutuion
[re: Perl newbie]
|
|
Автор |
sdg (shebang addict) |
Публикувано | 17.02.05 16:21 |
|
my ($filename, $lastmatchstart, $newfilename);
opendir D, "." || die "Cannot open current dir: $!\n";
while ($newfilename = $filename = readdir D) # get the file name
{
next if ($filename eq "." || $filename eq ".."); # bail out if curdir or parentdir
while ($newfilename =~ m/\./g) { $lastmatchstart = $-[0]; } # remember offset of beginning of last match; perldoc perlvar is your friend
$newfilename =~ s/\./_/g; # replace all dots with underscores
$newfilename = substr($newfilename, 0, $lastmatchstart) . "." . substr($newfilename, $lastmatchstart + 1, length($newfilename) - 1); # replace last matched dot with underscore
rename $filename, $newfilename; # rename file
}
closedir D;
RTFM!
--sdg
| |
Тема
|
Re: Брой прилагания на regexp substitutuion
[re: Perl newbie]
|
|
Автор |
zuluz (непознат
) |
Публикувано | 21.02.05 00:20 |
|
Predpolagam, che ednoredoviq script nqma da e tolkova qsen:
#:~
my $dir = 'rename_dir';
my @files = grep { -f }
<$dir/*>,
<$dir/.*>;
map{ $.=$_; s/\.(?=.)/_/g; rename $.,$_ }@files;
#~:
Редактирано от zuluz на 21.02.05 01:54.
| |
Тема
|
Re: Брой прилагания на regexp substitutuion
[re: zuluz]
|
|
Автор |
zuluz () |
Публикувано | 21.02.05 00:35 |
|
Po-gorniq primer e rabotesht pri uslovie, che '.' simvola e posleden.
Tozi raboti v/u vsichki '.', s izkluchenie na poslednata:
#:~
map{ $.=$_; s/\.(?=.[^\.]*\.{1}.[^\.]*)/_/g; rename $.,$_ }@files;
#~:
$.++;$.+=$l,$l=$.-$l,print"$. "for 1..9
| |
|
|
|
|