Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Matching hyphens in file path to extract zip code

by Anonymous Monk
on Feb 05, 2020 at 14:55 UTC ( #11112430=perlquestion: print w/replies, xml ) Need Help??

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 (Chancellor) 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 (Chancellor) 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://11112430]
Approved by marto
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (7)
As of 2020-05-28 15:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (166 votes). Check out past polls.

    Notices?