Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Perl] Классы, заглядывание в прошлое скаляра


Автор: KasMP 21.5.2010, 15:32
Цитата

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


Знакомлюсь с get_notnumber_count(), tie.
Вариантов два: я справлюсь или любимый винград откликнется smile . Посмотрим, что случится быстрее...

Автор: arto 21.5.2010, 19:38
perldoc perltie

Автор: JackYF 21.5.2010, 22:39
Как-то так. Проверка на числа очень простая, полную писать в лом.

Код

#!/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();



Автор: KasMP 22.5.2010, 01:11
Цитата(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 23.5.2010, 10:09
Все оказалось не так просто smile .
Т.е. все правильно и хорошо, но слишком просто и неинтересно. Нужно обязательно сделать так, чтобы жизнь медом не казалась, чтобы пришлось поизощряться и проявить глубокое знание и понимание Perl-а smile...
  • Во-первых, можно переопределять не три функции, а только одну STORE, если использовать Tie::StdScalar.
    Соответственно, здесь вылазит проблема: у нас-то определен хэш, который легко содержит сколько угодно чего угодно (в нашем это случае просто текущее числовое значение и кол-во присваиваний не числа), а в Tie::StdScalar есть только текущее значение - нужно найти какой-то "внешний" способ сохранять кол-во присваиваний.
  • Во-вторых, мы работаем только со строками и все "строковые" числа легко считаем числовыми значениями. Это вообще убивает все интересное в задачке. Нужно сделать так, что присваивания 
    Код
    $scalar = 1;
     и 
    Код
    $scalar = "1";
     различались: в первом случае присваиваем число, а во втором - не число. Видимо, нам уже внутри STORE нужно уметь определять не столько то, что $value в принципе может быть прочитано как число, сколько то, значение какого типа была присвоено $value. Говорят, есть какой-то набор методов, который при обращении к изначально строке и изначально числу ведет себя по-разному.
  • Ну и, в-третьих, конечно же, бывают вещественные числа, отрицательные числа... Но это в свете второго пункта уже не проблема.

Я не скажу, что я сломала голову над 1-ым и 2-ым пунктами, но я пока ничего не вижу и думать, перечитывать все мне некогда :( .

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

пс. похоже, вы пишете курсовик.

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

Причем тут CPAN? Нужно познать особенности Perl-а, а не исползать дополнительные библиотеки и модули, когда-то кем-то зачем-то созданные.
http://radikal.ru/F/s002.radikal.ru/i199/1005/af/aa55af4c8be0.jpg.html
Цитата(arto @  23.5.2010,  22:39 Найти цитируемый пост)
2. Devel::Peek и ему подобные? либо писать xs.

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

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

P.S.. Извините, на самом деле сдержаться не было сил... Спасибо за желание помочь.

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

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

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

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

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

Автор: KasMP 24.5.2010, 06:49
Цитата(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

Автор: arto 24.5.2010, 07:51
1. зачем вы тогда используете Tie::StdScalar? smile
2. я написал -- подобные, которые имеют доступ к внутренностям структур переменных. иначе вам сложно будет отличить 1 от "1".
3. просто через задницу все делаете.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)