2017-10-01 7 views
3

私は非常にPerlに慣れています(ただ1つのYoutubeビデオを見ました)。スクリプトを作成して、.csvファイルを2つ取り、一緒に追加して新しい.csvファイルを作成するスクリプトを作成したいとします。追加されている2つの.csvファイルを変更する必要はありません。また、このスクリプトでは、マージするファイルとしてユーザー入力を受け入れるようにしたい(今は2つの追加.csvファイルが同じディレクトリにあります)。閉じたファイルハンドルのprint()

私が得続けるエラーは次のとおりです。閉じたファイルハンドルのOUT(1行目)(#2)(W閉じる)印刷中のファイルハンドルは、今までに閉じられています。あなたのコントロールフローを確認してください

しかし私は決してcloseコマンドを使用していないので、私のファイルハンドルはどのように閉じていますか?

use strict; 
use warnings; 
use diagnostics; 
use feature 'say'; 
use feature "switch"; 
use v5.22; 

# Ask for Base File 
say "What is the base file you want to use?"; 
my $base_file = <STDIN>; 
chomp $base_file; 
open (BASE, '<', $base_file) or die "Couldn't find the base file you are entered: $base_file "; 

# Ask for Append File 
say "What is the file you want to append to the base file?"; 
my $append_file = <STDIN>; 
chomp $append_file; 
open (APPEND, '<', $append_file) or die "Couldn't find the append file you are entered: $append_file "; 

# Create new File with new name 
say "What is the name of the new file you want to create?"; 
my $new_file = <STDIN>; 
open (OUT, '>>', $new_file); 
chomp $new_file; 
while(my $base_line = <BASE>) { 
     chomp $base_line; 
     print OUT $base_line; 
} 
+0

注: '' v5.22を使用すると '' say''と 'switch'の機能が有効になります(' use feature ... 'の必要はありません)。 。 (2)[機能スイッチ](https://perldoc.perl.org/feature.html#The-%27switch%27-feature)は実験的なものとみなされ、将来的には変更が行われる可能性がほぼあります。 (3) '$ base_line'を' chomp $ 'して改行がないようにしてから、改行なしで 'print'します。したがって、これらの「線」はすべて1つの大きな線になります。 'chomp'を' say'(改行を追加するため)に使うか、 'chomp'と' print'をしないでください。 – zdim

答えて

4

openへの呼び出しが成功するかどうかを確認する必要があります。

open(OUT, '>>', $new_file) 
    or die("Can't append to \"$new_file\": $!\n"); 

私は私はあなたが指定したファイルが存在しないので、それはだことがわかります賭ける、と私はあなたが$new_fileは、改行が含まれていることがわかります賭け、あなたはopenが失敗していることがわかります賭けますそれはすべきではない。

修正がopen前に次の行を移動することです:

chomp $new_file; 

ところで、あなたはグローバル変数を使用するべきではありません。 OUTmy $OUTに置き換えてください。 BASEおよびAPPENDと同じです。

関連する問題