in reply to Re^3: Is require still required?
in thread Is require still required?

If it would be unreliable, it should fail sometimes - but it doesn't, ....

I am pretty sure that Toby meant "unreliable" as in "the return value depends on whether that file had already been required before".

Let me expand his example a bit:

use strict; use warnings; use autodie; use File::Temp qw/ tempfile /; use Data::Dump; my ($fh, $filename) = tempfile(); print $fh qq('Hello, world';\n); close $fh; my $first = require $filename; dd $first; my $second = require $filename; dd $second;

Output:

"Hello, world"
1

Replies are listed 'Best First'.
Re^5: Is require still required?
by shmem (Chancellor) on Feb 03, 2024 at 11:07 UTC

    This is all stated in the documentation for require, inclusive the role of %INC:

    if (exists $INC{$filename}) { return 1 if $INC{$filename}; croak "Compilation failed in require"; }

    To import a fle more than once you have to delete from %INC of course.

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
      > To import a fle more than once you have to delete from %INC of course.

      Or use a different path to it (I've seen this in production, don't ask).

      My.pm:

      package My; use warnings; use strict; our $counter //= 10; ++$counter

      script.pl

      #!/usr/bin/perl use warnings; use strict; use feature qw{ say }; use lib './'; say require My; # 11 say require 'My.pm'; # In %INC, returns 1. say require './My.pm'; # Not in %INC, thus 12!

      map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]
        > (I've seen this in production, don't ask).

        Yes, because keys in %INC are the paths.

        Edit
        But if I wanted to reload the required file, I'd rather use an explicit %INC hook doing it explicitly without leaving a key at all.

        Though I have trouble imagining a use case...

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        see Wikisyntax for the Monastery