Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
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 studying the Monastery: (5)
As of 2020-05-29 17:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    If programming languages were movie genres, Perl would be:















    Results (170 votes). Check out past polls.

    Notices?