Lucrarea 4
Lucrarea 4
Structuri de date complexe(continuare)
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:
- Parcurgeţi tabloul $tablou şi afişati numele, materiile şi notele fiecărui student.
- Studiaţi documentaţia funcţiei keys (http://perldoc.perl.org/functions/keys.html).
- Studiaţi documentaţia funcţiei ref (http://perldoc.perl.org/functions/ref.html).
- Folosiţi fişierul OpenBSD-dmesg.txt din ataşamente pentru crearea unei structuri complexe arborescente.
- Ex:
- $struct = {
- 'root' =>
- {
- 'mainbus0' =>
- {
- 'bios0' =>
- {
- 'acpi0' =>
- {
- 'acpitimer0' => 1,
- 'acpimadt0' => 1,
- 'acpiprt0' => 1,
- 'acpiprt1' => 1,
- },
- },
- 'cpu0' => {
- },
- 'ioapic0' => {
- },
- },
- },
- };