From mboxrd@z Thu Jan 1 00:00:00 1970 To: devel@linux.iplabs.ru Subject: Re: [devel] Q: perl Message-ID: <20001220023512.B1252@localhost.localdomain> Mail-Followup-To: mookid@sigent.ru, devel@linux.iplabs.ru References: <3A3FD5B2.4020905@logic.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.2i In-Reply-To: <3A3FD5B2.4020905@logic.ru>; from aen@logic.ru on Wed, Dec 20, 2000 at 12:40:02AM +0300 From: mookid@sigent.ru (Mikhail Zabaluev) Sender: devel-admin@linux.iplabs.ru Errors-To: devel-admin@linux.iplabs.ru X-BeenThere: devel@linux.iplabs.ru X-Mailman-Version: 2.0 Precedence: bulk Reply-To: devel@linux.iplabs.ru List-Help: List-Post: List-Subscribe: , List-Id: IPLabs Linux Team Developers mailing list List-Unsubscribe: , List-Archive: X-Original-Date: Wed, 20 Dec 2000 02:35:12 +0300 Date: Wed, 20 Dec 2000 02:35:12 +0300 Archived-At: List-Archive: List-Post: Hello Aleksey, On Wed, Dec 20, 2000 at 00:40 +0300, Aleksey Novodvorsky wrote: > > Господа, я уже почти привык к perl'у, но все же будет лучше, если эту > функицю перепишет кто-нибудь из знатоков. > sub version_compare { > my ($a, $b) = @_; > local $_; > > while ($a || $b) { > my ($sb, $sa) = map { $1 if $a =~ /^\W*\d/ ? s/^\W*0*(\d+)// : > s/^\W*(\D+)// } ($b, $a); > $_ = length($sa) cmp length($sb) || $sa cmp $sb and return $_; > } > } > > Дело в том, что она неверно (точнее -- не так, как хотелось бы) > сравнивает названия полей release в том случае, если там есть ipl. Вот функция по мотивам файла 'dependencies' из документации rpm: sub version_compare { my ($a, $b) = @_; local $_; while ($a || $b) { my ($sa, $sb); if ($a =~ /^[\W_]*\d/ && $b =~ /^[\W_]*\d/) { ($sa, $sb) = map { s/^[\W_]*0*(\d+)//; $1 } ($a, $b); $_ = length($sa) cmp length($sb) || $sa <=> $sb and return $_; } elsif ($a =~ /^[\W_]*(\D|$)/ && $b =~ /^[\W_]*(\D|$)/) { ($sa, $sb) = map { s/^[\W_]*([^\d\W]+|$)//; $1 } ($a, $b); $_ = $sa cmp $sb and return $_; } else { return undef; } } return length($a) cmp length($b) || $a cmp $b; } Возвращает число в случае нормального сравнения и undef в случае, когда численная порция приходится против буквенной (напр. 5mdk и ipl5mdk). -- Stay tuned, MhZ mailto:mookid@sigent.ru ----------- It's reassuring to know that if you behave strangely enough, society will take full responsibility for you. _______________________________________________ Devel mailing list Devel@linux.iplabs.ru http://www.logic.ru/mailman/listinfo/devel