in reply to Extracting files from .7z using Perl

Thank you for all the tips everyone!

Quite a few things to get through, love the challenge.

Since the glob thing has been mentioned more than once, so I'll give a quick explanation what I'm trying to do with them.

The first one: my $archive = glob qq($base.Gridfee0?.7z\\); I need to use a wildcard, there are 7 zipfiles named 'Gridfee01' up to 'Gridfee07' which i need to get through.

The second one: my @files = glob qq($base\\Gridfee0?.7z\\Gridfee?\\invoic_b2c_$year$month$day*.txt); Need to use several wildcards here (? twice and a *) and the glob qq() thing is the easiest way that has worked for me until now.

Replies are listed 'Best First'.
Re^2: Extracting files from .7z using Perl
by Lotus1 (Vicar) on Jun 13, 2017 at 14:09 UTC

    There is nothing wrong with using glob for this purpose but there are some pitfalls. You have to make sure you are giving the glob what it needs which you are not as has been pointed out already. Do your files have whitespace in the names or paths? Do you need to call glob in scalar or array context? There are a few different versions of glob available and you need to specify if you need one other than the built in one. Wildcards are what glob was made for but make sure you understand which metacharacters you are using. Have a look at File::Glob and another look at the replies you have already gotten.

Re^2: Extracting files from .7z using Perl
by Marshall (Canon) on Jun 15, 2017 at 00:11 UTC
    The first one: my $archive = glob qq($base.Gridfee0?.7z\\); I need to use a wildcard, there are 7 zipfiles named 'Gridfee01' up to 'Gridfee07' which i need to get through.
    Don't include a trailing "/" in $base or in the glob.
    my $archive = glob qq($base/Gridfee0?.7z);
    The second one: my @files = glob qq($base\\Gridfee0?.7z\\Gridfee?\\invoic_b2c_$year$month$day*.txt); Need to use several wildcards here (? twice and a *) and the glob qq() thing is the easiest way that has worked for me until now.
    The wildcard glob pattern should only be at the end of the "filespec". You cannot expect this to work with multiple wildcards in the "path". There are at least 3 versions of glob() that I have encountered. If you are using glob, keep what it does as simple as possible and use grep{} to further refine the search. You will need to code a loop here or use another method. Do not expect glob() to do implict looping. For the end target, I would use *.txt and use grep{} to filter out files which do not match /_(\d+)\.txt$/. Looping at multiple levels for $year$month$day*.txt makes no sense. Get all .txt files at one "go" and then filter as needed.