2017-02-14 2 views
0

私は現在、いくつかのユーザー/パスワード情報を保持しているPerlファイルを分割していますが、これは正常に実行していますが、自分のコードでは満足できません。私はPerlでそれを行うより良い方法があると確信しています(私は初心者です)。もし誰かがぴったりなやり方を思いつくことができたら!Perlファイルを行と変数に分割する

my $i = 1; 
my $DB; 
my $DBHOST; 
my $DBUSER; 
my $DBPASS;  
my $filename = "some_file"; 
open(my $fh, '<:encoding(UTF-8)', $filename) 
    or die "Could not open file '$filename' $!"; 

while (my $row = <$fh>) { 
    chomp $row; 
    if ($i == 1) { 
     $DB = (split /=/, $row)[1]; 
    } 
    if ($i == 2) { 
     $DBHOST = (split /=/, $row)[1]; 
    } 
    if ($i == 3) { 
     $DBUSER = (split /=/, $row)[1]; 
    } 
    if ($i == 4) { 
     $DBPASS = (split /=/, $row)[1]; 
    } 
    $i++; 
} 
+5

コードレビューを依頼するには、[codereview.stackexchange](http://codereview.stackexchange.com/)が良い場所になるかもしれません。 –

+1

ファイルハンドルの厳密な警告、クロージャ、$ i ++を$に置き換えることができます。あなたの場合。 – user3606329

+0

あなたはどのデータベースを使用していますか?これを行う最善の方法は、データベースサーバーが資格情報ファイルを直接解析できるようにすることです。たとえば、MySQLには[オプションファイル](https://dev.mysql.com/doc/refman/5.7/en/option-files.html)があり、Postgresには[.pgpass](https://www.postgresql。 org/docs/9.2/static/libpq-pgpass.html)。 – ThisSuitIsBlackNot

答えて

0

map()このようなことのためにかなり便利です:

my ($DB, $DBHOST, $DBUSER, $DBPASS) = map {$_ =~ /.*?=(.*)/} <$fh>; 

何が起こっている:

  • map()は、リスト上で動作し、そう<$fh>の各要素に対して
  • 1つとしては扱いリスト(この場合はファイル行)をデフォルトの変数( $_
  • 次に、regexを使用して必要な行の一部を取得し、それを返し、それを左側の関連する変数に割り当てます(ファイルの各反復で、各受信変数は次のようになります)。次のように正規表現が動作)にも
  • をシフト:このソリューションは、変数の4つのすべてのデータが取り込まれた後も、ファイル全体を介してすべての方法を反復することを

    / .*? # ignore everything, non greedy until we match a = # our delimiter ( # begin capture .* # capture everything until end of line (less the newline char) ) # end capture /

は注意(あなたのOPでやったように)

ここでもエラーチェックは行われないので、値がキャプチャされていないと、未定義の変数に関する警告が表示されます。

+0

ありがとう、ここで何が起こっているのか説明できますか?ドキュメントページはあまり役に立ちません。 – user2774695

+0

確かに。私は私の答えを更新します。 – stevieb

+0

私はそれを見ることができます '。*?' 0回以上(行終了記号を除く)任意の文字にマッチし、 '='にマッチしてから、0回以上の文字を再度マッチさせます。そしてmapは基本的にこれらの変数のforeachを行いますか? '='の後にどのように値を取得し、それを変数に代入するのですか? – user2774695

0

私はあなたの個々の変数を削除し、接続情報をハッシュに格納すると思います。もちろん

my %db_conn; 

while (<$fh>) { 
    my ($key, $val) = split /=/, $_, 2; 
    $db_conn{$key} = $val; 
} 

が、これは各ライン上の=の左にあるどのような値の一意の識別子であることを前提としています。

関連する問題