Thread Bad name after... (52 answers)
Opened by bianca at 2015-02-19 12:08

Linuxer
 2015-02-20 14:57
#179778 #179778
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
In meinen Augen scheint Dir das Konzept der Packages/Namensräume nicht bekannt zu sein.

Wie Muffi schon bemerkt hat, die Subroutine hat den gleichen Namen und wird eben im gleichen Namensraum nochmal angelegt. Da meckert Perl zu recht.

Wenn mehrmals eine Routine mit gleichen Namen eingebunden werden soll, dann sollte das nicht im selben Namensraum passieren.
Entweder ist es OK, dass eine Subroutine überschrieben wird, dann schaltet man die Warnung dafür in dem jweiligen Block ab, oder man ändert den Namensraum für jede Sub ab.

Hier erweitern wir den String-eval() und reiten fröhlich in den Abgrund ;-)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /usr/bin/perl -I.
use strict;
use warnings;
use 5.010.000;

use File::Basename qw( basename );


my @dispatch = (
  {
    file        => 'x5_1.pl',
    subroutine  => 'foo',          # string here, not coderef
  },
  {
    file        => 'x5_2.pl',
    subroutine  => 'foo',          # string here, not coderef
  },
);

sub foo {
  say "wrong sub";
}

for my $ref ( @dispatch ) {
  # clean up file name for usage as namespace name (remove file path and extension and convert '-' to '_')
  ( my $namespace = basename( $ref->{file}, '.pl' ) ) =~ tr/-/_/;

  eval <<"EVAL_CODE";
package $namespace;                     # declare package to contain imported functions
require "$ref->{file}";                 # "import" function(s)
$ref->{subroutine}('a');                # call function with string-eval; remember to insert error handling
                                        # We are inside package MyModule, so no need for package name in string
EVAL_CODE
        warn "$@\n"     if $@; 
}

say "At the end:";                 # just a check what happens now with main::foo
foo( 'b' );
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Bad name after...