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