Stap 2: Eenvoudig Model
Perl heeft in wezen 3 primitieve gegevenstypen. Steken, geïndexeerde arrays en associatieve arrays.
Zeer vroeg op, ontdekte ik dat het was makkelijker voor mij om te werken met verwijzingen naar deze structuren, en de referentie waar nodig. Associatieve arrays lenen zich goed voor sleutelwaarde paringen. Dit is echter niet het einde van deze overweging, zoals een sleutel aan meer dan één waarde toewijzen kan. Afhankelijk van de toepassing, kan strikt het definiëren van de waarde van de vereniging een voorafgaande waarde wissen. Dus laten we zien hoe we kunnen model meerdere waarden die worden toegewezen aan een sleutel.
Houd rekening met de volgende methoden:
Code:
#!/usr/bin/perl <br>use strict; # Just do it! use warnings; use Data::Dumper; <br> my $key1 = 'city1'; my $key2 = 'city2'; my $key3 = 'city3'; my $val1 = 'zip1'; my $val2 = 'zip2'; my $val3 = 'zip3'; my $val4 = 'zip1'; my = ($val1,$val3,$val4); # Make a quick list Notice the repeated value my $hashref; # Initialize the structure
#approach 1 hash of string-tokens foreach my $value ( { if ($hashref->{$key1}) { my $current_value = $hashref->{$key1}; $hashref->{$key1} = $current_value . "," . $value; }else{ $hashref->{$key1} = $value; } } # print Dumper $hashref;
#approach 2 key-assoc-cnt hash foreach my $value ( { if ($hashref->{$key2}->{$value}) { $hashref->{$key2}->{$value} ++; }else{ $hashref->{$key2}->{$value} = 1; } } # print Dumper $hashref;
#approach 3 hash - array associations foreach my $value ( { if ($hashref->{$key3}) { push( , $value); #switch order push vs unshift }else{ $hashref->{$key3} = [ $value ]; } } print Dumper $hashref;
Uitgang:
#perl association_approaches.pl<br>$VAR1 = { 'city2' => { 'zip3' => 1, 'zip1' => 2 }, 'city1' => 'zip1,zip3,zip1', 'city3' => [ 'zip1', 'zip3', 'zip1' ] };
In elk van deze benaderingen, het gedrag wordt bepaald door het bestaan / definitie van de sleutel. Bovendien, hefboomwerking de methoden Perls "autovivification" concept. Elke sleutel zal opbouwen van een reeks "tokens." In de eerste benadering, wordt de waarde van een sleutel direct gebruikt als een tekenreeks. Als meer dan één token vereist is, wordt deze toegevoegd aan de tekenreeks gescheiden door een willekeurig karakter. In dit geval zou het een komma, maar meer in het algemeen, het kan worden geselecteerd, zodat tokenizing met de split-functie. In de tweede benadering, is de waarde gescheiden gehouden doordat ze een andere laag van de vereniging. Uiteindelijk zal de hash moet een waarde worden toegewezen. Het kan worden ingesteld op een willekeurig aantal waarden. De geselecteerde waarde wordt geïnitialiseerd als 1 en oplopend in de daaropvolgende registraties. De derde benadering wordt gekeken naar het gebruik van geïndexeerde arrays voor elk van de waarden.
De eerste benadering werd gebruikt in een implementatie, waar ik had een beetje meer van een tijdkraken. Het toont haar opvoeding als iets gebruikt voor het verwerken van CSV-bestanden. Ik vond dat als penningen werd ingewikkelder werd het moeilijker en moeilijker om te plukken van een betrouwbare token scheidingsteken. Toen ik had tijd terug te gaan en het evalueren van alternatieve benaderingen vond ik dat ik vond de tweede benadering. Waar bood als de derde aanpak omslachtig voor mijn toepassing, de tweede benadering de mogelijkheid te creëren een unieke lijst met het bijkomend voordeel van het tellen van het aantal keren dat het paar werd gedefinieerd. In mijn toepassing was de volgorde van invoer niet belangrijk, zolang zijnde kundig voor itereren over de hele set van sleutels. toepassingen waar bestellen belangrijker is, zinvoller met behulp van arrays.
Nu laten we eens kijken wat we kunnen doen met aanpak nummer 2.
# original hash from approach 2 $VAR1 = { 'city2' => {<br> 'zip3' => 1, 'zip1' => 2 } }
# Extending from approach 2 above # Reverse it my $revhash = {}; foreach my $key (keys(%$hashref)){ foreach my $val (keys(%{$hashref->{$key}})){ $revhash->{$val}->{$key} = $hashref->{$key}->{$val}; } } print Dumper $revhash;
Uitgang:
#perl revit.pl $VAR1 = { 'zip3' => { 'city2' => 1 }, 'zip1' => { 'city2' => 2 } }; #
Merk op hoe de sleutels en waarden hebben verwisseld, en dat de telling van de koppeling blijft hetzelfde.