WedX - журнал о программировании и компьютерных науках

Что означает шестнадцатеричное число в ссылке на массив, хэш и т. д.?

При печати ссылки на массив, хэш и т. д. что это за шестнадцатеричное число в скобках?

perl -e 'print []'

Дает вывод, например: МАССИВ (0x9acb830)

Что такое 0x9acb830? Если я снова напечатаю ту же ссылку, это число изменится.

02.01.2011

  • Когда вы говорите снова напечатать ту же ссылку, вы имеете в виду снова запустить ту же программу? Нет никакой гарантии, что Perl будет выделять одну и ту же память от процесса к процессу. 02.01.2011
  • @Schwern: Я был бы удивлен, если бы это изменилось в «тривиальной» программе, которая не делает ничего, кроме того, что он написал выше. Существует разница между запуском perl -le 'print [ ] for 1..5', где адрес изменяется, и запуском repeat 5 perl -le 'print [ ]', где он нет. Опять же, это тривиальный случай, и ваше утверждение слишком благоразумно, чтобы с ним не согласиться; более крупные программы имеют слишком много возможных путей кода, чтобы гарантировать детерминированные результаты на этом уровне. 02.01.2011
  • @tchrist В OS X повторные запуски дают одно и то же число, но в Debian я получаю разные числа. Этого и следовало ожидать, malloc() — непредсказуемая тварь, наполненная самой черной магией. На самом деле, я удивлен, что он получает один и тот же адрес памяти от запуска до запуска на OSX. Но кто знает, что на самом деле представляет это число в современной операционной системе? 03.01.2011
  • @Schwern, вы также можете видеть рандомизацию макета адресного пространства. Linux имеет реализацию почти для всех программ, OS X использует его только для нескольких библиотек. 03.01.2011

Ответы:


1

Если вы снова напечатаете ту же ссылку, номер должен остаться прежним; число является фактическим адресом заголовка SV для упомянутой вещи.

02.01.2011
  • Если это официальная терминология Perl, то она МНОГОЕ объясняет о Perl ;)))) 02.01.2011
  • Это только для нас, олдскульных типов. Верблюд III заменил его референтом. 02.01.2011
  • Вещь, как определено в собственной документации Perl, — это все, на что указывает ссылка, например объект. Если вы особенно скучный человек, вместо этого вы могли бы назвать это референтом. Промежуточный Perl, второе издание. Я ‹3 Perl теперь даже больше :) 02.01.2011
  • Re SLaks удалил ответ Это адрес памяти объекта, это правильно. Это то же самое число, которое вернет Scalar::Util::refaddr. 02.01.2011
  • @ysth, Slaks: тогда я исправляюсь. Незначительная проверка также подтверждает это: C:\>perl -MScalar::Util=refaddr -E "$test = []; say q!Stringified ref: !, $test; say q!refaddr: !, refaddr($test); say q!manually: !, hex(substr $test, index($test, q!(!) + 1, -1)" 02.01.2011
  • @ysth: Джон и я утверждали, что это довольно сильно для Camel Ⅲ. Мне всегда было неудобно использовать thingy или thingies в официальных обсуждениях, но признайте, что гомофония referents и reference раздражает. В основном thingy в наши дни означает просто что называется; это использование в современных верблюдах. Запуск ˋegrep -i 'thing(y|ies)' perl/pod/*.podˋ приводит к 4 совпадениям в стандартном дистрибутиве src, если быть точным, в perl{58delta,func,guts,obj}.pod. Недавно я снова прибегал к thingy, но теперь забыл, где. 02.01.2011

  • 2

    Это в основном расположение памяти массива. Perl пытается сообщить вам, что вы пытаетесь напечатать ссылку, а не скалярное значение.

    Попробуй это:

    #! /usr/bin/env perl
    use strict;
    use warnings;
    
    my @foo = qw(one two three four five);
    print @foo . "\n";   #Prints the array in a scalar context (five items)
    print \@foo . "\n";
    print $foo[1] . "\n";
    print \$foo[1] . "\n";
    
    5
    two
    SCALAR(0x100804ff0)
    ARRAY(0x10082ae48)
    

    Обратите внимание, что когда я печатаю ссылку, Perl пытается сделать правильно. Вместо того, чтобы пытаться напечатать какое-то странное значение, он сообщает вам, что вы пытаетесь напечатать ссылку на скаляр или массив.

    02.01.2011
    Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]