1

以下の文字列を解析しようとしています-

入力:"1"|"abc xyz"||"a|25|30"|2345

出力:

"1"
"abc xyz"

"a|25|30"
2345

これどうやってするの?

4

3 に答える 3

5
#!perl
use strict;
use warnings;
use Text::CSV;

my $in = q{"1"|"abc xyz"||"a|25|30"|2345};
my $csv = Text::CSV->new({ sep_char => '|', quote_char => '"' });
$csv->parse($in);
print $_, "\n" for $csv->fields;

出力:

1
abc xyz

a|25|30
2345
于 2012-05-09T03:54:46.650 に答える
1

CSVパーサーは引用符を削除します。これらのソリューションは、それらを無傷に保ちます。

use Text::ParseWords qw(quotewords);
quotewords(qr'[|]', qr("), q("1"|"abc xyz"||"a|25|30"|2345));
# (
#     '"1"',
#     '"abc xyz"',
#     '',
#     '"a|25|30"',
#     2345
# )

use Data::Record qw();
use Regexp::Common qw(delimited);
my $r = Data::Record->new({ split => qr'[|]', unless => $RE{quoted} });
$r->records(q("1"|"abc xyz"||"a|25|30"|2345));
# (
#     '"1"',
#     '"abc xyz"',
#     '',
#     '"a|25|30"',
#     2345
# )
于 2012-05-09T07:03:56.177 に答える
0
use strict;
use warnings;

my $input = q{"1"|"abc xyz"||"a|25|30"|2345||"2"|"z|6|7"|"jkl"||b};
print $& eq '||' ? "\n" : "$&\n" while $input =~ /".*?"|\w+|\|.{0}\|/g;

出力

"1"
"abc xyz"

"a|25|30"
2345

"2"
"z|6|7"
"jkl"

b
于 2012-05-09T05:59:30.367 に答える