2016-12-08 5 views
2

私は非常に基本的なperlスクリプトを持っています。このスクリプトは、検索パターンにマッチした後にテキストファイルの次の行を出力します。作品Perl:whileループ内からファイルに行を印刷するには?

@ARGV = <dom_boot.txt>; 
while (<>) { 
    print scalar <> if /name=sacux445/; 
} 

は、しかし、私はむしろSTDOUTにそれを印刷するよりも、さらに使用するために、ファイルへの出力をキャプチャしたいと思います。私はちょうど(ゆっくり)勉強してい ので、これを実行しようとしました:

my $fh; 
my $dom_bootdev = 'dom_bootdev.txt'; 

open ($fh, '>', $dom_bootdev) or die "No such file"; 

@ARGV = <dom_boot.txt>; 
while (<>) { 
    print $fh <> if /name=sacux445/; 
} 

close $fh; 

しかし、私は、構文エラーが発生します。

構文try.plx 19行でエラー、近く "<>"

私はこれを理解するのに苦労しています。私はそれがおそらく非常に簡単なので、どんな助けも高く評価されていると思います。

ありがとう、 ルーク。

+0

'print $ fh <>'を 'print $ fh scalar <>'に置き換えてみてください。あるいは単にオリジナルのPerlスクリプトでBashリダイレクトを使って出力をファイルに保存してください。 –

+1

'use strict;どんなコーディングの前にも警告を使用してください。 – AbhiNickz

+1

ありがとうございます。私はstrictを使用して警告を使用しましたが、貼り付けには含めませんでした。残念ながら私はこれらの提案を役に立たなかった。 –

答えて

4

Perlパーサーは間接的な表記に問題があることがあります。それを処理するための標準的な方法は、ブロックにハンドルをラップすることです:あなたはscalarを削除してもよろしい

print {$fh} <> if /name=sacux445/; 

ていますか?

+1

いいえ、私はしませんでした - 私の部分でタイプミス。しかし、{}もうまくいきませんでした。 チップをありがとう。 –

+0

@BillSwift:「うまくいかない」とはどういう意味ですか?私は5.10.1と5.18.2で動作します。 – choroba

2

単にループ内で次の行をフェッチし、それを印刷し、ラインパターンと一致した場合:

while (<>) { 
    next unless /name=sacux445/; 
    my $next = <>; 
    last unless defined $next; 
    print $fh $next; 
} 

注意を、あなたはダイヤモンド演算子の戻り値をチェックする必要があります。一つは、データを解析するためのステートマシンを使用することを学ぶ必要があります

入力

name=sacux445 (1) 
aaa 
name=sacux445 (2) 
bbb 
name=sacux445 (3) 

出力

aaa 
bbb 
+0

OPの質問の最初の文章では、現在の行ではなく次の行を印刷することを意味していました。 – Zaid

+0

これはある程度はうまくいきましたが、残念ながら私が探していた行は印刷されていて、行は印刷されませんでした。 –

+0

@BillSwift、私は答えを更新しました。私は何とか次の行について言及した部分を見逃してしまった。 –

0

。ステートマシンを使用すると、入力の読み込みをコード内の1つの場所に限定することができます。

ステートマシン私たちにデータが文脈自由であるならば、それだけで正規表現を使用して解析することができた場合

​​

:ステートマシンとしてコードを書き換えます。

データがツリー構造の場合は、単純なステートマシンを使用して解析できます。

複雑な構造の場合、プッシュダウンスタックを備えたステートマシンが少なくとも1つ必要です。スタックは、現在の状態が終了したときにマシンがその状態に戻ることができるように、前の状態を記録します。

最も複雑なデータ構造はXMLです。構文のためのステートマシンとセマンティクスのためのスタックを持つステートマシンが必要です。

関連する問題