in reply to problem to open a specified path file in open system call

It's clear that you're working on files in a directory but I'm not sure what are you trying to achieve as you provide a very small amount of information on that. For what you're doing, Perl provides built-in functions so you don't need external program like ls: opendir, readdir, and closedir. Examples (untested),
my $dir = shift; # get the first command line arg my $path = "/remote/scm/rsync/builds/$arg/FailedInformal"; opendir DIR, $path or die "Can't open $path: $!\n"; my @releases = grep {/^\d/} readdir DIR; # NOW, it's up to you what you want with files you find # in @releases # get the latest three my @three = @releases[-1,-2,-3]; # get only the very latest my $latest = $relreases[-1]; .... # and closing the DIR handle is good closedir DIR;
One thing to note: since you're working on the current directory (wherever it is), you have to use the original path to work on a file. For example, the following is wrong,
open FILE, $latest or die "Can't open $latest: $!\n"; ....
Instead, you have to write,
# presume / as path separator my $latest_file = "$path/$latest"; open FILE, $latest_file or die ...;
As to the error message, it just says what the perl interpreter thinks, the file doesn't exist. Check it manually if that's not what you think.

Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!

Replies are listed 'Best First'.
Re^2: problem to open a specified path file in open system call
by Anonymous Monk on Jul 14, 2007 at 13:03 UTC
    Hi Naikonta,
    Thx for quick reply,the actual problem is as below
    $path1="/remote/scm/rsync/builds/v_dialer/FailedInformal/3.0.0.0.118"; i can able to open the file by command prompt as
    vi /remote/scm/rsync/builds/v_dialer/FailedInformal/3.0.0.0.118/build.log
    but in open comman unable to open
    open(FILE,$path1/build.log) or die "$!\n"; why this will not open the build.log?
    whats wrong in open() call...litrally i am not getting where its going wrong...help me out to proceed further
      The problem with your usage on open is that it can't open a file with newline character in its name. As pointed out by tirwhan, the embedded newline characters in your filenames came from ls command. You need to chomp them.
      my @files = `ls -1`; chomp @files; # or in one line chomp(my @files = `ls -1`);
      Using built-in opendir and readdir would be safer for you, and no extra processes needed.

      Open source softwares? Share and enjoy. Make profit from them if you can. Yet, share and enjoy!

        The problem with your usage on open is that it can't open a file with newline character in its name.

        To be precise, open can open a file with newline characters in its name just fine, as long as they're supported by the filesystem and they do exist. Under *NIX the only forbidden charachters are "\0" and "/".

        blazar@perlmonk ~ $ perl -e 'open F, ">foo\nbar" or die' blazar@perlmonk ~ $ ls foo* foo?bar
      open(FILE,$path1/build.log) or die "$!\n"; why this will not open the build.log?

      In case it's not just a typo in this post...  you'd need to either interpolate

      open(FILE,"$path1/build.log") or die "$!\n";

      or concatenate the strings

      open(FILE,$path1."/build.log") or die "$!\n";

      Using strictures would have revealed the problem. With use strict; you'd have gotten:

      Bareword "build" not allowed while "strict subs" in use at ./626616.pl + line 8. Execution of ./626616.pl aborted due to compilation errors.

      and with use warnings; even more:

      Unquoted string "build" may clash with future reserved word at ./62661 +6.pl line 8. Name "main::FILE" used only once: possible typo at ./626616.pl line 8. Argument "build" isn't numeric in division (/) at ./626616.pl line 8. Argument "." isn't numeric in division (/) at ./626616.pl line 8. Illegal division by zero at ./626616.pl line 8.