http://qs321.pair.com?node_id=11112430

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks!

I need to extract the zip code from a strange file path,I have a solution, just want to ask if there is a better way of doing this. here is the sample code to show my version of the regular expression I am using:
#!/usr/bin/perl use strict; use warnings; print "\n"; my $file_1 = '-/yf/-/22211_01_09_2000_XYz.pdf'; # Just to show that the "hyphen" can be in any place in the path. my $file_2 = '_/gt/-/02239_04_04_1989_PkW.pdf'; my $file_3 = '-/xy/-/02239_04_04_1989_PkW.pdf'; my ($zip) = $file_1 =~ /^[\w\-]+\/[\w\-]+\/[\w\-]+\/(\d{5})_/; print "\n\n *$zip* \n\n\n";
Thanks for looking!

Replies are listed 'Best First'.
Re: Matching hyphens in file path to extract zip code
by haukex (Archbishop) on Feb 05, 2020 at 14:59 UTC

    Is the ZIP code always at the beginning of the filename? You can use the core module File::Basename to strip off the path:

    use warnings; use strict; use File::Basename qw/fileparse/; my @files = ( '-/yf/-/22211_01_09_2000_XYz.pdf', '_/gt/-/02239_04_04_1989_PkW.pdf', '-/xy/-/02239_04_04_1989_PkW.pdf' ); for my $file (@files) { my $bn = fileparse($file); my ($zip) = $bn =~ /^(\d{5})\D/; print "$file => $zip\n"; }
      I like that option too, just a little more code.
        just a little more code

        Not significantly, I just wrote it more verbosely.

        use File::Basename; my ($zip) = fileparse($file) =~ /^(\d{5})\D/;
Re: Matching hyphens in file path to extract zip code
by hippo (Bishop) on Feb 05, 2020 at 15:28 UTC
    just want to ask if there is a better way of doing this

    That depends on what makes one solution "better" than another and also how representative your sample set is.

    use strict; use warnings; use Test::More; my @set = ( { file => '-/yf/-/22211_01_09_2000_XYz.pdf', zip => '22211' }, { file => '_/gt/-/02239_04_04_1989_PkW.pdf', zip => '02239' }, { file => '-/xy/-/02239_04_04_1989_PkW.pdf', zip => '02239' }, ); plan tests => 2 * @set; for my $datum (@set) { is zip_substr ($datum->{file}), $datum->{zip}, "Substr for $datum- +>{file}"; is zip_regex ($datum->{file}), $datum->{zip}, "Regex for $datum- +>{file}"; } sub zip_substr { return substr (shift, 7, 5); } sub zip_regex { my ($zip) = shift =~ m#/(\d{5})_#a; return $zip; }
A reply falls below the community's threshold of quality. You may see it by logging in.