The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
тип данных, !*! sproot, 23-Янв-09, 14:16  [смотреть все]
Привет народ!

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

  • тип данных, !*! 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};
        >}

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




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

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