псевдонимы типаglob

Хорошо, так что легко создать ссылку на массив ...

my @a;
my $b=\@a;
#can now reference the same list of scalars from either @$b or @a

Но как я могу сделать это наоборот? Например:

my $a=[1..4];
my @b;
#some magic happens here and now @b is an alias for @$a
@b=(6..10);
print "@$a\n";  #should print "6 7 8 9 10"

Я предполагаю, что это произойдет через typeglobs, но это просто ускользнет от меня. Идеи?

Также было бы неплохо сделать то же самое для хэшей, а также массивов.

EDIT: Кажется, это работает, но это немного клочья, поскольку он просто копирует элементы массива anon в «псевдоним», а затем снова указывает на массив:

my @[email protected]$a;
$a=\@b;

Любые лучшие идеи?

1
nl ja de

4 ответы

Два пути:

  1. Glob aliasing

    Perl calls "type glob", or "glob" for short, its symbol table entry data structure. It is possible to set the entries in this data structure to a reference to name that reference.

    *B = $A;      # Sets the array slot of "B", @B.
    say for @B;
    

    Note that one normally asks Perl to forbid the us from using package variables (by using use strict;). You can get around that using

    1. say for $this::package::B;
    2. our @B; say for @B;

  2. Data::Alias

    alias my @B = @$A;
    say for @B;
    
5
добавлено
В основном, что я наткнулся, но вы также добавили больше! +1
добавлено автор mswanberg, источник

Все переменные в perl-программах хранятся в пространствах имен . Существует два типа пространств имен:

  1. Symbol tables. It is a global hash which stores record of global variables.
  2. Lexical scopes. It is anonymous temporary memory which is stored, not a PARTICULAR symbol table but it is attached to a block of your program. They store variables which we can see only in that program block.

Typeglobs используются для определения записи (переменная, массив и т. Д.) Таблиц Symbol, но не лексических прицелы. Итак, когда вы используете эту часть кода:

my @b;
*b = $a;

ты получишь это:

Name "main::b" used only once:

Это говорит нам о том, что запись main :: b не определена нами в таблицах символов, но мы можем сделать это с помощью модификатора « наш ». Поэтому, когда вы пишете так:

our @b;
*b = $a;

Мы можем получить полезный результат для нас, потому что * b хранится в таблицах Symbol, и мы можем использовать оператор * typeglob.

4
добавлено

Кажется, я понял ...

my $a=[1..4];
our @b;
*b=$a;
print "@b\n";
@b=(6..10);
print "@$a\n";

печатает:

1 2 3 4
6 7 8 9 10

«наш» до сих пор немного загадочен для меня ... Наверное, у меня есть кое-какие чтения ...

3
добавлено
Это может быть полезно: stackoverflow.com/questions/4623556/ & hellip;
добавлено автор creaktive, источник

$ a и @a - это не одно и то же. $ a, поскольку вы сначала назначаете его, это ссылка на анонимный массив. Он не имеет ничего общего с @a, который представляет собой массив (а не ссылку).

$ b = \ @a # $ b содержит ссылку на @a, но не на $ a.

$ a, @a,% a - все разные переменные. Итак, если у вас есть

my @a = (1,2,3,4);

И затем вы заявляете

my $ a;

$ a не содержит ссылки на @a;

The variables are held in the symbol table by their type; scalar, hash, array, etc. That way you can have $a, @a, %a, &a ... and the don't conflict with one another.

Дело в том, что

#some magic happens here and now @b is an alias for @$a

не происходит. Он по-прежнему указывает область памяти, в которой хранится @a, отличается от того, где хранится $ a.

0
добавлено
Я боюсь, что вы полностью упустили мой вопрос. Я знаю, что $ a и @a - разные вещи. Не в этом дело. Я знаю, как взять ссылку на массив и сохранить его в скаляре, как в $ b = \ @ a. Мои вопросы заключаются в том, чтобы сделать объявление в обратном порядке ... Я хочу разместить @a поверх той же ячейки памяти, что и @ $ b, чтобы я мог получить доступ к этому массиву в этой ячейке памяти из обоих методов. Очевидно, @a = @ $ b не будет делать это как КОПИРОВАНИЕ элементов массива. \ @ a = $ b тоже не работает ... «Невозможно изменить конструктор ссылок в скалярном присваивании ...», как заявляет ошибка.
добавлено автор mswanberg, источник
FYI, моя «какая-то магия происходит здесь» не является ссылкой на что-то, что делает Perl ... это ссылка на «скажите мне, какие команды/код поставить здесь, чтобы сделать следующее»
добавлено автор mswanberg, источник
Извинения ... кажется совершенно ясным, когда вы смотрите на код и желаемый результат.
добавлено автор mswanberg, источник
ОК. Тогда вам нужно сделать это ясно в своем вопросе. Я не знаю этого, основываясь на том, что вы написали.
добавлено автор jmcneirney, источник
Modern::Perl
Modern::Perl
362 участник(ов)

Пожалуйста, представьтесь при добавлении в группу. Это необходимо во избежание спам-ботов. Ваше первое сообщение не должно быть ссылкой или репостом. Мы всегда рады нестандартным вопросам.

use Perl or die;
use Perl or die;
164 участник(ов)

Группа о языке Perl и обо всём что с ним связано.

pro.perl
pro.perl
22 участник(ов)

Язык программирования Perl