Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Find the last item in a series of files

by Laurent_R (Canon)
on Jun 16, 2017 at 20:28 UTC ( [id://1192985]=note: print w/replies, xml ) Need Help??


in reply to Find the last item in a series of files

I'm a bit reluctant to sort a whole array if all that is needed is to find a maximum value, because the algorithmic complexity is higher (meaning it is in theory less efficient). Having said that, I must admit it probably does not matter unless then number of file is very high.

Anyway, you might avoid a sort with something like this:

my %hash for my $file (glob("*.*")) { my ($root, $ext) = split /\./, $file; if (defined $hash{root) { $hash{$root} = $ext if $ext > $hash{$root}; } else { $hash{$root} = $ext; } }
The if ... else statement could be reduced to a simple if statement and a Boolean operator:
$hash{$root} = $ext if (not defined $hash{$root}) or $ext > $hash{$roo +t};
but I wanted to make it as easy to read as possible.

Replies are listed 'Best First'.
Re^2: Find the last item in a series of files
by Marshall (Canon) on Jun 16, 2017 at 23:54 UTC
    A simple split to two parts may not be enough depending upon the OP's filenames and how many '.' characters might be contained within those names. I think that a regex assignment would be more appropriate instead of a split. But it could be that this is all the OP needs.

    I don't like your one line if..else because it is "hard to understand" and confers no execution advantage.

    Anyway, a nice algorithm idea that compares favorably with the HoA ideas previously posted.

      I agree with you. I chose split on the basis of the example provided in the OP (file.001, file.002, ...). A regex would be more robust for more complex filenames.

      I also think that the one-line version of the if ... else statement is less easy to understand (that's why I used the other version in the complete code version), I only wanted to show it could also be made more concise.

      A simple split to two parts may not be enough depending upon the OP's filenames and how many '.' characters might be contained within those names. I think that a regex assignment would be more appropriate instead of a split. But it could be that this is all the OP needs.

      That's why using File::Basename seems a good idea as it provides an easy interface to extract path, files-basename and extension.

      CountZero

      A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

      My blog: Imperial Deltronics
        Yes, File::Basename is a fine idea. But that won't get you out of providing a regex in this particular situation. The functions either take a list of strings like ".txt". ".doc". Or a regex in qr// form. Of course the enumerated suffix strings are the easiest way to use these functions. However, in this particular situation with varying numeric suffixes, ".001", etc., I would think a regex is needed even if using File::Basename.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1192985]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (6)
As of 2024-04-25 08:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found