|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 22 Mar 2002 12:25:30 To : Alexander Kamotsky Subject : Re: упростить getRelativePath -------------------------------------------------------------------------------- Здравствуй, Alexander Kamotsky. AK> Привет, All. AK> Hаписал функцию для создания относительного пути к файлу или каталогу по AK> двум абсолютным... Hо мне кажется, что тут можно как-то красиво AK> соптимизировать. Скорость не критична - интерес чисто академический (учу AK> перл). AK> === Cut === AK> sub getRelativePath AK> # returns relative path from one directory or file to another AK> # params: AK> # $src - source path AK> # $dst - destination path AK> { AK> my ($src, $dst) = @_; AK> my (@srcDirs, @dstDirs, @dstFile, $i1, $i2, $result); AK> @srcDirs = $src =~ m/([^\/]*\/)/g; AK> @dstDirs = $dst =~ m/([^\/]*\/)/g; AK> @dstFile = $dst =~ m/[^\/]+$/g; AK> $i1 = 0; AK> $i2 = 0; AK> $result = ""; AK> for (;;) AK> { AK> $dir1 = ($i1 <= $#srcDirs)? $srcDirs[$i1] : ""; AK> $dir2 = ($i2 <= $#dstDirs)? $dstDirs[$i2] : ""; AK> last if (!($dir1 eq $dir2)); AK> $i1++; AK> $i2++; AK> } AK> $result = $result. ("../" x ($#srcDirs + 1 - $i1)); AK> for (;$i2 <= $#dstDirs; $i2++) AK> { AK> $result = $result.$dstDirs[$i2]; AK> } AK> if ($#dstFile != -1) AK> { AK> $result = $result.$dstFile[0]; AK> } AK> print $result; AK> } AK> $src = "dep120/rus/events/index.htm"; AK> $dst = "dep120/images/e.gif"; AK> print "src: $src\ndst: $dst\n"; AK> getRelativePath ($src, $dst); AK> === Cut === AK> пример работы: AK> src: dep120/rus/events/index.htm AK> dst: dep120/images/e.gif AK> ../../images/e.gif AK> Что мне не нравится: куча массивов, много переменных вообще, отдельная AK> обработка имени файла для добавления его в конец... Как бы я решал такую задачу: sub getRelativePath { my ($src,$dst) = @_; # Откусываем общий префикс while ($src =~ m#^([^/]*/)# && substr($dst,0,length($1)) eq $1) { substr($dst,0,length($1),''); substr($src,0,length($1),''); } # Считаем оставшиеся слеши в $src my $n = ($src =~ tr#/##); # Hа каждый слеш добавляем "../" в начало $dst return ('../' x $n) . $dst; } Последние два оператора разделены для удобокомментируемости. Я бы их в один записал. -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/144541080b49c.html, оценка из 5, голосов 10
|