2009-09-04 8 views
0

私は設定を読み込もうとしています。 Perlのファイル。設定ファイルは、行の継続を示すために後続のバックスラッシュを使用します。たとえば、ファイルは次のようになります。Perlでは、設定ファイルの継続行をどのように処理できますか?

=== somefile === 
    foo=bar 
    x=this\ 
    is\ 
    a\ 
    multiline statement. 

私はファイルを読み込み、その後、ラインを連結するために、末尾のバックスラッシュ(ES)を処理するコードを持っています。しかし、Perlはすでに私のためにそれをしたようです。例えば、コード:

open(fh, 'somefile'); 
    @data = <fh>; 
    print join('', @data); 

プリント:

foo=bar 
    x=thisisamultiline statement 

ローと、見よ '@data =;'ステートメントはすでにを持っているように見えるは、後ろにバックスラッシュを処理!

これはPerlで定義された動作ですか?

+4

これを再現できません - これはperlスクリプト全体ですか?上記のスニペットに表示されていないモジュールが必要なのか使用していますか? open()で使用した構文は標準のperlでもありません。使用しているPerlのバージョンとプラットフォームは何ですか? –

答えて

3

私は、あなたがやっている内容を正確に把握していないが、あなたが私たちに与えたコードでも実行されません:

=> cat z.pl 
#!/usr/bin/perl 
fh = open('somefile', 'r'); 
@data = <fh>; 
print join('', @data); 

=> perl z.pl 
Can't modify constant item in scalar assignment at z.pl line 2, near ");" 
Execution of z.pl aborted due to compilation errors. 

そして私は、スニペットは、実際のperlのように変更した場合:

=> cat z.pl 
#!/usr/bin/perl 
open my $fh, '<', 'somefile'; 
my @data = <$fh>; 
print join('', @data); 

それは明らかデータをマングルしない:

=> perl z.pl 
foo=bar 
x=this\ 
is\ 
a\ 
multiline statement. 
+0

ええ、開いた声明については申し訳ありません。それは 'open(fh、' somefile ');'と読みます。 興味深いことに、それは私のためにデータをmangles、あなたのためにではありません。私はそれがPerlバージョンのものかどうか疑問に思います。私たちは5.8.8を使用しています。あなたはどう? –

+0

私は同じことを得る - 上記のスニペットが表示されていないモジュールが必要かどうか疑問に思っています。 –

5

は、私はあなたが見ているものは考えているが、それは、有効なPerlコードのANではありませんdはPerlでの動作ではありません。ここではいくつかのPerlコードが何をしたいということです。

#!/usr/bin/perl 

use strict; 
use warnings; 

while (my $line = <DATA>) { 
    #collapse lines that end with \ 
    while ($line =~ s/\\\n//) { 
     $line .= <DATA>; 
    } 
    print $line; 
} 

__DATA__ 
foo=bar 
x=this\ 
is\ 
a\ 
multiline statement. 

注:あなたはこのようなコマンドライン上でファイルを入力している場合:

perl -ple 1 <<! 
foo\ 
bar 
baz 
! 

次に、あなたがあなたのシェルの効果を見ています、 Perlではありません。次の例を考えてみましょう:

printf 'foo\\\nbar\nbaz\n' | perl -ple 1 
3

Perlはあなたに指示しない限り、あなたのデータに何もしません。あなたはそれを間違ってしまった。あなたが持っている正確なコードを投稿してください。

+0

私は冗談ではない、人々。 Perlは私のために改行を処理しました!非常に奇妙な行動。私は何が起こっているのか把握しようとしています... –

+2

depeszとChasが指摘しているように、上記のコードサンプルは__WILL NOT__はPerlが有効でないため実行されません。したがって、現在のコードを削除し、問題の原因となったコードを貼り付けることで、正確なコードを提供できる場合に役立ちます。 –

5

私のConfigReader::Simpleモジュールは、設定ファイルの継続行をサポートしています。あなたの質問に書かれているフォーマットであれば、設定を処理する必要があります。

自分で操作する方法を知りたい場合は、そのモジュールのソースを調べてください。それは多くのコードではありません。

関連する問題