Как я могу вставить имя переменной из строки в Perl? - PullRequest
0 голосов
/ 22 августа 2009

Я пытаюсь вставить переменную $font1 ниже. Переменная $font1 является именем шрифта, например, Arial. Я действительно хочу, чтобы он возвращал $arial (или что бы то ни было $font) как переменную.

Когда вызывается $arial, он получает arial.ttf из папки на моем сервере через get_fonts.pl.

Я перепробовал все \$$font '"$font"' и все возможные варианты этого.

Я даже пытался 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");
      }
...

Не обращайте внимания на исключенные конечные скобки ..

Обратите внимание, что я позвонил $font1 .. Если я позвоню $arialb, все в порядке.

Вот шрифты

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";
}

Я также хочу сделать то же самое с $color, но, как только $font выяснится, я смогу это выяснить.

Спасибо за любую помощь.

Ответы [ 3 ]

10 голосов
/ 22 августа 2009

Если $ font равен «arial» и вы хотите получить доступ к $ arial, вам нужно:

${$font}

Но вы почти наверняка не хотите этим заниматься. Я не совсем уверен, что вы пытаетесь сделать в своем коде, но кажется, что использовать хеш будет проще и лучше:

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

Также обратите внимание, что пример $ {$ font} не будет работать, если вы используете

use strict;
3 голосов
/ 22 августа 2009

Хватит этого: см. perldoc -q "variable name":

Начинающие часто думают, что хотят, чтобы переменная содержала имя переменной. ...

Краткий ответ: не надо. Длинный ответ: прочитайте раздел часто задаваемых вопросов (который также доступен на вашем компьютере). Более длинный ответ: Прочитайте MJD Почему глупо «использовать переменную как имя переменной» ( Часть 2 , Часть 3 ).

1 голос
/ 22 августа 2009

Чтобы ответить на ваш вопрос, попробуйте что-то похожее на:

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

Но я вижу некоторые проблемы:

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

вы не должны делать сравнения строк с ==. Вы должны использовать оператор eq.

Попробуйте этот код:

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

Кроме того, где объявлен $ font1? Если он объявлен внутри области действия оператора if, вы не сможете увидеть эту переменную за пределами этой области. Я рекомендую вам использовать прагму использовать строгое; см http://www.perl.com/doc/manual/html/lib/strict.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...