Perl - Referensi

Referensi Perl adalah tipe data skalar yang menyimpan lokasi nilai lain yang bisa berupa skalar, array, atau hash. Karena sifat skalar, referensi dapat digunakan di mana saja, skalar dapat digunakan.

Anda bisa membuat daftar yang berisi referensi ke daftar lain, yang bisa berisi referensi ke hash, dan seterusnya. Ini adalah bagaimana struktur data bersarang dibangun di Perl.

Buat Referensi

Mudah untuk membuat referensi untuk variabel, subrutin, atau nilai apa pun dengan mengawali dengan garis miring terbalik sebagai berikut -

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

Anda tidak dapat membuat referensi pada pegangan I / O (filehandle atau dirhandle) menggunakan operator garis miring terbalik tetapi referensi ke array anonim dapat dibuat menggunakan tanda kurung siku sebagai berikut -

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

Cara serupa Anda dapat membuat referensi ke hash anonim menggunakan tanda kurung kurawal sebagai berikut -

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

Referensi ke subrutin anonim dapat dibuat dengan menggunakan sub tanpa subnama sebagai berikut -

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

Dereferensi

Dereferensi mengembalikan nilai dari titik referensi ke lokasi. Untuk mendereferensi referensi cukup gunakan $, @ atau% sebagai awalan dari variabel referensi tergantung pada apakah referensi menunjuk ke skalar, larik, atau hash. Berikut adalah contoh untuk menjelaskan konsep tersebut -

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

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

Jika Anda tidak yakin tentang jenis variabel, maka mudah untuk mengetahui jenisnya menggunakan ref, yang mengembalikan salah satu string berikut jika argumennya adalah referensi. Jika tidak, itu mengembalikan false -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Mari coba contoh berikut -

#!/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";

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

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

Referensi Melingkar

Referensi melingkar terjadi ketika dua referensi berisi referensi satu sama lain. Anda harus berhati-hati saat membuat referensi, jika tidak, referensi melingkar dapat menyebabkan kebocoran memori. Berikut adalah contohnya -

#!/usr/bin/perl

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

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

Value of foo is : REF(0x9aae38)

Referensi ke Fungsi

Ini mungkin terjadi jika Anda perlu membuat penangan sinyal sehingga Anda dapat menghasilkan referensi ke suatu fungsi dengan mendahului nama fungsi tersebut dengan \ & dan untuk membedakan referensi tersebut, Anda hanya perlu memberi awalan variabel referensi menggunakan ampersand &. Berikut adalah contohnya -

#!/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);

Ketika program di atas dijalankan, itu menghasilkan hasil sebagai berikut -

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