use warnings; and use Warnings; give different results

T

Ted Sung

D:\perl_scripts>perl -v
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

I have the following simple/trivial script, test.pl:

use strict;
use Warnings;
use Cwd;

When I run this as perl -w test.pl, I get the following:

D:\perl_scripts>perl -w test2.pl
Subroutine bits redefined at d:/perl/lib/warnings.pm line 285.
Subroutine import redefined at d:/perl/lib/warnings.pm line 304.
Subroutine unimport redefined at d:/perl/lib/warnings.pm line 314.
Subroutine __chk redefined at d:/perl/lib/warnings.pm line 325.
Subroutine enabled redefined at d:/perl/lib/warnings.pm line 373.
Subroutine warn redefined at d:/perl/lib/warnings.pm line 386.
Subroutine warnif redefined at d:/perl/lib/warnings.pm line 400.

Strangely, if I change the upper case 'W' to w so the script is like
this:

use strict;
use warnings;
use Cwd;

I don't see these warnings.

Also, if I remove the 'use Cwd;' line, I don't get any warnings
regardless of the case of 'W'.

What is going on here?

Thanks,

Ted
 
S

Sherm Pendley

Ted said:
D:\perl_scripts>perl -v
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

I have the following simple/trivial script, test.pl:

use strict;
use Warnings;
use Cwd;

When I run this as perl -w test.pl, I get the following:

D:\perl_scripts>perl -w test2.pl
Subroutine bits redefined at d:/perl/lib/warnings.pm line 285.
Subroutine import redefined at d:/perl/lib/warnings.pm line 304.
Subroutine unimport redefined at d:/perl/lib/warnings.pm line 314.
Subroutine __chk redefined at d:/perl/lib/warnings.pm line 325.
Subroutine enabled redefined at d:/perl/lib/warnings.pm line 373.
Subroutine warn redefined at d:/perl/lib/warnings.pm line 386.
Subroutine warnif redefined at d:/perl/lib/warnings.pm line 400.

Strangely, if I change the upper case 'W' to w so the script is like
this:

use strict;
use warnings;
use Cwd;

I don't see these warnings.

Also, if I remove the 'use Cwd;' line, I don't get any warnings
regardless of the case of 'W'.

What is going on here?

Case-insensitive file system. The name of the module as given in the
'use' statement is cached in %INC, so the module only gets parsed once.
The 'Cwd' module has 'use warnings', and in your second example
'warnings.pm' isn't loaded again because you've already loaded it.

In the first example, you (incorrectly) refer to it as Warnings, which
causes perl to read and parse 'Warnings.pm'. When Cwd's 'use warnings'
is found, 'warnings.pm' is loaded. But on a case-insensitive file
system, those are the same file; so you get 'Subroutine ... redefined'
warnings.

Avoid the warnings by correctly spelling the name of the module: It's
'warnings', as in your second example.

sherm--
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top