Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
哈希/Foreach中的Perl变量引用_Perl_Reference - Fatal编程技术网

哈希/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
共享相同的字符串表示形式。其中一个是字符串,另一个是