perl - 如何基于字符串创建 Perl 变量名?

标签 perl symbolic-references

在 Perl 中,是否可以基于字符串创建全局变量?

例如,如果我有这样的功能:

sub create_glob_var {
    my ($glob_var_str) = @_;
    # something like this ( but not a hash access).
    our ${$glob_var_str};
};

我这样称呼它:
create_glob_var( "bar" );

如何修改create_glob_var实际创建一个名为 $bar 的全局变量?

我的项目使用 perl 5.8.5。

编辑

以下不起作用:
use strict;
BEGIN {
  sub create_glob_var {
    my ($glob_var_str) = @_;
    no strict 'refs';
    $$glob_var_str = undef;  # or whatever you want to set it to
  }

  create_glob_var("bah");
};

$bah = "blah";

产生:

变量“$bah”未在/nfs/pdx/home/rbroger1/tmp2.pl 第 12 行导入。
全局符号“$bah”在/nfs/pdx/home/rbroger1/tmp2.pl 第 12 行需要明确的包名称。
/nfs/pdx/home/rbroger1/tmp2.pl 的执行由于编译错误而中止。

注意 我意识到使用全局变量会导致 ozone depletion and male pattern baldness .我正在尝试清理一些已经完全感染了使用全局变量的遗留代码。一次重构一个...

最佳答案

如果您正在尝试清理旧代码,您可以编写一个导出所需变量的模块。每次您觉得需要调用 create_glob_var ,而是向此包添加一个变量并将其放入导入列表中。

这将帮助您跟踪正在发生的事情以及如何使用变量。

package MyVars;

use strict; use warnings;

use Exporter 'import';

our($x, %y, @z);

our @EXPORT_OK = qw( $x %y @z );

剧本:
#!/usr/bin/perl

use strict;use warnings;

use MyVars qw( $x %y @z );

$x = 'test';
%y = (a => 1, b => 2);
@z = qw( a b c);

use Data::Dumper;
print Dumper \($x, %y, @z);

输出:

$VAR1 =\'测试';
$VAR2 = {
'a' => 1,
'b' => 2
};
$VAR3 = [
'一种',
'b',
'C'
];

关于perl - 如何基于字符串创建 Perl 变量名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2275463/

相关文章:

perl - 如何在 Perl 中使用变量作为变量名?

syntax - 内省(introspection)模块/类/等的替代语法

matlab - Matlab中变量的符号声明

perl - Perl 中@array->[4] 或 %hash->{key} 行为的文档在哪里?

regex - 正则表达式安全性

r - 在 Perl 中更有效地处理 AoA 的笛卡尔积

git - Git 符号引用的推荐用法是什么?

perl - ($a,$b,$c) = @array 在 Perl 中是什么意思?

perl - 如何在 Perl 中打印/提取二维数组列下的信息?