如何使用变量';s值作为Perl变量名?
对于所有这些愚蠢的问题,我感到很抱歉,我一直被灌输Perl编程,我发现很难像Perl程序员那样思考 今天的愚蠢问题: 我使用id字段作为键将管道分隔的文件加载到散列中,如下所示如何使用变量';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
#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/醺緎