1

我有一段像下面这样的 xml 代码我会读到这个并用换行符分割它

<head>
        <name>states.opml</name>
        <Created>Tue, 15 Mar 2005 16:35:45 GMT</Created>
        <Modified>Thu, 14 Jul 2005 23:41:05 GMT</Modified>
        <owner>Dave Winer</owner>
        <Email>dave@scripting.com</Email>
        <expansion>1, 6, 13, 16, 18, 20</expansion>
        <vertScrollState>1</vertScrollState>
        <windowTop>106</windowTop>
        <windowLeft>106</windowLeft>
        <windowBottom>558</windowBottom>
        <windowRight>479</windowRight>
        </head>

我的 perl 代码:

my $xml=<STDIN>;
my @head=split(/\n/,$xml);
print length(@head);
#output is 1...split is not working at all

我想要的是:我想要的是这样的字符串数组:

@head={<head>,
        <name>states.opml</name>,
        <Created>Tue, 15 Mar 2005 16:35:45 GMT</Created>,
        <Modified>Thu, 14 Jul 2005 23:41:05 GMT</Modified>,
        <owner>Dave Winer</owner>,
        <Email>dave@scripting.com</Email>,
        <expansion>1, 6, 13, 16, 18, 20</expansion>,
        <vertScrollState>1</vertScrollState>,
        <windowTop>106</windowTop>,
        <windowLeft>106</windowLeft>,
        <windowBottom>558</windowBottom>,
        <windowRight>479</windowRight>,
        </head>}

有人可以帮忙吗?我知道 XML::XMLin,但不允许使用它。

谢谢!

4

2 回答 2

2

实际上split正在按应有的方式工作。您只将一行读入$xml,因此split只返回一行。如果您将文件 slurp 到 scalar$xml中,那么您将需要拆分,并且此代码将起作用:

local $/ = undef;   # set input record separator to undef (instead of newline)
my $xml=<STDIN>;    # all lines are now in $xml
my @head=split(/\n/,$xml);    # so now we can split it

但是,此代码并没有按照您的想法进行:

print length(@head);

它打印数组大小的长度,即 1。@head在标量上下文中作为字符串进行评估,字符串“1”的长度为 1。您要查找的内容很简单:

print scalar @head;

但是为什么要这么麻烦呢?做就是了:

my @head = <STDIN>;   # all the lines are now in @head
print scalar @head;

如果您需要删除换行符,请使用chomp

chomp(my @head = <STDIN>);
于 2012-05-13T05:37:56.973 回答
1

问题是站点上的文件具有传统的 Mac OS 编码,CR用作行分隔符。

输入记录分隔符 的正常设置分隔字符$/上的行LF,并且由于您的文件中没有任何行,因此一次读取所有行。

解决这个问题的传统方法是 write local $/ = "\r",之后相同范围内的文件读取语句将由CR字符终止。也chomp将从行尾删除 a CR

但是,如果您同时从具有不同行终止符的多个文件中读取,这可能会很尴尬,因为它会影响<FH>操作员而不是特定的文件句柄。

我遇到的处理这个问题的最巧妙的方法是安装模块,PerlIO::eol它可以让你打开任何带有MODE. <:raw:eol(LF)这会将所有不同的行终止符更改为标准"\n",并且您的程序将独立于数据源正常运行。

请注意,该模块只需要安装 - 程序中不需要use一行。

于 2012-05-13T12:54:51.273 回答