Forum Webscript.Ru
Программирование => Perl => Тема начата: Yaroslav от 23 Сентября 2003, 15:12:52
-
Ситуация такова, что есть файл со строками несущими 2 значения (число и текст) например:
8 текст1
45 тект 2
12 Текст1
6 Текст3
…
Надо что б при совпадении текста (в данном случае 1 и 3 позиция) записывалось в одну строку при этом ссумировались числа
Подскажите кто чем сможет, не ясно даже с чего начать
:confused:
-
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.
Что то типа: $hash{$TEXT} += $NUMBER;
-
ondr:
Пройдись по данным и запихай все в хэш, где ключом будет текст, а значением цифра.
в поле текст тоже иногда бывают цифры ((
-
Yaroslav:
в поле текст тоже иногда бывают цифры ((
да хоть спецсимволы :) не имеет значения!
-
ondr:
да хоть спецсимволы не имеет значения!
почти понятно (попутно читаю про хеш :)), но я так и не понял, каким же способом мне разделить строку на $TEXT и $NUMBER ?
если split, то по каким значениям? можно ли указать что то типа по первому пробелу после цифр?
-
по пробелу split-ом вроде. ага
-
-------------------
...
...
...
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;
}
}
}
}
...
...
...
-------------------
-
ondr - спасибо
если не трудо обьясните некоторые позиции что они делают:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;
тогда я думаю мне станет понятней что происходит.
-
perldoc perlre
perldoc perlop
-
Chs:
perldoc perlre
perldoc perlop
спасибо, вот если бы еще perldoc на русском. вообще хорошо было б.
кстати, от куда ты знаешь какой командой все это вызывать? это где то написано и я пропустил?
-
perldoc perl :D
-
неужели так трудно обьяснить (что б остальные учились) что все таки значат строки, а то без внятного примера и читая только анг спецификацию трудно понимается о чем идет речь. плс..:
1. ($string !~ /^\\s+$/)
2. $string =~ s/\\s+$//;
3. my $number = $1;
4. $hash{$text} += $number;
-
вроде немного разобрался (сильная вешь книга) если что то не так понял, обьясните пожалуйста (и посылать на ... 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; # создать новый ключь-значение
-
if ($string !~ /^\\s+$/) { # если $string с начала и до конца строки содержит одни прбелы
Правильно. Тут я ошибся. Грамотнее будет так : if ($string !~ /^\\s*$/). В коде выше уже исправил.
(.*)пусто
что угодно и сколько угодно или вообще ничего
if (defined $text && defined $number) { # если заполнен $text и заполнен $number
если определенны! Тут легко запутаться.
если существует $hash{$text}
Аналогично. Если определен данный элемент массива.
Остальное в принципе верно :)
-
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