我使用分隔符' |'分割记录。遇到管道符号(分隔符)前面有转义序列的情况,在这种情况下,管道符号不能被视为分隔符。我如何使用拆分解决它? 发布在代码示例下方
#!/usr/bin/perl
use strict;
my $id = 'Hi|Hello\|Sir';
my @code = split(/\|/,$id);
print $code[1]."\n";
上述计划的预期输出是" Hello \ | Sir "但实际输出是" ** Hello **"。如何使用拆分处理转义前面的分隔符。
谢谢
答案 0 :(得分:2)
您无法使用split
,但Text::CSV_XS
可以解析此格式。
use Text::CSV_XS qw( );
my $parser = Text::CSV_XS->new({
sep_char => '|',
escape_char => '\\',
quote_char => undef,
auto_diag => 2,
binary => 1,
});
$parser->parse('Hi|Hello\|Sir');
my @fields = $parser->fields();
print("$fields[1]\n"); # Hello|Sir
答案 1 :(得分:-1)
你需要的是像这样的负面断言后视:
my @code = split(/(?<!\\)\|/,$id,-1);
注意,我添加-1作为分割的参数,以防在分隔符之间跟踪空字符串在数据中很重要。
任何&#39;(?...)&#39;中的东西。未被捕获且&#34; <!
&#34;表示查看前一个字符,如果匹配则失败。因此,如果条形符号前面有反斜杠,则模式将不匹配。
答案 2 :(得分:-1)
您可以在拆分中尝试此表达式:
my @code = split(/(?<!\\{1})\|/,$id);
与@ hepcat72相似 只有在管道之前的前一个字符不是斜线时才会拆分,但是如果前面有1个斜杠,则只会拆分
这会将Hi|Hello\|Sir
拆分为Hi
和Hello\|Sir
这也会将"Hi|Hello\\\\|Sir"
拆分为Hi
和Hello\\|Sir