首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl解析abnf语法

使用perl解析abnf语法
EN

Stack Overflow用户
提问于 2014-02-25 20:53:19
回答 1查看 409关注 0票数 1

感谢您在链接Parse::ABNF perl usage上提出的问题。我仍然面临着解决我的问题的困难。请求检查我下面的问题,并提供指向解决方案的指针。

现在,我已经在一个文件中创建了ABNF格式的sip语法(命名为sip.abnf)。我在如下所示的文件(recd_message.txt)中有带标头的sip消息:

代码语言:javascript
复制
From: <sip:07455900064@212.136.178.216:5060;user=phone>;tag=1526438727-1338998848384-
To: "govoice-lab2-aokanlawon"<sip:441127653485@isf.fire.ipgcom.com>
Contact: <sip:07455900064@10.12.33.29:5070;transport=udp>
Allow: ACK,BYE,CANCEL,INFO,INVITE,OPTIONS,PRACK,REFER,NOTIFY
Accept: multipart/mixed,application/media_control+xml,application/sdp

我创建了一个Perl程序,使用ABNF语法来验证上面的头消息,将其命名为testSipHeader.pl,内容如下:

代码语言:javascript
复制
use strict; use warnings;
use File::Slurp;
use Parse::ABNF ;
use Data::Dumper;

my $grammar_file = shift;
my $messages = shift;
my @header_name;
my $header_status;

my $grammar = scalar read_file( $grammar_file );
$grammar =~ s/\x0d\x0a/\n/g;
$grammar =~ s/^\s+(?=[\w-]+\s*=)//mg;

$grammar = Parse::ABNF->new->parse(  scalar read_file( $grammar_file ) );
if (defined $grammar) {
    print "Grammar is now defined...\n";
    my $header;
    open ( $header , "<", $messages) or die "Could not open $messages file";
    while(<$header>) {
        print "Processing the message $_\n";
        @header_name = split(': ', $_);
        if ($header_name[0] eq "From") {
            $header_status = $grammar->From($_) ;
        } elsif ($header_name[0] eq "To") {
            $header_status = $grammar->To($_) ;
        } elsif ($header_name[0] eq "Contact") {
            $header_status = $grammar->Contact($_) ;
        } elsif ($header_name[0] eq "Allow") {
            $header_status = $grammar->Allow($_) ;
        } elsif ($header_name[0] eq "Accept") {
            $header_status = $grammar->Accept($_) ;
        } else {
            print "Error: Unsupported header $header_name[0] received\n";
        }
    }
} else {
        print "Error: grammar is not defined\n";
}

下面是Perl调用和输出/错误

代码语言:javascript
复制
$> perl -I. testSipHeader.pl sip.abnf recd_messages.txt
Grammar is now defined...
Processing the message From: <sip:07455900064@212.136.178.216:5060;user=phone>;tag=1526438727-

Can't call method "From" on unblessed reference at testSipHeader.pl line 21, <$header> line 1.

注意:目前我有一个生成SIP头的C程序,我正在尝试通过这个perl函数来验证头的内容。我正在尝试使用与链接Parse::RecDescent grammar not working as expected中给出的用法类似的用法

我必须在您的脚本中做一点修改,以包含Parse::ABNF和处理输入文件,然后接收到的输出出现在路径https://drive.google.com/file/d/0B8KDQDXsCKR_ZERzV3IyY1M2NW8/edit?usp=sharing

EN

回答 1

Stack Overflow用户

发布于 2014-02-25 21:44:53

我重写了一下你的脚本,输出是什么?

代码语言:javascript
复制
use Data::Dumper;
my $grammar_rules;
{
    local $/=undef;
    open(my $fh,'<',$grammar_file) or die $grammar_file,$!;
    $grammar_rules = <$fh>;
    $grammar_rules =~ s/\x0d\x0a/\n/g;
    $grammar_rules =~ s/^\s+(?=[\w-]+\s*=)//mg;
}
print Dumper('rules',$grammar_rules);
my $grammar = Parse::ABNF->new->parse(  $grammar_rules );
print Dumper('grammar',$grammar);
die "Error: grammar is not defined" if ! defined $grammer;
print "Grammar is now defined...\n";

open ( my $header_fh , "<", $messages) or die "Could not open $messages file, $!";
while(my $line = <$header_fh>) {
    chomp($line);
    print "Processing the message $line\n";
    @header_name = split(': ', $line);
    if ($header_name[0] eq "From") {
        $header_status = $grammar->From($line) ;
    } elsif ($header_name[0] eq "To") {
        $header_status = $grammar->To($line) ;
    } elsif ($header_name[0] eq "Contact") {
        $header_status = $grammar->Contact($line) ;
    } elsif ($header_name[0] eq "Allow") {
        $header_status = $grammar->Allow($line) ;
    } elsif ($header_name[0] eq "Accept") {
        $header_status = $grammar->Accept($line) ;
    } else {
        print "Error: Unsupported header $header_name[0] received\n";
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22014817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档