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):

#!/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 $_; }
which can be used e.g. in the following ways (also from the Cookbook)
% 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/'
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/ +/./g' * or % rename 'tr/ /./' *
Try to understand how this program works - and if you have any questions, feel free to ask here ...

-- 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
    Thanks! I appreciate the dissection. Maybe I'm just missing something, but while my script now does create a file with the . instead of the space, that file is empty. So its doing a "touch" rather than a "mv" and that is using open(NEW, ">>Test/$newfile"); what am I missing?

      In what way are you doing an open(NEW, ">>Test/$newfile") call - I thought you are renaming files with rename??

      Could you post the code you have now, please.

      -- Hofmator

        I have:
        opendir(DIR, "$dir") || die "cant open $dir $!\n"; foreach my $filename (readdir(DIR)) { if ($filename =~ / /) { my $newfile = $filename; $newfile =~ s/ +/./g; rename($filename, $newfile) unless $filename eq $newfile; } } closedir(DIR);
        print "$newfile\n"; presents the correct name but no changes occur in the directory DIR. That's why I tried implementing the open function. Perhaps rename isn't working properly?