Привет народ!Как узнать тип perl переменной(не ссылки)? Т.е. требуется четко знать какого типа переменная: SCALAR,ARRAY,HASH и т.д. Про perldoc -f ref в курсе. Там требуется ссылка, а значит не подходит. Подозреваю, что это можно получить через таблицу символов и typeglob, но вот что-то не выходит каменный цветок.
>Привет народ!
>
>Как узнать тип perl переменной(не ссылки)? Т.е. требуется четко знать какого типа
>переменная: SCALAR,ARRAY,HASH и т.д. Про perldoc -f ref в курсе. Там
>требуется ссылка, а значит не подходит. Подозреваю, что это можно получить
>через таблицу символов и typeglob, но вот что-то не выходит каменный
>цветок.у переменной в перле вначале есть такой префикс
бакс означает скаляр
собака - массив
процент - хешь.? как можно незнать тип переменной?
лан, хотел закончить поделюсь сокровенным.
чтобы узнать тип, надо получть ссылку на переменную и применить ref :-)
>[оверквотинг удален]
>>требуется ссылка, а значит не подходит. Подозреваю, что это можно получить
>>через таблицу символов и typeglob, но вот что-то не выходит каменный
>>цветок.
>
>у переменной в перле вначале есть такой префикс
>бакс означает скаляр
>собака - массив
>процент - хешь.
>
>? как можно незнать тип переменной?Если тип переменной меняется во время выполнения программы. Но это только один из случаев, можно придумать массу других.
>лан, хотел закончить поделюсь сокровенным.
>
>чтобы узнать тип, надо получть ссылку на переменную и применить ref :-)
>не канает :) когда делается ссылка на переменную, применяется символ указания типа, а значит это не наш случай.
Хорошо. Задам вопрос проще:
#!/usr/bin/perl -w
use strict;my $var = "Я переменная";
продолжи этот тривиальный код и выведи мне тип переменной при условии что ты не знаешь.
>[оверквотинг удален]
>Хорошо. Задам вопрос проще:
>
>#!/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";Так. Еще раз. Тип переменной НЕИЗВЕСТЕН. Ты же, пишешь код под конкретный тип. Могло быть и так:
#!/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"; и посмотри результат.не я вот так сделаю:
print "type: ".ref(\@var)."\n";
>[оверквотинг удален]
>>
>>#!/usr/bin/perl -w
>>use strict;
>>
>>my @var = ("Я переменная");
>>
>>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.
>
>не я вот так сделаю:
>print "type: ".ref(\@var)."\n";Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего сказать, то зачем флудить?
>[оверквотинг удален]
>>>
>>>my @var = ("Я переменная");
>>>
>>>а теперь, подставь свое print "type: ".ref(\$var)."\n"; и посмотри результат.
>>
>>не я вот так сделаю:
>>print "type: ".ref(\@var)."\n";
>
>Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего
>сказать, то зачем флудить?мне сказать нечего?
ты объясни нормально в чем трудность и где она возникает, и действительно ли тебе нужна эта инфа о типе переменной.
из твоих примеров ничего не понятно. я не верю что гдето возникают проблемы.
>[оверквотинг удален]
>>>print "type: ".ref(\@var)."\n";
>>
>>Ты прикалываешься? Я конечно понимаю, пятница и все дела..Но если тебе нечего
>>сказать, то зачем флудить?
>
>мне сказать нечего?
>ты объясни нормально в чем трудность и где она возникает, и действительно
>ли тебе нужна эта инфа о типе переменной.
>из твоих примеров ничего не понятно. я не верю что гдето возникают
>проблемы.А что ненормального в моем вопросе? Я уже и так все подробно расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35 страницы учебника биологии за 6 класс. В чем проблема? Что странного в том, что нужно узнать тип переменной динамически, во время выполнения, когда этот тип НЕ ЧИТАЕТСЯ из кода?
>[оверквотинг удален]
>>ты объясни нормально в чем трудность и где она возникает, и действительно
>>ли тебе нужна эта инфа о типе переменной.
>>из твоих примеров ничего не понятно. я не верю что гдето возникают
>>проблемы.
>
>А что ненормального в моем вопросе? Я уже и так все подробно
>расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35
>страницы учебника биологии за 6 класс. В чем проблема? Что странного
>в том, что нужно узнать тип переменной динамически, во время выполнения,
>когда этот тип НЕ ЧИТАЕТСЯ из кода?ну я таких амеб не видел.
а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из которых непонятно что за тип.
приведите!
>[оверквотинг удален]
>>А что ненормального в моем вопросе? Я уже и так все подробно
>>расписал, что даже амеба поняла бы, и даже инфузория-туфелька с 35
>>страницы учебника биологии за 6 класс. В чем проблема? Что странного
>>в том, что нужно узнать тип переменной динамически, во время выполнения,
>>когда этот тип НЕ ЧИТАЕТСЯ из кода?
>
>ну я таких амеб не видел.
>а на пример бы посмотрел. я таких хитрозаверченных конструкций не видел. из
>которых непонятно что за тип.
> приведите!чувак вообще какойто странный )) зачем в интерпритаторном языке знать тип переменной? ))
в перле по моему все сделано для того чтобы от этого абстрагироваться ))
приведите пример такого кодаРекомендую почитать http://perldoc.perl.org/perldata.html
Основные идеи:
- типов в перле 3 - скаляр, массив и хеш
- тип определяется первым символом в названии
- для каждого типа свой неймспейсвыполните код
===============
$a = 'a';
@a = ('a' => 'b');print $a;
print "\n";
print @a;
print "\n";
===============а ссылка может указывать в любой нейм спейс, поэтому и требуется функция ref
Похоже вы сами не понимаете о чём говорите.
Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь? Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым ref
>Похоже вы сами не понимаете о чём говорите.
>Если ваша искомая переменная динамическая,- то вы к ней как-то же обращаетесь?
>Какой-то указатель видимо? ну так посмотрите что внутри указателя тем-же самым
>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?
>Когда переменная объявлена через 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.
Похоже что можно, только вопрос будет другой, не какого типа такая-то переменная, а есть ли среди скаляров такая-то переменная ?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}};'
>Похоже что можно, только вопрос будет другой, не какого типа такая-то переменная,
>а есть ли среди скаляров такая-то переменная ?
>
>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/perluse Data::Dumper;
use strict;
#программа определяет переменные test находит ее дескриптор среди определенного типа переменных
#и если нашла то печатает ее значение через Dumperpackage 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};
}
>[оверквотинг удален]
> my ($pkg, $name) = @_;
> *N = "\*$pkg\::$name";
> return *N{ARRAY};
>}
>#вернет ссылку на хеш или ундеф
>sub has_hash {
> my ($pkg, $name) = @_;
> *N = "\*$pkg\::$name";
> return *N{HASH};
>}Благодарю всех за участие! Вопрос решен.