2010-12-08 15 views
1

Ich habe eine einzelne Perl-Subroutine in einer eigenen Datei. Es wird separat von zwei verschiedenen Perl-Skripten aufgerufen. Ich habe die Liste der übergebenen Argumente geändert und die notwendigen Änderungen in beiden aufrufenden Skripten vorgenommen, aber nur ein Skript macht das, was ich erwarte. Wenn ich den Perl-Debugger auf dem anderen verwende, wenn der Debugger in das Unterprogramm des Moduls tritt, zeigt es mir, wie das Modul aussah, bevor ich es bearbeitet habe. Wenn ich also dieses Skript ausführe, übergibt es die neue Argumentliste, aber das Modul versucht, sie auf die alte Weise zuzuordnen, was eindeutig falsch ist.Änderungen am lokalen Perlmodul nicht erkannt

Was könnte das verursachen? Warum funktioniert ein Skript korrekt und das andere nicht?

Für Details, ja, ich verwende strenge und Warnungen. Old:

use strict; 
use warnings; 
use lib("/absolute/path/to/module"); #mymodule.pm lives here 
use packagename; 

my $string = "foo"; 
my %Hash = my_sub($foo); 

und im Modul:

package packagename; 

use strict; 
use warnings; 
use Exporter; 
use vars qw(@ISA @EXPORT @EXPORT_OK); 

@ISA = qw(Exporter); 
@EXPORT = qw(my_sub); 
@EXPORT_OK = qw(my_sub); 

sub my_sub { 
    my $string = $_[0]; 
    my %Hash; 
    ... 
    return %Hash; 
} 

Ich habe ein Array Bezug auf die Argumente hinzugefügt. Neu in der aufrufenden Skripts:

my @array = qw(Zero One Two); 
my %Hash = my_sub(\@array, $string); 

Neu auf dem Modul:

sub my_sub { 
    my (@array) = @{$_[0]}; 
    my $string = $_[1]; 
} 

Als ich mein Skript mit dem Debugger und Schritt in diesem Modul laufen, es zeigt mein $ string von $ zugewiesen wird _ [0] als erste Zeile des Unterprogramms, so als ob ich das Modul nie geändert hätte.

Wieder geschieht dies nur mit einem meiner Skripte, aber das andere funktioniert gut. Alles ist im selben Verzeichnis. Ich betreibe dies auf Linux, Perl 5.10. Ich bin verblüfft!

Antwort

2

Ich würde vermuten, dass die Skripte verschiedene Kopien des Moduls laden, und Sie nur eine Kopie geändert. Versuchen

print $INC{'packagename.pm'}."\n"; 

nach der use packagename Zeile in jedem Skript hinzufügen. (Vergessen Sie nicht, :: durch / in packagename, falls vorhanden zu ersetzen.) Das wird Ihnen sagen, ob die Skripte wirklich das gleiche Modul laden.

+0

Bingo! Ich habe komplett vergessen, dass ich das Modul an anderer Stelle für den Bereitstellungstest kopiert hatte, und eines meiner Skripte verwendete dieses. Ich bin relativ neu in Perl und wusste nichts über $ INC; Danke für den tollen Tipp. – jasper77