Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: mmv-like hack in perl? (don't use s///)

by Aristotle (Chancellor)
on Apr 14, 2003 at 11:23 UTC ( [id://250262]=note: print w/replies, xml ) Need Help??


in reply to mmv-like hack in perl?

There's no easy way to do this save for parsing the replace-with string yourself. There's a rename script which comes with Perl, that allows you to pass Perl code as the first parameter, which it then executes for every file, passing the filename in $_ and moving the file if the code modified $_.

Note that $1 et al are most likely subject to parsing by the shell on Unixoid systems, as are parens and the backslash, so if you want to use them, you'll need to enclose the parameters in single quotes to prevent those characters from being interpreted by the shell.

Probably the sanest solution would be to use a printfish syntax for the right side, composing a new string from the captured bits for every match. Something like this (untested; esp. the pattern).

my ($re, $fmt) = @ARGV; function reformat { local $_ = $fmt; s/%(?:(\d+)|.)/$_[$1] if defined $1/ge; return $_; } # ... $re = qr/$re/; # precompile for(@list_of_files) { next unless (my @capture = /$re/); rename $_, reformat(@capture); }
You'd then call it something like foo '(.+)-(\d{,2})\.ext' moof-%1-%2.newext, using %% to use literal percent signs in the replace-with name.

Makeshifts last the longest.

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (5)
As of 2024-04-24 06:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found