Задача следующая:
Имеем строку произвольной длинны с элементами вида "a:b" где а - индекс, b - индекс сортировки... :
"34:2,56:4,65:3,675:1,69:0"
Задача элементу ($id) изментить индекс сортировки на единицу в зависимоти от условия ($order=up или $order=down);
Моя спешная реализация:
---------------------------------------------------------------------------------#!/usr/bin/perl -w
use strict;
#исходные данные.
my $var="34:2,56:4,65:3,675:1,69:0";
my $id=56;
my $order="down";
#вызов функции order
$var=order($var, $id, $order);
print "$var\\n\\n";
#вывод и сортировка хеш массива
my @arr=split(",", $var);
my $Data;
for (my $NI=0; $NI<=$#arr; $NI++)
{
($Data->[$NI]{\'id\'}, $Data->[$NI]{\'order\'})=split(":", $arr[$NI]);
}
$Data=[ sort {$a->{order}<=>$b->{order}} @$Data ];
my $NI=0;
while ($Data->[$NI])
{
print "id=".$Data->[$NI]{\'id\'}."\\n";
$NI++
}
#конец вывода
sub order #функция сдвига сортировки
{
my ($var, $id, $order)=@_;
#определения максимального элемента
my @arr=split(",", $var);
my @arr_order;
my$i=0;
for my $el(@arr)
{
my ($id, $o)=split(":", $el);
$arr_order[$i]=$o;
$i++
}
@arr_order=sort {$b <=>$a} @arr_order;
my $max_elem=$arr_order[0];
###################################
#непосредственный сдвиг
my $var_1=$var;
$var=~/($id:)([0-9])/g;
my $ord=$2;
my $ord_old=$2;
if ($order eq "up")
{
if ($ord==0) #проверка на ноль
{
return $var;
exit;
}
else
{$ord--}
}
elsif ($order eq "down")
{
if ($ord==$max_elem) #проверка на максимальный элемент
{
return $var;
exit;
}
else
{$ord++}
}
$var_1=~/([0-9]+)(:$ord)/g;
my $id_2=$1;
$var=~s/($id:[0-9]+)/$id:$ord/g;
$var=~s/($id_2:[0-9]+)/$id_2:$ord_old/g;
return $var;
}
---------------------------------------------------------------------------------
есть идеи по уменьшению объема кода?