Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Perl] Классы, заглядывание в прошлое скаляра, сколько раз ему присваивали не число? 
V
    Опции темы
KasMP
Дата 21.5.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Написать класс для связывания скаляра, позволяющий быстро выдать количество раз, когда скаляру присваивали не числовые значения.


Знакомлюсь с get_notnumber_count(), tie.
Вариантов два: я справлюсь или любимый винград откликнется smile . Посмотрим, что случится быстрее...
PM MAIL   Вверх
arto
Дата 21.5.2010, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perldoc perltie
PM MAIL ICQ   Вверх
JackYF
Дата 21.5.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Как-то так. Проверка на числа очень простая, полную писать в лом.

Код

#!/usr/bin/perl                                                                                

package MyScalar;

use Tie::Scalar;
use base qw(Tie::Scalar);

sub TIESCALAR {
        my ($class) = @_;

        return bless {} => $class;
}

sub STORE {
        my ($self, $value) = @_;

        if ($value !~ m/^\d+$/)
        {
                $self->{'count'} += 1;
        }
        $self->{'value'} = $value;
}

sub FETCH {
        my ($self) = @_;

        return $self->{'value'};
}

sub non_number_assigments {
        my ($self) = @_;

        return $self->{'count'};
}

package main;

my $scalar;
tie $scalar, MyScalar;

my @array = qw(1 2 tumtum 78 qwe89 7 8);
foreach my $v (@array) {
        $scalar = $v;
        print $v, ' ';
}
printf "\nNon-number assignments: %u\n", (tied $scalar)->non_number_assigments();





--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
KasMP
Дата 22.5.2010, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(JackYF @  21.5.2010,  22:39 Найти цитируемый пост)
Проверка на числа 

В смысле проверка? Ты имеешь в виду не целые, отрицательные числа и т.п.? Это лишнее smile .


А с какой целью мы обращаемся к следующему модулю?
Код

use base qw(Tie::Scalar);

По-моему, все и без него хорошо smile ...


И вот тут еще интересный момент:
Код

sub TIESCALAR {
        my ($class) = @_;
        return bless {} => $class;
}

Почему бы не сделать просто "return bless {};"? Чем "return bless {} => $class;" лучше?

Это сообщение отредактировал(а) KasMP - 22.5.2010, 12:59
PM MAIL   Вверх
KasMP
Дата 23.5.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все оказалось не так просто smile .
Т.е. все правильно и хорошо, но слишком просто и неинтересно. Нужно обязательно сделать так, чтобы жизнь медом не казалась, чтобы пришлось поизощряться и проявить глубокое знание и понимание Perl-а smile...
  • Во-первых, можно переопределять не три функции, а только одну STORE, если использовать Tie::StdScalar.
    Соответственно, здесь вылазит проблема: у нас-то определен хэш, который легко содержит сколько угодно чего угодно (в нашем это случае просто текущее числовое значение и кол-во присваиваний не числа), а в Tie::StdScalar есть только текущее значение - нужно найти какой-то "внешний" способ сохранять кол-во присваиваний.
  • Во-вторых, мы работаем только со строками и все "строковые" числа легко считаем числовыми значениями. Это вообще убивает все интересное в задачке. Нужно сделать так, что присваивания 
    Код
    $scalar = 1;
     и 
    Код
    $scalar = "1";
     различались: в первом случае присваиваем число, а во втором - не число. Видимо, нам уже внутри STORE нужно уметь определять не столько то, что $value в принципе может быть прочитано как число, сколько то, значение какого типа была присвоено $value. Говорят, есть какой-то набор методов, который при обращении к изначально строке и изначально числу ведет себя по-разному.
  • Ну и, в-третьих, конечно же, бывают вещественные числа, отрицательные числа... Но это в свете второго пункта уже не проблема.

Я не скажу, что я сломала голову над 1-ым и 2-ым пунктами, но я пока ничего не вижу и думать, перечитывать все мне некогда :( .
PM MAIL   Вверх
arto
Дата 23.5.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1. Tie::StdScalar -- ? на cpan его нет
2. Devel::Peek и ему подобные? либо писать xs.
3. не проблема.

пс. похоже, вы пишете курсовик.
PM MAIL ICQ   Вверх
KasMP
Дата 24.5.2010, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(arto @  23.5.2010,  22:39 Найти цитируемый пост)
1. Tie::StdScalar -- ? на cpan его нет

Причем тут CPAN? Нужно познать особенности Perl-а, а не исползать дополнительные библиотеки и модули, когда-то кем-то зачем-то созданные.
user posted image
Цитата(arto @  23.5.2010,  22:39 Найти цитируемый пост)
2. Devel::Peek и ему подобные? либо писать xs.

Devel::Peek - это вообще какое-то расширение, призванное сделать отладку более удобной. Не надо никуда лезть, все всегда лежит на поверхности!
Цитата(arto @  23.5.2010,  22:39 Найти цитируемый пост)
пс. похоже, вы пишете курсовик. 

 smile  smile 
Да ну? И как же вы догадались (мне на самом деле интересно, какими соображениями вы руководствовались!!)?
Может быть, ваши телепатические способности позволят вам вообще и тему "курсовика" сформулировать, и задачи, и ... . А?

P.S.. Извините, на самом деле сдержаться не было сил... Спасибо за желание помочь.
PM MAIL   Вверх
gcc
Дата 24.5.2010, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



KasMP, ну если это не курсовой, то ваши задачу можно решить без tie

tie редко где применятеся, если вам она не обходима будет или если будет прогармма на ней, то вы сами все увидите где она нужна
а так не понятно зачем она вам... она реально редко где применяется, может в каких-то огромнных программах, но на фремворках ее нету

(хотя еще в виде DBM базы данных в виде хэша)

tied это такое представление в виде удобной структуры данных, т.е. как связывание объектов классов http://www.spravkaweb.ru/perl/class#tie

http://providerz.ru/articles/perl/perl_tie...h_behavior.html
http://www.informit.com/articles/article.aspx?p=27844

Это сообщение отредактировал(а) gcc - 24.5.2010, 06:43
PM WWW ICQ Skype GTalk Jabber   Вверх
KasMP
Дата 24.5.2010, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(gcc @  24.5.2010,  06:35 Найти цитируемый пост)
tie это такое представление в виде удобной структуры данных, т.е. как связывание объектов классов

http://providerz.ru/articles/perl/perl_tie...h_behavior.html
http://www.informit.com/articles/article.aspx?p=27844

Да знаю я, что такое tie smile .

Цитата(gcc @  24.5.2010,  06:35 Найти цитируемый пост)
ну если это не курсовой

Конечно, не курсовой!
Это всего лишь маленькая задачка по маленькому спецкурсу у хорошего хитрого дотошного преподавателя smile . Самое грустное, что Perl мне на самом деле очень даже нравится и манит своей необычностью, но другие-то задачи программирования никуда не исчезли при этом! И вот именно с другими задачи я связываю будущую работу, именно им достается основная часть мыслительных и временных ресурсов. Perl - одно из дел, которым бы я занялась, если бы у меня было бесконечное кол-во часов. Эх smile ...

Цитата(gcc @  24.5.2010,  06:35 Найти цитируемый пост)
то ваши задачу можно решить без tie

А вот это уже очень интересно!!

Цитата(gcc @  24.5.2010,  06:35 Найти цитируемый пост)
а так не понятно зачем она вам... она реально редко где применяется, может в каких-то огромнных программах, но на фремворках их нету

Ну... Когда задачка формулировалась, то я стала спрашивать, как это я должна заглянуть вовнутрь переменной... И этот гениальный дотошный товарищ с изощренным умом вспомнил про tie
PM MAIL   Вверх
arto
Дата 24.5.2010, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1. зачем вы тогда используете Tie::StdScalar? smile
2. я написал -- подобные, которые имеют доступ к внутренностям структур переменных. иначе вам сложно будет отличить 1 от "1".
3. просто через задницу все делаете.
PM MAIL ICQ   Вверх
KasMP
Дата 10.8.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все давно решилось smile . Хочется добавить, что для проверки того, является ли присваиваемое значение числовым, есть намного более элегантный способ:
Код

if ($value ^ $value)
{
    ...
{

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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