2016-08-20 6 views
0

を読みながら組み合わせた複数の行私は、次のコードを使用してファイルを読んでいます:Perlが読むファイル:リストコンテキストで

open ($myfile, "<file.txt") or die "Could not open the file"; 

@lines = <$myfile>; 

foreach $line (@lines){ 
    print $line; 
} 

close myfile; 

ファイルの内容は次のとおりです。

Crossroads Blues 
Terraplane Blues 
Come on in My Kitchen 
Walking Blues 
Mister Jelly Roll Maker 
Last Fair Deal Gone Down 
32-20 Blues 
Kindhearted Woman Blues 
If I Had Possession Over Judgement Day 
Preaching Blues 
Blind Willie's Blues 
When You Got a Good Friend 
Rambling on My Mind 
Stones in My Passway 
Wild Jelly Roll Blues 
Traveling Riverside Blues 
Roll My Jellyroll 
Milkcow's Calf Blues 
Me and the Devil Blues 
Hellhound on My Trail 

しかしの出力プログラムは次のとおりです:

Hellhound on My Trailsuesdudgement Day 

コードでは1行だけが読み込まれ、最初の文字は新しいものに置き換えられます読み込まれた行。私は別のファイルを試しました。基本的にすべての行に集約された1行だけが出力されます。

答えて

2

あなたの元のファイルがちょうどキャリッジリターンを持っています(LF)、またはCRとLFの両方が必要な場合に、各行の最後にCR(CR)を入力してください。

データを分割するための改行なし、@linesにはファイル全体の内容を含む単一の要素しかありません

このテキストを端末に印刷すると、見たようにすべての行が互いに重なり合って表示されます

ファイルの作成は修正する必要がありますが、正しく読み込むことができますPerlのレコードセパレータを変更することにより、

use strict; 
use warnings 'all'; 

open my $fh, '<', 'file.txt' or die "Could not open the file: $!"; 

my @lines = do { 
    local $/ = "\r"; 
    <$fh>; 
}; 

chomp @lines; 

print "$_\n" for @lines; 
+0

完璧な答えです。多くを学んだ。 あなたが言うように、私は初心者のPerlコーダーです。 Perlの練習リソースを教えてください。私は現在Wileyを使用しています - [リンク](http://www.wiley.com/legacy/compbooks/chapman/perl/exercises.html) その他のリソースは非常に高く評価されます。 –

+0

@Aditya:私は喜んで助けます。 [** Project Euler **](https://projecteuler.net/archives)や[** HackerRank **](https://www.hackerrank.com/domains)のようないくつかのサイトでは非常に便利な演習がありますすべてのレベルで。より熟練したら、スタックオーバーフローでここで質問に答えてみてください。あなたのコードが特に良いか悪いかをフィードバックします。 – Borodin

0

元のスクリプトと投稿されたスクリプトが同じであることを確認してください。 あなたは最後の行があなたのサンプルプログラムによってのみ印刷されていると言いました。それはできません。行全体が印刷されます。

常に、use warnings;use strict;をプログラムの先頭に置きます。

次に、ファイル全体を配列に格納した後、配列から読み取るのは非常に難しい方法です。代わりにwhileループを使用してください。

open ($myfile, "<","file.txt") or die "Could not open the file"; 

while(<$myfile>) 
{ 
    print ; # Data are store into the default variable $_. So no need to mention the $_ in print statement. 

} 

以下のスクリプトは、上記の出力を生成します。

foreach (@lines) 
{ 
    $line = $_; # this or 
    @new = $_; # this 
} 
print $line; #last line 
print @new; #last line 

あなたは、配列のために、別の変数に特定のデータを保存する($)文字列を連結を見て、押したりアンシフトしたい場合は(@)