Perl-참조

Perl 참조는 스칼라, 배열 또는 해시 일 수있는 다른 값의 위치를 ​​보유하는 스칼라 데이터 유형입니다. 스칼라 특성으로 인해 참조는 어디에서나 사용할 수 있으며 스칼라를 사용할 수 있습니다.

해시 등에 대한 참조를 포함 할 수있는 다른 목록에 대한 참조를 포함하는 목록을 구성 할 수 있습니다. 이것이 Perl에서 중첩 된 데이터 구조가 구축되는 방식입니다.

참조 생성

다음과 같이 백 슬래시를 접두사로 추가하여 변수, 서브 루틴 또는 값에 대한 참조를 생성하는 것은 쉽습니다.

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*foo;

백 슬래시 연산자를 사용하여 I / O 핸들 (filehandle 또는 dirhandle)에 대한 참조를 만들 수 없지만 다음과 같이 대괄호를 사용하여 익명 배열에 대한 참조를 만들 수 있습니다.

$arrayref = [1, 2, ['a', 'b', 'c']];

비슷한 방법으로 다음과 같이 중괄호를 사용하여 익명 해시에 대한 참조를 만들 수 있습니다.

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

익명 서브 루틴에 대한 참조는 다음과 같이 하위 이름없이 sub를 사용하여 만들 수 있습니다.

$coderef = sub { print "Boink!\n" };

역 참조

역 참조는 참조 지점에서 위치까지의 값을 반환합니다. 참조를 역 참조하려면 참조가 스칼라, 배열 또는 해시를 가리키는 지 여부에 따라 참조 변수의 접두사로 $, @ 또는 %를 사용하면됩니다. 다음은 개념을 설명하는 예입니다.

#!/usr/bin/perl

$var = 10;

# Now $r has reference to $var scalar.
$r = \$var;

# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";

@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ",  @$r, "\n";

%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";

위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.

Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110

변수 유형에 대해 잘 모르면 다음을 사용하여 유형을 쉽게 알 수 있습니다. ref, 인수가 참조 인 경우 다음 문자열 중 하나를 반환합니다. 그렇지 않으면 false를 반환합니다.

SCALAR
ARRAY
HASH
CODE
GLOB
REF

다음 예를 들어 보겠습니다.

#!/usr/bin/perl

$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";

@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";

%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";

위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.

Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH

순환 참조

순환 참조는 두 참조가 서로에 대한 참조를 포함 할 때 발생합니다. 참조를 만드는 동안주의해야합니다. 그렇지 않으면 순환 참조로 인해 메모리 누수가 발생할 수 있습니다. 다음은 예입니다-

#!/usr/bin/perl

 my $foo = 100;
 $foo = \$foo;
 
 print "Value of foo is : ", $$foo, "\n";

위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.

Value of foo is : REF(0x9aae38)

함수에 대한 참조

함수 이름 앞에 \ &를 붙여 함수에 대한 참조를 생성하고 해당 참조를 역 참조하려면 앰퍼샌드 &를 사용하여 참조 변수를 접두사로 지정하면됩니다. 다음은 예입니다-

#!/usr/bin/perl

# Function definition
sub PrintHash {
   my (%hash) = @_;
   
   foreach $item (%hash) {
      print "Item : $item\n";
   }
}
%hash = ('name' => 'Tom', 'age' => 19);

# Create a reference to above function.
$cref = \&PrintHash;

# Function call using reference.
&$cref(%hash);

위의 프로그램이 실행되면 다음과 같은 결과가 나옵니다.

Item : name
Item : Tom
Item : age
Item : 19