Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

require "shared.pl" with use strict;

by DizietSma (Initiate)
on Feb 19, 2015 at 16:49 UTC ( [id://1117238]=perlquestion: print w/replies, xml ) Need Help??

DizietSma has asked for the wisdom of the Perl Monks concerning the following question:

I'm following http://www.perlmonks.org/?node_id=619554 but can't get it to work when use strict; is in place. Could any of the masters here please enlighten this confused initiate? The errors Perl is reporting are

Global symbol "$testVal" requires explicit package name at ./test.pl line 8.
Global symbol "@testArray" requires explicit package name at ./test.pl line 10.
Global symbol "@testArray" requires explicit package name at ./test.pl line 12.
Global symbol "@testArray" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.

My code is

test.pl

#!/usr/bin/perl -T use warnings; use strict; require "./shared.pl"; print $testVal; for my $i (0 .. (scalar(@testArray)-1)) { print $testArray[$i][0] . " = " . $testArray[$i][1] . "\n"; };

shared.pl

use base qw (Exporter); our @EXPORT = qw(testVal testArray); my $testVal = "hello world\n"; my @testArray = ( ["Shadow", "Blinky"], ["Speedy", "Pinky"], ["Bashful", "Inky"], ["Pokey", "Clyde"] ); 1;

Replies are listed 'Best First'.
Re: require "shared.pl" with use strict;
by choroba (Cardinal) on Feb 19, 2015 at 16:53 UTC
    Please, fix the link:
    [id://619554] ->Include subs from different perl file

    Also, you cannot export lexical variables (declared with my). You can export package global variables (declared with our), but it's not recommended. It seems the thread mentions it.

    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      Link updated.
      What is the best way to import values from a shared file?
        No, you should use [id://NUMBER] to link to other nodes. See What shortcuts can I use for linking to other information?.

        The preferred thing to export from a module is a subroutine. Or, alternatively, you can switch to the object oriented approach.

        Shared.pm:

        package Shared; use warnings; use strict; use Exporter qw{ import }; our @EXPORT_OK = qw{ test_val test_list }; sub test_val { "hello world\n" } sub test_list { ( [ 'Shadow', 'Blinky' ], [ 'Speedy', 'Pinky' ], [ 'Bashful', 'Inky' ], [ 'Pokey', 'Clyde' ], ) } __PACKAGE__

        test.pl:

        #!/usr/bin/perl use warnings; use strict; use Shared qw{ test_val test_list }; print test_val(); for my $pair (test_list()) { print "@$pair\n"; }

        Object oriented

        Shared_OO.pm:
        package Shared_OO; use warnings; use strict; sub new { my $class = shift; bless { test_val => "hello world\n", test_list => [ [ 'Shadow', 'Blinky' ], [ 'Speedy', 'Pinky' ], [ 'Bashful', 'Inky' ], [ 'Pokey', 'Clyde' ], ], }, $class } sub test_val { shift()->{test_val} } sub test_list { @{ shift()->{test_list} } } __PACKAGE__

        test_oo.pl:

        #!/usr/bin/perl use warnings; use strict; use Shared_OO; my $o = 'Shared_OO'->new; print $o->test_val; for my $pair ($o->test_list) { print "@$pair\n"; }
        لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: require "shared.pl" with use strict;
by vinoth.ree (Monsignor) on Feb 19, 2015 at 17:45 UTC

    In general, when you are working with multiple files, and importing variables between them, you will find that requiring files ends up getting a bit complicated as your project grows. This is due to everything sharing a common namespace, but with some variables declared in some files but not others.

    The usual way this is resolved in Perl is to create modules, and then import from those modules.


    All is well. I learn by answering your questions...
      From the error message posted. I believe the compiler is complaining that some variables where not created using the my() operator, Hence that error. Make sure all variables or those that need to be lexical are declared using the my() operator. I believe that would save you alot of stress because you have said (use strict) hence those errors. Also make sure there are no conflicts between your variable names and those imported from other modules or required file names. Thats my little thought base on the posted error message. Hope this helps. Should i be wrong please correct me.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1117238]
Approved by Old_Gray_Bear
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having an uproarious good time at the Monastery: (6)
As of 2024-04-16 13:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found