Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Perl 在字符串替换中,我们如何使用'/r';修饰语_Perl - Fatal编程技术网

Perl 在字符串替换中,我们如何使用'/r';修饰语

Perl 在字符串替换中,我们如何使用'/r';修饰语,perl,Perl,我需要在字符串中增加一个数值: my $str = "tool_v01.zip"; (my $newstr = $str) =~ s/\_v(\d+)\.zip$/ ($1++);/eri; #(my $newstr = $str) =~ s/\_v(\d+)\.zip$/ ($1+1);/eri; #(my $newstr = $str) =~ s/\_v(\d+)\.zip$/ $1=~s{(\d+)}{$1+1}/r; /eri; print $newstr; 预期输出为tool_

我需要在字符串中增加一个数值:

my $str = "tool_v01.zip";

(my $newstr = $str)  =~ s/\_v(\d+)\.zip$/ ($1++);/eri;
#(my $newstr = $str) =~ s/\_v(\d+)\.zip$/ ($1+1);/eri;
#(my $newstr = $str) =~ s/\_v(\d+)\.zip$/ $1=~s{(\d+)}{$1+1}/r; /eri;

print $newstr;
预期输出为
tool_v02.zip


注意:版本号
01
可能包含任意数量的前导零

我认为这个问题与
/r
修饰符无关,而是与如何正确格式化输出有关。为此,我建议:

或者,仅将数字替换为零宽度:


my$newstr=$str=~s{(?我认为这个问题与
/r
修饰符无关,而是与如何正确格式化输出有关。为此,我建议:

或者,仅将数字替换为零宽度:


my$newstr=$str=~s{(?您缺少的位是
sprintf
,其工作方式与
printf
相同,只是它不是将格式化字符串输出到
stdout
或文件句柄,而是将其作为字符串返回。示例:

sprintf("%02d",3)
生成字符串
03

将其放入正则表达式中,您可以这样做。您可以使用零宽度前瞻(
(?=…)
)来匹配文件后缀,而不是使用
/r
,只需将匹配的数字替换为新值即可

s/(\d+)(?=.zip$)/sprintf("%02d",$1+1)/ei

您缺少的位是
sprintf
,其工作方式与
printf
相同,只是它不是将格式化字符串输出到
stdout
或文件句柄,而是将其作为字符串返回。例如:

sprintf("%02d",3)
生成字符串
03

将其放入正则表达式中,您可以这样做。您可以使用零宽度前瞻(
(?=…)
)来匹配文件后缀,而不是使用
/r
,只需将匹配的数字替换为新值即可

s/(\d+)(?=.zip$)/sprintf("%02d",$1+1)/ei


提示,
my$newstr=$str=~s/..//r;
(my$newstr=$str)=~s/../;
@Саа27:
my$newstr=$str=~s/(\d+)/$1+1/er;
感谢它的工作,但是前面的零
0
丢失了…它应该是
tool\u v02.zip
获取输出
tool\u v2.zip
您没有格式化
$1+1
所以它当然会丢失前面的零zeros@ChrisTurner:这就是为什么我要问如何做。提示,
my$newstr=$str=~s/..//r;
(my$newstr=$str)=~s/../;
@Саа27:
my$newstr=$str=~s/(\d+)/$1+1/er;
感谢它的工作,但是前面的零
0
丢失了…它应该是
tool\u v02.zip
获取输出
tool\u v2.zip
您没有格式化
$1+1
所以它当然会丢失前面的零zeros@ChrisTurner:这就是为什么我要问怎么做。这不能解决问题“注意:前面的
0
可能是
0..n
次。”@haukex n在问题中没有定义,所以我选择了2次……但我确信OP能够选择一个适合的数字,以便所有文件名具有相同的大小number@Chris:我想你误解了这个问题。”前面的0可能是0..n次英语很差,但这意味着可能有任意数量的前导零。这并不意味着
n
将作为数据的一部分提供,而且您不能只选择2.@Borodin所以你不认为问题在于他们如何一致地设置一个数字的格式,以适应给定范围内的任何数字,并且可能有可选的前零吗?@Chris:我认为OP把他们自己弄糊涂了。主题行和下面几行代码显示了试图理解
/r
修饰符的尝试,仅此而已.这是一个问题,就目前的情况而言,这很好。但是脚注试图包含零填充,这与关于
/r
修饰符的主要论点完全无关。这里的问题应该重点突出且完整,但人们通常期望首先满足他们的需求。事实上,这是一个好问题它的答案是目标:它们的共同作用将不仅仅是OP。这不能处理“注意:前面的
0
可能是
0..n
次。”@haukex n在问题中没有定义,所以我选择了2…但我确信OP能够选择一个适合的数字,以便所有文件名都具有相同的大小number@Chris:我想你误解了这个问题。“前面的0可能是0..n次”是蹩脚的英语,但这意味着可能有任意数量的前导零。这并不意味着
n
将作为数据的一部分提供,而且您不能只是“选择2”.@Borodin所以你不认为问题在于他们如何一致地设置一个数字的格式,以适应给定范围内的任何数字,并且可能有可选的前零吗?@Chris:我认为OP把他们自己弄糊涂了。主题行和下面几行代码显示了试图理解
/r
修饰符的尝试,仅此而已.这是一个问题,就目前的情况而言,这很好。但是脚注试图包含零填充,这与关于
/r
修饰符的主要论点完全无关。这里的问题应该重点突出且完整,但人们通常期望首先满足他们的需求。事实上,这是一个好问题它的答案就是目标:它们的共同作用不仅仅是OP。
\u v\K
更有效(?
\u v\K
更有效(?)?