in reply to open(), go away with bad way, or fail with the right way?

Hello hda,

LanX has answered your question, but I was somewhat surprised by the error message (which comes courtesy of use strict;, BTW), since it appears that $fh is already declared when the die code is parsed. Deparsing shows what’s going on: or is (apparently) rewritten as unless, which places the $fh in the die clause before its declaration in the call to open:

22:56 >perl -MO=Deparse -Mstrict -we "my $file = 'x'; open (my $fh, '< +', $file) or die qq[Can't open $fh];" Global symbol "$fh" requires explicit package name (did you forget to +declare "my $fh"?) at -e line 1. -e had compilation errors. BEGIN { $^W = 1; } use strict; my $file = 'x'; die "Can't open ${'fh'}" unless open my $fh, '<', $file; 22:56 >

Hope that’s of interest,

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: open(), go away with bad way, or fail with the right way?
by Anonymous Monk on May 31, 2019 at 14:43 UTC

    Perl makes "my" variables available in the statement after the "my". This allows things like

    my $foo = 'Bar'; my $foo = $foo x 2; say $foo; # 'BarBar'

    No, I do not defend this as a coding practice -- I'm just trying to elucidate how Perl works.

      "...This allows things like..."

      Yes and no:

      #!/usr/bin/env perl use strict; use warnings; use feature qw(say);; my $foo = 'Bar': my $foo = $foo x 2; say $foo; __END__

      Perl allows it generously but then it complains about  "my" variable $foo masks earlier declaration in same scope at ./foo.pl line 8..

      Iznogoud. But in a block it works flawless - no surprise:

      KARL : { my $foo = $foo x 2; say $foo; }

      But why the effort? You could say $foo x= 2; which results in BarBar. If this is what you wanted. What i assume.

      Best regards, Karl

      «The Crux of the Biscuit is the Apostrophe»

      perl -MCrypt::CBC -E 'say Crypt::CBC->new(-key=>'kgb',-cipher=>"Blowfish")->decrypt_hex($ENV{KARL});'Help

        "But why the effort?"

        It's only a demo. If you read the thread, it would be obvious.

      It's pretty useful in nested scopes and closures.

      For instance

      my $level = $level + 1;

Re^2: open(), go away with bad way, or fail with the right way?
by BillKSmith (Monsignor) on May 31, 2019 at 13:40 UTC
    Very Strange, But if it worked the way I expect, perl would not have found the error.
    Bill