in reply to Constructing a hash with filepath,filename and filerev

You can code the following way provided the file name is unique.Other wise use an ArrayofHashes.
Read perldsc for information about perl datastructures.
use strict; use warnings; use Data::Dumper; my %hash; while(<DATA>) { my ($file_path,$file_name,$ver)=m{^(.*/(.*))\#(\d+)$}; %{$hash{$file_name}}=(file_path => $file_path, version => $ver); } print Dumper(\%hash); __DATA__ //depot/asic/tools/perl/scripts/examples/modem.c#7 //depot/asic/tools/perl/files/examples/file.txt#2 //depot/asic/tools/perl/proc/examples/apps.c#14

Replies are listed 'Best First'.
Re^2: Constructing a hash with filepath,filename and filerev
by perl_mystery (Beadle) on Dec 11, 2010 at 05:59 UTC

    The filename is not unique,just curious what is the problem with the above code if the filename is not unique and how using array of hashes will resolve the problem?

      Here's suhailck's basic example using a hash of arrays of hashes to allow for multiple versions of the same file with the same name.

      #!perl use strict; use warnings; my %files_by; while (<DATA>) { my ($file_path, $file_name, $version) = m{^(.*/(.*))#(\d+)$}; push @{ $files_by{$file_name} }, { file_path => $file_path, version => $version, }; } for my $file_name (sort keys %files_by) { for my $href (@{ $files_by{$file_name} }) { print "File name: $file_name\n"; print "File path: $href->{file_path}\n"; print "File version: $href->{version}\n"; } } # This prints 6 print $files_by{'modem.c'}[2]{version}, "\n"; # This prints '//depot/asic/tools/perl/files/examples/apps.c' print $files_by{'apps.c'}[0]{file_path}, "\n"; __DATA__ //depot/asic/tools/perl/scripts/examples/modem.c#4 //depot/asic/tools/perl/scripts/examples/modem.c#5 //depot/asic/tools/perl/scripts/examples/modem.c#6 //depot/asic/tools/perl/scripts/examples/modem.c#7 //depot/asic/tools/perl/files/examples/file.txt#2 //depot/asic/tools/perl/proc/examples/apps.c#14

        I am trying to output the hash to a file "hash_glf.txt",using the following code,the file given as input is 40,000 lines.It takes a lot of time to outpuf to "hash_glf.txt",if I change the input file to some 100 lines,I can see the hash structure being output'ed to hash_glf.txt immediately.Is there a way I can quicken the script to output to the file quickly?

        #!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; my %files_by; print "Enter File1 "; my $file1_name = <>; chomp($file1_name); open my $DATA, '<', $file1_name or die "Cannot open file 1\n"; while (<$DATA>) { my ($file_path, $file_name, $version) = m{^(.*/(.*))#(\d+)$}; push @{ $files_by{$file_name} }, { file_path => $file_path, version => $version, }; } open my $hash_glf, '>', "hash_glf.txt"; print $hash_glf Dumper( \%files_by ); close $DATA;