2014-01-18 33 views
0

读光栅网格文件到@grid含有任意数,像。连续的正则表达式替换分隔值

82 8 98 98 42 12 3342 321 34 34 09434 9232 

(以及更多的那些行的)。

在此,我确实希望替换一些数字,例如34和42. 但是只有单个分隔的数字!例如。我不想更换34 3342

因此,对于数字美元(搜索,如34)和$ b(替换,如42),我的做法是

s/(^|\s)$a(\s|$)/$1$b$2/g for @grid; 

但这只是取代每隔一秒连续发生一次(如34 34 34 34 =>42 34 42 34),因为后缀\s不被考虑为下一个模式的前缀。

是否有解决这个问题的方法,除了把这些命令中的两个连接起来(这对大数组来说很慢)?

回答

2

您正在寻找\b:一个字字符(\ W)和东西之间的界限不是一个字字符

s/\b$a\b/$b/g 

Live DEMO

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 

希望这会有所帮助!

+0

相当优雅的解决方案,但'/ e'似乎性能较差。 – Martin