0

我想更改存储在哈希中的变量,但我一直收到错误消息:
"Can't use the string ("SCALAR(0x30f558)") as a SCALAR ref while "strict refs" in use at - line 14.


我的简化代码如下:

#!/usr/bin/perl

use strict;
use warnings;


my $num = 1234;
my $a = 5;

my %hash = (\$num => "value");

foreach my $key (keys %{hash}){
    print "Key: $key\n";
    #OPTION1: $a = $$key;
}

my $ref = \$num ;
print "Ref: $ref\n";
#OPTION2: $a = $$ref ;

print $a;

运行此打印:

Key: SCALAR(0x30f558)
Ref: SCALAR(0x30f558)
5

表明 $key 和 $ref 都指向同一个变量 - $num
此外,如果 $key 和 $ref 相同,则 OPTION1 和 OPTION2 上的代码相同。

当我取消注释 OPTION2 时,$a 打印为 1234。
但是,当我取消注释 OPTION1 时,我收到上面显示的错误。



问题:如何使用我在 OPTION1 中尝试做的哈希将 $a 更改为 $num?为什么这不能按原样工作?



参考资料: http
://cpansearch.perl.org/src/CHIPS/perl5.004_05/t/pragma/strict-refs 我密切关注这段代码:

use strict 'refs' ;
my $fred ;
my $b = \$fred ;
my $a = $$b ;

在我引入哈希之前,它没有造成任何错误。


谢谢您的帮助。



原始代码(不起作用):

#User Defined - here are the defaults
my $a = 122160;
my $b = 122351;
my $c = 'string';
my $d = 15;
my $e = 123528;
#etc.

#Create variable/print statement hash
my %UserVariables = (
\$a =>  "A: (Default: $a): ",
\$b =>  "B: (Default: $b): ",
\$c =>  "C: (Default: $c): ",
\$d =>  "D: (Default: $d): ",
\$e =>  "E: (Default: $e): ",
);

#Allow user to change variables if desired
foreach (keys %UserVariables){
    print $UserVariables{$_};
    chomp (my $temp = <>);
    print "$_\n";
    $$_ = $temp unless ($temp eq '');
    print "$temp\n" unless ($temp eq '');
};

效率较低但有效的方法:

#Alternate Method without loops (not ideal)
my $temp;
print $UserVariables{\$a};
    chomp ($temp = (<>));
    $a= $temp unless ($temp eq '');
print $UserVariables{\$b};
    chomp ($temp = (<>));
    $b= $temp unless ($temp eq '');
print $UserVariables{\$c};
    chomp ($temp = (<>));
    $c= $temp unless ($temp eq '');
print $UserVariables{\$d};
    chomp ($temp = (<>));
    $d= $temp unless ($temp eq '');
print $UserVariables{\$e};
    chomp ($temp = (<>));
    $e= $temp unless ($temp eq '');
4

3 回答 3

3

Perl hash keys can only be string. You don't have reference as key, but what your reference automatically stringified to: a verbatim string "SCALAR(0x30f558)" instead. Obviously, string won't work as reference.

You should rethink the way you store data and maybe explain in little more details what you want to do instead on focusing on how.

In your particular case illustrated by example just use plain hash for those values you want to be overridable:

my %config = (
   a => 122160,
   b => 122351,
   c => 'string',
   d => 15,
   e => 123528,
);

...and then overwrite values in this hash.

于 2012-07-26T19:14:25.143 回答
1
我想更改存储在哈希中的变量

就像您不能将变量存储在标量中一样,您也不能将变量存储在哈希中。您可以将值(包括对变量的引用)存储在哈希中。(例如value代码中的字符串。)

显示 $key 和 $ref 都指向同一个变量 - $num

不,它表明 和 的值$key具有$ref相同的字符串化。

但是,当我取消注释 OPTION1 时,我收到上面显示的错误。

哈希表键必须是字符串,就像数组键必须是非负整数一样。

我密切关注这段代码:

不,与哈希相同的工作正常。

use strict 'refs' ;
my %hash = ( fred => undef );
my $b = \$hash{fred} ;
my $a = $$b ;

我无法提供解决方案,因为您没有说您要做什么。

于 2012-07-26T19:31:29.933 回答
0

您在评论中一直说您想修改通过 STDIN 传递的变量,但是不清楚您的意思是什么。您是在传递命令行参数或请求用户输入,还是将另一个程序的输出通过管道传输到您的程序中,或者完全是其他什么?理想的方法会根据您要执行的操作而略有不同。

要读取命令行参数,您可以访问@ARGV数组:

$foo = $ARGV[0]; #read the first argument

要从 STDIN 中读取一行:

print "Enter a number: ";
$foo = <STDIN>;
于 2012-07-27T12:55:16.070 回答