0

簡単な質問:

これを1行で行うにはどうすればよいですか:

my $foo = $bar->{baz};
fizz(\$foo);

\$bar->{baz}、\${$bar->{baz}}、その他多数を試しました。これは可能ですか?

-fREW

更新: わかりました。ハッシュ参照は DBI から来ており、スカラー参照をテンプレート ツールキットに渡しています。より詳しく見てみると、この問題は TT がこれらすべてをどのように行うかに関係していると思います。効果的に言いたいのは:

$template->process(\$row->{body}, $data);

しかし、TT はそのようには機能しません。TT はスカラー ref を取得してそこにデータを配置するため、次のようにする必要があります。

$template->process(\$row->{body}, $shopdata, \$row->{data});

とにかく、助けてくれてありがとう。参考文献は少なくとも 2 つではなく 1 つだけです。

4

4 に答える 4

5
\$bar->{baz}

動作するはずです。

例えば:

my $foo;
$foo->{bar} = 123;

my $bar = \$foo->{bar};

$$bar = 456;

print "$foo->{bar}\n";   # prints "456"

OPの更新に応じて、次のことができます。

\@$row{qw(body data)};

これは、配列への参照を 1 つ作成する \@array とは異なります。上記は参照を配布し、2 つの参照のリストを作成します。

于 2008-11-25T17:15:34.767 に答える
4

\$bar->{baz} は私のためにトリックを行うようです:

my $bar = { baz => 1 };
print $bar->{baz}, "\n";  # prints 1
my $ref =  \$bar->{baz};
print $$ref, "\n";        # prints 1
$$ref = 2;
print $bar->{baz}, "\n";  # prints 2 
于 2008-11-25T17:16:07.543 に答える
2

%bar と fizz() のセットアップ方法が示されていなかったので、次のようにセットアップしました。

my %hash;
my $bar = \%hash;
$hash{baz} = "found it\n";
sub fizz {
  my $ref = shift;
  print $$ref;
}

次に、これらの両方が機能します。元の信号は次のとおりです。

my $foo = $bar->{baz};
fizz(\$foo);

そして、あなたが試したとあなたが言ったバリアントの1つ:

fizz(\$bar->{baz});

あなたに与えているエラーを表示できますか?

于 2008-11-25T17:14:58.840 に答える
0

あなたが何をしているのかさえわかりません。また、baz を引用符で囲む必要があります。

ここで、最初の行でスカラーをスカラーに代入すると、2 行目が機能するはずだと考えてみましょう。しかし、これがあなたがここでしようとしていることであるかどうかはわかりません.Perlでは意味がありません. 参照の使用は、他の言語でよく使用されます。

  1. 関数呼び出しを高速化する
  2. 複数の値を返すことができます。

最初は通常スカラーでは必要ありませんが、とにかく Perl はスクリプト言語なので、本当に速度が気になる場合は C を書きます。

匿名ハッシュへのリストと参照を非常に簡単に返すことができるため、2 番目は Perl では必要ありません。

「man perlref」を見たことがありますか?

于 2008-11-25T17:10:47.413 に答える