Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用变量';s值作为Perl变量名?_Perl_Variables_Symbolic References - Fatal编程技术网

如何使用变量';s值作为Perl变量名?

如何使用变量';s值作为Perl变量名?,perl,variables,symbolic-references,Perl,Variables,Symbolic References,对于所有这些愚蠢的问题,我感到很抱歉,我一直被灌输Perl编程,我发现很难像Perl程序员那样思考 今天的愚蠢问题: 我使用id字段作为键将管道分隔的文件加载到散列中,如下所示 #open file my %hash; while (<MY_FILE>) { chomp; my ($id, $path, $date) = split /\|/; $hash{$id} = { "path" => $path, "dat

对于所有这些愚蠢的问题,我感到很抱歉,我一直被灌输Perl编程,我发现很难像Perl程序员那样思考

今天的愚蠢问题: 我使用id字段作为键将管道分隔的文件加载到散列中,如下所示

#open file

my %hash;
while (<MY_FILE>) {
    chomp;

    my ($id, $path, $date) = split /\|/;

    $hash{$id} = {
        "path" => $path,
        "date" => $date
    };
}
但是在perldb中,x${$key}始终是未定义的,尽管x${path}在$path中打印值

有什么方法可以做我想做的吗

TIA是这样的吗

use Carp 'confess';

sub load_hash {
    my $key = shift;

    # ...

    while (...) {
        # ...
        my %line;  # important that this is *inside* the loop
        @line{qw (id path date)} = split /\|/;
        confess "BUG: unknown key '$key'"  unless exists $line{$key};  # error checking
        $hash{$line{$key}} = \%line;
        delete $line{$key};  # assuming you don't want the key value duplicated
    }
}
像这样的

use Carp 'confess';

sub load_hash {
    my $key = shift;

    # ...

    while (...) {
        # ...
        my %line;  # important that this is *inside* the loop
        @line{qw (id path date)} = split /\|/;
        confess "BUG: unknown key '$key'"  unless exists $line{$key};  # error checking
        $hash{$line{$key}} = \%line;
        delete $line{$key};  # assuming you don't want the key value duplicated
    }
}
你试图使用“符号参照”。如果你有一个问题,你认为“嘿,我将用符号引用来解决这个问题”,你现在有两个问题

首先,它们只在全局上工作。您已将
$path
声明为词法(仅在声明它的块中可见),因此load\u path无法看到它。不,不要将
$path
设置为全局

其次,符号引用创建意大利面代码。全球化已经够糟糕的了。他们可以随时随地被任何人访问。通过对全局的符号引用,您甚至无法看到正在访问哪个全局。这使得跟踪什么可能改变什么变得不可能。这就是为什么
strict
会关闭它们。打开
strict
并保持打开状态,直到您知道何时应该关闭它

我不完全确定你想要完成什么,但看起来这很好

my %hash;
while (<MY_FILE>) {
    chomp;

    my ($id, $path, $date) = split /\|/;

    $hash{$path} = {
        "path" => $path,
        "date" => $date
    };
}
你试图使用“符号参照”。如果你有一个问题,你认为“嘿,我将用符号引用来解决这个问题”,你现在有两个问题

首先,它们只在全局上工作。您已将
$path
声明为词法(仅在声明它的块中可见),因此load\u path无法看到它。不,不要将
$path
设置为全局

其次,符号引用创建意大利面代码。全球化已经够糟糕的了。他们可以随时随地被任何人访问。通过对全局的符号引用,您甚至无法看到正在访问哪个全局。这使得跟踪什么可能改变什么变得不可能。这就是为什么
strict
会关闭它们。打开
strict
并保持打开状态,直到您知道何时应该关闭它

我不完全确定你想要完成什么,但看起来这很好

my %hash;
while (<MY_FILE>) {
    chomp;

    my ($id, $path, $date) = split /\|/;

    $hash{$path} = {
        "path" => $path,
        "date" => $date
    };
}

别担心,我总是使用“严格”和“警告”(尽管我在尝试此操作时必须关闭警告)。@Sparkles,如果您必须关闭警告,那么您可能做错了什么。投票支持引用世上最自以为是的Perl仇恨者的话?(Naggum是最自以为是的Perl仇恨者,但他死了。)@sparks这是“永远”的新定义。不要只是关闭警告,找出导致警告的原因并修复它@jrockway我想我是在引用mjd(他说的是AUTOLOAD)。看来jwz也不是原版:http://➡.ws/醺緎别担心,我总是使用“严格”和“警告”(尽管我在尝试此操作时必须关闭警告)。@Sparkles,如果您必须关闭警告,那么您可能做错了什么。投票支持引用世上最自以为是的Perl仇恨者的话?(Naggum是最自以为是的Perl仇恨者,但他死了。)@sparks这是“永远”的新定义。不要只是关闭警告,找出导致警告的原因并修复它@jrockway我想我是在引用mjd(他说的是AUTOLOAD)。看来jwz也不是原版:http://➡.ws/醺緎