5

基本的に、動的に生成された文字列で名前が付けられた変数の内容を取得したいのですが、厳密モードでこれを達成するためのすべての努力は失敗しました。同様の問題に関する投稿がいくつかありますが、私にとってはうまくいった解決策があるようには見えません。

これは私がやりたいことです:

# Fields:
$q1 = "ex. data 1";
$q2 = "ex. data 2";
$q3 = "ex. data 3";
$q4 = "ex. data 4";
$q5 = "ex. data 5";

# retrieve the desired field name.  q1, q2, q3, q4, or q5.
$field_name = fetch_the_desired_field_name();

# fetch the contents of the named field.  ex. data 1, ex. data 2, etc.
$contents_of_desired_field = $$field_name;

print $contents_of_desired_field;

厳密モードでこれを行う方法はありますか? 同様の問題に関する他の投稿では、ハッシュが答えであると人々は言っていますが、ハッシュでこれを行う方法を完全に理解できないようです。これが非常に単純化された例であることは言うまでもありません。実際のコードでは、115 の可能なフィールド名があり、すべてデータベースから取得され、内容は予測できません。

4

3 に答える 3

12

これをハッシュで行うには:

店:

$myHash{q3} = "ex. data 3";

取得:

$result = $myHash{q3};

これには、次のような複数の利点があります。

  • 「use strict」を満たします。

  • 経由ですべてのフィールド名をループできますkeys %myHash

  • フィールド名は最後のポイントのリストであるため、必要に応じて他のリスト操作を行うことができます ( mapgrep) など...

    • たとえば、フィールド名が「q[1-5]」の形式の値のみを取得するには、次のようにします。

      @subset = @myHash{ grep m/q[1-5]/ keys %myHash }; # Use a slice @{} operator.
      
    • ほとんどのデータベース API (DBI など) には、テーブルから行をクエリするときに、この正確な形式のハッシュ (または代わりにハッシュ参照) を自動的に返す呼び出しがあります。

      $hash_ref = $sth->fetchrow_hashref;
      
于 2013-07-02T19:43:14.953 に答える
7

変数名を動的に生成したくありません! 代わりに、ハッシュまたは配列を使用します。

my @q = ("ex. data 1", ..., "ex. data 5");

my $contents  = $q[ $some_index ];

print $contents;

Where$some_indexは目的のインデックスに設定されるため、動的な名前は必要ありません。

于 2013-07-02T19:41:46.550 に答える
5

strict「シンボリック参照」と呼ばれるものの使用を明示的に許可しません。これは、Perl に許可を求めることで回避できます。

use strict;
use warnings;
use 5.10.0;

our $x = '5';
my $field_name = 'x';

my $contents;
{ # no strict is lexially scoped
    no strict 'refs';
    $contents = ${$field_name};
}

say $contents;

参照される変数は字句ではなく動的でなければならず、この方法は一般的に推奨されないことに注意してください。正しいデータ型であるハッシュで問題を解決する方法は次のとおりです。

# Fields:
my %data = (
    q1 => "ex. data 1",
    q2 => "ex. data 2",
    q3 => "ex. data 3",
    q4 => "ex. data 4",
    q5 => "ex. data 5",
);

# retrieve the desired field name.  q1, q2, q3, q4, or q5.
$field_name = fetch_the_desired_field_name();

# fetch the contents of the named field.  ex. data 1, ex. data 2, etc.
$contents_of_desired_field = $data{$field_name};

print $contents_of_desired_field;

そこには。面倒なことはありませんno strict。すべてのデータを保持する変数は 1 つだけです。

于 2013-07-02T19:49:44.027 に答える