Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re^5: can't import using exporter

by chromatic (Archbishop)
on Mar 13, 2012 at 05:31 UTC ( #959237=note: print w/replies, xml ) Need Help??

in reply to Re^4: can't import using exporter
in thread can't import using exporter

You're doing this the hard way.

Put each module in a separate file. Use use. Things will magically just work, because that's how they were designed to work.

To make things work your way, you'll have to declare our variables outside of the BEGIN block and then, within a BEGIN block, assign to them. You're going to have a hard time getting things to work by randomly adding braces and blocks and little bits of syntax.

Replies are listed 'Best First'.
Re^6: can't import using exporter
by perl-diddler (Hermit) on Mar 14, 2012 at 06:57 UTC
    I don't want to put define class point{ my x; my y; }

    in a separate file.

    I have 5-10 line modules that if I put in a separate file will multiple my work by 100%...

    You don't split things to a separate file till at least 1000 in many cases, and I've seen manageable files in the 2-3k range, though 5k gets a bit unwieldy....

    I have programs with 10 modules in 300 lines, and I should break them into 30 line modules each just because perl is broken?

    So far every method that everyone "knows" works, doesn't in 5.14, and that one guy wants to claim 5.14 isn't broken (worse than 5.12 and 5.12 -- which were also broken in various ways)...

    It's not like I haven't reported multiple bugs/RFE's...Usually met with resistance about not wanting to change the established order for fear of breaking existing code -- but I've got code broken by every perl upgrade since 5.6. Before that -- virtually nada (at least in the 5.x series).

    I've been told on the perl-porters list that they way I am doing things should work just fine with import and such...

    yet no one here seems to be able to make it work either.

    Hopefully grandfather who's on that list will take note.

    If I have to break it into separate files, then the language is broken.

    packages are meant to be modular. They aren't. I complained and was told all I needed to do was use import.

    I keep running into new problems in each new vversion.

    (I have had some programs that worked in 5.12, but fail now in 5.14)...

    So I wanted to make sure I wasn't missing *some* solution, that would work - before I go and file another bug about .. well... not sure!...

    modules don't work?

    I wanted 'use module' not try to include a module if it was in the same file... I got thoroughly roasted for that idea... yet it is so simple, but my guess is they can't make it work.

    If it worked that way, then a package could be removed anytime, and it would work in a libdir the same as in program.

    But doesn't even work at all.

    Sorry. Breaking apart a 800 line perl prog that was a 185 line shell script , into a 10-15 file perl monster is messed up.

    These are not standalone packages -- they are mutually dependent classes. You don't put such things with dependent functionality in multiple files or your development becomes a nightmare finding what file you are supposed to be in.

      Extraordinary claims require extraordinary evidence.

      So far, all you have shown are two snippets that don't compile and a huge program that you obviously did not care to cut down to the problem. I've reduced your program to the following, self-contained program and noted where I added BEGIN blocks to make all symbols appear in the order which use would make appear them in as well:

      #!/usr/bin/perl -w use 5.12.0; use warnings FATAL => 'all'; BEGIN { # Added this because that's how "use" works package Debug;{ use Exporter 'import'; our @EXPORT=qw( Debug $Filename2Fields); my %dop = ( Filename2Fields => 1, HaltOnError => 2, ); our $Filename2Fields= $dop{Filename2Fields}; our $HaltOnError = $dop{HaltOnError}; sub Debug($$) { my ($what, $str)=@_; print STDERR $str; } }; } BEGIN { # Added this because that's how "use" works package Transcode_plug;{ use strict; use Exporter 'import'; BEGIN { Debug->import() }; our @EXPORT=qw( album get_fieldAR_from_filename ); sub album {}; sub get_fieldAR_from_filename($) { my $file=$_[0]; Debug($Filename2Fields,"get_fieldAR_from_filename($file)\n"); } }; } package main; BEGIN { Transcode_plug->import; }; print "Main is running\n"; # Now see that even prototype parsing works properly: print "OK\n"; get_fieldAR_from_filename "Foo"; # vim: ts=2 sw=2

      It behooves you well to put more effort into making your findings reproducible, especially when nobody else seems to be able to reproduce your problem.

      Also, you may be interested in App::fatpacker, which packs a script and its modules into one monolithic file.

        The above, today would be written more naturally, like:
        #!/usr/bin/perl -w { package Debug; use warnings; use strict; our (@ISA,@EXPORT,$DBGOPS); use mem; use mem(@ISA=qw(Exporter), @EXPORT=qw( Debug Filename2Fields HaltOnE +rror); use Exporter; use P; use constant Filename2Fields => 1; use constant HaltOnError => Filename2Fields << 1; sub Debug($$;@) { shift & $DBGOPS && Pe shift,@_ } 1}; ################################################### { package Transcode_plug; use warnings; use strict; our (@ISA, @EXPORT); use mem; use mem(@ISA=qw(Exporter), @EXPORT=qw( album get_fieldAR_from_filena +me); use Exporter; use Debug; sub album() {$_[0]->}; sub get_fieldAR_from_filename($) { Debug(Filename2Fields, "get_fieldAR_from_filename(%s)", $_[0]); } 1} ##################################################### package main; use Transcode_plug; use P; P "Main is running"; # Now see that even prototype parsing works properly: P "OK"; get_fieldAR_from_filename "Foo";

        No BEGIN's in sight, and a natural 'use module' syntax the same as one would use them if they were in separate files.

        A few other things would be simpler as well, but they aren't in a form to be published yet...

        I do learn...

        using mem with Exporter as I did above, also exports the prototypes.

        May not be perfect, but looks tidier than using BEGIN blocks and the modules have the benefit of being easily put into separate files with no code changes.


        The entire program was included for anyone who wanted to reproduce the problem. If no one could reproduce the problem, it is because they didn't try. Not because the source wasn't there.

        Every workaround and suggestion to fix the problem didn't work. I'd say it wasn't a trivial problem.

        In fact chromatic, a veteran perler admitted, that it'd be too ugly to do it the way you did it.

        But thanks for proving the concept. It will useful on more than one level -- including on a reason why

        'use module' should simply do it's import mechanics on packages already defined in the current file.

        But believe me, I appreciate the example.

      I have programs with 10 modules in 300 lines, and I should break them into 30 line modules each just because perl is broken?

      Perl is working exactly as documented. There's at least one question a week here about how this all works, and every time the answer is the same.

      I wanted 'use module' not try to include a module if it was in the same file...

      How is that to work? Is the compiler to guess that subsequent code in the file will declare a package? Is the compiler to process the entire file once, looking for package statements, and only then start compiling the code?

      You don't put such things with dependent functionality in multiple files or your development becomes a nightmare finding what file you are supposed to be in.

      Sure I do, and I don't have these nightmare debugging problems you do.

      Just a raw guess: Your "version control system" is called copy or cp and it does not scale to more than one file per project. Do you still live in the 1960s? Learn about git and subversion, both will solve that problem, and both scale to more source files than you ever need to use. Welcome to the 21st century!


      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

        Can you explain how you arrived at such a nonsensical conclusion?

        I've tried splitting a project early on into modules,

        it was a constant bother trying to find where a routine was -- in this window or that window -- is a window with that file even open? 'edit' -- oops -- file is being doubly diddled -- half the time on my other machine ---- so it's not listed with the same group as the other files... but those are minor oopses..

        The time wasted finding functions that need to be updated or interfaces that need to be updated/changed over multiple files because they are just being fleshed out and not really really to be split -- or really weren't designed to exist independently, but were, because perl can't easily have multiple classes in 1 file (as is demonstrated in the **beginner** books on perl OOP (Intermediate Perl).).

        The introduction to classes by the experts doesn't demonstrate using "use" to use other Class objects. It shows them all in one file. That's the starting point that almost nothing follows afterwards.

        Yet that's the first book (or it's predecessor by a different title), on perl classes and packages that someone would be likely to read. Yet nothing in perl works that way.

        You don't see a problem with that?

        Why doesn't anyone program the way Schwartz & bdfoy, and t.phoenix demonstrated? Do Schartz and bdFoy know nothing about perl.

        Why would the perl community support a perl that burns anyone who programs they way Schwartz and bdFoy taught? That's not to say they use that paradigm for everything, but for Dog says bark, and Cow says moo, separating things into 5 separate files would turn off anyone.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://959237]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (1)
As of 2017-03-26 10:45 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (315 votes). Check out past polls.