Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 упростить getRelativePath   Alexander Kamotsky   21 Mar 2002 00:33:26 
 Re: упростить getRelativePath   Artem Chuprina   22 Mar 2002 12:25:30 
 упростить getRelativePath   Alexander Kamotsky   23 Mar 2002 00:31:59 
 Re: упростить getRelativePath   Artem Chuprina   24 Mar 2002 15:09:58 
Архивное /ru.perl/144541080b49c.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional