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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что означает данный скрипт, deposits.pl 
V
    Опции темы
igoruk
Дата 28.11.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем 
нашел примеры на перл 

сижу прорабатываю
непонятен следующий скрипт ->

Код

use strict 'vars';
my %total;

while (<>) {
  my ($who, $action, $how_much) = split;
  unless ($how_much =~ /^\d+\.\d\d$/) {
    die "Malformed amount field";
  }

  if ($action eq 'deposit')     { $total{$who} += $how_much }
  elsif ($action eq 'withdraw') { $total{$who} -= $how_much }
  else { die "Bizarre action field `$action'" }
}

for my $customer (sort keys %total) {
  print "$customer:\t$total{$customer}.\n";
}


Раставьте комменты а дальше я сам
Заранее tnx smile 
PM MAIL   Вверх
korob2001
Дата 29.11.2006, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

# Следим за тем, что бы все переменные были явно объявлены
use strict 'vars';

# Объявляем хеш
my %total;

# Читаем входной поток, скорее всего это файлы имена которых были переданы из командной строки
# в виде параметров. Например при вызове скрипта таким образом:
# C:\>perl script.pl file1.txt file2.txt file3.txt
# Эти три файла (file1.txt,file2.txt,file3.txt), будут прочитаны как один файл, в той же 
# последовательности, построчно.
while (<>) {
  # Каждую строку файла разбиваем на три подстроки, по символу пробела. Т.е. строка может выглядеть
  # примерно так:
  # Vasya deposit 1800.99
  # Kolya deposit 1100.00
  # Masha deposit 1110.50
  # Masha withdraw 99.80
  # Kolya withdraw 119.85
  # и т.д. Хотя исходя из логики данного кода, deposit и withdraw прописаны в разных файлах, потому
  # используется ромб <>.
  my ($who, $action, $how_much) = split;
  # Если $how_mutch не число с двумя цифрами после запятой, то умираем и выдаём сообщение. Судя по
  # всему подсчитываются денежные единицы.
  unless ($how_much =~ /^\d+\.\d\d$/) {
    die "Malformed amount field";
  }
  
  # Если $action равно 'deposit' создаём, если не существует, новую пару где ключь это имя, а
  # значение - сумма. Если же этот ключь уже существует, складываем предидущее значение с текущим
  # и сохраняем под тем же ключём, т.е. именем.
  if ($action eq 'deposit')     { $total{$who} += $how_much }
  # Если $action равно 'withdraw' делает тоже самое, что и с 'deposit', только не слогаем, а вычитаем.
  elsif ($action eq 'withdraw') { $total{$who} -= $how_much }
  # В противном случае умираем и выводим сообщение о том, что такое действие не допустимо.
  else { die "Bizarre action field `$action'" }
}

# Сортируем ключи хеша, т.е. имена и в цикле проходим по всему отсортированному списку.
for my $customer (sort keys %total) {
  # На каждой итерации цикла выводим имя пользователя, табуляцию, сумму и символ перевода строки.
  print "$customer:\t$total{$customer}.\n";
}

Для теста, создай в том же каталоге, где расположен этот код 2 файла - deposit.txt и withdraw.txt.
Добавь в файл deposit.txt следующие строки:
Цитата

Vasya deposit 1800.99
Kolya deposit 1100.00
Masha deposit 1110.50

А в файл withdraw.txt эти две строки:
Цитата

Masha withdraw 99.80
Kolya withdraw 119.85

Затем в командной строке перейди в каталог, где находится скрипт. И дай команду:
C:\>perl script.pl deposit.txt withdraw.txt
Предполагается, что код сохранён в файле script.pl и все файлы расположены на диске C:, если у тебя имя файла другое, то разумеется его и нужно указать вместо script.pl.
C:\> - указывать не нужно, это приглашение оболочки в DOS/Windows, в *nix - это может быть @/$.

После выполнения, должен получить, в STDOUT, такой результат:
Цитата

Kolya:    980.15
Masha:    1010.7
Vasya:    1800.99

STDOUT - стандартное устройство вывода, в нашам случае это командная строка / терминал.

Заметь, что вывод немного не соответствует стандартам. Программа требует на ввод числа, с двумя цифрами после запятой, зато на выходе, у Маши, отбросила завершающий 0. Что бы и на выходе результат был с таким же форматом, как и на входе, нужно изменить одну лишь строку кода.
Код

print "$customer:\t$total{$customer}.\n";

замени на:
Код

print "$customer:\t" . sprintf("%.2f",$total{$customer}) . "\$\n";

Теперь вывод будет таким:
Цитата

Kolya:    980.15$
Masha:    1010.70$
Vasya:    1800.99$

Здесь я добавил ещё знак доллара в конец, если он не нужен, удали его.
Ну вот собственно и всё. ;)))))

Это сообщение отредактировал(а) korob2001 - 29.11.2006, 08:05


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
igoruk
Дата 30.11.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 korob2001 

Ну чта тут сказать Большое tnx

Теперя разобрался  smile  smile  smile 


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


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

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


 




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


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

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