#! perl -slw
use strict;
use Data::Dump qw[ pp ];
our $i //= 'tutorial-data.txt';
our $debug //= 0;
open my $in, '<', $i or die "failed to open '$i':$!";
my %users;
my $userid;
while( <$in> ) {
chomp;
warn "DEBUG: $_\n" if $debug;
s[#.*$][] if /#/;
next unless /\S/;
my( $lead, $key, $val ) = m[^(\s+)?(\S+)\s*:\s*(.+?)\s*$] or die "
+Invalid line format at line $.";
$key = lc $key;
if( defined $lead and length $lead ) {
die "Missing userid at $." unless $userid;
$val = [ split '\s*,\s*', $val ] if $key eq 'hobbies'; ## modi
+fied to trim
$users{ $userid }{ $key } = $val;
}
else {
die "Missing userid at line $." unless $val;
die "Userid '$val' not a positive integer at line $." unless $
+val =~ /^\d+$/;
die "Userid '$val' not unique at line $." if exists $users{ $v
+al };
$userid = $val;
}
}
warn "DEBUG: Dumping user hash\n" and pp \%users if $debug;
And a debug run: C:\test>p56tut -debug -i=tutorial-data.txt
DEBUG: # file: tutorial-data.txt
DEBUG: # a data file of users and their attributes
DEBUG: # note all valid lines are in format "key: value..."
DEBUG: user: 1234 # unique ID (an integer > zero)
DEBUG: last: Brown
DEBUG: first: Sam
DEBUG: job: gunsmith
DEBUG: # hobbies may be a comma-separated list
DEBUG: hobbies: hunting, Perl Monging
DEBUG: user: 2316
DEBUG: last: Doe
DEBUG: first: Jane
DEBUG: job: financial analyst
DEBUG: hobbies: Python open source, bowling
DEBUG: Dumping user hash
{
1234 => {
first => "Sam",
hobbies => ["hunting", "Perl Monging"],
job => "gunsmith",
"last" => "Brown",
},
2316 => {
first => "Jane",
hobbies => ["Python open source", "bowling"],
job => "financial analyst",
"last" => "Doe",
},
}
|