Perl仅使用无引号的读行分隔符

Perl仅使用无引号的读行分隔符,perl,Perl,我希望输入记录分隔符$/仅在带引号的字符串之外工作。这里有一个具体的例子 我编写了一个Perl工具,它依赖于用分号分隔行提取单个C++语句,然后逐行处理。我是这样做的: $/ = ';'; 不幸的是,如果代码引用了分号,那么它就失败了。比如说 cout << "I feel it's necessary to separate this message; with a semicolon\n". cout一个简单的答案可能是——对于大多数代码来说——假设一个“语句”是行尾的分号。

我希望输入记录分隔符
$/
仅在带引号的字符串之外工作。这里有一个具体的例子

我编写了一个Perl工具,它依赖于用分号分隔行
提取单个C++语句,然后逐行处理。我是这样做的:

$/ = ';';
不幸的是,如果代码引用了分号,那么它就失败了。比如说

cout << "I feel it's necessary to separate this message; with a semicolon\n".

cout一个简单的答案可能是——对于大多数代码来说——假设一个“语句”是行尾的分号。但也不一定是这样

但是,“正确操作”可能是
Text::ParseWords

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

use Text::ParseWords;

local $/;
my @statements = quotewords( ";", 0, <DATA> );

print Dumper \@statements;

__DATA__
statement; another statement;
statement2; "some text; with a semicolon"; nothing here;
multi
line
statement ;
here

我们可以使用正则表达式查找带引号的分号,并将其临时替换为其他内容

 $_ =~ s/(['"][^;]+)(;)([^;]+['"].*)/$1 QUOTED_SEMI_COLON $3/;    

在运行以分号分隔行的脚本后,可以将带引号的分号替换为“;”

Text::ParseWords
可能值得一看。或者你能在分号通常位于行尾的假设下拆分“\n”吗?男孩,这是一个简单而优秀的想法,将使我从1%的失败率上升到.001%的失败率。我在打我的头。非常感谢。
 $_ =~ s/(['"][^;]+)(;)([^;]+['"].*)/$1 QUOTED_SEMI_COLON $3/;