2009-08-21 10 views
0

Ich versuche, eine Variable $font1 unten einzufügen. Die Variable $font1 ist der Name der Schriftart, z. Arial. Ich möchte wirklich, dass es $arial (oder was auch immer $font ist) als Variable zurückgibt.Wie kann ich einen Variablennamen aus einer Zeichenfolge in Perl einfügen?

Wenn $arial aufgerufen wird, wird die Datei arial.ttf aus einem Ordner auf meinem Server über get_fonts.pl abgerufen.

Ich habe alles \$$font'"$font"' und jede mögliche Variante davon versucht.

Ich habe sogar versucht if ($font=="arial"){$font = a ton of different attempts;}

do "get_fonts.pl"; 
&GetFonts($im); 

foreach $key (keys %ENV) { 
    if($key !~ /[A-Z]/){ 
    if ($key="sometext") { 
     $text="$ENV{'typetext'}"; 
     $color="$ENV{'typecolor'}"; 
     $font="$ENV{'typefont'}"; 
     $size="$ENV{'typesize'}"; 

     $string = qq~ $text ~; 
     $gd_text = GD::Text->new() or die GD::Text::error(); 
     $gd_text->set_font($arialb, $size) or die $gd_text->error; 
     $gd_text->set_text($string); 
     my ($w, $h) = $gd_text->get('width', 'height'); 
     $y1 = (300/6); 
     if ($w <= 380) { 
     $x1 = ((400/2) - ($w/2)); 
     $im->stringFT("$blue", $font1, $size, 0, $x1, $y1, "$string"); 
     } 
... 

bis ausgeschlossen endend Klammern Achtet nicht ..

Hinweis whare ich $font1 genannt .. Wenn ich $arialb alles ist in Ordnung rufen.

ist hier Schriftarten bekommen

sub GetFonts { 
    my($im) = $_[0]; 
    $arial = "fonts/arial.ttf"; 
    # I tried Tons of things here to no avail 
    if ($font=="arialb") { 
    $font1 = '$arialb'; # and so many different other attempts 
    } 

    $arialb = "fonts/ariblk.ttf"; 
    $ariali = "fonts/ariali.ttf"; 
    $arialbi = "fonts/arialbi.ttf"; 
    $comic = "fonts/comic.ttf"; 
    $comicb = "fonts/comicbd.ttf"; 
    $verdana = "fonts/verdana.ttf"; 
    $verdanab = "fonts/verdanab.ttf"; 
    $verdanai = "fonts/verdanai.ttf"; 
    $verdanabi = "fonts/verdanaz.ttf"; 
} 

ich auch mit $color das gleiche zu tun wünschen, aber, sobald $font wird herausgefunden, sollte ich in der Lage sein, dass, um Fiqure.

Danke für jede Hilfe.

+4

Vielleicht werden Sie nicht hören wollen, aber was Sie wollen eine ziemlich schlechte Idee zu tun ist. Siehe hier zur Diskussion: http://perl.plover.com/varvarname.html – Telemachus

+1

@ Jimbo: Ich habe ein wenig aufräumen auf Ihre Formatierung, aber ehrlich gesagt ist es eine Katastrophe. Kannst du bitte die Blöcke säubern und ein paar Eindrücke hinzufügen? Sie können nicht erwarten, dass sich viele Menschen darum bemühen, Ihnen zu helfen. – Telemachus

+2

Noch eine Sache: Wenn Sie alle Ihre Programme mit 'Warnungen verwenden 'starten, erhalten Sie viele hilfreiche - gut - Warnungen. So hätten Sie das gesehen: Argument "fonts/arial.ttf" ist nicht numerisch in numerischer eq (==) bei Zeile . – Telemachus

Antwort

1

Ihre Frage zu beantworten, versuchen etwas Ähnliches wie:

my $f=\$b; 
$b="foo"; 
print $$f; 

Aber ich einige Probleme sehen:

if ($font=="arialb") {$font1 = '$arialb'} 

Sie nicht String-Vergleiche mit == tun sollten. Sie sollten den eq-Operator verwenden.

diesen Code Versuchen:

$f="sf"; 
$b="fs"; 
if($f==$b){ 
    print "whoops"; 
} 

Auch wo font1 $ erklärt? Wenn es innerhalb des Gültigkeitsbereichs dieser if-Anweisung deklariert wird, können Sie diese Variable nicht außerhalb dieses Bereichs sehen. Ich empfehle, dass Sie das Pragma verwenden verwenden Sie streng; http://www.perl.com/doc/manual/html/lib/strict.html siehe

+1

Ich glaube nicht, dass '==' die Länge von Strings vergleicht. Es prüft immer auf numerische Gleichheit. Aber alle Zeichenfolgen sind numerisch gleich 0, also == wird für alle zwei Zeichenfolgen wahr. 'Perl -e‚print ‚Wahr \ n‘ if ‚Hallo‘ == ‚was zum Teufel‘‘;?' – Telemachus

+0

jeden Tag etwas Neues kennen zu lernen, vor allem in Rand Fällen Sie meiden wie die Pest. –

+2

@Telemachus: Eigentlich nummify Strings als der Wert ihrer führenden Ziffern, falls vorhanden: 'perl- "print '123abc' + 1"' prints "124". Die meisten Strings haben jedoch keine führenden Ziffern und sind daher als 0 nummeriert. –

10

Wenn $ Schriftart „Arial“ gleich, und Sie wollen $ arial zugreifen zu können, möchten Sie:

${$font} 

Aber man fast tun sicherlich nicht wirklich wollen, dies zu tun. Ich bin mir nicht ganz sicher, was Sie versuchen, in Ihrem Code zu tun, aber es scheint, wie ein Hash mit einfacher und besser wäre:

$fonts{'arial'} = "/path/to/arial" 

Beachten Sie auch, dass das $ {$ font} Beispiel wird nicht arbeiten, wenn Sie verwenden

use strict; 
+0

Vielen Dank. Die $ {$ font} hat wirklich geholfen. Der Hash ist eine bessere Idee. Ich lerne noch. So: $ Fonts {'arial'} = "/ Pfad/zu/Arial"; $ fonts {'arialb'} = "/ pfad/zu/arialb"; Was würde ich damit machen? Ich glaube, ich bin dort verloren ... –

+1

@ Jimbo: Wenn Sie einen Hash verwenden, können Sie immer noch auf die Schriftart _by name_ beziehen (was Sie wollen, denke ich), da der Name der Schriftart der Schlüssel des Hash ist. – Telemachus

+0

@Telemachus Ich muss in meiner Anwendung Hash verwenden. Es ist mir egal, die Schriftart mit Namen zu benennen und sie so dynamisch und "ungewöhnlich" wie möglich zu gestalten. Ich benutze Zeitstempel im Mai Fällen für Dinge/vars .. Ihr Rat hier war sehr wertvoll .. Danke .. Ich habe im Grunde sechs Zeilen zentriert +/- gewickelt Text jede Zeile mit indivisual Schriftart, Farbe und Größe zugewiesen über ein Hintergrundbild. Das GUI ist html/javascript in ein png mit gd konvertiert .. hoffentlich .. –

Verwandte Themen