可以通过引用操作连接到字符串的var

时间:2013-03-25 16:15:33

标签: string perl reference concatenation

我需要初始化一个字符串,其中固定的文本连接到一个变量,如下所示:

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

现在,在0-> 9的imaginay循环中,我想只修改$id值而不更改固定文本。 我猜测使用引用应该像这样工作

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

依此类推......但是它没有用。

我误解了引用系统吗?

3 个答案:

答案 0 :(得分:3)

您很难理解参考系统。

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

该文本与该点的id值相同,在本例中为0.此文本与varable $ id失去所有连接。然后在循环中

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

您正在使用$id递增$rid变量($id会成为my $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->();
}

然后在你的循环中做

{{1}}

答案 1 :(得分: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);
}

答案 2 :(得分:1)

你似乎对引用感到困惑。也许您正在考虑以下C指针场景:

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

我不知道在您将$id的内容插入my $x = "Test string $id"后,您可以通过更改{的值更改内插字符串的值,这会产生什么样的思维过程? {1}}。

正如我所说,你真的很困惑。

现在,如果你想某个子程序能够格式化一些输出而不在子程序中嵌入输出格式,你可以将一个参数传递给子程序一个消息格式化程序,如:

$id

这必然会变得乏味,所以你基本上可以拥有一个格式化程序包,让subs使用他们需要的任何格式化程序:

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];
}