Notice the arrows:use strict; use warnings; use Storable; my %CS = ( 'Name' => { 'first_name' => 'Reinier', 'last_name' => 'Maliepaard', }, 'Website' => 'www.reiniermaliepaard.nl', 'Programming' => { 'language' => ['Perl', 'newLisp', 'Windows Commandline'], }, ); store \%CS, 'data.db'; print "Data stored in data.db\n"; my $ref = retrieve('data.db'); print "Data retrieved from data.db\n"; print "Name: $ref->{Name}->{first_name} $ref->{Name}->{last_name}\n"; print "Website: $ref->{Website}\n\n"; print "Programming languages:\n"; print " - $_\n" for @{ $ref->{Programming}->{language} };
This is a hash of hashes. The top-level keys are full names. Each name points to a complete user record.use strict; use warnings; use Storable; my %CS = ( 'Reinier Maliepaard' => { 'Name' => { first_name => 'Reinier', last_name => 'Maliepaard' }, 'Website' => 'www.reiniermaliepaard.example', 'Programming' => { language => ['Perl','newLisp','Windows Commandline'] }, }, 'Jeppe Van Dijk' => { 'Name' => { first_name => 'Jeppe', last_name => 'Van Dijk' }, 'Website' => 'www.jeppevandijk.example', 'Programming' => { language => ['Python','Bash'] }, }, 'Cato Mayer' => { 'Name' => { first_name => 'Cato', last_name => 'Mayer' }, 'Website' => 'www.catomayer.example', 'Programming' => { language => ['Java','C++'] }, }, ); store \%CS, 'data.db'; print "Mini database stored in data.db";
use strict; use warnings; use Storable; my $ref = retrieve('data.db'); print "Mini User Database\n"; print "-----------------\n"; print "1. Retrieve user by name\n"; print "2. Search users by programming language\n"; print "3. List all users\n"; print "Choose option (1, 2, or 3): "; chomp(my $option = <STDIN>); if ($option eq '1') { # Retrieve by name (case-insensitive) print "Enter full user name: "; chomp(my $user_input = <STDIN>);# Find the actual key ignoring case my ($user_name) = grep { lc($_) eq lc($user_input) } keys %$ref; if ($user_name) { my $info = $ref->{$user_name}; print "\nUser: $user_name\n"; print " Website: $info->{Website}\n"; print " First Name: $info->{Name}->{first_name}\n"; print " Last Name: $info->{Name}->{last_name}\n"; print " Programming languages:\n"; print " - $_\n" for @{ $info->{Programming}->{language} }; } else { print "User '$user_input' not found.\n"; } } elsif ($option eq '2') { # Search by programming language print "Enter programming language to search: "; chomp(my $search_lang = <STDIN>); my $found = 0; print "\nUsers who know '$search_lang':\n\n"; for my $user (sort keys %$ref) { my $languages = $ref->{$user}->{Programming}->{language}; if (grep { lc($_) eq lc($search_lang) } @$languages) { $found = 1; print "User: $user\n"; print " Website: $ref->{$user}->{Website}\n"; print " Languages: " . join(", ", @$languages) . "\n\n"; } } print "No users found with '$search_lang'.\n" unless $found; } elsif ($option eq '3') {# List all users print "\nAll Users in the Database:\n\n"; for my $user (sort keys %$ref) { my $info = $ref->{$user}; print "User: $user\n"; print " Website: $info->{Website}\n"; print " Programming Languages: " . join(", ", @{ $info->{Programming}->{language} }) . "\n"; print "\n"; } } else { print "\nInvalid option. Please choose 1, 2, or 3.\n"; }
The file
Storable converts your hash into a serialized binary format.
When you call
For small and medium datasets, Storable is very fast.
Benchmark (Loading ~1 MB dataset)| Machine Type | Storage | Storable | SQLite | Text Parsing |
|---|---|---|---|---|
| Modern Desktop (16 GB RAM) | SSD | 0.003 – 0.008 sec | 0.005 – 0.012 sec | 0.020 – 0.050 sec |
| Older Machine (4 GB RAM) | SSD | 0.01 – 0.03 sec | 0.02 – 0.05 sec | 0.08 – 0.15 sec |
| Older Machine (4 GB RAM) | HDD | 0.03 – 0.10 sec | 0.05 – 0.15 sec | 0.15 – 0.40 sec |
What this means:
You built:
All using one module: Storable.