如何从Perl中的字符串插入变量名?

时间:2009-08-21 22:49:02

标签: perl

我正在尝试在下面插入变量$font1。变量$font1是字体的名称,例如Arial字体。我真的希望它将$arial(或任何$font)作为变量返回。

调用$arial时,它会通过get_fonts.pl从我服务器上的文件夹中获取arial.ttf。

我已经尝试了所有\$$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");
      }
...

不要注意排除结尾括号..

注意whare我打电话给$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 个答案:

答案 0 :(得分:10)

如果$ font等于“arial”并且您想要访问$ arial,则需要:

${$font}

但你几乎肯定不想这样做。我不太确定你在代码中尝试做什么,但似乎使用哈希会更容易和更好:

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

另请注意,如果您使用

,$ {$ font}示例将无效
use strict;

答案 1 :(得分:3)

不要这样做:请参阅perldoc -q "variable name"

  

初学者通常认为他们希望变量包含变量的名称。 ...

简答:不要。答案很长:阅读FAQ条目(也可在您的计算机上找到)。更长的答案:阅读MJD的Why it's stupid to "use a variable as a variable name"Part 2Part 3)。

答案 2 :(得分:1)

要回答您的问题,请尝试以下类似的内容:

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

但我确实看到了一些问题:

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

你不应该用==进行字符串比较。 你应该使用eq运算符。

试试这段代码:

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

另外,$ font1声明在哪里?如果它在if语句的范围内声明,那么您将无法在该范围之外看到该变量。我建议你使用pragma   用严格; 见http://www.perl.com/doc/manual/html/lib/strict.html