行のリストを配列にロードする


このブログ記事は、私の同僚が、定義されたトークンで動的な文字列を繰り返して、いくつかを加えることについてしばしば尋ねる一般的な仕事について説明しますor , and , = 間にプラスプラススマート仕上げ.
私はPerlを使うのが好きです__DATA__ これのための私のスクリプトの終わりにトークン.The __DATA__ トークンの強さは« "embed” a file inside a Perl program then read it from the DATA filehandle » . それはあなたの創造とオープンファイルを保存し、非常に迅速なプロトタイプとテストに便利です.
#!/usr/bin/env perl
use strict;
use warnings;

# Your script here

# Everything under is considered as 
# the end of the code
__DATA__
a
lot
lot
of
stuff
here
...
一般的な慣習は、ファイルハンドルとして扱うことによって、それらのデータを配列にロードすることです.
my @lines = <DATA>;
しかし、値はあなたが明らかにしたくないキャリッジリターンを含みます.この二つの解決法を使いました.
my @lines;
push @lines, 
 split while <DATA>;
これは非常に読みやすく、自己説明(Perlは自然言語を覚えています、それは言語学者によって作成されました).私がポストを改善することができたように、何かが不明であるならば、コメントしてください.
を、私は少し秘密を認める必要があります:
push my @lines, 
  split while <DATA>;
... 事前宣言なしで@lines も同じです.私はそれをチェックしなければならなかったが、Perlで頻繁に、自然に何か愚かなことを考えるとき、それは実際に自然に動作します(私はそれが時々奇跡のように見えることを認めなければならない).
欲しいならuniq 値(確かに)、1つの方法は、コアモジュールを使用することですList ::Util :
use List::Util qw(uniq);

push my @lines, 
  uniq split while <DATA>;
Another way to do it 常に可能です.
chomp( my @lines = uniq <DATA> );
私は実際にこのリストコンテキストの解決策を好みます.それはショートネスです.
あなたが一連のor あなたの同僚や顧客のため.私たちは実際、ここで超高度な言語生成を行っています.
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw(uniq);

chomp( my @lines = uniq <DATA> );

for ( @lines ) {
  # $_ is the current loop element
  print generate_string( $_ );
  # $lines[-1] is the last array element
  if ( not $_ eq $lines[-1] ) {
    print ' or ';
  } else {
    print "\n";
  }
}    

sub generate_string {
  return 'line == "' . shift . '"';
}

__DATA__
a
lot
lot
of
stuff
here
...
$ perl lines.pl
line == "a' or line == "lot' or line == "of' or line == "stuff' or line == "here' or line == "...'  
他の多くのソリューションが存在するPerl one-liners そのような実践についてもっと学ぶことができること.
このループの中で行うことができますクールスの量は、ログの解析から、コードやデータのミュージングを生成するには、Perlの親切のおかげで無限です.

参考文献
  • Read a file into an array using Perl
  • Stupid DATA Tricks

  • ノート
    私は私の記憶がひどいので、私はいつもの正確な構文を探して疲れていたこれを書いた__data__ 配列へのトークン.私が検索エンジンでそれをタイプするとき、私を含むあらゆる種類の人々を助けることを望みます.