2014-01-18 4 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: граница между словом полукокса (\ ш) и то, что не слово, символ

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

Смежные вопросы