Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re^2: Looking up elements of an array in another array!

by better (Acolyte)
on Mar 15, 2013 at 22:00 UTC ( #1023784=note: print w/replies, xml ) Need Help??

in reply to Re: Looking up elements of an array in another array!
in thread Looking up elements of an array in another array!


thanks for that proposal.

I think "push @result, $_ if $_ eq $file;" doesn't do the job, because the filenames in $dh are not exactly identical with the IDs given in @ds.

The ID is only a part of a filename (ID: I C 7710; filename: I C 7710 -A.jpg)



  • Comment on Re^2: Looking up elements of an array in another array!

Replies are listed 'Best First'.
Re^3: Looking up elements of an array in another array!
by 2teez (Vicar) on Mar 16, 2013 at 05:40 UTC

    From your last reply:
    ..Scan a directory and return all filenames containing the IDS I C 7700 -A.jpg I C 7700 -B.jpg I C 7700 a,b -KK
    Then change this line:
    push @result, $_ if $_ eq $file;
    push @result, $_ if $_=~/^\Q$file/;

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me

      Hi again,

      when I announced in my reply to Anonymous Monk the solution of all my problems was found, I was to hasty.

      The script worked well within the setting I developed to test it. When I started it under real conditions I was surprised that many files had been copied, whose filenames didn't include the IDs listed in the text file. This was my thought at least at a first glance.

      Then I realized that they did, i.e.: The operation "$_ =~ /^\Q$file/" on ID "I C 17" finds not only "I C 17.jpg" and "I C 17 -A.jpg" but also "I C 170.jpg" and "I C 1778 - A.jpg" etc. It's a characteristic of operating with regex which is well known and named as "greedy".

      Now here is my next step: a snippet, which deals exclusively with the greedyness of regex:

      #Script tests matching of IDs with a list of filenames #Should find matches without being too greedy #For testing input is given as two arrays, defined within the script #Input will be a a list of IDs in a text file and a scan of a director +y containing the image files # # use strict; use warnings; my @dir = ("I C 17.jpg", "I C 17 a.jpg", "I C 17 a,b -A x.jpg", "I C 1 +70.jpg", "I C 171 a,b -A x.jpg", "I C 171 a,b -B x.jpg"); my @ids = ("I C 17", "I C 171"); foreach my $a (@ids) { my $ext = "[^0-9]*\.jpg"; my $a_ext=$a.$ext; foreach my $b (@dir) { if ($b =~ m/($a_ext)/) { print "Found file: $b\n"; } } }

      All I have to do now, is to implement this into the main script

      I hope, if this is done, the routine for importing files will work

      better    (annoying this dull play on words, isn't it?)

      update: I implemented this nontoogreedy matching into the main script and it works better than before. But it's getting even more complicated, because IDs named "I C 17 <1>" refer to image files named "I C 17 _1_ -A.jpg". So I have to replace the the brackets before matching.

        I'd suggest:

        my $a_ext=quotemeta($a).$ext;

        ... because this will cope better when $a contains "special" characters such as "[" or "+".

        package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1023784]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2018-06-20 08:32 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (116 votes). Check out past polls.