関数に渡されたときに配列の配列を逆参照するにはどうすればよいですか?
私はこのようにやっています:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
実際には、配列に、、、およびの@c
アドレスを含める必要があります。@array1
@array2
@array3
関数に渡されたときに配列の配列を逆参照するにはどうすればよいですか?
私はこのようにやっています:
my @a = {\@array1, \@array2, \@array3};
func(\@a);
func{
@b = @_;
@c = @{@b};
}
実際には、配列に、、、およびの@c
アドレスを含める必要があります。@array1
@array2
@array3
my @a = {\@array1, \@array2, \@array3};
上記は、単一のメンバー->以下を含むハッシュを持つ配列です。
{ ''.\@array1 => \@array2, ''.\@array3 => undef }
ハッシュのキーとして、Perlはへの参照を@array1
文字列に強制するためです。また、Perlでは、最初の要素が割り当てられたスカラーである配列が必要であることが「理解」されているため、スカラーハッシュ参照を配列に割り当てることができます。
次のように、配列の配列を作成します。
my @a = (\@array1, \@array2, \@array3);
そして、あなたの関数では、次のようにそれらを解凍します:
sub func {
my $ref = shift;
foreach my $arr ( @$ref ) {
my @list_of_values = @$arr;
}
}
または、たとえば地図が最も簡単な表現であるなど、そのバリエーションもあります。
my @list_of_entries = map { @$_ } @$ref;
あなたの例で@c
は、アドレスのリストは、適切に構築されたものと単純に同じものです@a
。
あなたは読みたいかもしれません、、perldoc perlreftut
そしてperldoc perlref
あなたperldoc perldsc
は言うことができます:
sub func {
my $arrayref = shift;
for my $aref (@$arrayref) {
print join(", ", @$aref), "\n";
}
}
my @array1 = (1, 2, 3);
my @array2 = (4, 5, 6);
my @array3 = (7, 8, 9);
my @a = \(@array1, @array2, @array3);
func \@a;
またはよりコンパクトに:
sub func {
my $arrayref = shift;
for my $aref (@$arrayref) {
print join(", ", @$aref), "\n";
}
}
func [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
perlreftutのドキュメントをお読みください。
編集:他の人は私が最初に逃した良い点を指摘します。@aの初期化では、おそらく@a = (...)
(参照を含む配列を作成する)または$arrayref = [...]
(配列への参照を作成する)のいずれかを意味し、({...}
ハッシュへの参照を作成する)ではありません。この投稿の残りの部分は、あなたがその@a = (...)
バージョンを持っているふりをします。
1つの引数(への参照@a
)をfunc
に渡すので、@_はその1つの参照を含むリストです。その参照を取得してから、次のようにして参照を解除できます。
sub func {
my $arrayref = shift;
my @c = @{$arrayref};
}
または、1行で次のようになります。
sub func {
my @c = @{shift()};
}
(でバックスラッシュを使用していなかった場合、@ _は3つの参照の配列であるfunc(\@a)
に等しくなります。)@a
次の関数は、配列または配列参照のいずれかを取得し、一意の値の並べ替えられた配列を返すように設計されています。未定義の値は削除され、HASHとGLOBはそのままになります。
#!/usr/bin/perl
use strict; use warnings;
my @one = qw / dog rat / ;
my @two = qw / dog mice / ;
my @tre = ( "And then they said it!", "No!?? ", );
open my $H, '<', $0 or die "unable to open $0 to read";
my $dog; # to show behavior with undefined value
my %hash; $hash{pig}{mouse}=55; # to show that it leaves HASH alone
my $rgx = '(?is)dog'; $rgx = qr/$rgx/; # included for kicks
my @whoo = (
'hey!',
$dog, # undefined
$rgx,
1, 2, 99, 999, 55.5, 3.1415926535,
%hash,
$H,
[ 1, 2,
[ 99, 55, \@tre, ],
3, ],
\@one, \@two,
[ 'fee', 'fie,' ,
[ 'dog', 'dog', 'mice', 'gopher', 'piranha', ],
[ 'dog', 'dog', 'mice', 'gopher', 'piranha', ],
],
[ 1, [ 1, 2222, ['no!', 'no...', 55, ], ], ],
[ [ [ 'Rat!', [ 'Non,', 'Tu es un rat!' , ], ], ], ],
'Hey!!',
0.0_1_0_1,
-33,
);
print join ( "\n",
recursively_dereference_sort_unique_array( [ 55, 9.000005555, ], @whoo, \@one, \@whoo, [ $H ], ),
"\n", );
close $H;
exit;
sub recursively_dereference_sort_unique_array
{
# recursively dereference array of arrays; return unique values sorted. Leave HASH and GLOB (filehandles) as they are.
# 2020v10v04vSunv12h20m15s
my $sb_name = (caller(0))[3];
@_ = grep defined, @_; #https://stackoverflow.com/questions/11122977/how-do-i-remove-all-undefs-from-array
my @redy = grep { !/^ARRAY\x28\w+\x29$/ } @_; # redy==the subset that is "ready"
my @noty = grep { /^ARRAY\x28\w+\x29$/ } @_; # noty==the subset that is "not yet"
my $countiter = 0;
while (1)
{
$countiter++;
die "$sb_name: are you in an infinite loop?" if ($countiter > 99);
my @next;
foreach my $refarray ( @noty )
{
my @tmparray = @$refarray;
push @next, @tmparray;
}
@next = grep defined, @next;
my @okay= grep { !/^ARRAY\x28\w+\x29$/ } @next;
@noty = grep { /^ARRAY\x28\w+\x29$/ } @next;
push @redy, @okay;
my %hash = map { $_ => 1 } @redy; # trick to get unique values
@redy = sort keys %hash;
return @redy unless (scalar @noty);
}
}
する必要があります
func {
$b = shift;
}
参照を渡す場合。それがいくつかの助けになることを願っています。