Forum Webscript.Ru

Программирование => Perl => Тема начата: DamonLSD от 26 Октября 2005, 10:18:06

Название: Избитая тема - сортировка
Отправлено: DamonLSD от 26 Октября 2005, 10:18:06
Будь здрав, О всезнающий All.
Прошу не пинать ногами и не отсылать на perldoc sort :( ибо задал я поиск по форуму, почитал темы, нашел одну аналогичную http://forums.webscript.ru/showthread.php?threadid=6150&highlight=%F1%EE%F0%F2%E8%F0%EE%E2%EA%E0
но не помогло!
Суть такова: имеется файлик со строками. Строка разделена символом "|" и содержит два поля, например, Имя и цифровое значение:
Name1|123|
Name2|4.04|
NameA|35.5|
...

Необходимо отсортировать содержимое этого файла по второму полю и вывести на экран следующее:
Name1|123|
NameA|35.5|
Name2|4.04|
...

ПОМОГИТЕ пжлста горе-"программеру" :)
и благорности моей :beer: не будет предела!
Название: Избитая тема - сортировка
Отправлено: AnnA от 26 Октября 2005, 12:05:30
затягивайте данные в хэш да и foreach (sort values %hash)
если нужен массив:
@data = sort byID @data;

sub byID  {
 my $aa=(split(/\\|/,$b))[1];
 my $ab=(split(/\\|/,$a))[1];
 return ($ab <=> $aa)
}
если хочется сортировать не цифры, то надо заменить строку
 return ($ab cmp $aa)
Название: Избитая тема - сортировка
Отправлено: DamonLSD от 26 Октября 2005, 13:40:05
AnnA, спасибо! Сейчас обязательно попробую :)
И я нашел решение из темы http://forums.webscript.ru/showthread.php?s=&threadid=11493&highlight=%F1%EE%F0%F2%E8%F0%EE%E2%EA%E0 обошелся вот этим куском кода:
open (FILE, "<$datfile") or die("Can\'t open $file-file ",$!);
my @lines=;
close(FILE);

my $i=0;
@lines=sort{(split /\\|/,$b)[1] <=> (split /\\|/,$a)[1]}@lines;

foreach (@lines)
{
$i++;
my($name1,$name2,$name3)=split(/\\|/, $_);
print "$name1 - $name2 $name3";
}

Результат вышел:
Name1 - 123
NameA - 35.5
Name2 - 4.04
что и нужно было :)

З.Ы. AnnA, пиво то куда высылать? ;)
Название: Избитая тема - сортировка
Отправлено: AnnA от 26 Октября 2005, 14:45:16
DamonLSD пива я не пью, фигуркой дорожу, знаете ли. ;)
мартини или коньяк. ;)
впрочем, насколько я поняла, моя помощь вам и непонадобилась.
с сортировкой-то.
Название: Избитая тема - сортировка
Отправлено: DamonLSD от 26 Октября 2005, 14:51:46
AnnA, спасибо и за твое решение! Все получилось

@data = sort byID @data;

sub byID  {
my $aa=(split(/\\|/,$b))[1];
my $ab=(split(/\\|/,$a))[1];
return ($ab <=> $aa)
}

print @data;

А вот как теперь вывести @data в нужном виде? Например:
Имя - Число
Имя - Число

а то ведь получается:
Имя|Число|
Имя|Число|


З.Ы. ТАК КУДА коньяк ОТПРАВЛЯТЬ? ;)
Название: Избитая тема - сортировка
Отправлено: AnnA от 26 Октября 2005, 15:28:26
слушайте. нутк и забирайте в переменные сплитом данные из @data да и печатаейте как вам угодно.
foreach (@data) {
my($n,$d)  = split(/\\|/);
print "$n - $d\\n
";
}
это ж элементарщина. издеваетесь что ль?
Название: Избитая тема - сортировка
Отправлено: vladsu от 26 Октября 2005, 15:37:36
Почитайте эту тему сортировка (http://forums.webscript.ru/showthread.php?s=&threadid=17409&highlight=sort)
там есть один, очень хороший, линк для самообразования.
Название: Избитая тема - сортировка
Отправлено: DamonLSD от 26 Октября 2005, 15:46:16
AnnA, vladsu, СПАСИБО!