Как напечатать значения ссылки на массив в PERL? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть определенный массив дней с квадратной скобкой в ​​Perl. Я хочу получить доступ к каждому элементу массива. Пример, аналогичный приведенному ниже коду (это всего лишь фрагмент кода): -

@days = [a,2,3];
foreach(@days){print "$_\n";}
print "\n\n @days";

И вывод ARRAY (0x2032950)

ARRAY (0x2032950)

Мне нужно получить доступ к массиву elementS, но я не могу изменить объявление @days. Следующий код также не работает: -

 @days = [a,2,3];
    use feature qw<say>;    
    foreach(@days){print "$_\n";}
    print "\n\n @days\n";
    print "@$days\n";
    say $_ for $days->@*;

enter image description here

Ответы [ 3 ]

3 голосов
/ 19 марта 2020

Внимание: OP - объявление массива неверно.

Если вы не можете изменить объявление массива (неясно, в чем причина), напечатайте их следующим кодом

use strict;
use warnings;
use feature 'say';

my @days = ['a',2,3];

say for @{$days[0]};

say "Number of elements: " . scalar @{$days[0]};

Правильный код должен быть

use strict;
use warnings;
use feature 'say';

my @days = ('a',2,3);

say for @days;

say "Number of elements: " . scalar @days;

Следующий фрагмент кода демонстрирует, как создается массив, используя эту информацию, легко понять, как получить доступ к сохраненным значениям элементов массива

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my @days = ['a',2,3];

say Dumper(\@days);

Выход

$VAR1 = [
          [
            'a',
            2,
            3
          ]
        ];
2 голосов
/ 19 марта 2020

Я думаю, что у вас случайно есть дополнительный слой в ваших данных.

Когда вы используете квадратные скобки, вы фактически используете конструктор анонимного массива. Это возвращает ссылку на массив, который является скаляром (один элемент). Вы, вероятно, не хотели назначать это массиву, поскольку вы получаете массив из одного элемента, где этот один элемент является ссылкой. В результате получается двухуровневый ха sh:

my @days = [ 'a', 1, 2 ];  # probably wrong

Поскольку ссылка на массив является скаляром, вы, скорее всего, хотите присвоить его скаляру с символом $ (один элемент). вы не используете @, потому что ссылка указывает на массив. Символ больше относится к контейнеру, чем к данным:

my $days = [ 'a', 1, 2 ];

Когда у вас есть ссылка на массив, есть различные способы получить его элементы. Так как это простой скаляр (не один элемент доступа к массиву или ха sh), вы можете использовать префикс @ (многоэлементный символ), чтобы рассматривать его как массив:

my @elements = @$days;

# OR
foreach my $element ( @$days ) {
    say "Element: $element";
    }

Вы можете даже интерполировать это как именованный массив:

say "Elements are @$days";
0 голосов
/ 19 марта 2020

Вот способ напечатать ссылку на массив:

#! /usr/bin/env perl

use warnings;
use strict;
use feature qw<say>;

my $arr_ref = [1,2,3];

say for $arr_ref->@*;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...