Forum Webscript.Ru

Программирование => Perl => Тема начата: Yaroslav от 23 Сентября 2003, 15:12:52

Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 23 Сентября 2003, 15:12:52
Ситуация такова, что есть файл со строками несущими 2 значения (число и текст) например:
8 текст1
45 тект 2
12 Текст1
6 Текст3

Надо что б при совпадении текста (в данном случае 1 и 3 позиция) записывалось в одну строку при этом ссумировались числа
Подскажите кто чем сможет, не ясно даже с чего начать
:confused:
Название: не ясно даже с чего начать :confused:
Отправлено: ondr от 23 Сентября 2003, 15:25:33
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.

Что то типа: $hash{$TEXT} += $NUMBER;
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 23 Сентября 2003, 16:21:39
Цитировать
ondr:
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.

в поле текст тоже иногда бывают цифры ((
Название: не ясно даже с чего начать :confused:
Отправлено: ondr от 23 Сентября 2003, 16:25:52
Цитировать
Yaroslav:
в поле текст тоже иногда бывают цифры ((


да хоть спецсимволы :) не имеет значения!
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 23 Сентября 2003, 17:36:31
Цитировать
ondr:
да хоть спецсимволы  не имеет значения!

почти понятно (попутно читаю про хеш :)), но я так и не понял, каким же способом мне разделить строку на $TEXT и $NUMBER ?
если split, то по каким значениям? можно ли указать что то типа по первому пробелу после цифр?
Название: не ясно даже с чего начать :confused:
Отправлено: AliMamed от 23 Сентября 2003, 17:58:31
по пробелу split-ом вроде. ага
Название: не ясно даже с чего начать :confused:
Отправлено: ondr от 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;
      }
    }
  }
}

...
...
...
-------------------
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 24 Сентября 2003, 00:36:16
ondr - спасибо
если не трудо обьясните некоторые позиции что они делают:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;

тогда я думаю мне станет понятней что происходит.
Название: не ясно даже с чего начать :confused:
Отправлено: Chs от 24 Сентября 2003, 09:07:55
perldoc perlre
perldoc perlop
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 24 Сентября 2003, 11:25:25
Цитировать
Chs:
perldoc perlre
perldoc perlop

спасибо, вот если бы еще perldoc на русском. вообще хорошо было б.
кстати, от куда ты знаешь какой командой все это вызывать? это где то написано и я пропустил?
Название: не ясно даже с чего начать :confused:
Отправлено: ondr от 24 Сентября 2003, 11:43:03
perldoc perl :D
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 24 Сентября 2003, 19:21:02
неужели так трудно обьяснить (что б остальные учились) что все таки значат строки, а то без внятного примера и читая только анг спецификацию трудно понимается о чем идет речь. плс..:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;
Название: не ясно даже с чего начать :confused:
Отправлено: Yaroslav от 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;         # создать новый ключь-значение
Название: не ясно даже с чего начать :confused:
Отправлено: ondr от 30 Сентября 2003, 10:21:48
Цитировать
if ($string !~ /^\\s+$/) { # если $string с начала и до конца строки содержит одни прбелы


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

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


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


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


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

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


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

Остальное в принципе верно :)
Название: не ясно даже с чего начать :confused:
Отправлено: vladsu от 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