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.
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:
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:
Siehe die Dokumentation zu chomp
, da Sie diese auch für das Lesen anderer Eingaben verwenden möchten .
Ihre interpolierte Variable $cols
sieht so aus, als ob sie eine Zahl wäre, sagen wir 10, also
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:
Gültige Informationen zum Format finden Sie hier .
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
%Vor%*
) oder von einem angegebenen Argument (z. B.*2$
) erhalten: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.
Ich kann Ihr Problem nicht reproduzieren. Der folgende Code funktioniert einwandfrei:
%Vor%Es druckt jede Eingabezeile mit mindestens 40 Spalten Breite.
Tags und Links perl variables interpolation printf