Hi Alex,

Your script should be like that:

$oldfile = $file;
chomp($oldfile);
my $newfile = $oldfile . ".x";

... as $file (and $oldfile, which is redundant btw) ends with "\n".

Besides, it'd be much easier to collect all the files in the given
directory with fileglob.

-- iD


2012/1/5 Alex Ardin <alexardi...@gmail.com>

> Hi,
> I frequently have to review logs that are captured with 'script' using
> terminal but these logs have many control characters.
>
> The intent of the script is the following:
>
> 1. Get a listing of all the logs in a directory, storing the list of
> files in an array.
> 2. For each filename in the array, create a new filename but append a
> ".x" to the original filename, so that file 'a' would result in a new
> file 'a.x', as an example.
> 3. Open the original file, search and remove any control characters
> (such as  ^M, ^C, and so on) line by line and store the results in the
> newly created file ending in .x (such as the a.x example above).
> 4. After reaching the end file, close both files.
> 5. Move the newly created .x file so that it replaces the original
> file (or 'mv a.x a' in the example above).
>
> What happens is that the script works fine, all control characters are
> replaced in the file, but the move fails, so that if I start with a
> directory containing these files:
>
> xong$ ls -rlt
> -rw-r--r--  1 rootroot  staff  50033 Oct 11 17:43 xyz
> -rw-r--r--  1 rootroot  staff  50033 Oct 13 18:57 123
>
> when the script finishes executing, I end up with these file, the
> first two are the original files with all the control characters, the
> last two are the newly created files with the control characters
> removed:
>
> xong$ ls -rlt
> -rw-r--r--  1 rootroot  staff  50033 Oct 11 17:43 xyz
> -rw-r--r--  1 rootroot  staff  50033 Oct 13 18:57 123
> -rw-r--r--  1 rootroot  staff  49792 Jan  4 22:14 xyz?.x
> -rw-r--r--  1 rootroot  staff  49792 Jan  4 22:14 123?.x
>
> Here's the errors I see when the script executes, the comments are
> just for debugging:
>
> Here's a listing of the files:
> 123
> xyz
>
> Here's newfile: 123
> .xHere's oldfile: 123
>
> Now mv file
> Here's newfile: 123
> .xHere's oldfile: 123
> usage: mv [-f | -i | -n] [-v] source target
>       mv [-f | -i | -n] [-v] source ... directory
> sh: line 1: .x: command not found
>
> I'm not sure why this is happening, the newfile should contain "123.x"
> but instead the .x is appearing on the newline.  I've gone through the
> "Programming Perl" book and can't seem to fine another way to do this,
> and I've also searched this group, and didn't find anything similar.
>
> Here's the script:
>
> #!/usr/bin/perl
>
> #
> # Delete all control characters in a group of files in a directory.
> #
>
> #use strict;
> use warnings;
>
> if ($#ARGV != 0) {
>    print "\nusage: get_file_list.pl directory\n\n";
>    exit;
> }
>
> $dir_path = $ARGV[0];
> chdir "$dir_path" or die "\ncd failed, check file path!\n\n";
>
> $cmd = "pwd";
> if(system($cmd)) { print "\n\npwd failed.\n"; }
>
> $cmd = "ls -l";
> if(system($cmd)) { print "\n\nFile listing failed.\n"; }
>
> # Store file listing in a array:
> $cmd = "ls";
> my @fl = qx($cmd);
>
> print "\nHere's a listing of the files:\n";
>
> foreach $file (@fl) {
>        print $file;
> }
>
> I thought it was a result of my foreach loop but the loop exits after
> the last file is reached, so there's nothing to force a newline when
> my script copies the original filename to a new file name ending in
> ".x".
>
> foreach $file (@fl) {
>        $oldfile = $file;
>        my $newfile = $oldfile . ".x";
>        print("Here's newfile: $newfile");
>        print("Here's oldfile: $oldfile");
>
>        open(OF, $oldfile);
>        open(NF, ">$newfile");
>
>        # read in each line of the file
>        while ($line = <OF>) {
>                $line =~ s/\cM//g;
>                $line =~ s/\cH//g;
>                $line =~ s/\cC//g;
>                $line =~ s/\cL//g;
>                $line =~ s/\cG//g;
>                $line =~ s/\cP//g;
>                $line =~ s/\cQ//g;
>                $line =~ s/\cR//g;
>                $line =~ s/\c[//g;
>                print NF $line;
>        }
>
>        print("\nNow mv file\n");
>        print("Here's newfile2: $newfile");
>        print("Here's oldfile2: $oldfile");
>
>        $cmd = "mv $newfile $oldfile";
>        if(system($cmd)) { print "rename failed\n"; }
>
>        close(OF);
>        close(NF);
> }
>
> I also thought it had been the result of my closing my files after I
> attempted the move, but I get the same results if I move these lines:
>
>        close(OF);
>        close(NF);
>
> above this line:
>
> print("\nNow mv file\n");
>
> so that the files are closed and then attempt to move them.
>
> Is it possible to understand how to work around this?
>
> Alex
>
>
> --
> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
> For additional commands, e-mail: beginners-h...@perl.org
> http://learn.perl.org/
>
>
>

Reply via email to