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ハッシュキーは文字列のみにすることができます。キーとしての参照はありませんが、参照が自動的に文字列化されたもの:代わりに逐語的な文字列 "SCALAR(0x30f558)"。明らかに、文字列は参照として機能しません。

データの保存方法を再考し、方法に焦点を当てる代わりに、何をしたいのかをもう少し詳しく説明する必要があります

例で示されている特定のケースでは、オーバーライド可能にしたい値にプレーンハッシュを使用します。

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

...そして、このハッシュの値を上書きします。

于 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 に答える