2016-06-17 6 views
-3

Ich versuche, diesen Code zu kompilieren, aber es erhält immer denselben Fehler für @fields und $ Element Variable. Soweit ich das beurteilen kann, handelt es sich nicht um einen Scoping-Fehler, wie er global erklärt wird. Es wird kompiliert, wenn ich nicht streng benutze.Perl Code Fehler: Globales Symbol Erfordert expliziten Paketnamen

Ich habe einen Prototyp des Codes zur Verfügung gestellt, bitte ignorieren Sie alle Tippfehler.

#!usr/bin/perl 
use strict; 
use warnings; 
use file::BaseName; 
use file::Copy; 

#my array declaration 
my @fields; 

#my other declarations 
#input and output file initialization 

while(<DATA1>) { 
    $String=''; 
    $String= $_; 
    @fields= split(/,/,$String); 
     foreach my $elements(@fields){ 
      #Some code 
     } 

    #more code 
} 
close (DATA1); 
+0

Was das ist Error? Was ist in 'DATA1'? Wo deklarieren Sie '$ String'? – fugu

+0

Das sieht wie eine Kopie von http://stackoverflow.com/q/37856440/1331451 aus. – simbabque

+2

Ich habe dafür gestimmt, diese Frage zu schließen, weil wir Code, den wir nicht sehen, nicht debuggen können. Sie müssen ** Ihren echten Code ** einfügen, indem Sie den tatsächlichen, echten Live-Code bearbeiten und kopieren/einfügen. Tippe es nicht noch einmal ein. Poste nichts anderes. Zeigen Sie den echten Code. Niemand kann erraten, was Sie auf Ihrem Computer falsch eingegeben haben. – simbabque

Antwort

0

Auf ein Minimum, müssen Sie Ihren Code zum Kompilieren bekommen. Der Perl-Compiler ist normalerweise sehr hilfreich, um Ihnen zu sagen, was falsch ist. Hier haben Sie ungültige Paketnamen, einen ungültigen Perl-Pfad, und Sie sollten DATA anstelle von DATA1 verwenden.

Versuchen Sie Ihr Code ausgeführt wird mit diagnostics wie es informativer ist:

perl -cwT -Mdiagnostics script.pl 

Can't locate file/BaseName.pm in @INC (you may need to install the 
file::BaseName module) (@INC contains: /etc/perl /usr/local/lib/i386- 
...) at foo2.pl line 4. 

BEGIN failed--compilation aborted at foo2.pl line 4 (#1) 
    (F) You said to do (or require, or use) a file that couldn't be found. 
    Perl looks for the file in all the locations mentioned in @INC, unless 
    the file name included the full path to the file. Perhaps you need 
    to set the PERL5LIB or PERL5OPT environment variable to say where the 
    extra library is, or maybe the script needs to add the library name 
    to @INC. Or maybe you just misspelled the name of the file. 

    See "require" in perlfunc and lib. 

Uncaught exception from user code: 
    Can't locate file/BaseName.pm in @INC (you may need to install the 
    file::BaseName module) (@INC contains: /etc/perl /usr/local/lib/i386- 
    ...) at foo2.pl line 4. 

BEGIN failed--compilation aborted at foo2.pl line 4. 

Hier ist eine Compilierung Version des Codes:

#!/usr/bin/perl 

use strict; 
use warnings; 
use File::Basename; 
use File::Copy; 

my @fields; 

while(<DATA>) { 
    my $String=''; 
    $String= $_; 
    @fields= split(/,/,$String); 
    my $i = 0; 
    foreach my $element (@fields) { 
     print "[$i] : $element\n"; 
     $i++; 
    } 
} 

__DATA__ 
foo,bar,baz 
qux,1,2,3 

Ausgabe

[0] : foo 
[1] : bar 
[2] : baz 

[0] : qux 
[1] : 1 
[2] : 2 
[3] : 3 
+1

* "Sie sollten DATA anstelle von DATA1 verwenden" * Nicht unbedingt, wenn 'DATA1' in den unsichtbaren Teilen des Programms geöffnet wurde – Borodin

+0

True, aber http://perldoc.perl.org/perldata.html sagt, dass Perl wird weiß, wie man den Abschnitt "__DATA__" liest. Jeder andere Abschnitt muss extra geöffnet werden. Wenn Sie mehrere Datenblöcke verwenden, sollten Sie 'Inline :: Files' verwenden. Http://search.cpan.org/~ambs/Inline-Files-0.69/lib/Inline/Files.pm – xxfelixxx

+0

Ich bin mir nicht sicher, welchen Punkt du machst. Das OP hat möglicherweise nicht beabsichtigt, einen Datenblock zu verwenden – Borodin

2

Sie scheinen sehr viel Code zu übersprungen, wo Probleme

versteckt werden können, was Sie

gezeigt haben
  • Sie haben wirklich nicht $String erklärt, die sollte be $string

  • file::BaseName heißt wirklich File::Basename und file::Copy ist File::Copy Dinkel

  • #!usr/bin/perl#!/usr/bin/perl sollte

  • @fields erklärt werden sollte, wo es zuerst verwendet wird, nicht auf der äußeren Ebene der Datei

Da es jedoch ist so viel fehlt diese möglicherweise nicht die Quelle für Ihren Fehler

Versuchen Sie, thi s Teil Ihres Codes so

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Basename; 
use File::Copy; 

# my array declaration 
my @fields; 

# my other declarations 
# input and output file initialization 

while (<DATA1>) { 

    my $string = $_; 

    @fields = split /,/, $string; 

    foreach my $elements (@fields) { 
     # Some code 
    } 

    # REST OF THE CODE 

} 

close DATA1; 
Verwandte Themen