Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> еще немного о манипуляции внутри файла, сортировка записи 
V
    Опции темы
tcg2
Дата 21.4.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



Подскажите с примером разобратся:
Код

username2          11-01-2008          11:08:30    66
username1          17-02-2008          17:23:05  1980
username3          20-03-2008          12:07:33    889

, нужно их отсортировать по последней колонке (допустим по убыванию). Я сумеваю извлеч и отсортировать, но только при попытке напечатат вся строка, связана с етой записью в нужном порядке, у меня облом smile
Код:
Код

#!/usr/bin/perl

use IO::File;

$s = 0;
@arr = ();

open(file,"result") || die "$!";

while(<file>) {
    $s++;
    @arr[$s] = $_;
    s/^.*:..//;
    m/\d+/;
    @st[$s] = $_;
}
for ($i=0;$i<@arr;$i++) {
       for ($j=0;$j<$i;$j++) {
        if (@st[$i] < @st[$j]) {
                  next;    } else {
                            $b = $arr[$i];
                            $arr[$i] = $arr[$j];
                            $arr[$j] = $b;
         }

   }
}
print "@arr";
close(file);

...А у меня получается вот такая (....) !
Код

username3          20-03-2008          12:07:33   889 
 username1          17-02-2008          17:23:05  1980 
  username2          11-01-2008          11:08:30    66

PM MAIL ICQ   Вверх
Bulat
Дата 21.4.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: нет
Всего: 57



tcg2, есть такая перловая функция sort(), которую можно переопределить по своему усмотрению. smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
amg
Дата 21.4.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Код

@arr = 
  map {$_->[0]} 
  sort {$b->[1] <=> $a->[1]} 
  map {/(\d+)\s*$/; [$_,$1]} 
<file>;



Это сообщение отредактировал(а) amg - 21.4.2008, 12:54
PM MAIL   Вверх
tcg2
Дата 21.4.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



Код

@arr = sort {$b <=> $a} @arr

Она заменяет строки с моего примера с 17 по 27, только заставить работат на моем примере, не знаю как. Может подскажете?
PM MAIL ICQ   Вверх
ginnie
Дата 21.4.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый tcg2,  amg уже Вам подсказал. В Вашем примере в массиве  @arr хранятся строчки целиком и они не могут использоваться для сортировки. Нужно выделить часть, по которой сортировать - создать массив массивов каждый элемент которого будет содержать исходную строку и значение для сортировки.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tcg2
Дата 21.4.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



ginnie, amg если я все правильно понял, то нужно указаного amg, поместить после 27 строчке моего примера, только при таком расскладе ничего не отображается. Если не сложно можете показать?

Это сообщение отредактировал(а) tcg2 - 21.4.2008, 13:23
PM MAIL ICQ   Вверх
amg
Дата 21.4.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Код

open(file,"result") || die "$!";
@arr = 
  map {$_->[0]} 
  sort {$b->[1] <=> $a->[1]} 
  map {/(\d+)\s*$/; [$_,$1]} 
<file>;
print @arr;
close(file);
Вот и все. Только заменить file на FILE или на $file, чтобы перл не ругался.

Это сообщение отредактировал(а) amg - 21.4.2008, 13:38
PM MAIL   Вверх
tcg2
Дата 21.4.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 26.9.2006

Репутация: нет
Всего: нет



smile
Код

Низкий поклон!!! Все работает! Благодарю!!  

Только, грустновато немножко стало, что не все понимаю, что вы наделали за так мало строк по сравнению с моим больше 30ти
('map'...'\s*$'), но как бы ето не суть. Спасибо!

Это сообщение отредактировал(а) tcg2 - 21.4.2008, 14:03
PM MAIL ICQ   Вверх
amg
Дата 21.4.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(tcg2 @  21.4.2008,  13:46 Найти цитируемый пост)
...не все понимаю, что вы наделали за так мало строк...
Разобраться стоит, т.к. это не какой-то экслюзив, а стандартный способ сортировки строк по полям. Собственно, ginnie уже сказал, что там происходит.

Вот еще вариация на ту же тему: сортируем сначала по последнему полю по убыванию чисел, затем по первому в алфавитном порядке.
Код

@arr = 
  map {$_->[0]} 
  sort { $b->[-1] <=> $a->[-1] or $a->[1] cmp $b->[1]} 
  map {[$_,split]} 
<FILE>;

PM MAIL   Вверх
arto
Дата 21.4.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 1
Всего: 40



sort -nk4 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.