R__
R__

Reputation: 1531

"Null filename used" error

#!/usr/bin/perl

{
my $file = shift;                                                                     
print $file;
require $file;
}

run as ./arg /root/perl/arg getting:

Null filename used at /root/perl/arg line 13.
Compilation failed in require at ./arg line 6.

But the file actually exists,why ??

Upvotes: 2

Views: 979

Answers (4)

Sai
Sai

Reputation: 1

Another way i found it to work is to give the complete path to the package in the require statement.

Upvotes: 0

benrifkah
benrifkah

Reputation: 1576

The problem is that you're doing 2 requires. You've assumed that the "Null filename" error is coming from the first one but its actually coming from the second one.

The first require is in the code you posted at line 6. It gets the value that you passed on the command line" "/root/perl/arg". The second require is in "/root/perl/arg" on line 13. This is not getting a value for some reason. When it gets no value it dies with a "Null filename" error. Then execution goes back to the require at line 6 and perl reports that "Compilation failed".

Here is a modified version of your code that explains what's happening as it goes:

$main::runcount++;
{
  print "beginning run number $main::runcount\n";
  print "\tARGV has ", scalar @ARGV, " arguments\n";
  my $file = shift;
  print "\tabout to require file `$file`\n";
  require $file;
}
1;

And here's the output when I run it with itself as the only argument:

~$ perl arg arg
beginning run number 1
        ARGV has 1 arguments
        about to require file `arg`
beginning run number 2
        ARGV has 0 arguments
        about to require file ``
Null filename used at arg line 9.
Compilation failed in require at arg line 9.

From this its clear that the "Null filename" error is generated by the second require.

For fun I ran the script passing it's own name twice:

~$ perl arg arg arg
beginning run number 1
        ARGV has 2 arguments
        about to require file `arg`
beginning run number 2
        ARGV has 1 arguments
        about to require file `arg`

Here you can see that the second run of the script is able to get a value from @ARGV. However, since "arg" was already required we don't get a third run.

Upvotes: 0

Dallaylaen
Dallaylaen

Reputation: 5318

Here's a minimal example code to reproduce your error messages. The actual error in not on the -e line, but in nullfn.pm. You're probably trying to use empty string (undef?) in require on line 13 of the included file (/root/perl/arg). The calling file (./arg) is OK.

-bash$ cat nullfn.pm 
#!/usr/bin/perl -w
require "";
1;
-bash$ perl -we 'require nullfn;'
Null filename used at nullfn.pm line 3.
Compilation failed in require at -e line 1.

Upvotes: 0

Kerrek SB
Kerrek SB

Reputation: 477512

You have to call your program with one command-line argument:

./getting myfilename

Otherwise you're trying to shift into a non-existent variable!

An alternative would be to refer to the argument directly and add a check:

my $num_args = $#ARGV + 1;

if ($num_args != 1)
{
  print "Error!";
  exit;
}

my $file = $ARGV[0];

Upvotes: 1

Related Questions