Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

comment on

( #3333=superdoc: print w/replies, xml ) Need Help??

Obviously, you found out the following already, but here it's for those reading along:

IP::Country::Fast puts its database files (aptly named with a .gif extension -- what the...?) into the lib/ hierarchy of the distribution. This has the result that they're installed into the normal Perl library paths along with the code.

Now, this is an inexplicably bad thing to do. You don't want arbitrary data cruft to reside in your library tree. But it gets worse. In order to *find* that file, the module goes on to access the place where IP::Country::Fast has been loaded from using $INC{"IP/Country/"}. This breaks in the PAR context (and always will) because the module *might not even have been loaded from a file*, but from memory after unzipping from the PAR archive!

There are several solutions to this. One would be to put the database (in base64 encoded form or similar) into the __DATA__ section of a real .pm file and simply load that and ask it for its *DATA file handle. This is what's done with PAR::StrippedPARL::* for example.

Another solution -- the elegant one -- is to NOT put that database in the lib/ hierarchy at all but to include it as a shared file. For details, check out the documentation of the excellent File::ShareDir module and specifically the section about using it for module-specific data. Now, to make this PAR-packaging friendly, you simply use the File::ShareDir::PAR wrapper of File::ShareDir instead which knows how to access such shared data files from PAR archives.

If all these solutions seem too difficult, then you should try to think about what makes them difficult. There is no good separation of code/logic and data where there should be a separation. CPAN distributions have never been very good at this and the File::ShareDir approach is an attempt to fix that. PAR is put in a much more problematic position again because it suddenly has to deal with that separation as well. It was devised mostly for dealing with logic.

To sum this up, this is a problem that requires an upstream solution. I very much doubt you can fix it in PAR/pp.


In reply to Re^2: IP::Country::Fast library by tsee
in thread IP::Country::Fast library by edatawiz

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or or How to display code and escape characters are good places to start.
Log In?

What's my password?
Create A New User
Domain Nodelet?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2022-01-18 10:17 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (52 votes). Check out past polls.