我正在逐行读取另一个perl文件,需要通过单引号或双引号查找任何单词或单词组。这是我正在阅读的代码示例:
#!/usr/bin/env perl
use strict;
use warnings;
my $string = 'Hello World!';
print "$string\n";
基本上,我需要找到并打印出“Hello World!'和" $ string \ n"。
我已经正确读取了我的文件并将其内容存储在一个数组中。从那里我循环遍历每一行,并使用正则表达式在引号中找到所需的单词集:
for(@contents) {
if(/\"|\'[^\"|\']*\"|\'/) {
print $_."\n";
}
}
给出了以下输出:
my $string = 'Hello World!';
print "$string\n";
我尝试用空格分割内容然后尝试找到匹配,但这给了我这个:
'Hello
World!'
"$string\n";
我已经尝试了其他建议的众多解决方案,但无济于事。我也试过Text :: ParseText并使用parse_line,但这给了我完全错误的输出。
任何可以帮助我的想法?
答案 0 :(得分:4)
只需要在正则表达式中添加一些捕获括号,而不是打印整行
use strict;
use warnings;
while (<DATA>) {
if(/(["'][^"']*["'])/) {
print "$1\n";
}
}
__DATA__
#!/usr/bin/env perl
use strict;
use warnings;
my $string = 'Hello World!';
print "$string\n";
注意,你的正则表达式有很多缺陷。例如,'\''
无法正常匹配。 "He said 'boo'"
也不会。为了更接近你,你必须做一些平衡的括号检查,但是没有任何完美的解决方案。
对于更接近的解决方案,您可以使用以下内容:
if(/('(?:(?>[^'\\]+)|\\.)*'|"(?:(?>[^"\\]+)|\\.)*")/) {
这会处理我的上述异常以及print "how about ' this \" and ' more \n";
之类的字符串,但仍然存在使用qq{}
或q{}
等边缘情况。更不用说跨越多行的字符串了。
换句话说,如果你的目标是完美的,那么这个项目可能超出了大多数人的技能范围,但希望上面的内容会有所帮助。
答案 1 :(得分:2)
也许你可以拥有多个&#34;字符串&#34;为了捕获每一行,一个解决方案可能是:
while(my $line=<STDIN>) {
while( $line =~ /[\'\"](.*?)[\'\"]/g ) {
print "matched: '$1'\n";
}
}
即输入:
#!/usr/bin/env perl
use strict;
use warnings;
my $string = 'Hello World!' . 'asdsad';
print "$string\n";
并执行代码将为您提供:
matched: 'Hello World!'
matched: 'asdsad'
matched: '$string\n'