使用分隔符拆分记录

时间:2015-09-30 17:55:46

标签: perl split string-split

我使用分隔符' |'分割记录。遇到管道符号(分隔符)前面有转义序列的情况,在这种情况下,管道符号不能被视为分隔符。我如何使用拆分解决它? 发布在代码示例下方

#!/usr/bin/perl
use strict;

my $id = 'Hi|Hello\|Sir';
my @code = split(/\|/,$id);

print $code[1]."\n";

上述计划的预期输出是" Hello \ | Sir "但实际输出是" ** Hello **"。如何使用拆分处理转义前面的分隔符。

谢谢

3 个答案:

答案 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拆分为HiHello\|Sir

的数组

这也会将"Hi|Hello\\\\|Sir"拆分为HiHello\\|Sir

的数组