in reply to How can I opendir, replace all files containing a space with .?
You already have gotten working but let me tell 'tear apart' your code, to tell you what went wrong. You should see this as a chance to learn, no offence meant.
I put some comments into your sourcecode, always above the line which they belong to:
# good, open with error checking opendir(DIR, "$dir") || die "can't open $dir $!\n"; # maybe name the variable @filenames - as there is more than one # or get rid of the variable altogether by saying # foreach my $oldname ( readdir(DIR) ) my @filename = readdir (DIR); # declare filename with my and give better name (see above) # foreach my $oldname (@filename) foreach $filename (@filename) { # this matches against the special variable $_ # (which you are not using) you want # if ($filename =~ / /) if (/ /) { # the regex is completely wrong you want either # s/ +/./g or tr/ /./ try to figure out the difference # and $newfile is never assigned a value so: my $newfile = $oldfile; $newfile =~ s/ +/./g; # you don't have to do the rename when you didn't # change anything, so rename($oldname, $newfile) unless $oldname eq $newfile; } } closedir(DIR);
If you want to use this as a standalone script, I'd go for the rename program out of the Cookbook (recipe 9.9):
which can be used e.g. in the following ways (also from the Cookbook)#!/usr/bin/perl -w # rename - Larry's filename fixer $op = shift or die "Usage: rename expr [files]\n"; chomp(@ARGV = <STDIN>) unless @ARGV; for (@ARGV) { $was = $_; eval $op; die $@ if $@; rename($was,$_) unless $was eq $_; }
This approach has several advantages, as you can specify the affected files from the command line (and don't have to work on all files in a directory). Furthermore it is very flexible due to the eval approach. Your problem could be solved with it like this:% rename 's/\.orig$//' *.orig % rename 'tr/A-Z/a-z/ unless /^Make/' * % rename '$_ .= ".bad"' *.f % rename 'print "$_: "; s/foo/bar/ if <STDIN> =~ /^y/i' * % find /tmp -name '*~' -print | rename 's/^(.+)~$/.#$1/'
Try to understand how this program works - and if you have any questions, feel free to ask here ...% rename 's/ +/./g' * or % rename 'tr/ /./' *
-- Hofmator
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: How can I opendir, replace all files containing a space with .?
by nkpgmartin (Sexton) on Aug 15, 2001 at 19:02 UTC | |
by Hofmator (Curate) on Aug 15, 2001 at 20:22 UTC | |
by nkpgmartin (Sexton) on Aug 15, 2001 at 20:37 UTC | |
by Hofmator (Curate) on Aug 15, 2001 at 20:50 UTC | |
by nkpgmartin (Sexton) on Aug 15, 2001 at 21:04 UTC |