我正在尝试编写一个基本的Perl脚本来进行一些字符串操作。我将“Existing_Value_To_Be_Changed”和“New_Value”作为用户输入。
该文件有多个行块,如下所示 -
foo_bar_xyz000123 := abcd (100010
01010111111001011010001010); - (Not in same line as previous)
字符串的foo_bar_abc
部分在文件中出现多次。它后面的唯一数字是每个外观的唯一数字。
当我在Perl中逐行遍历时,如何在0
匹配后用1
(New_Value)替换所有foo_bar_xyz
(Existing_Value_To_Be_Changed)(在所有事件中)。但是我需要在(
之后开始并继续执行以下行,直到遇到);
并在此之后停止。
修改
我已经完成了关于导航到那些特定线条块的部分。我被困在角色搜索&替换部分。
$var = 'false';
while <File> {
if (pattern matches) {
$var = 'true';
}
if ($var eq "true") {
push(@array, $_);
if ( $_ contains ");" ) {
$var = 'false';
}
}
}
当前行存储在变量中时,(
仅在);
部分之后进行替换的最佳方法是什么?
修改
Existing_Value_To_Be_Changed 和 New_Value 是用户输入,如果一个为0,则另一个为1,反之亦然,因为它是一个只包含0和的二进制字符串1秒。
答案 0 :(得分:0)
最简单的方法是在找到每个多行序列时执行转换。这个简短的程序证明了这一点。
您还没有描述输入文件的内容,所以我不得不猜测一些测试数据。可执行替换中的tr/0/1/r
是更改数据的部分。
use strict;
use warnings;
use 5.014; # For non-destructive substitution
while (<DATA>) {
if (/foo_bar_xyz000123/) {
$_ .= <DATA> until /\);/;
s| ( \( [01\s]+ \) ) | $1 =~ tr/0/1/r |ex;
}
print
}
__DATA__
xx
yy
zz
foo_bar_xyz000123 := abcd (100010
01010111111001011010001010);
aa
bb
cc
foo_bar_xyz000123 := abcd (100010
01010111111001011010001010
01010111111001011010001010
01010111111001011010001010);
dd
ee
ff
<强>输出强>
xx
yy
zz
foo_bar_xyz000123 := abcd (111111
11111111111111111111111111);
aa
bb
cc
foo_bar_xyz000123 := abcd (111111
11111111111111111111111111
11111111111111111111111111
11111111111111111111111111);
dd
ee
ff