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

如何在Perl中从字符串中插入变量名?,perl,Perl,我试图在下面插入一个变量$font1。变量$font1是字体的名称,例如arial。我真的希望它返回$arial(或者任何$font是什么)作为变量 调用$arial时,它通过get_fonts.pl从我的服务器上的文件夹中获取arial.ttf 我已经尝试了所有的\$$font“$font”以及所有可能的变体 我甚至尝试了if($font==“arial”){$font=大量不同的尝试;} do "get_fonts.pl"; &GetFonts($im); foreach $key

我试图在下面插入一个变量
$font1
。变量
$font1
是字体的名称,例如arial。我真的希望它返回
$arial
(或者任何
$font
是什么)作为变量

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

我已经尝试了所有的
\$$font
“$font”
以及所有可能的变体

我甚至尝试了
if($font==“arial”){$font=大量不同的尝试;}

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");
      }
...
我也希望对
$color
做同样的事情,但是,一旦
$font
被弄明白了,我应该能够弄明白


谢谢您的帮助。

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

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 严格使用; 请参见

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

${$font}
但你几乎肯定不想这样做。我不太确定您想在代码中做什么,但使用哈希似乎更容易、更好:

$fonts{'arial'} = "/path/to/arial"
还要注意,如果使用${$font},则${$font}示例将不起作用

use strict;
别再想要了:看:

初学者通常认为他们想要一个包含变量名的变量


简短的回答:不要。详细解答:阅读常见问题解答条目(也可在您的计算机上找到)。较长的答案:阅读MJD的(,)。

也许你不想听这个,但你想做的是一个非常糟糕的主意。请看这里进行讨论:@Jimbo:我对您的格式做了一些清理,但坦率地说,这是一场灾难。你能把这些方块清理干净,加上一些缩进吗?你不能指望有很多人费力地去帮助你。还有一件事:如果你在开始所有程序时都使用
警告你会得到很多有用的警告。所以你们会看到:参数“fonts/arial.ttf”在第行的数字等式(=)中不是数字。非常感谢。很抱歉快速粘贴了这段糟糕的代码。我会把它清理一下,这样大家都能看到我的想法。再次感谢所有的建议。请看,我不认为
==
比较字符串的长度。它总是检查数值是否相等。但所有字符串在数字上都等于0,因此==将对任意两个字符串测试为真
perl-e'print“True\n”如果'hello'='what heck?''每天学习新的东西,特别是在你避免像瘟疫一样的边缘情况下。@Telemachus:实际上,字符串会作为其前导数字的值,如果有的话:
perl-e“print'123abc'+1”
prints“124”。不过,大多数字符串没有前导数字,因此将其命名为0。有很多帮助。。。我已经10多年没有写过任何PERL了。我完全忘记了eq。这里每个人都帮了大忙…@Michael:我确实知道,但自动开始假设这些示例中的字符串(即,没有任何数字)。谢谢你的澄清,非常感谢。${$font}确实有帮助。散列是个更好的主意。我还在学习。所以:$fonts{'arial'}=“/path/to/arial”$字体{'arialb'}=“/path/to/arialb”;我该怎么办?我想我在那里迷路了…@Jimbo:如果你使用散列,你仍然可以按名称引用字体(我想这是你想要的),因为字体的名称是散列的关键。@Telemachus我需要在我的应用程序中深入使用散列。我不在乎用名字来称呼字体,我更喜欢让它尽可能的动态和“不寻常”。我在5月份使用时间戳表示事物/变量。。你的建议很有价值。。谢谢我基本上有六行居中+/-环绕的文本,每行在背景图像上指定了不同的字体、颜色和大小。gui通过gd将html/javascript转换为png。。有希望地。。
use strict;