Wie kann ich eine Variable in einen Perl printf Ausdruck einfügen?

7

Wie kann ich eine Variable in einen printf Ausdruck einfügen?

Hier ist mein Beispiel:

%Vor%

Dabei ist $cols die Anzahl der Spalten und $_ ist eine Zeichenkette.

Die Anweisung führt zu einer Warnung "Ungültige Konvertierung".

Das Problem endete damit, dass ich vergessen habe, die Variable zu bearbeiten. Gah. Danke an alle.

    
Lou 17.02.2010, 20:58
quelle

6 Antworten

9

Ich habe Ihr spezifisches Problem herausgefunden. Dein Code ist korrekt. Ich nehme jedoch an, dass $cols eine Zahl sein könnte, die von Benutzereingaben gelesen wird, etwa so:

%Vor%

Das funktioniert, und im numerischen Kontext scheint $cols eine Zahl zu sein, aber das Problem ist, dass $cols nicht hier im numerischen Kontext erscheint. Es befindet sich im Zeichenfolgenkontext, was bedeutet, dass Ihre Formatzeichenfolge statt in "%5s" auf "%5\ns" erweitert wird. Die Newline dort muckt die Formatzeichenfolge auf.

Ändern Sie den Code, in dem Sie $cols gelesen haben:

%Vor%

Siehe die Dokumentation zu chomp , da Sie diese auch für das Lesen anderer Eingaben verwenden möchten .

    
Chris Lutz 17.02.2010, 21:11
quelle
11

Ihre interpolierte Variable $cols sieht so aus, als ob sie eine Zahl wäre, sagen wir 10, also

%Vor%

sollte interpolieren und äquivalent zu

sein %Vor%

Dies ist eine gültige Formatzeichenfolge.

Wenn jedoch $cols etwas anderes als eine Zahl oder eine gültige Formatzeichenfolge ist, erhalten Sie die Warnung.

Zum Beispiel, wenn:

%Vor%

Das würde "%ws" als Formatzeichenfolge ergeben - geben Sie den Fehler an, den Sie angeben:

%Vor%

Gültige Informationen zum Format finden Sie hier .

    
martin clayton 17.02.2010 21:08
quelle
6

Verwenden Sie immer * in Ihrem Formatbezeichner, um die Variablenbreite eindeutig anzugeben! Dies entspricht dem Hinweis, printf "%s", $str anstelle von printf $str zu verwenden.

Aus der perlfunc Dokumentation zu sprintf :

  

(minimale) Breite

     

Argumente werden normalerweise so formatiert, dass sie nur so groß sind, dass sie den angegebenen Wert anzeigen. Sie können die Breite überschreiben, indem Sie hier eine Zahl eingeben oder die Breite vom nächsten Argument (mit * ) oder von einem angegebenen Argument (z. B. *2$ ) erhalten:

%Vor%      

Wenn eine Feldbreite, die durch * erhalten wird, negativ ist, hat sie den gleichen Effekt wie das - -Flag: linksbündig.

Zum Beispiel:

%Vor%

Ausgabe:

%Vor%

Wenn das Pragma warnings aktiviert ist, werden Warnungen für nicht numerische Breite angezeigt.

    
Greg Bacon 17.02.2010 21:27
quelle
3

Ihre aktuelle Methode sollte funktionieren

%Vor%     
Evan Carroll 17.02.2010 21:03
quelle
1

Das Folgende scheint für mich zu funktionieren:

%Vor%

ergibt

%Vor%     
kirillka 17.02.2010 21:08
quelle
1

Ich kann Ihr Problem nicht reproduzieren. Der folgende Code funktioniert einwandfrei:

%Vor%

Es druckt jede Eingabezeile mit mindestens 40 Spalten Breite.

    
Danilo Piazzalunga 17.02.2010 21:08
quelle