Ken,

Thank you for your quick response.  

I changed the code from:

if (-e $tmpfile) {

to:

if (-f $tmpfile) {

and got the same results.  (The test failed.)
(-e substr ($file, 0, index($file, ".pgp"))),
(-e $tmpfile),
(-e "$tmpfile"),
(-e "$RDYdir\/$tmpfile")
(-f $tmpfile)
(-e "F0715PAY.TXT") <--- This is the only one that worked. 

Here is the true code if that helps:
I've tried: 

foreach my $file ( @currset )
{
    my $tmpstr = substr ($file, 0, index($file, ".pgp"));
    print ("trying to delete $tmpstr \n");
## pgp will core dump if there's already an unencrypted file
## with the destination source name... So we have to remove the
## previously decrypted file if it exists.
   unlink ($tmpstr);
    $tmpstr = "/usr/local/bin/pgp -z 'Chars process for WSHA' $file";
   if (system($tmpstr) == 0) {
       $notice .= LogMsg (MSG => "system $tmpstr failed: $?", DEBUG =>
$debug);
   } else {
        my $tmpfile = substr ($file, 0, index($file, ".pgp"));
        print cwd();
        chomp($tmpfile);
        if (-f $tmpfile) {
            $notice .= LogMsg (MSG => "Deleteing PGP file from RDY
directory: $file", Echo => $debug); 
                ## Remove the PGP file; it's already been archived.
            unlink ($file); 
            $file = substr ($file, 0, index($file, ".pgp"));
            $notice .= LogMsg (MSG => "copying unencrypted to HST directory
as: $file.$datestr", Echo => $debug);
                ## archive new unencrypted file with today's date
            copy ($file, "$HSTdir/$file.$datestr");
            $notice .= LogMsg (MSG => "moving unencrypted to HST directory
as: $file", Echo => $debug);
                ## change file permissions so users can upload file.
            chmod 0666, $file;
                ## move file to archive directory with correct name.
                ## this file will be deleted upon file upload.
            move ($file, "$HSTdir/$file");
        } else {
            my $msg = LogMsg (MSG => "The call to PGP failed on file:
$file", Echo => $debug);
                EmailNotice(LIST => [$file], DEBUG => $debug, MSG => $msg,
WHO => [EMAIL PROTECTED]); 
            $notice .= "The call to PGP failed on file: $file\n";
        }
   }
}



-----Original Message-----
From: Kenneth Wolcott [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, July 29, 2008 5:38 PM
To: beginners@perl.org
Subject: Re: Checking to see if file exists.

On Tue, Jul 29, 2008 at 2:32 PM, tvadnais <[EMAIL PROTECTED]> wrote:

> I am totally confounded by what appears to be a bug in the "does file
> exist"
> functionality.
>
>
>
> Here is the code as it stands now:
>
> my $tmpfile = substr ($file, 0, index($file, ".pgp"));
>
> print cwd();         ## debug code: to make sure we're in the correct
> directory
>
> chomp($tmpfile); ## debug code: Added this to see if there was any thing
> funny in the file name.
>
>            if (-e $tmpfile) {
>
> #          if (-e "$tmpfile"){ ##This doesn't work
>
> #          if (-e "F0715PAY.TXT") { ## This does work, but it needs to be
a
> variable
>
>                        ## Do magic stuff to file.
>
> } else {
>
> ## Send error message
>
> }
>
>
>
> I stepped through the code with the debugger for the above snippet and
this
> is what I got (with a few minor edits for clarity sake)
>
>
>
> The following files were found in directory: F0715PAY.TXT.pgp,
> J0715PAY.TXT.pgp, C0715PAY.TXT.pgp
>
> main::(rmain.pl2): my $tmpfile = substr ($file, 0, index($file, ".pgp"));
>
> DB<> n
>
> DB<> x $tmpfile
>
> 0 'F0715PAY.TXT.pgp'
>
> DB<> /xfer/test/RDY
>
> main::(rmain.pl2): chomp($tmpfile);
>
> DB<> n
>
> main::(rmain.pl2): if (-e $tmpfile) {
>
> DB<> x $tmpfile
>
> 0  'F0715PAY.TXT'
>
> DB<> n
>
> main::(rmain.pl2): LogMsg (MSG => "Couldn't find $F0715PAY.TXT", Echo =>
> $debug);
>
>
>
> In a nutshell:
>
> If I hard code in a file that I know exists, then the conditional (-e
> filename) comes back true.
>
> If that same file name is passed to the conditional in variable form, then
> (-e $filename) and (-e "$filename") returns false.
>
> I also tried passing in the full path name, with no success.
>
> Yes, I do have permissions to read the file.
>
> The OS is AIX UNIX if that makes any difference.
>
>
>
> The "Send error message" includes email notification that the PGP
> unencryption didn't work, so it's critical I don't just blindly assume
that
> the PGP decryption worked.
>
> The "Do magic stuff" includes zipping and archiving the PGP file of to an
> archive directory.
>
>
>
> Any thoughts you anyone has would be greatly appreciated.
>
>
>
> Tim


See what happens if you don't quote the variable in your if statement and
use -f rather than -e.

Replace this:
if (-e "$tmpfile")

with this:

if (-f $tmpfile)


perldoc -q quoting
Found in /usr/lib/perl5/5.10/pods/perlfaq4.pod
       What's wrong with always quoting "$vars"?

       The problem is that those double-quotes force
stringification--coercing
       numbers and references into strings--even when you don't want them to
       be strings.  Think of it this way: double-quote expansion is used to
       produce new strings.  If you already have a string, why do you need
       more?

       If you get used to writing odd things like these:

               print "$var";           # BAD
               $new = "$old";          # BAD
               somefunc("$var");       # BAD

       You'll be in trouble.  Those should (in 99.8% of the cases) be the
       simpler and more direct:

               print $var;
               $new = $old;
               somefunc($var);

       Otherwise, besides slowing you down, you're going to break code when
       the thing in the scalar is actually neither a string nor a number,
but
       a reference:

               func([EMAIL PROTECTED]);
               sub func {
                       my $aref = shift;
                       my $oref = "$aref";  # WRONG
                       }

       You can also get into subtle problems on those few operations in Perl
       that actually do care about the difference between a string and a
       number, such as the magical "++" autoincrement operator or the
       syscall() function.

       Stringification also destroys arrays.

               @lines = `command`;
               print "@lines";     # WRONG - extra blanks
               print @lines;       # right


I hope this helps,
Ken Wolcott


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to