Creare acestor tipuri de structuri se bazează pe utilizarea referintelor anonime. Un avantaj al acestui mod de agregare a diferitelor tipuri de date este posibilitatea de a transmite în mod compact, eficient şi rapid date către şi din subrutine.
Referinţe către structuri anonime:
Exemplele din lucrarea precedentă prezintă o modalitate de creare a refeţintelor către variabile deja existente. Este posibilă definirea de referinţe către structuri ce nu au fost asociate unor nume de variabile:
use strict;
use warnings;
use Data::Dumper;
#referinta catre un array gol
my $ref_array = [];
#referinta catre un array populat
$ref_array = [1,2,"abc"];
#referinta catre un hash gol
my $ref_hash = {};
#referinta catre un hash populat
$ref_hash = {
"nume" => "POPESCU",
"prenume"=>"Vlad",
};
print Dumper($ref_array);
print Dumper($ref_hash);
Dereferenţiere multi-nivel:
Tipurile de date tablou şi hash accepta valori scalare, referintele fiind valori scalare se combina mai multe structuri referinta, rezultand o structura multi-nivel. Numărul de niveluri este limitat doar de memoria RAM a sistemului pe care rulează programul. Astfel este posibil ca pentru accesare unei variable (cunoscute sau anomine) să fie nevoie de mai multe niveluri de dereferentiere:
use strict;
use warnings;
my $a = 1;
my $ref_a = \$a;
my $ref_ref_a = \$ref_a;
my $ref_ref_ref_a = \$ref_ref_a;
#afisare variabila
print $a;
#nivel 1
print "Referinta: $ref_a\n";
print "Nivel 1: $$ref_a\n";
#nivel 2
print "Nivel 2: $$$ref_ref_a\n";
#nivel 3
print "Nivel 3: $$$$ref_ref_ref_a\n";
Exemple de structuri de date complexe
Listă de liste de hash-uri de liste de liste de hash-uri :)
use strict;
use warnings;
use Data::Dumper;
my $tablou =
[
{
'nume' => 'CHIRIAC',
'prenume' => 'Vasile',
'materii' => {
'automate' => [9, 8],
'programare' => [10, 9],
'practica' => [8, 10],
}
},
{
'nume' => 'VOGHINA',
'prenume' => 'Claudiu',
'materii' => {
'automate' => [8, 8],
'programare' => [8, 9],
'practica' => [10, 9],
'sport' => [9, 9],
}
}
];
print Dumper($tablou);
Pentru accesarea notei a doua a studentului "CHIRIAC Vasile" la materia "programare" se va utiliza: print $tablou->[0]->{'materii'}->{'programare'} ->[1];
Exerciţii: