0

次のような変数に連結された固定テキストで文字列を初期化する必要があります。

   my $id = 0;
   my $text ="This is an example, id: ".$id."\n";

$idここで、0-> 9のイマジネイループで、固定テキストを変更せずに値のみを変更したいと思います。参照の使用はこのように機能するはずだと思いました

for($i = 0; $i < 9; $i++) {
    my $rid = \$id;
    ${$rid}++;
    print $text;
}

必要な出力は

This is an example, id: 0
This is an example, id: 1
This is an example, id: 2

など...しかし、それは機能していません。

参照システムを誤解していますか?

4

3 に答える 3

3

参照システムを誤解しています。

my $id = 0;
my $text ="This is an example, id: ".$id."\n";

テキストは、その時点でのidの値(この場合は0)と連結されます。このテキストは、変数$idとのすべての接続を失います。その後、ループで

for($i = 0; $i < 9; $i++) {
    my $rid = \$id;
    ${$rid}++;
    print $text;
}

(inはatの別名になり ますが、変数への参照がないため、テキストには影響しません。$idを使用して変数をインクリメントしています。$rid$idmy $rid = \$id;$id

あなたがやろうとしていることをする最もきれいな方法は、クロージャーを使うことです

my $id = 0;
my $textfunc = sub { return "This is an example, id: ".$id."\n" };

次に、ループで

for($i = 0; $i < 9; $i++) {
    $id++;
    print $textfunc->();
}
于 2013-03-25T16:41:20.173 に答える
1

Sinanが指摘したように、これを行うためのより簡単な方法があります。$text保守性や再利用のために文字列を分離したい場合は、次のように使用することも検討してくださいsprintf

my $id = 0;
my $max_id = 9;
my $text = "This is an example, id: %d\n";

for (my $i = $id; $i < $max_id; $i++) {
    print sprintf($text, $i+1);
}
于 2013-03-25T19:15:14.550 に答える
1

あなたは参照について混乱しているようです。たぶん、あなたは次のCポインタシナリオを考えていると思います。

char text[] = "This is a test xx\n";
char *cursor = text + 15;
*cursor = ' 1';

$idの内容をに補間するmy $x = "Test string $id"と、の値を変更することで、補間された文字列の値を変更できるという印象をどのような思考プロセスがもたらすのかわかりません$id

私が言ったように、あなたは本当に混乱しています。

ここで、サブルーチンのどこかで出力フォーマットをサブルーチンに埋め込まずに出力をフォーマットできるようにしたい場合は、次のように、引数の1つとしてメッセージフォーマッターをサブルーチンに渡すことができます。

my $formatter = sub { sprintf 'The error code is %d', $_[0] };

forbnicate([qw(this that and the other)], $formatter);

sub frobnicate {
    my $args = shift;
    my $formatter = shift;

    # ...

    for my $i (0 .. 9) {
       print $formatter->($i), "\n";
    }

    return;
}

これは面倒になるので、基本的にフォーマッターのパッケージを用意し、潜水艦に必要なフォーマッターを使用させることができます。

package My::Formatters;

sub error_code {
    my $class = shift;
    return sprintf 'The error code is %d', $_[0];
}

メインスクリプト:

use My::Formatters;

for my $i (0 .. 9) {
    My::Formatters->error_code($i);
}
于 2013-03-25T20:03:13.037 に答える