- тип данных, NuINu, 14:42 , 23-Янв-09 (1)
>Привет народ! > >Как узнать тип perl переменной(не ссылки)? Т.е. требуется четко знать какого типа >переменная: SCALAR,ARRAY,HASH и т.д. Про perldoc -f ref в курсе. Там >требуется ссылка, а значит не подходит. Подозреваю, что это можно получить >через таблицу символов и typeglob, но вот что-то не выходит каменный >цветок. у переменной в перле вначале есть такой префикс бакс означает скаляр собака - массив процент - хешь. ? как можно незнать тип переменной? лан, хотел закончить поделюсь сокровенным. чтобы узнать тип, надо получть ссылку на переменную и применить ref :-)
- тип данных, sproot, 14:53 , 23-Янв-09 (2)
>[оверквотинг удален] >>требуется ссылка, а значит не подходит. Подозреваю, что это можно получить >>через таблицу символов и typeglob, но вот что-то не выходит каменный >>цветок. > >у переменной в перле вначале есть такой префикс >бакс означает скаляр >собака - массив >процент - хешь. > >? как можно незнать тип переменной? Если тип переменной меняется во время выполнения программы. Но это только один из случаев, можно придумать массу других. >лан, хотел закончить поделюсь сокровенным. > >чтобы узнать тип, надо получть ссылку на переменную и применить ref :-) > не канает :) когда делается ссылка на переменную, применяется символ указания типа, а значит это не наш случай. Хорошо. Задам вопрос проще: #!/usr/bin/perl -w use strict; my $var = "Я переменная"; продолжи этот тривиальный код и выведи мне тип переменной при условии что ты не знаешь.
- тип данных, NuINu, 15:05 , 23-Янв-09 (3)
>[оверквотинг удален] >Хорошо. Задам вопрос проще: > >#!/usr/bin/perl -w >use strict; > >my $var = "Я переменная"; > > >продолжи этот тривиальный код и выведи мне тип переменной при условии что >ты не знаешь. print "type: ".ref(\$var)."\n";
- тип данных, sproot, 15:11 , 23-Янв-09 (4)
>[оверквотинг удален] >>#!/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"; и посмотри результат.
- тип данных, NuINu, 15:20 , 23-Янв-09 (5)
>[оверквотинг удален] > >Так. Еще раз. Тип переменной НЕИЗВЕСТЕН. Ты же, пишешь код под конкретный >тип. Могло быть и так: > >#!/usr/bin/perl -w >use strict; > >my @var = ("Я переменная"); > >а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат. не я вот так сделаю: print "type: ".ref(\@var)."\n";
- тип данных, sproot, 15:24 , 23-Янв-09 (6)
>[оверквотинг удален] >> >>#!/usr/bin/perl -w >>use strict; >> >>my @var = ("Я переменная"); >> >>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат. > >не я вот так сделаю: >print "type: ".ref(\@var)."\n"; Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего сказать, то зачем флудить?
- тип данных, NuINu, 15:35 , 23-Янв-09 (7)
>[оверквотинг удален] >>> >>>my @var = ("Я переменная"); >>> >>>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат. >> >>не я вот так сделаю: >>print "type: ".ref(\@var)."\n"; > >Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего >сказать, то зачем флудить? мне сказать нечего? ты объясни нормально в чем трудность и где она возникает, и действительно ли тебе нужна эта инфа о типе переменной. из твоих примеров ничего не понятно. я не верю что гдето возникают проблемы.
- тип данных, sproot, 15:48 , 23-Янв-09 (8)
>[оверквотинг удален] >>>print "type: ".ref(\@var)."\n"; >> >>Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего >>сказать, то зачем флудить? > >мне сказать нечего? >ты объясни нормально в чем трудность и где она возникает, и действительно >ли тебе нужна эта инфа о типе переменной. >из твоих примеров ничего не понятно. я не верю что гдето возникают >проблемы. А что ненормального в моем вопросе? Я уже и так все подробно расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35 страницы учебника биологии за 6 класс. В чем проблема? Что странного в том, что нужно узнать тип переменной динамически, во время выполнения, когда этот тип НЕ ЧИТАЕТСЯ из кода?
- тип данных, NuINu, 16:10 , 23-Янв-09 (9)
>[оверквотинг удален] >>ты объясни нормально в чем трудность и где она возникает, и действительно >>ли тебе нужна эта инфа о типе переменной. >>из твоих примеров ничего не понятно. я не верю что гдето возникают >>проблемы. > >А что ненормального в моем вопросе? Я уже и так все подробно >расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35 >страницы учебника биологии за 6 класс. В чем проблема? Что странного >в том, что нужно узнать тип переменной динамически, во время выполнения, >когда этот тип НЕ ЧИТАЕТСЯ из кода? ну я таких амеб не видел. а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из которых непонятно что за тип. приведите!
- тип данных, Pahanivo, 13:05 , 24-Янв-09 (15)
>[оверквотинг удален] >>А что ненормального в моем вопросе? Я уже и так все подробно >>расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35 >>страницы учебника биологии за 6 класс. В чем проблема? Что странного >>в том, что нужно узнать тип переменной динамически, во время выполнения, >>когда этот тип НЕ ЧИТАЕТСЯ из кода? > >ну я таких амеб не видел. >а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из >которых непонятно что за тип. > приведите! чувак вообще какойто странный )) зачем в интерпритаторном языке знать тип переменной? )) в перле по моему все сделано для того чтобы от этого абстрагироваться ))
- тип данных, Vladin, 17:52 , 23-Янв-09 (10)
приведите пример такого кодаРекомендую почитать http://perldoc.perl.org/perldata.html Основные идеи: - типов в перле 3 - скаляр, массив и хеш - тип определяется первым символом в названии - для каждого типа свой неймспейс выполните код =============== $a = 'a'; @a = ('a' => 'b'); print $a; print "\n"; print @a; print "\n"; =============== а ссылка может указывать в любой нейм спейс, поэтому и требуется функция ref
- тип данных, adews, 18:04 , 23-Янв-09 (11)
Похоже вы сами не понимаете о чём говорите. Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь? Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым ref
- тип данных, sproot, 04:36 , 24-Янв-09 (12)
>Похоже вы сами не понимаете о чём говорите. >Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь? >Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым >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?
- тип данных, vladin, 12:53 , 24-Янв-09 (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}};'
- тип данных, NuINu, 14:14 , 24-Янв-09 (16)
>Похоже что можно, только вопрос будет другой, не какого типа такая-то переменная, >а есть ли среди скаляров такая-то переменная ? > >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}; }
- тип данных, sproot, 15:00 , 24-Янв-09 (17)
>[оверквотинг удален] > my ($pkg, $name) = @_; > *N = "\*$pkg\::$name"; > return *N{ARRAY}; >} >#вернет ссылку на хеш или ундеф >sub has_hash { > my ($pkg, $name) = @_; > *N = "\*$pkg\::$name"; > return *N{HASH}; >} Благодарю всех за участие! Вопрос решен.
|