将栅格网格文件读入包含任意数字的@grid
,例如
82 8 98 98 42 12 3342 321 34 34 09434 9232
(以及更多这些行)。
在这里,我想更换一些数字,比如34和42。 但只有单个,分开的数字!例如。我不想替换3342中的34。
因此对于数字$ a(搜索,例如34)和$ b(替换,例如42),我的方法是
s/(^|\s)$a(\s|$)/$1$b$2/g for @grid;
但这仅替换连续出现的每一秒(例如34 34 34 34
=> 42 34 42 34
),因为后缀\s
不会被考虑作为下一个模式的前缀。< / p>
这个问题有没有解决办法,除了将两个命令背对背(对于大型阵列来说速度慢)?
答案 0 :(得分:2)
答案 1 :(得分:0)
您可以设置包含替换对的哈希值,然后捕获一行上的每个数字,并在该数字为哈希键时进行替换:
use strict;
use warnings;
my %replacements = ( 34 => 42, 8 => 100 );
while (<DATA>) {
s/(\d+)/exists $replacements{$1} ? $replacements{$1} : $1/ge;
print;
}
__DATA__
82 8 98 98 42 12 3342 321 34 34 09434 9232
97 8 8 8 27 37 34 55 19 100 8 34 07932 8
输出:
82 100 98 98 42 12 3342 321 42 42 09434 9232
97 100 100 100 27 37 42 55 19 100 100 42 07932 100
希望这有帮助!