将选项卡式文本转换为Perl数据格式

时间:2012-07-21 00:16:18

标签: xml json perl hashtable vlc

我有一些来自VLM telnet服务的数据:

show
    media : ( 1 broadcast - 0 vod )
        cam1
            type : broadcast
            enabled : yes
            loop : no
            inputs
                1 : rtsp://xxx:xxx@xxx.xxx.xxx.xxx:xxx/xxxx/xxx.xxx
            output : #transcode{vcodec="h264"}:standard{access=http,mux=ts,dst=xxx.xxx.xxx.xxx:6690/cam1}
            options
            instances
                instance
                    name : default
                    state : playing
                    position : 0,000000
                    time : 0
                    length : -1
                    rate : 1,000000
                    title : 0
                    chapter : 0
                    can-seek : 0
                    playlistindex : 1
    schedule

这是一种将此数据转换为XML或JSON或其他Perl支持的格式(哈希表等)的方法吗?

2 个答案:

答案 0 :(得分:2)

这个数据非常接近YAML,也许是故意的。您需要做的就是

  • 添加初始行---以标记内容的开头

  • 删除所有评论,例如( 1 broadcast - 0 vod )

  • 在所有当前不包含

  • 的行中添加尾部冒号

现有的评论没有问题,只是media节点不能同等于评论和cam1节点的容器。

该程序编辑数据以形成正确的YAML,将其加载到Perl哈希并转储结果。

use strict;
use warnings;

use YAML 'Load';

open my $fh, '<', 'VLM.txt' or die $!;

my $yaml = "---\n";

while (<$fh>) {
  s/\s*\(.*//;
  s/$/ :/ unless /:/;
  $yaml .= $_;
}

my $data = Load($yaml);

use Data::Dump;
dd $data;

<强>输出

{
  show => {
    media => {
      cam1 => {
        enabled   => "yes",
        inputs    => { 1 => "rtsp://xxx:xxx\@xxx.xxx.xxx.xxx:xxx/xxxx/xxx.xxx" },
        instances => {
                       instance => {
                         "can-seek"      => 0,
                         "chapter"       => 0,
                         "length"        => -1,
                         "name"          => "default",
                         "playlistindex" => 1,
                         "position"      => "0,000000",
                         "rate"          => "1,000000",
                         "state"         => "playing",
                         "time"          => 0,
                         "title"         => 0,
                       },
                     },
        loop      => "no",
        options   => undef,
        output    => "#transcode{vcodec=\"h264\"}:standard{access=http,mux=ts,dst=xxx.xxx.xxx.xxx:6690/cam1}",
        type      => "broadcast",
      },
    },
    schedule => undef,
  },
}

答案 1 :(得分:1)

你可能正在尝试已经完成的事情 - 检查这个SF项目:

http://sourceforge.net/projects/p5vlc/files/latest/download?source=files