Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么Parse::RecDescent会给我所有这些警告和错误?_Perl_Parsing_Parse Recdescent - Fatal编程技术网

Perl 为什么Parse::RecDescent会给我所有这些警告和错误?

Perl 为什么Parse::RecDescent会给我所有这些警告和错误?,perl,parsing,parse-recdescent,Perl,Parsing,Parse Recdescent,下面的Perl文件解析代码让人非常痛苦[最后一次回复是在PM@follow: !/usr/bin/perl-w 严格使用; 使用警告; #使用诊断; 使用Parse::RecDescent; 使用数据::转储程序; #在Parse::RecDescent模块中启用警告。 $::RD_ERRORS=1;#确保解析器在遇到错误时死亡 $::RD_WARN=1;#启用警告。这将对未使用的规则发出警告&c。 $::RD_HINT=1;#给出提示以帮助解决问题。 #$::RD_TRACE=1;#解析器的跟

下面的Perl文件解析代码让人非常痛苦[最后一次回复是在PM@follow:

!/usr/bin/perl-w
严格使用;
使用警告;
#使用诊断;
使用Parse::RecDescent;
使用数据::转储程序;
#在Parse::RecDescent模块中启用警告。
$::RD_ERRORS=1;#确保解析器在遇到错误时死亡
$::RD_WARN=1;#启用警告。这将对未使用的规则发出警告&c。
$::RD_HINT=1;#给出提示以帮助解决问题。
#$::RD_TRACE=1;#解析器的跟踪
#$::AUTOSTUB=1;
my$grammar=Dump([$text],“fieldStuff”]);
$return={fieldName=>$item[2],fieldValue=>$item[3]};
}
元字段:/^\#/metaName元字段值
{
#打印“[*]已获取名为\'”$item{metaName}.\'的元字段,值为\'.$item{metaFieldValue}.\'\n”;
#打印“[*]已获取名为\'”$item[2].\'的元字段,其值为\'.$item[3]。“\'\n”;
$return={metaName=>$item[2],metaFieldValue=>$item[3]};
}
记录正文:字段
{
打印“\n[*]个字段\n”;
#打印main::Dumper\@项;
#打印数据::转储程序->转储([@item],“字段)”);
$return='字段';
#如果((长度($text)>3)和&(0=@item))
如果(长度($text)>2)
{
$return=undf;
}
}
|
元域(s)
{
打印“\n[*]元字段\n”;
#打印main::Dumper\@项;
#打印数据::转储程序->转储([@item],“元字段]);
$return='metaField';
#如果((长度($text)>3)和&(0=@item))
如果(长度($text)>2)
{
$return=undf;
}
}
|
#
#startOfRecord:RECORDSTART recordBody(s/$/)RECORDEND
startOfRecord:RECORDSTART recordBody RECORDEND
#startOfRecord:RECORDSTART(元字段)RECORDEND
#startOfRecord:RECORDSTART(字段)metaField(字段))RECORDEND
{
#打印main::Dumper\@项;
$return='something';
#$return=$item[1];
1.
}
|
#
_地理语法_
#$skeletonPattern=“#输入_类型[\t]*”;
#我的$metaFieldPattern=qr/[\t]*.#([^\t]+)[\t]+(.*)/o;#“#输入类型SCDR+”,“#文件名已处理\u 01_20080616001403.cdr”等
#我的$normalFieldPattern=qr/([\t]*)([0-9]*)F[\t]+([^\t]+)[\t]+([^\t\r\n]+)(.*)/;#“1F S#U Diagnostic162”或“F S#U Diagnostic162”或“F S#U Diagnostic162”是同义词,等等

我的$testData0=我认为在XP上选择ActivePerl很好;唯一的问题是语法

recordBody的语法规则规定,内部只能有多个字段或多个元字段,中间不能有任何内容

如果您需要字段/元字段的混合,我建议创建一些人工规则anyField

anyField : field | metaField

recordBody : anyField(s)

它是有效的,但我不明白为什么-你能给我指一个资源,让我澄清对我的基本误解吗?还要注意,根据你的建议,语法仍然失败,只有$testData4(meta)有空值的字段,不同于其他$testData'sSorry,我知道没有指针-我只使用了关于(ANTLR表示法)G:(X*)(Y*)和G:(X | Y)*之间区别的常识。前者说“如果你选择第一个选项,匹配所有的X而不是Y;否则,匹配所有的Y而不是X”“匹配X或Y,然后匹配X或Y。。。"“具有空值的元字段”问题可能是由您的元名称规则引起的,尤其是结尾处的“\n”;“这会占用换行符,而下面的元字段值没有任何匹配项。如果您希望每行有一个字段,最好不要在名称/值中处理行尾…而是在字段规则中处理;这有助于保留您的san。”你可能想看看这里:寻找一些关于空格处理的指针。 RECORD F ptc_record_length 00B6 F ptc_charging_start_time 20090604093721 F ptc_charging_end_time 20080604093721 F ptc_called_msrn_ton FF F ptc_term_mcz_duration 060000 . [*] field(s) Parsing done sucessfully! RECORD #input_id 91210758171x001_0013 #input_type PTC #output_type MTC #source_id 01 #filename TTFILE01-0001-20080101000000 #jingalama valuewith#inIt andaSpace . [*] metaField(s) Parsing done sucessfully! RECORD F ptc_record_length 00B6 F ptc_charging_start_time 20090604093721 F ptc_charging_end_time 20080604093721 F ptc_called_msrn_ton FF F ptc_term_mcz_duration 060000 #input_id 91210758171x001_0013 #input_type PTC #output_type MTC #source_id 01 #filename TTFILE01-0001-20080101000000 #jingalama valuewith#inIt andaSpace . [*] field(s) Bad input! RECORD #input_id 91210758171x001_0013 #input_type PTC #output_type MTC #source_id 01 #filename TTFILE01-0001-20080101000000 #jingalama valuewith#inIt andaSpace F ptc_record_length 00B6 F ptc_charging_start_time 20090604093721 F ptc_charging_end_time 20080604093721 F ptc_called_msrn_ton FF F ptc_term_mcz_duration 060000 . [*] metaField(s) Bad input! RECORD #input_id 91210758171x001_0013 #output_id #input_type PTC #output_type PTC #addkey #source_id 01 #filename TTFILE01-0001-20080101000000 F ptc_record_length 00B6 F ptc_record_type F ptc_charging_start_time 20090604093721 F ptc_charging_end_time 20080604093721 F ptc_called_msrn_ton FF F ptc_term_mcz_duration 060000 F ptc_term_mcz_change_direction . [*] metaField(s) Bad input! print() on closed filehandle ERROR at C:/laPerl/site/lib/Parse/RecDescent.pm line 2905. Variable "$errortext" is not available at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906. Variable "$errorprefix" is not available at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906. Use of uninitialized value $errorprefix in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2850. Use of uninitialized value $errortext in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2850. Use of uninitialized value $errortext in formline at C:/laPerl/site/lib/Parse/RecDescent.pm line 2852. write() on closed filehandle ERROR at C:/laPerl/site/lib/Parse/RecDescent.pm line 2906. ...
anyField : field | metaField

recordBody : anyField(s)