Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 18:54 27.04.24 
Компютри и Интернет
   >> Perl
Всички теми Следваща тема *Кратък преглед

Тема Брой прилагания на 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



Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.