Perl'de basit veri yapıları, doğrudan isimleriyle eriştiğimiz skalarlar, diziler ve hash'lerdir. Referanslar, diğer veri yapıların adresini içeren skalarlerdir. İç içe (çok boyutlu) diziler, iç içe hash'ler ve karmaşık nesneler oluşturmak için gereklidir.
Referansların kullanımına bir örnek:
my %hash = ( foo => 1, bar => 2 ); my $ref = \%hash; print $ref->{foo}; # 1 # Hash'lere referans dizisi my @array = ( { name => "Tom" }, { name => "Jerry" } ); print $array[1]{name}; # Jerry
Eğer referanslar kullanılmazsa, örneğin, çok boyutlu bir dizi oluşturmak mümkün değildir:
# Referansla çok boyutlu dizi my $matrix = [ [1,2,3], [4,5,6] ]; print $matrix->[1][2]; # 6
Bu, karmaşık veri yapıları oluşturmayı, bunları fonksiyonlar arasında kompakt bir şekilde geçirmeyi ve OOP desenlerini gerçekleştirmeyi sağlar.
İç içe bir diziye (veya hash'e) referans kullanmadan erişim sağlamak mümkün mü? Evet ise, nasıl ve ne zaman çalışmayacak?
Genellikle yapılamaz denir, fakat aslında Perl bazen yapıları "otomatik" olarak dönüştürür. Ancak referanslar olmadan, yapıları iç içe oluşturmak veya argüman olarak geçirdiğinizde çalışmayacaktır.
Yanlış ve doğru erişim örneği:
# Bu şekilde çalışmayacak: my @arr = ( [1,2],[3,4] ); print $arr[0][1]; # 2 # Fakat bir referans yerine basit bir dizi olarak tanımlarsak: my @matrix = ( [1,2], [3,4] ); print $matrix[1][0]; # 3
Hikaye
Büyük bir projede, dizi referansını \ operatörünü kullanmadan geçirmeye çalıştılar; bu da iç yapının skalarlar dizisi gibi açılması ve mantığın tamamen bozulmasına neden oldu.
Hikaye
Geliştirici, referansa ve referanssız erişimi kodda karıştırdı; bu da iç içe foreach döngülerinde referans dizisi ile çalışırken verilerin kaybolmasına neden oldu.
Hikaye
Bir konfigürasyonda, referans içeren bir hash ile çalışırken referansı dereferans etmeyi unuttuk ve hash gibi erişimi denedik; bu da prod'da "Cannot use string ("HASH(0x1234)") as a HASH" çalışma zamanı hatasına neden oldu.