The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"тип данных"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"тип данных"  
Сообщение от sproot (ok) on 23-Янв-09, 14:16 
Привет народ!

Как узнать тип perl переменной(не ссылки)? Т.е. требуется четко знать какого типа переменная: SCALAR,ARRAY,HASH и т.д. Про perldoc -f ref в курсе. Там требуется ссылка, а значит не подходит. Подозреваю, что это можно получить через таблицу символов и typeglob, но вот что-то не выходит каменный цветок.

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "тип данных"  
Сообщение от NuINu (??) on 23-Янв-09, 14:42 
>Привет народ!
>
>Как узнать тип perl переменной(не ссылки)? Т.е. требуется четко знать какого типа
>переменная: SCALAR,ARRAY,HASH и т.д. Про perldoc -f ref в курсе. Там
>требуется ссылка, а значит не подходит. Подозреваю, что это можно получить
>через таблицу символов и typeglob, но вот что-то не выходит каменный
>цветок.

у переменной в перле вначале есть такой префикс
бакс означает скаляр
собака - массив
процент - хешь.

? как можно незнать тип переменной?

лан, хотел закончить поделюсь сокровенным.

чтобы узнать тип, надо получть ссылку на переменную и применить ref :-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "тип данных"  
Сообщение от sproot (ok) on 23-Янв-09, 14:53 
>[оверквотинг удален]
>>требуется ссылка, а значит не подходит. Подозреваю, что это можно получить
>>через таблицу символов и typeglob, но вот что-то не выходит каменный
>>цветок.
>
>у переменной в перле вначале есть такой префикс
>бакс означает скаляр
>собака - массив
>процент - хешь.
>
>? как можно незнать тип переменной?

Если тип переменной меняется во время выполнения программы. Но это только один из случаев, можно придумать массу других.

>лан, хотел закончить поделюсь сокровенным.
>
>чтобы узнать тип, надо получть ссылку на переменную и применить ref :-)
>

не канает :) когда делается ссылка на переменную, применяется символ указания типа, а значит это не наш случай.

Хорошо. Задам вопрос проще:

#!/usr/bin/perl -w
use strict;

my $var = "Я переменная";


продолжи этот тривиальный код и выведи мне тип переменной при условии что ты не знаешь.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "тип данных"  
Сообщение от NuINu (??) on 23-Янв-09, 15:05 
>[оверквотинг удален]
>Хорошо. Задам вопрос проще:
>
>#!/usr/bin/perl -w
>use strict;
>
>my $var = "Я переменная";
>
>
>продолжи этот тривиальный код и выведи мне тип переменной при условии что
>ты не знаешь.

print "type: ".ref(\$var)."\n";

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "тип данных"  
Сообщение от sproot (ok) on 23-Янв-09, 15:11 
>[оверквотинг удален]
>>#!/usr/bin/perl -w
>>use strict;
>>
>>my $var = "Я переменная";
>>
>>
>>продолжи этот тривиальный код и выведи мне тип переменной при условии что
>>ты не знаешь.
>
>print "type: ".ref(\$var)."\n";

Так. Еще раз. Тип переменной НЕИЗВЕСТЕН. Ты же, пишешь код под конкретный тип. Могло быть и так:

#!/usr/bin/perl -w
use strict;

my @var = ("Я переменная");

а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "тип данных"  
Сообщение от NuINu (??) on 23-Янв-09, 15:20 
>[оверквотинг удален]
>
>Так. Еще раз. Тип переменной НЕИЗВЕСТЕН. Ты же, пишешь код под конкретный
>тип. Могло быть и так:
>
>#!/usr/bin/perl -w
>use strict;
>
>my @var = ("Я переменная");
>
>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.

не я вот так сделаю:
print "type: ".ref(\@var)."\n";

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "тип данных"  
Сообщение от sproot (ok) on 23-Янв-09, 15:24 
>[оверквотинг удален]
>>
>>#!/usr/bin/perl -w
>>use strict;
>>
>>my @var = ("Я переменная");
>>
>>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.
>
>не я вот так сделаю:
>print "type: ".ref(\@var)."\n";

Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего сказать, то зачем флудить?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "тип данных"  
Сообщение от NuINu (??) on 23-Янв-09, 15:35 
>[оверквотинг удален]
>>>
>>>my @var = ("Я переменная");
>>>
>>>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.
>>
>>не я вот так сделаю:
>>print "type: ".ref(\@var)."\n";
>
>Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего
>сказать, то зачем флудить?

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "тип данных"  
Сообщение от sproot (ok) on 23-Янв-09, 15:48 
>[оверквотинг удален]
>>>print "type: ".ref(\@var)."\n";
>>
>>Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего
>>сказать, то зачем флудить?
>
>мне сказать нечего?
>ты объясни нормально в чем трудность и где она возникает, и действительно
>ли тебе нужна эта инфа о типе переменной.
>из твоих примеров ничего не понятно. я не верю что гдето возникают
>проблемы.

А что ненормального в моем вопросе? Я уже и так все подробно расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35 страницы учебника биологии за 6 класс. В чем проблема? Что странного в том, что нужно узнать тип переменной динамически, во время выполнения, когда этот тип НЕ ЧИТАЕТСЯ из кода?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "тип данных"  
Сообщение от NuINu (??) on 23-Янв-09, 16:10 
>[оверквотинг удален]
>>ты объясни нормально в чем трудность и где она возникает, и действительно
>>ли тебе нужна эта инфа о типе переменной.
>>из твоих примеров ничего не понятно. я не верю что гдето возникают
>>проблемы.
>
>А что ненормального в моем вопросе? Я уже и так все подробно
>расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35
>страницы учебника биологии за 6 класс. В чем проблема? Что странного
>в том, что нужно узнать тип переменной динамически, во время выполнения,
>когда этот тип НЕ ЧИТАЕТСЯ из кода?

ну я таких амеб не видел.
а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из которых непонятно что за тип.
приведите!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "тип данных"  
Сообщение от Pahanivo email(??) on 24-Янв-09, 13:05 
>[оверквотинг удален]
>>А что ненормального в моем вопросе? Я уже и так все подробно
>>расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35
>>страницы учебника биологии за 6 класс. В чем проблема? Что странного
>>в том, что нужно узнать тип переменной динамически, во время выполнения,
>>когда этот тип НЕ ЧИТАЕТСЯ из кода?
>
>ну я таких амеб не видел.
>а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из
>которых непонятно что за тип.
> приведите!

чувак вообще какойто странный )) зачем в интерпритаторном языке знать тип переменной? ))
в перле по моему все сделано для того чтобы от этого абстрагироваться ))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "тип данных"  
Сообщение от Vladin (ok) on 23-Янв-09, 17:52 
приведите пример такого кода

Рекомендую почитать http://perldoc.perl.org/perldata.html
Основные идеи:
- типов в перле 3 - скаляр, массив и хеш
- тип определяется первым символом в названии
- для каждого типа свой неймспейс

выполните код
===============
$a = 'a';
@a = ('a' => 'b');

print $a;
print "\n";
print @a;
print "\n";
===============

а ссылка может указывать в любой нейм спейс, поэтому и требуется функция ref

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "тип данных"  
Сообщение от adews (ok) on 23-Янв-09, 18:04 
Похоже вы сами не понимаете о чём говорите.
Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь? Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым ref

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "тип данных"  
Сообщение от sproot (ok) on 24-Янв-09, 04:36 
>Похоже вы сами не понимаете о чём говорите.
>Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь?
>Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым
>ref

Сорри, если кого обидел, эт я сгоряча..

Смотрите, так переменную видно:

#!/usr/bin/perl
require Devel::Symdump;

@ARRAY_X = ("Я переменная");

$obj = Devel::Symdump->rnew(@main);

@array = $obj->arrays;

foreach (@array) {
    print "$_\n";
}


/test.pl
DB::args
Carp::EXPORT_FAIL
Carp::ISA
Carp::EXPORT
Carp::EXPORT_OK
main::array
main::ARGV
main::INC
main::ARRAY_X
main::_
main::main


а так нет:

#!/usr/bin/perl
require Devel::Symdump;

my @ARRAY_X = ("Я переменная");

$obj = Devel::Symdump->rnew(@main);

@array = $obj->arrays;

foreach (@array) {
    print "$_\n";
}

./test.pl
DB::args
Carp::EXPORT_FAIL
Carp::ISA
Carp::EXPORT
Carp::EXPORT_OK
main::array
main::ARGV
main::INC
main::_
main::main


Когда переменная объявлена через my, она не прописывается в symbol table?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "тип данных"  
Сообщение от vladin (ok) on 24-Янв-09, 12:23 
>Когда переменная объявлена через my, она не прописывается в symbol table?

Да.
См http://perldoc.perl.org/perlsub.html#Private-Variables-via-my()

Variables declared with my are not part of any package and are therefore never fully qualified with the package name.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "тип данных"  
Сообщение от vladin (ok) on 24-Янв-09, 12:53 
Похоже что можно, только вопрос будет другой, не какого типа такая-то переменная, а есть ли среди скаляров такая-то переменная ?

perl -MData::Dumper -e '@test=('123');$test=321;%test=('abc');$Data::Dumper::Purity = 1;print Dumper %{*{"@main\::"}}' | grep test

perl -e '$test = 123; *N = "\*main\::test"; print ${*N{SCALAR}};'

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

16. "тип данных"  
Сообщение от NuINu (??) on 24-Янв-09, 14:14 
>Похоже что можно, только вопрос будет другой, не какого типа такая-то переменная,
>а есть ли среди скаляров такая-то переменная ?
>
>perl -MData::Dumper -e '@test=('123');$test=321;%test=('abc');$Data::Dumper::Purity = 1;print Dumper %{*{"@main\::"}}' | grep test
>
>perl -e '$test = 123; *N = "\*main\::test"; print ${*N{SCALAR}};'

по результатам этого примера я написал небольшой код.
хотя не понимаю для чего это нужно.


#!/usr/bin/perl

use Data::Dumper;
use strict;
#программа определяет переменные test находит ее дескриптор среди определенного типа переменных
#и если нашла то печатает ее значение через Dumper

package p1;
our $test = 123;
our @test = (1, 2, 3, 4, 5 );
our %test = ('a'=>1, 'b'=>2);

package main;

my @names = qw(test test1);
my @pkgs = qw(p1 main);
my ($ref, $scal);

foreach my $p (@pkgs) {
    print "In package '$p':\n";
    foreach my $vname (@names) {
    if($scal = has_scalar($p, $vname)) {
        print "Have var $vname: $scal\n";
    } else {
        print "No find scalar var $vname ".Dumper($scal);
    }
    }
    foreach my $vname (@names) {
    if($ref = has_array($p, $vname)) {
        print "Have var $vname: ".Dumper($ref)."\n";
    } else {
        print "No find array var $vname\n";
    }
    }

    foreach my $vname (@names) {
    if($ref = has_hash($p, $vname)) {
        print "Have var $vname: ".Dumper($ref)."\n";
    } else {
        print "No find hash var $vname\n";
    }
    }

}

#вернет скляр или ундеф
sub has_scalar {
    my ($pkg, $name) = @_;
    *N = "\*$pkg\::$name";
    return ${*N{SCALAR}};
}
#вернет ссылку на массив или ундеф
sub has_array {
    my ($pkg, $name) = @_;
    *N = "\*$pkg\::$name";
    return *N{ARRAY};
}
#вернет ссылку на хеш или ундеф
sub has_hash {
    my ($pkg, $name) = @_;
    *N = "\*$pkg\::$name";
    return *N{HASH};
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "тип данных"  
Сообщение от sproot (ok) on 24-Янв-09, 15:00 
>[оверквотинг удален]
>    my ($pkg, $name) = @_;
>    *N = "\*$pkg\::$name";
>    return *N{ARRAY};
>}
>#вернет ссылку на хеш или ундеф
>sub has_hash {
>    my ($pkg, $name) = @_;
>    *N = "\*$pkg\::$name";
>    return *N{HASH};
>}

Благодарю всех за участие! Вопрос решен.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру