使用Text :: Balanced创建优化模式以使用Text :: Markdown进行格式化

时间:2012-09-23 16:30:52

标签: regex perl perl-module

我可以在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: $item\n";
}

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

#!/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: $item\n";
}

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

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

找到我想用Text :: Markdown处理的完整多行记录但是我得到错误

  • 使用?PATTERN?在第10行不推荐使用显式运算符。
  • 全局符号“$ patstring”需要第10行显式的包名称。
  • 搜索模式未在第10行终止。

我试图只获取记录的分隔文本,看起来像这样,不包括开头和结尾的引用,我希望这是有道理的:

“说明” “Star-Lite 2人用飞铝,铁锈

规格:

  • 包装尺寸:13“”X 5“”
  • 1门
  • 内部面积:41.25平方英尺
  • 峰高:44“”
  • 地板材质:190T涤纶,2000mm P.U.涂层
  • Mesh:No-see-um
  • 极数:2个防震铝线8.5毫米。
  • 极点部分:12“”长度。
  • 包括Rainfly。
  • 90“”X 66“”X 44“”“

排除我只想要的第一行

Star-Lite 2人用飞铝,铁锈

规格:

  • 包装尺寸:13“”X 5“”
  • 1门
  • 内部面积:41.25平方英尺
  • 峰高:44“”
  • 地板材质:190T涤纶,2000mm P.U.涂层
  • Mesh:No-see-um
  • 极数:2个防震铝线8.5毫米。
  • 极点部分:12“”长度。
  • 包括Rainfly。
  • 90“”X 66“”X 44“”

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

编辑:粘贴了错误的脚本

2 个答案:

答案 0 :(得分:1)

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

#!/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 "$fragment\n";  
}

答案 1 :(得分:0)

Global symbol "$patstring" requires explicit package name at line 10.

您已启用strict并忘记声明$patstring变量。

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

gen_delimited_pat需要一个字符串。你已经通过了......好吧,你传递了一个语法错误。我想这应该是一个正则表达式?无奈之下,Perl试图使用单个问号将其解析为?PATTERN?,然后放弃。

你提供的任何一个例子都不应该有效。两者都包含上述相同的错误。没有名为gen_delimited_patq的Text :: Balanced函数(它是gen_delimited_pat),既没有从Text :: Balanced导出正确的函数,也从未使用$patstring