Ссылка на Perl в массиве, почему из-за необходимости создавать новое значение ссылки - PullRequest
0 голосов
/ 26 октября 2019

Я изучаю Perl-скрипт. Я использовал приведенный ниже пример кода, чтобы понять ссылки в perl

#!/usr/bin/perl
use Data::Dumper;

my $example;

sub pushdata{
  my ($ref,$value)=@_;
  print 'Reference of array received in pushdata sub  @{$example} ', $ref,"\n";
  my @pusharray=@$ref;
  print 'Reference of array passed to the push sub @pusharray',\@pusharray,"\n";
  push(@pusharray,$value);
}

print 'Before creating array Reference of $example ', \$example,"\n";
$example->[0]=1;
$example->[1]=1;
$example->[2]=1;
$example->[3]=1;
print 'After creating array Reference of $example ', \$example,"\n";
pushdata(\@{$example},10);
pushdata(\@{$example},10);
pushdata(\@{$example},10);
pushdata(\@{$example},10);
pushdata(\@{$example},10);
print Dumper($example),"\n";

И вывод этого кода

1.Before creating array Reference of $example SCALAR(0x561e878b47f8)
2.After creating array Reference of $example REF(0x561e878b47f8)
3.Reference of array received in pushdata sub  @{$example} ARRAY(0x561e87888470)
4.Reference of array passed to the push sub @pusharrayARRAY(0x561e878b4960)
5.Reference of array received in pushdata sub  @{$example} ARRAY(0x561e87888470)
6.Reference of array passed to the push sub @pusharrayARRAY(0x561e878b4960)
7.Reference of array received in pushdata sub  @{$example} ARRAY(0x561e87888470)
8.Reference of array passed to the push sub @pusharrayARRAY(0x561e878b4960)
9.Reference of array received in pushdata sub  @{$example} ARRAY(0x561e87888470)
10.Reference of array passed to the push sub @pusharrayARRAY(0x561e878b4960)
11.Reference of array received in pushdata sub  @{$example} ARRAY(0x561e87888470)
12.Reference of array passed to the push sub @pusharrayARRAY(0x561e878b4960)
13.$VAR1 = [
          1,
          1,
          1,
          1
        ];

Q1.Здесь outputline1 скалярное значениеSCALAR0x561e878b47f8. После присвоения массива скалярному значению он изменяется со SCALAR на тип Ref outputline2 . Это из-за того, что я сделал операцию над этим скалярным значением и назначенным массивом?

Q2. Если мы увидим outputline3 , я попытался напечатать полученное здесь значение ref. Это не то же самое, что \ \ пример ссылки, почему?

Ответы [ 2 ]

2 голосов
/ 26 октября 2019

Вы получаете другое значение в pushdata, потому что вы печатаете что-то другое. print \$example; печатает ссылку на скаляр $example, а не ссылку на массив, который он содержит. Чтобы напечатать ссылку на массив, как вы делали внутри pushdata, вы должны были использовать print $example;.

(при печати ссылки на скаляр используется REF, если скаляр содержит ссылку, GLOB, если он содержит глобус, и SCALAR в противном случае.)

Хотя вы этого не спрашивали, причина, по которой ваш код не работает, заключается в том, что вы добавляете в @pusharray, а немассив, на который ссылаются $example и $ref. @pusharray = @$ref; копирует содержимое массива.

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

sub pushdata{
   my ($ref, $value) = @_;

   print("\$ref:       $ref\n");
   push(@$ref, $value*2);                    # Adds to @$ref aka @$example

   my @local = @$ref;
   print("\\\@local:    ", \@local, "\n");
   push(@local, $value*3);                   # Adds to @local.
}

my $example = [ 1, 1, 1, 1 ];
print("\$example:   $example\n");
print("\\\@\$example: ", \@$example, "\n");

pushdata($example, 10) for 1..4;
print(Dumper($example));

Вывод:

$example:   ARRAY(0x1ea5e0)
\@$example: ARRAY(0x1ea5e0)
$ref:       ARRAY(0x1ea5e0)
\@local:    ARRAY(0x6d0470)
$ref:       ARRAY(0x1ea5e0)
\@local:    ARRAY(0x6d0470)
$ref:       ARRAY(0x1ea5e0)
\@local:    ARRAY(0x6d0470)
$ref:       ARRAY(0x1ea5e0)
\@local:    ARRAY(0x6d0470)
$VAR1 = [
          1,
          1,
          1,
          1,
          20,
          20,
          20,
          20
        ];
0 голосов
/ 26 октября 2019

Эта строка

my @pusharray=@$ref;

создает копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...