5

$/私はインターネット上で perl overを使った多くの例を見てきましsplitたが、その使い方を理解できませんでした。

Perl で$/overをどのように使用しているか説明していただけますか?split

4

3 に答える 3

10

readline $filehandle(または) をスカラー コンテキストで使用する<$filehandle>と、ファイルの未読部分の残りが返され$/ます。デフォルトでは、これは改行に設定されているため、ファイルの次の行が返されます。

my $line = <$filehandle>

while (<$filehandle>) { ... }

どちらもスカラー コンテキストを課すため、変数はファイルの次の行に設定され、ループはファイルの 1 行ずつ$_変数で実行されます。

$/ファイル内のデータの単位が複数の行にまたがる場合、の値を変更すると役立つ場合があります。たとえば、行末が常に a}で終わるブロックがファイルに含まれている場合は、 を設定できます$/ = "}\n"。次に、ブロックの次の終了が返されるまで、おそらく改行が埋め込まれている可能性があります。

にはいくつかの特別な値があります$/。で空の文字列に設定すると、$/ = ''Perl はファイル内の 1 つまたは複数の空白行まですべてを返します。明らかに、これは、ファイル内のデータが空白行でユニットに分割されている場合にのみ役立ちます。

に設定$/するundefと、ファイルの最後まで読み取りを続行できます。これは、ファイルをメモリに丸呑みすることの意味であり、小さなファイルの場合に実用的な場合があります。絶対に必要な場合は、次localのような小さなコード ブロックの範囲内で使用するのが最適です。

my $data = do {
  open my $filehandle, '<', 'file.txt' or die $!;
  local $/;
  <$filehandle>;
};

数値$/への参照を設定すると、特定の文字数の後に読み取りが強制的に停止されます。たとえば、ファイルから次の 4KB のデータ$/ = \4096readline取得します (残りが 4KB 未満の場合は残りのファイルを取得します)。これは、独自のファイル読み取りをキャッシュするなどの特別な目的に使用できます。

$/「 Perl で使用する」とは、これとスカラー変数に丸呑みされたファイル全体splitを使用することの違いを意味していると思います。split主な考慮事項はメモリ空間です。ファイルが数 KB を超える場合、完全に必要でない限り、一度にすべてを Perl 変数に読み込むのは非常に無駄です。$/andを使用するとwhile、一度に 1 つのレコードのみがメモリに読み込まれ、処理され、次のレコードが読み込まれたときに破棄されます。

配列内のすべてのファイルが必要であると思われる場合は、たとえば前方だけでなく後方も見ることができるようにするために、ファイル全体が配列内にあるかのように表示するTie::Fileモジュールを検討する必要があります (さらに、変更する必要があります) が、実際には必要に応じてメモリのデータをページインおよびメモリからページングします。

を使用する利点は、文字列を分割する場所を識別するために正規表現splitが必要になることです。これは、単純な文字列にのみ設定できる whichとは対照的です。ファイルをより複雑な方法で分割する必要がある場合は、これが役立つ場合があります。$/

一般に、$/with を使用することwhileは、ファイルを読み取るための最良の方法であり、何か別のものを必要とする決定的な理由がない限り、最初に選択する必要があります。一度に 1 つのデータ レコードに集中するように強制することで、無駄なメモリの使用を防ぎ、より良いプログラミングを促進します。

于 2012-07-29T10:27:50.557 に答える
2

あなたが話している例はわかりませんが、誰かがそう思うかもしれません

my @lines = split $/, $very_long_string;

次のように、ファイルを配列に丸呑みすることに似ています

my @lines = <$FILE>;

splitただし、の最初の引数は正規表現であり、 while$/は文字列としてのみ解釈されるため、まったく同じではありません。のデフォルト値で$/は違いはありませんが、eg に設定すると違いが見られる.はずです。

于 2012-07-29T09:53:11.093 に答える
2

Perl Doc から

$/ と $\ は、それぞれ入力と出力のレコード セパレータです。これらは、データの読み取りまたは書き込み時に「レコード」を定義するものを制御します。

デフォルトでは、使用されるセパレーターは です\n。でも、

ファイルに含まれている場合、

Lorem ipsum dolor sit amet, --- consectetuer --- adipiscing elit. 

を定義すると、ではなく$/ = "---\n";セパレータが作成され、それに応じて読み込まれます。セパレーターで文字列を「分割」しました。---\n

(参照)

于 2012-07-29T09:48:35.993 に答える