2009-06-11 5 views
4

G'day,Warum wird diese beabsichtigte Interpolation als Division durch Perl interpretiert?

Warum erhalte ich die folgenden zwei Fehler vom folgenden Skriptfragment?

Argument "www4.mh.xxxx.co.uk.logstatsto20090610.gz" ist in der Division nicht numerisch (/) in Zeile 56

Argument „/logs/xxxx/200906/mcs0.telhc/borg2" ist beide Strings und die Verkettung der beiden Strings, zusammen mit dem Schrägstrich in der Mitte, wird auch nicht numerisch eingewickelt in Division (/) in Zeile 56

die Variablen $ dir und $ log werden mit Anführungszeichen.

 foreach my $dir (@log_dirs) { 
      foreach my $log (@log_list) { 
line 56:  if (-s "$dir/$log") { 
        push(@logs, $dir/$log); 
       } 
      } 
     } 

Edit: 56 Line ist auf jeden Fall die if-Anweisung. Doch Paul, du hast recht, rund um die Teilung auf Linie 57 mit Anführungszeichen das Problem behebt. Vielen Dank.

Edit: Die Perl-Version Linie 56 Berichterstattung ist

[email protected]:/var/tmp/robertw> /usr/local/perl/bin/perl -v  

This is perl, v5.6.1 built for sun4-solaris 

Copyright 1987-2001, Larry Wall 

Perl may be copied only under the terms of either the Artistic License or the 
GNU General Public License, which may be found in the Perl 5 source kit. 

Complete documentation for Perl, including FAQ lists, should be found on 
this system using `man perl' or `perldoc perl'. If you have access to the 
Internet, point your browser at http://www.perl.com/, the Perl Home Page. 

[email protected]:/var/tmp/robertw> 

Edit: Verwendung Obwohl die Methode der interpolierten Strings in Perl, da die Variablen selbst Strings und ich versuche, sie zu verbinden zusammen mit einem Schrägstrich ist nicht die Netto-Ergebnis-String-Verkettung?

prost,

+2

IMHO, sollten Sie zumindest vorgeben, die Fehlermeldung ernst zu nehmen und einen Blick auf die Zeile werfen, die den Fehler vor dem Posten verursacht. –

+0

Die Erweiterung einer Variablen in einer Zeichenfolge in Perl wird als Interpolation bezeichnet. Wenn die Variablen jedoch Zeichenfolgen enthalten, ist der Nettoeffekt sicherlich eine Verkettung. Jees. –

+0

Die Aktion des Operators/ist die Division in Perl.Wenn die Operanden momentan String-Typen sind, wird Perl versuchen, sie in einen numerischen Typ zu konvertieren - die fraglichen Strings sind nicht numerisch, daher erhalten Sie den Fehler –

Antwort

12

56 Line ist wahrscheinlich die Linie danach, wo Sie tun versuchen zwei Strings zu teilen. Was ist Ihr wahrscheinlich war beabsichtigt

foreach my $dir (@log_dirs) { 
     foreach my $log (@log_list) { 
      if (-s "$dir/$log") { 
       push(@logs, "$dir/$log"); 
      } 
     } 
    } 
+0

Alle drei von euch (Paul Dixon, brian d foy und 1800 INFORMATION) haben mich in Sekundenschnelle geschlagen ... +1 – AllenG

9

Du hast nicht die Zeichenfolge in Ihrem push zitieren. Stattdessen Wege selbst zu schaffen, versuchen, in die Gewohnheit, mit File::Spec machen tragbare Wege zu bekommen:

use File::Spec::Functions; 

my $path = catfile($dir, $file); 

Dann nutzen Sie $path, wann immer Sie diese Zeichenfolge wollen, damit Sie nicht die sich wiederholen, indem Sie erneut die Zeichenfolge remaking (und vielleicht das nächste Mal falsch machen;).

5

Es ist durch die folgende Zeile verursacht:

push(@logs, $dir/$log); 

Sie haben dort eine Division.

2

Ich bin gespannt, welche Version von Perl Sie verwenden? Alle, die ich leicht ausprobieren kann, geben die Zeilennummer des Pushs korrekt an.

+0

Guten Tag, ich habe eine Notiz über die Perl-Version hinzugefügt. –

+0

Vergessen zu sagen thatnks für Ihr Interesse. (-: –

+0

Vielleicht gibt es irgendwo einen Kommentar #line. Ich habe mir das mehr als einmal selbst angetan. Aber andererseits habe ich es getan, weil 5.6 die Zeile unseres Fehlers falsch berichtet hat - aber es ist unordentlich, wenn du diese Dinge bewegst . – Axeman

Verwandte Themen