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' => {
    • },
    • },
    • },
    • };