in reply to Try::Tiny and -E

Because -E implicitly enables all optional features and builtins, which as of 5.40 includes The 'try' feature, and AFAICT that try requires a catch.

Replies are listed 'Best First'.
Re^2: Try::Tiny and -E
by 1nickt (Canon) on Dec 26, 2025 at 13:35 UTC

    Thank you.


    The way forward always starts with a minimal test.

      Ways to address this:

      • You can convert to using the builtin feature.

        $ perl -E'try { 1/0 } catch ( $e ) { }; say "ok"' # Using 5.40 ok
      • You can follow add no feature qw( try );

        $ perl -MTry::Tiny -E'no feature qw( try ); try { 1/0 }; say "ok"' ok
      • You can use an older version of the "language" (even if you're using the 5.40 interpreter).

        $ perl -Mv5.38 -MTry::Tiny -e'try { 1/0 }; say "ok"' ok

        (5.10 would suffice for this program.)


      As you might have noticed, -E isn't forward compatible. Your program would have worked with 5.38, but it doesn't with 5.40. If it's not a throwaway program, it's safer to use

      -e'use v5.xx; ...'
      or
      -Mv5.xx -e'...'
      instead of
      -E'...' # XXX Not forward-compatible.

        You *could* also do this:
        perl -MTry::Tiny -E 'Try::Tiny::try { 1 / 0 } Try::Tiny::catch { print $_ };'
        which (as expected) generates:
        Illegal division by zero at -E line 1.

        Hope that helps.

        Thank you.


        The way forward always starts with a minimal test.