Loading ...
Sorry, an error occurred while loading the content.

Why is @ISA not searched?

Expand Messages
  • Hans Ginzel
    Hello, I have on perl module called Bb.pm: package Bb; sub bb { warn bb ; } 1; and a programm called c.pl: require Bb; @ISA = qw(Bb); bb(); When I invoke perl
    Message 1 of 13 , Dec 3, 2003
    • 0 Attachment
      Hello,

      I have on perl module called Bb.pm:

      package Bb;

      sub bb { warn "bb"; }

      1;

      and a programm called c.pl:

      require Bb;

      @ISA = qw(Bb);

      bb();

      When I invoke

      perl c.pl

      I get

      Undefined subroutine &main::bb called at c.pl line 5.

      Why is the @ISA array not searched and/or the Bb::bb() not found?

      Best regards

      Hans

      --
      The Federal Judiciary's national IT infrastructure
      is migrated to a Linux/Intel platform
      http://www.businesswire.com/cgi-bin/f_headline.cgi?bw.111903/233235172&ticker=PECS
      Perl won the Linux Journal Editors' Choice Award :-)
      http://www.linuxjournal.com/article.php?sid=6868
      VIM is the Favorite Text Editor
      (Linux Journal Readers' Choice Awards) :-)
      http://www.linuxjournal.com/article.php?sid=7029
    • merlyn@stonehenge.com
      ... Hans Why is the @ISA array not searched and/or the Bb::bb() not found? @ISA is for objects, not just a general subroutine search path. See perldoc
      Message 2 of 13 , Dec 3, 2003
      • 0 Attachment
        >>>>> "Hans" == Hans Ginzel <hans@...> writes:

        Hans> Why is the @ISA array not searched and/or the Bb::bb() not found?

        @ISA is for objects, not just a general subroutine search path.

        See "perldoc perlboot" for info on how to start with objects
        and how to use @ISA.

        --
        Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
        <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
        Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
        See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
      • Hans Ginzel
        ... Thank you for a quick answer. ... How it works when Exporter is used? Program uses module which does not have it s import() but requires Exporter and has
        Message 3 of 13 , Dec 3, 2003
        • 0 Attachment
          On Wed, Dec 03, 2003 at 03:31:12AM -0800, merlyn@... wrote:
          > @ISA is for objects, not just a general subroutine search path.

          Thank you for a quick answer.

          > See "perldoc perlboot" for info on how to start with objects
          > and how to use @ISA.

          How it works when Exporter is used?

          Program uses module which does not have it's import() but requires
          Exporter and has set @ISA=qw(Exporter). Why is then the
          Exporter::import() called? (There are no objects.)
          It's the setting of @ISA relevant for this? Or are there other tricks?

          Best regards
          Hans
        • merlyn@stonehenge.com
          ... Hans How it works when Exporter is used? Exporter is not related to @ISA at all. They are different mechanisms. Please read perlboot and perlmod. --
          Message 4 of 13 , Dec 3, 2003
          • 0 Attachment
            >>>>> "Hans" == Hans Ginzel <hans@...> writes:

            Hans> How it works when Exporter is used?

            Exporter is not related to @ISA at all. They are different mechanisms.
            Please read perlboot and perlmod.

            --
            Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
            <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
            Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
            See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
          • Hans Ginzel
            ... I read allmost all perl* pages. I want to perfectly understand the Eporter different mechanisms. There is in the SYNOPSIS section of Exporter package
            Message 5 of 13 , Dec 3, 2003
            • 0 Attachment
              On Wed, Dec 03, 2003 at 05:18:22AM -0800, merlyn@... wrote:
              > Exporter is not related to @ISA at all. They are different mechanisms.
              > Please read perlboot and perlmod.

              I read allmost all perl* pages. I want to perfectly understand the
              Eporter "different" mechanisms.

              There is in the SYNOPSIS section of Exporter

              package ModuleName;
              require Exporter;
              @ISA = qw(Exporter);

              That is why the Exporter::import() is used when module defines none.
              But there are no "objects" (= noyhing is blessed()).

              There is in Exporter/Heavy.pm

              @failed = $pkg->export_fail(@failed)

              so the export_fail routine form the module resp. form the Exporter would
              be called. So I understand that $pkg, which is the first parametr of
              import() -- the Module name, is "automaticly blessed" to the module.
              Is the @ISA mechanisms just for the import() or supports it also something
              more?

              Regards
              Hans Ginzel
            • merlyn@stonehenge.com
              ... Hans There is in the SYNOPSIS section of Exporter Hans package ModuleName; Hans require Exporter; Hans @ISA = qw(Exporter); Hans That is why the
              Message 6 of 13 , Dec 3, 2003
              • 0 Attachment
                >>>>> "Hans" == Hans Ginzel <hans@...> writes:

                Hans> There is in the SYNOPSIS section of Exporter

                Hans> package ModuleName;
                Hans> require Exporter;
                Hans> @ISA = qw(Exporter);

                Hans> That is why the Exporter::import() is used when module defines none.

                Because "use Foo qw(aaa bbb)" translates into:

                BEGIN {
                require Foo;
                Foo->import(qw(aaa bbb));
                }

                Note the method call there. Note that this means that Foo @ISA Exporter
                to define "import".

                --
                Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
                <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
                Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
                See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
              • Jeff 'japhy' Pinyan
                ... The way Exporter works (in most cases) is like so: package Foo; require Exporter; @ISA = qw( Exporter ); # Foo is going to inherit Exporter s import()
                Message 7 of 13 , Dec 3, 2003
                • 0 Attachment
                  On Dec 3, Hans Ginzel said:

                  > I read allmost all perl* pages. I want to perfectly understand the
                  >Eporter "different" mechanisms.
                  >
                  > There is in the SYNOPSIS section of Exporter
                  >
                  > package ModuleName;
                  > require Exporter;
                  > @ISA = qw(Exporter);
                  >
                  >That is why the Exporter::import() is used when module defines none.
                  >But there are no "objects" (= noyhing is blessed()).

                  The way Exporter works (in most cases) is like so:

                  package Foo;
                  require Exporter;
                  @ISA = qw( Exporter ); # Foo is going to inherit Exporter's import()
                  @EXPORT = qw( bar );
                  sub bar { return "some string" }
                  1;

                  When you use Foo in a program with

                  use Foo;

                  what you're actually doing is saying

                  # this happens at compile-time
                  BEGIN {
                  require Foo;
                  Foo->import;
                  }

                  That is a CLASS METHOD call; Foo->import is calling Foo's 'import' method.
                  As shown above, Foo inherits (an object oriented term) Exporter's 'import'
                  method. When Foo->import happens, it calls the 'import' method with its
                  first argument being 'Foo' (the name of the class invoking the method).
                  This causes Exporter::import('Foo') to be called. The import method looks
                  at its first argument, and get's that package's @EXPORT array, and then
                  uses symbol aliasing to make an alias of the things (variables and
                  functions) in @EXPORT in the CALLING package (the place where the 'use'
                  occurred).

                  So, if, in package 'main', we write 'use Foo', then the package Foo's
                  'import' method is called. This actually calls Exporter::import('Foo'),
                  which reads @Foo::EXPORT for a list of symbols to export to 'main'. The
                  result is &main::bar is an alias for &Foo::bar.

                  --
                  Jeff "japhy" Pinyan japhy@... http://www.pobox.com/~japhy/
                  RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/
                  <stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
                  [ I'm looking for programming work. If you like my work, let me know. ]
                • Hans Ginzel
                  ... Oh, so. In the perldoc -f use there is: use Module LIST It is exactly equivalent to BEGIN { require Module; import Module LIST; } except that Module must
                  Message 8 of 13 , Dec 3, 2003
                  • 0 Attachment
                    On Wed, Dec 03, 2003 at 07:25:19AM -0800, merlyn@... wrote:
                    > Hans> @ISA = qw(Exporter);

                    > Because "use Foo qw(aaa bbb)" translates into:
                    > BEGIN {
                    > require Foo;
                    > Foo->import(qw(aaa bbb));
                    > }

                    Oh, so.

                    In the perldoc -f use there is:

                    use Module LIST

                    It is exactly equivalent to

                    BEGIN { require Module; import Module LIST; }

                    except that Module must be a bareword.

                    Half page later

                    The "import" is not a builtin--it's just an
                    ordinary static method call into the "Module"
                    package to tell the module to import the list of
                    features back into the current package. The mod-
                    ule can implement its "import" method any way it
                    likes, ...

                    It would be good, if your above explanation would be
                    in the perlfunc manual page.

                    Relevant an interesting is also the second paragraph under
                    "The Arrow Operator" in perlop. It sais, that Class->method()
                    or PackageName->subroutine() respectively
                    could be used "without blessing".


                    Thank you

                    Hans Ginzel
                  • merlyn@stonehenge.com
                    ... Hans It is exactly equivalent to Hans BEGIN { require Module; import Module LIST; } Hans except that Module must be a bareword. Hans Half page later
                    Message 9 of 13 , Dec 4, 2003
                    • 0 Attachment
                      >>>>> "Hans" == Hans Ginzel <hans@...> writes:

                      Hans> It is exactly equivalent to

                      Hans> BEGIN { require Module; import Module LIST; }

                      Hans> except that Module must be a bareword.

                      Hans> Half page later

                      Hans> The "import" is not a builtin--it's just an
                      Hans> ordinary static method call into the "Module"
                      Hans> package to tell the module to import the list of
                      Hans> features back into the current package. The mod-
                      Hans> ule can implement its "import" method any way it
                      Hans> likes, ...

                      Hans> It would be good, if your above explanation would be
                      Hans> in the perlfunc manual page.

                      Uh, where do you think I got what I said? It's identical. How
                      is my explanation *not* on the manpage?

                      --
                      Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
                      <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
                      Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
                      See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
                    • Hans Ginzel
                      Hello, ... I did not say, that it is *not* in the manpage. I am saying, it could be there *better*. :-) Instaed of BEGIN { require Module; import Module LIST;
                      Message 10 of 13 , Dec 4, 2003
                      • 0 Attachment
                        Hello,

                        On Thu, Dec 04, 2003 at 03:48:15AM -0800, merlyn@... wrote:
                        > > It would be good, if your above explanation would be
                        > > in the perlfunc manual page.
                        >
                        > Uh, where do you think I got what I said? It's identical. How
                        > is my explanation *not* on the manpage?

                        I did not say, that it is *not* in the manpage. I am saying, it could
                        be there *better*. :-)
                        Instaed of

                        BEGIN { require Module; import Module LIST; }

                        on the top of perldoc -f use
                        and 30 rows later _in the middle of the paragraph_

                        The "import" is not a builtin--it's just an
                        ordinary static method call into the "Module"
                        package to tell the module to import the list of

                        could be there your explanation

                        BEGIN { require Module; Module->import Module LIST; }

                        showing just from this line, that import is called form the Module,
                        that @ISA mechanism is used because of '->'. The explanation sentence
                        could be then ligthly modified.

                        Thank you for your answers

                        Hans Ginzel
                        --
                        This is perl, v5.8.0 built for i386-linux-thread-multi




                        >
                        > --
                        > Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
                        > <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
                        > Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
                        > See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
                        >
                        >
                        > Unsubscribing info is here: http://help.yahoo.com/help/us/groups/groups-32.html
                        >
                        > Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
                        >

                        --
                        The Federal Judiciary's national IT infrastructure
                        is migrated to a Linux/Intel platform
                        http://www.businesswire.com/cgi-bin/f_headline.cgi?bw.111903/233235172&ticker=PECS
                        Perl won the Linux Journal Editors' Choice Award :-)
                        http://www.linuxjournal.com/article.php?sid=6868
                        VIM is the Favorite Text Editor
                        (Linux Journal Readers' Choice Awards) :-)
                        http://www.linuxjournal.com/article.php?sid=7029
                      • merlyn@stonehenge.com
                        ... Hans I did not say, that it is *not* in the manpage. I am saying, Hans it could be there *better*. :-) You *do* realize that import Module LIST *is*
                        Message 11 of 13 , Dec 4, 2003
                        • 0 Attachment
                          >>>>> "Hans" == Hans Ginzel <hans@...> writes:

                          Hans> I did not say, that it is *not* in the manpage. I am saying,
                          Hans> it could be there *better*. :-)

                          You *do* realize that

                          import Module LIST

                          *is*

                          Module->import(LIST)

                          correct?

                          That's why I'm saying it's *already* there. I didn't say *anything*
                          that wasn't already in the manpage.

                          --
                          Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
                          <merlyn@...> <URL:http://www.stonehenge.com/merlyn/>
                          Perl/Unix/security consulting, Technical writing, Comedy, etc. etc.
                          See PerlTraining.Stonehenge.com for onsite and open-enrollment Perl training!
                        • Hans Ginzel
                          ... Thank you. So when I invoke the routine in a object way , the @ISA would be searched: main- routine(); I read also the perlobj page and found how to
                          Message 12 of 13 , Dec 16, 2003
                          • 0 Attachment
                            On Wed, Dec 03, 2003 at 03:31:12AM -0800, merlyn@... wrote:
                            > Hans> Why is the @ISA array not searched and/or the Bb::bb() not found?
                            > @ISA is for objects, not just a general subroutine search path.
                            > See "perldoc perlboot" for info on how to start with objects
                            > and how to use @ISA.

                            Thank you. So when I invoke the routine "in a object way", the @ISA would be searched:

                            main->routine();

                            I read also the perlobj page and found how to invoke routine from the
                            current package (class) without specifying the package name explicitly:

                            __PACKAGE__->routine();

                            For just invoking the parent's routine it should be
                            SUPER->routine();

                            Why does this not work:

                            { package BB;

                            sub bb { warn "bb" }
                            }

                            @ISA = qw(BB);

                            sub bb { warn "main" } # try to comment this line

                            __PACKAGE__->bb();

                            SUPER->bb();

                            Can't locate object method "bb" via package "SUPER" (perhaps you forgot
                            to load "SUPER"?) at o.pl line 12.

                            Also this does not work:

                            SUPER::bb(__PACKAGE__);

                            Undefined subroutine &SUPER::bb called at o.pl line 10.


                            Best regards
                            Hans Ginzel
                          • Hans Ginzel
                            ... I got it: __PACKAGE__- SUPER::bb();
                            Message 13 of 13 , Dec 16, 2003
                            • 0 Attachment
                              On Tue, Dec 16, 2003 at 11:39:25AM +0100, hans wrote:
                              > For just invoking the parent's routine it should be
                              > SUPER->bb();
                              > Why does this not work:
                              > Can't locate object method "bb" via package "SUPER" (perhaps you forgot
                              > to load "SUPER"?) at o.pl line 12.

                              I got it:
                              __PACKAGE__->SUPER::bb();

                              > Hans Ginzel
                            Your message has been successfully submitted and would be delivered to recipients shortly.