package Base::Data; use strict; use warnings FATAL => qw( all ); use base 'Exporter'; our @EXPORT_OK = qw(data_file data_directory get_hash alpha_array alpha_hash); use File::Basename; use File::Spec; use List::Util qw(first); use Base::Roots qw(get_root); sub data_file { my ($directory,$filename) = @_; my $file_name = basename($0); my $root_path = get_root('path'); my $root_data = get_root('data'); my $relative_path = File::Spec->abs2rel($file_name,$root_path); $relative_path =~ s/\.\w+$//; my $data; if ($directory && $filename) { $data = "$root_data/$directory/$filename"; } else { $data = first {-e $_} map("$root_data/$relative_path.$_",qw(csv txt)); } if (!defined $data) { die "No file associated with $relative_path."; } return $data; } sub data_directory { my ($dir) = @_; $dir =~ s/ /_/g; return get_root('data')."/$dir/"; } # Written with rindolf in #perlcafe on freenode; golfed with the help of [GrandFather] of PerlMonks. # Changed to accept named parameters to make it prettier to use. # The parameters are file, headings, and a very optional sort. sub get_hash { my %opt = @_; open(my $fh, '<', $opt{file}) or die("can't open $opt{file} $!"); my $line_number = 0; my %hash; while (my $line = <$fh>) { ++$line_number; chomp $line; my @values = split(/\|/,$line); my $n = 0; $hash{$values[0]}{sort_number} = $line_number if $opt{sort}; for my $heading (@{$opt{headings}}) { $hash{$values[0]}{$heading} = defined($values[$n]) ? $values[$n] : ''; ++$n; } } return %hash; } sub first_alpha { my $alpha = shift; $alpha = ucfirst($alpha) if $alpha =~ /^\l./; $alpha =~ s/\s*\b(A|a|An|an|The|the)(_|\s)//xi; if ($alpha =~ /^\d/) { $alpha = "#"; # $alpha =~ s/^([\d\.,]+).*/$1/; # $alpha =~ s/(\d),(\d)/$1$2/; } else { $alpha =~ s/^(.)(\w|\W)+/$1/; } return $alpha; } sub alpha_array { my ($org_list) = @_; my %alpha_hash; for my $org_value (@{$org_list}) { my $alpha = first_alpha($org_value); push @{$alpha_hash{$alpha}}, $org_value; } return %alpha_hash; } sub alpha_hash { my ($org_list) = @_; my %alpha_hash; for my $org_value (keys %{$org_list}) { my $alpha = first_alpha($org_value); $alpha_hash{$alpha}{$org_value} = $org_list->{$org_value}; } return %alpha_hash; } 1;