Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 连接到字符串的变量是否可以通过引用进行操作_String_Perl_Reference_Concatenation - Fatal编程技术网

String 连接到字符串的变量是否可以通过引用进行操作

String 连接到字符串的变量是否可以通过引用进行操作,string,perl,reference,concatenation,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; } 等等…但它不起作用 我是否误解了

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

   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;
}
等等…但它不起作用


我是否误解了参考系?

您对参考系的理解有误

文本在该点与id值关联,在本例中为0。此文本将丢失与可变$id的所有连接。然后,在循环中

for($i = 0; $i < 9; $i++) {
    my $rid = \$id;
    ${$rid}++;
    print $text;
}
那么在你的循环中呢

for($i = 0; $i < 9; $i++) {
    $id++;
    print $textfunc->();
}
($i=0;$i<9;$i++)的
{
$id++;
打印$textfunc->();
}

您误解了参考系

文本在该点与id值关联,在本例中为0。此文本将丢失与可变$id的所有连接。然后,在循环中

for($i = 0; $i < 9; $i++) {
    my $rid = \$id;
    ${$rid}++;
    print $text;
}
那么在你的循环中呢

for($i = 0; $i < 9; $i++) {
    $id++;
    print $textfunc->();
}
($i=0;$i<9;$i++)的
{
$id++;
打印$textfunc->();
}

正如西南所指出的,有一种更简单的方法可以做到这一点。如果您想将<代码> $TEX<代码>字符串分开以维护和/或重用,您也可以考虑使用<代码> SeaStff,例如:

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);
}
my$id=0;
我的$max_id=9;
my$text=“这是一个示例,id:%d\n”;
对于(my$i=$id;$i<$max_id;$i++){
打印sprintf($text,$i+1);
}

正如西南所指出的,有一种更简单的方法可以做到这一点。如果您想将<代码> $TEX<代码>字符串分开以维护和/或重用,您也可以考虑使用<代码> SeaStff,例如:

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);
}
my$id=0;
我的$max_id=9;
my$text=“这是一个示例,id:%d\n”;
对于(my$i=$id;$i<$max_id;$i++){
打印sprintf($text,$i+1);
}

您似乎对参考资料感到困惑。可能您正在考虑以下C指针场景:

char text[] = "This is a test xx\n";
char *cursor = text + 15;
*cursor = ' 1';
我不知道什么样的思维过程会给人这样的印象:一旦你将
$id
的内容插入
my$x=“Test string$id”
,你就可以通过改变
$id
的值来改变插入字符串的值

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

现在,如果希望某个地方的子例程能够格式化某些输出,而无需在子例程中嵌入输出格式,则可以将消息格式化程序作为参数之一传递给子例程,如下所示:

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;
}
这肯定会变得单调乏味,因此您基本上可以拥有一个格式化程序包,让Sub使用他们需要的任何格式化程序:

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

你似乎对推荐信感到困惑。可能您正在考虑以下C指针场景:

char text[] = "This is a test xx\n";
char *cursor = text + 15;
*cursor = ' 1';
我不知道什么样的思维过程会给人这样的印象:一旦你将
$id
的内容插入
my$x=“Test string$id”
,你就可以通过改变
$id
的值来改变插入字符串的值

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

现在,如果希望某个地方的子例程能够格式化某些输出,而无需在子例程中嵌入输出格式,则可以将消息格式化程序作为参数之一传递给子例程,如下所示:

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;
}
这肯定会变得单调乏味,因此您基本上可以拥有一个格式化程序包,让Sub使用他们需要的任何格式化程序:

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

print$textfunc()正确吗?因为我在这一行得到了以下错误:
不是全局引用
否,最干净的方法是
print“这是一个示例,id:$\n”表示0。。9;闭包?!只是把一个变量插入一个字符串?世界将走向何方@SinanÜnür如果循环在同一个地方是的,但是问题暗示循环在程序的某个遥远的部分,或者他们也不需要引用。在这种情况下,不要关闭变量,只传递一个子引用。为什么不将一个参数传递给
$textfunc
,而不是让它的调用在“程序的某个遥远部分”的某个变量上操作呢正确吗?因为我在这一行得到了以下错误:
不是全局引用
否,最干净的方法是
print“这是一个示例,id:$\n”表示0。。9;闭包?!只是把一个变量插入一个字符串?世界将走向何方@SinanÜnür如果循环在同一个地方是的,但是问题暗示循环在程序的某个遥远的部分,或者他们也不需要引用。在这种情况下,不要关闭变量,只传递一个子引用。为什么不把一个参数传递给
$textfunc
,而不是让它的调用在“程序的某个遥远部分”的某个变量上操作呢?你可以用
printf
代替
print sprint(…)
。Perl不是我的$id(0..9)的C.
你可以用
printf
代替
print sprint(…)
.Perl不是我的$id(0..9)的C.
实际上有一个模块允许您执行类似的操作。阿格!不记得叫什么了。实际上,有一个模块可以让你做这样的事情。阿格!不记得叫什么了。完全