Reţele intranet‎ > ‎Laboratoare‎ > ‎

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' => {
    •       },
    •     },
    •   },
    • };
ċ
OpenBSD-dmesg.txt
(7k)
Andrei Gudiu,
30 oct. 2012, 03:18
Comments