我在文件中有以下字符串,并希望将字符串截断为不超过6个字符.如何在perl中使用正则表达式?
原始文件是:
cat shortstring.in:
<value>1234@google.com</value>
<value>1235@google.com</value>
我想把文件作为:
cat shortstring.out
<value>1234@g</value>
<value>1235@g</value>
我有一个如下代码,有没有比使用更有效的方法
s/<value>(\w\w\w\w\w\w)(.*)/$1/;?
这是我的代码的一部分:
while (<$input_handle>) { # take one input line at a time
chomp;
if (/(\d+@google.com)/) {
s/(<value>\w\w\w\w\w\w)(.*)</value>/$1/;
print $output_handle "$_\n";
} else {
print $output_handle "$_\n";
}
}
Run Code Online (Sandbox Code Playgroud)
Hut*_*ut8 10
使用它代替(正则表达式不是Perl的唯一功能,它对此有点过分了::-)
$str = substr($str, 0, 6);
Run Code Online (Sandbox Code Playgroud)
http://perldoc.perl.org/functions/substr.html
$ 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 $_;
}
Run Code Online (Sandbox Code Playgroud)
或者用一个模式来做
while (<$input_handle>) {
s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e;
print $output_handle $_;
}
Run Code Online (Sandbox Code Playgroud)
使用刘海作为替代算子的分隔符可防止Leaning Toothpick Syndrome in </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>
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./prog.pl <value>1234@g</value> <value>1235@g</value> <value>12@goo</value>
| 归档时间: |
|
| 查看次数: |
5203 次 |
| 最近记录: |