2

我有一些来自 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 支持的格式(哈希表等)吗?

4

2 回答 2

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,
  },
}
于 2012-07-21T13:51:13.930 回答
1

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

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

于 2012-07-21T02:35:39.330 回答