$ perl -pe 's/(<value>[^<]{1,6})[^<]*/$1/' shortstring.in
<value>1234@g</value>
<value>1235@g</value>
В контексте фрагмента вашего вопроса используйте
while (<$input_handle>) {
s!(<value>)(.*?)(</value>)!$1 . substr($2,0,6) . $3!e
if /(\d+\@google\.com)/;
print $output_handle $_;
}
или сделать это с одним шаблоном
while (<$input_handle>) {
s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e;
print $output_handle $_;
}
Использование взрыва в качестве разделителя в операторе подстановки предотвращает Синдром склонности зубочистки в </value>
.
ПРИМЕЧАНИЕ: Применяются обычные предупреждения о «разборе» XML с помощью регулярных выражений.
Демонстрационная программа:
#! /usr/bin/perl
use warnings;
use strict;
my $input_handle = \*DATA;
open my $output_handle, ">&=", \*STDOUT or die "$0: open: $!";
while (<$input_handle>) {
s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e;
print $output_handle $_;
}
__DATA__
<value>1234@google.com</value>
<value>1235@google.com</value>
<value>12@google.com</value>
Выход:
$ ./prog.pl
<value>1234@g</value>
<value>1235@g</value>
<value>12@goo</value>