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

Reply via email to