Автор Тема: не ясно даже с чего начать :confused:  (Прочитано 5236 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« : 23 Сентября 2003, 15:12:52 »
Ситуация такова, что есть файл со строками несущими 2 значения (число и текст) например:
8 текст1
45 тект 2
12 Текст1
6 Текст3

Надо что б при совпадении текста (в данном случае 1 и 3 позиция) записывалось в одну строку при этом ссумировались числа
Подскажите кто чем сможет, не ясно даже с чего начать
:confused:
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #1 : 23 Сентября 2003, 15:25:33 »
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.

Что то типа: $hash{$TEXT} += $NUMBER;
0 OK, 0:1

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #2 : 23 Сентября 2003, 16:21:39 »
Цитировать
ondr:
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.

в поле текст тоже иногда бывают цифры ((
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #3 : 23 Сентября 2003, 16:25:52 »
Цитировать
Yaroslav:
в поле текст тоже иногда бывают цифры ((


да хоть спецсимволы :) не имеет значения!
0 OK, 0:1

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #4 : 23 Сентября 2003, 17:36:31 »
Цитировать
ondr:
да хоть спецсимволы  не имеет значения!

почти понятно (попутно читаю про хеш :)), но я так и не понял, каким же способом мне разделить строку на $TEXT и $NUMBER ?
если split, то по каким значениям? можно ли указать что то типа по первому пробелу после цифр?
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн AliMamed

  • \\o/ ali akbar \\o/
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2409
  • +2/-0
  • 2
    • Просмотр профиля
    • http://alimamed.pp.ru
не ясно даже с чего начать :confused:
« Ответ #5 : 23 Сентября 2003, 17:58:31 »
по пробелу split-ом вроде. ага
ну, будем исповедоваться?

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #6 : 23 Сентября 2003, 18:16:04 »
-------------------
...
...
...

my %hash;

for my $string () {
  if ($string !~ /^\\s*$/) {

    $string =~ s/^\\s+//;
    $string =~ s/\\s+$//;
    $string =~ /^(\\d+)\\s+(.*?)$/;

    my $number = $1;
    my $text = $2;

    if (defined $text
    && defined $number) {
      if (defined $hash{$text}) {
        $hash{$text} += $number;
      } else {
        $hash{$text} = $number;
      }
    }
  }
}

...
...
...
-------------------
« Последнее редактирование: 24 Сентября 2003, 11:44:43 от ondr »
0 OK, 0:1

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #7 : 24 Сентября 2003, 00:36:16 »
ondr - спасибо
если не трудо обьясните некоторые позиции что они делают:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;

тогда я думаю мне станет понятней что происходит.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
не ясно даже с чего начать :confused:
« Ответ #8 : 24 Сентября 2003, 09:07:55 »
perldoc perlre
perldoc perlop
2B OR NOT 2B = FF

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #9 : 24 Сентября 2003, 11:25:25 »
Цитировать
Chs:
perldoc perlre
perldoc perlop

спасибо, вот если бы еще perldoc на русском. вообще хорошо было б.
кстати, от куда ты знаешь какой командой все это вызывать? это где то написано и я пропустил?
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #10 : 24 Сентября 2003, 11:43:03 »
perldoc perl :D
0 OK, 0:1

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #11 : 24 Сентября 2003, 19:21:02 »
неужели так трудно обьяснить (что б остальные учились) что все таки значат строки, а то без внятного примера и читая только анг спецификацию трудно понимается о чем идет речь. плс..:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #12 : 29 Сентября 2003, 19:26:59 »
вроде немного разобрался (сильная вешь книга) если что то не так понял, обьясните пожалуйста (и посылать на ... perldoc не надо :) )
  if ($string !~ /^\\s+$/) {         # если $string с начала и до конца строки содержит одни прбелы
    $string =~ s/^\\s+//;         # заменить пробелы с начала строки на пусто
    $string =~ s/\\s+$//;         # заменить пробелы в конце строки на пусто
    $string =~ /^(\\d+)\\s+(.*)$/;      # начинается с (цыфра или несколько)пробел или несколько(.*)пусто
    my $number = $1;            # дедуктивным методом понимаю что это берется с (\\d+) - это я еще буду читать
    my $text = $2;            # аналогично только с (.*)
    if (defined $text && defined $number) {   # если заполнен $text и заполнен $number
      if (defined $hash{$text}) {      # если существует $hash{$text}
        $hash{$text} += $number;      # добаить 1 к ключу
      } else {               # иначе
        $hash{$text} = $number;         # создать новый ключь-значение
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
не ясно даже с чего начать :confused:
« Ответ #13 : 30 Сентября 2003, 10:21:48 »
Цитировать
if ($string !~ /^\\s+$/) { # если $string с начала и до конца строки содержит одни прбелы


Правильно. Тут я ошибся. Грамотнее будет так : if ($string !~ /^\\s*$/). В коде выше уже исправил.

Цитировать
(.*)пусто


что угодно и сколько угодно или вообще ничего


Цитировать
if (defined $text && defined $number) { # если заполнен $text и заполнен $number


если определенны! Тут легко запутаться.

Цитировать
если существует $hash{$text}


Аналогично. Если определен данный элемент массива.

Остальное в принципе верно :)
0 OK, 0:1

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
не ясно даже с чего начать :confused:
« Ответ #14 : 30 Сентября 2003, 12:33:11 »
Цитировать
Yaroslav:
if ($string !~ /^\\s*$/) { # если $string с начала и до конца строки содержит одни прбелы

Не верно! Правильно будет: Условие примет значение истина, если $string не содержит ничего или никаких других символов кроме пробельных. К пробельным символам относятся: пробел, вертикальная и горизонтальная табуляция, символ новой строки, символ прогона страницы и т. д.

Цитировать
Yaroslav:
$string =~ s/^\\s+//; # заменить пробелы с начала строки на пусто

Удалить в $string  все пробельные символы встретевшиеся до первого не пробельного.

Цитировать
Yaroslav:
$string =~ s/\\s+$//; # заменить пробелы в конце строки на пусто

Аналогично предыдущему, только касаемо конца строки.

Цитировать
Yaroslav:
$hash{$text} += $number; # добаить 1 к ключу

Добавить $number к значению хеша %hash с ключем $text

use strict;

my %hash;
my $text = "a";
my $number = 3;

$hash{"a"} = "1";
print %hash,"\\n";
$hash{$text} += $number;
print %hash,"\\n";


Цитировать
Yaroslav:
$hash{$text} = $number; # создать новый ключь-значение

Если же такой ключ существует, то присвоить ему значение из $number
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28