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には正常に動作しています。に1行しか読み込まない$xmlため、split1行だけが返されます。ファイルをスカラー$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

CR問題は、サイト上のファイルに、行区切り文字として使用されるレガシーMacOSエンコーディングが含まれていることです。

入力レコードセパレータ の通常の設定では、文字の$/行が区切らLFれ、ファイルには何もないため、すべてが一度に読み取られます。

これを修正する従来の方法は、書き込みをlocal $/ = "\r"行うことです。その後、同じスコープ内のファイル読み取りステートメントは文字で終了しCRます。また、行末からchompを削除します。CR

<FH>ただし、特定のファイルハンドルではなく演算子に影響するため、異なる行ターミネータを使用して複数のファイルから同時に読み取る場合、これは厄介な場合があります。

これに対処するために私が遭遇した最も簡単な方法は、PerlIO::eolモジュールをインストールすることです。これにより、のが付いた任意のファイルを開くことができます。これにより、すべての異なるラインターミネータが標準に変更され、プログラムはデータのソースに関係なく通常どおりに動作します。MODE<:raw:eol(LF)"\n"

モジュールをインストールするだけでよいことに注意useしてください。プログラムに行は必要ありません。

于 2012-05-13T12:54:51.273 に答える