哈希/Foreach中的Perl变量引用
我想更改散列中存储的变量,但我一直收到错误:哈希/Foreach中的Perl变量引用,perl,reference,Perl,Reference,我想更改散列中存储的变量,但我一直收到错误: “在第14行使用“strict refs”时,不能将字符串(“SCALAR(0x30f558)”)用作标量引用。 我的简化代码如下: #!/usr/bin/perl use strict; use warnings; my $num = 1234; my $a = 5; my %hash = (\$num => "value"); foreach my $key (keys %{hash}){ prin
“在第14行使用“strict refs”时,不能将字符串(“SCALAR(0x30f558)”)用作标量引用。
我的简化代码如下:
#!/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相同,则选项1和选项2上的代码相同。
当我取消对选项2的注释时,$a打印为1234。
然而,当我取消对选项1的注释时,我收到上面显示的错误
问题: 如何像在选项1中一样使用哈希将$a更改为$num?为什么不能按原样工作
参考资料:
我严格遵循了这一准则:
use strict 'refs' ;
my $fred ;
my $b = \$fred ;
my $a = $$b ;
在我引入散列之前,这不会造成任何错误
谢谢你的帮助
原始代码(不工作):
#用户定义-以下是默认值
我的$a=122160;
我的$b=122351;
我的$c='string';
我的$d=15;
我的$e=123528;
#等等。
#创建变量/打印语句哈希
我的%UserVariables=(
\$a=>“a:(默认值:$a):”,
\$b=>“b:(默认值:$b):”,
\$c=>“c:(默认值:$c:”,
\$d=>“d:(默认值:$d):”,
\$e=>“e:(默认值:$e):”,
);
#允许用户根据需要更改变量
foreach(键%UserVariables){
打印$UserVariables{$};
chomp(我的$temp=);
打印“$\u\n”;
$$\=$temp除非($temp eq');
打印“$temp\n”,除非($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 '');
#没有循环的替代方法(不理想)
我的$temp;
打印$UserVariables{\$a};
chomp($temp=());
$a=$temp,除非($temp eq');
打印$UserVariables{\$b};
chomp($temp=());
$b=$temp除非($temp eq');
打印$UserVariables{\$c};
chomp($temp=());
$c=$temp,除非($temp eq');
打印$UserVariables{\$d};
chomp($temp=());
$d=$temp,除非($temp eq');
打印$UserVariables{\$e};
chomp($temp=());
$e=$temp,除非($temp eq');
Perl哈希键只能是字符串。您没有引用作为键,但您的引用自动字符串化为:一个逐字字符串“SCALAR(0x30f558)”。显然,字符串不能用作引用
你应该重新考虑你存储数据的方式,也许可以更详细地解释你想做什么,而不是专注于如何做
在示例所示的特定情况下,只需对要重写的值使用普通哈希:
my %config = (
a => 122160,
b => 122351,
c => 'string',
d => 15,
e => 123528,
);
…然后覆盖此散列中的值。Perl散列键只能是字符串。您没有引用作为键,但您的引用自动字符串化为:一个逐字字符串“SCALAR(0x30f558)”。显然,字符串不能用作引用 你应该重新考虑你存储数据的方式,也许可以更详细地解释你想做什么,而不是专注于如何做 在示例所示的特定情况下,只需对要重写的值使用普通哈希:
my %config = (
a => 122160,
b => 122351,
c => 'string',
d => 15,
e => 123528,
);
…然后覆盖此哈希中的值。我想更改哈希中存储的变量
就像不能将变量存储在标量中一样,也不能将变量存储在哈希中。可以将值(包括对变量的引用)存储在哈希中。(例如,代码中的字符串<代码>值代码>)
显示$key和$ref都指向同一个变量-$num
否。它显示$key
和$ref
的值具有相同的字符串化
然而,当我取消对选项1的注释时,我收到上面显示的错误。
哈希表键必须是字符串,就像数组键必须是非负整数一样
我严格遵循了这一准则:
不,散列也可以
use strict 'refs' ;
my %hash = ( fred => undef );
my $b = \$hash{fred} ;
my $a = $$b ;
我无法提供解决方案,因为您没有说明要做什么。我想更改散列中存储的变量
就像不能将变量存储在标量中一样,也不能将变量存储在哈希中。可以将值(包括对变量的引用)存储在哈希中。(例如,代码中的字符串<代码>值代码>)
显示$key和$ref都指向同一个变量-$num
否。它显示$key
和$ref
的值具有相同的字符串化
然而,当我取消对选项1的注释时,我收到上面显示的错误。
哈希表键必须是字符串,就像数组键必须是非负整数一样
我严格遵循了这一准则:
不,散列也可以
use strict 'refs' ;
my %hash = ( fred => undef );
my $b = \$hash{fred} ;
my $a = $$b ;
我不能提供一个解决方案,因为你没有说你想做什么。你一直在评论中说你想修改通过STDIN传递的变量,但是不清楚你的意思是什么。你是传递命令行参数还是请求用户输入,还是将另一个程序的输出传送到你的,o完全是其他的吗?理想的方法会根据你想做的事情略有不同 要读取命令行参数,请访问
@ARGV
数组:
$foo = $ARGV[0]; #read the first argument
要从STDIN中读取一行,请执行以下操作:
print "Enter a number: ";
$foo = <STDIN>;
打印“输入数字”:;
$foo=;
您在评论中一直说要修改通过STDIN传递的变量,但不清楚这是什么意思。您是传递命令行参数,还是请求用户输入,还是将另一个程序的输出传输到您的程序中,或者完全是其他什么?理想的方法会因你想做什么
要读取命令行参数,请访问@ARGV
数组:
$foo = $ARGV[0]; #read the first argument
要从STDIN中读取一行,请执行以下操作:
print "Enter a number: ";
$foo = <STDIN>;
打印“输入数字”:;
$foo=;
代码显示$key
和$ref
共享相同的字符串表示形式。其中一个是字符串,另一个是