使用"文本::平衡"创建优化的模式,以使用"文本":"标记"



我可以在csv文件上运行以下操作,以便从文件中获取分隔文本。

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced q/extract_delimited/;
my $filecontents = do { local $/; <> };
while (my $item = extract_delimited($filecontents, '"')) {
print "Item: $itemn";
}

但是结果总是包括引号,这是我不想要的,所以我尝试了以下方法来完全隔离多行记录

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/gen_delimited_pat/;
my $filecontents = do { local $/; <> };
$patstring = gen_delimited_patq(G(?:[^"]|""|""")* ]))
while (my $item = extract_delimited($filecontents, '"')) {
print "Item: $itemn";
}

因为我知道这个正则表达式

G(?:[^"]|""|""")*

找到完整的多行记录,然后我想用文本::Markdown处理,但是我得到的错误

  • 使用?模式?在第10行不赞成使用没有显式运算符的运算符
  • 全局符号"$patstring"要求在第10行显示包名称
  • 搜索模式未在第10行终止

我试图只获取像这样的分隔文本,不包括开头和结尾的引号。我希望这是有意义的:

"描述"Star Lite 2人,带飞铝,Rust

规格:

  • 包装尺寸:13"X 5">
  • 1门
  • 内部面积:41.25平方英尺
  • 峰高:44">
  • 地板材料:190T聚酯纤维,2000mm P.U.涂层
  • 网眼布:没有看到嗯
  • 电线杆数量:2根8.5毫米的铝制防震绳
  • 杆段:12"长度
  • 包括Rainfly
  • 90英寸X 66英寸X 44英寸

排除第一行,我只想要

Star Lite 2人,带飞铝,防锈

规格:

  • 包装尺寸:13"X 5">
  • 1门
  • 内部面积:41.25平方英尺
  • 峰高:44">
  • 地板材料:190T聚酯纤维,2000mm P.U.涂层
  • 网眼布:没有看到嗯
  • 电线杆数量:2根8.5毫米的铝制防震绳
  • 杆段:12"长度
  • 包括Rainfly
  • 90英寸X 66英寸X 44英寸

我需要做些什么来修复这个模块的模式?

编辑:粘贴错误的脚本,工作

有点不雅,但这会做我认为你想做的事:

#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/extract_delimited extract_multiple/;
my $filecontents = do { local $/; <> };
#replace newlines with pipes
$filecontents=~s/n/|/g;
$filecontents=~s/""/inches/g;
#grab all your delimited substrings into an array
my @extracted = extract_multiple($filecontents,
[ sub {extract_delimited ($_[0],q{"})}],
undef, 1);
foreach my $fragment(@extracted){
#remove "
$fragment=~s/"//g;
$fragment=~s/inches/""/g;
$fragment=~s/|/n/g;
print "$fragmentn";  
}
Global symbol "$patstring" requires explicit package name at line 10.

您对有严格的要求,但忘记声明$patstring变量。

Use of ?PATTERN? without explicit operator is deprecated at line 10

gen_delimited_pat获取一个字符串。你已经通过了…好吧,你已经通过语法错误。我想它应该是正则表达式?Perl在绝望中试图将其解析为?模式?使用单个问号,然后放弃。

你举的两个例子都不应该奏效。两者都包含与上面相同的错误。没有名为gen_delimited_patq的Text::Balanced函数(它是gen_delimited_pat),也没有从Text::Balanced导出正确的函数,并且从未使用过$patstring

最新更新