我可以在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
。