in reply to problem with repeating function

In perl OOP, a constructor generally blesses a newly created object, so the object "knows" in which package it lives. Read bless

The error message you got

Undefined subroutine &hc_url::call_httpd_exec called at /exlibris/meta +lib/m4_b/d +at01/vir_ext/hc_url.pm line 166.

tells you that the routine call_httpd_exec was looked up in package hc_url, which is not what you expected - not in package demo nor in package demo2.

Read perltoot.

--shmem

_($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                              /\_¯/(q    /
----------------------------  \__(m.====·.(_("always off the crowd"))."·
");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

Replies are listed 'Best First'.
Re^2: problem with repeating function
by mrguy123 (Hermit) on Sep 04, 2006 at 11:37 UTC
    The error message:
    Undefined subroutine &hc_url::call_httpd_exec called at /exlibris/meta +lib/m4_b/d +at01/vir_ext/hc_url.pm line 166.
    is for my real program. The error code for my demo programs is :
    Undefined subroutine &wrapper::call_httpd_exec called at demo.pm line +8.
    hc_url isn't used. Does this change your answer?
      Yes, the part w/regard to the error message changes.

      You do a require "wrapper" in package demo and in package demo2. demo2 is used by demo. The use means, that demo2 is compiled and executed before demo is even compiled to end.

      The docs for require state, that require doesn't include a file twice.

      So, wrapper is already loaded via demo2, so it lives in demo2. The require in demo just returns 1, no file is loaded. You'll see that your code works if you change call_httpd_exec in demo to demo2::call_httpd_exec.

      <update>
      OTOH, if you wrap require "wrapper" in demo into a BEGIN block and place it before use demo2, then the call to call_httpd_exec will fail in demo2, since it now lives in demo.

      Read require, use, again perltoot, perlmod, there BEGIN , CHECK, INIT and END... there are also modules which implement automatic exportation of functions, e.g. Spiffy.
      </update>

      --shmem

      _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                    /\_¯/(q    /
      ----------------------------  \__(m.====·.(_("always off the crowd"))."·
      ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}
        Thanks a lot, your answer was very helpful, and it solved my problem until I figure out a better way to use this function (I might change it to a mudule).
        Cheers,
        Guy Naamati