私は、一度に複数行の文字列を1行ずつ処理する適切なPBP承認方法を理解しようとしています。多くのPerlコーダーは、マルチライン文字列をファイルハンドルとして扱うことを推奨しています。これは、あなたのスクリプトで "厳密に"使用しない限りうまくいきます。厳密な参照が使用されている間、文字列をシンボルとして使用できないという警告がコンパイラから出されます。コメントアウトされたライン「厳格を使用する」というperlで複数行の文字列を一度に1行ずつ処理するにはどうしたらよいですか?
#use strict;
use warnings;
my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
if ($resultLine =~ m/joe/) {
$matchLines = $matchLines . "\t" . $resultLine;
}
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
お知らせ:
は、ここで問題の簡単な作業例です。このスクリプトを厳格に使用せずに実行すると、私は欲しいものと期待しているものを手に入れます:
Original string:
Volume in drive D has no label.
Volume Serial Number is 50D3-54A6
Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject
09/18/2009 11:38 AM <DIR> .
09/18/2009 11:38 AM <DIR> ..
09/18/2009 11:36 AM 394 .project
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
09/18/2009 11:38 AM 0 kurt.txt
09/18/2009 11:43 AM 497 main.pl
09/18/2009 11:38 AM 0 shane.txt
6 File(s) 891 bytes
2 Dir(s) 6,656,188,416 bytes free
Found these matching lines:
09/18/2009 11:37 AM 0 joe.txt
09/18/2009 11:37 AM 0 joey.txt
これは問題です。私はライン「厳格を使用する」をコメント解除したとき、私は、Perlから次の警告やエラーが表示されます。
Can't use string ("") as a symbol ref while "strict refs" in use at D:/Documents and Settings/username/My Documents/Eclipse/myTestProject/main.pl line 8.
8行目の「オープン$ ResultsHandle、 『<』、\ $のリターン;」でありますところで、ライン。だから、Perlのベストプラクティスでは厳密に使う必要があるので、PBPは一度に複数行の文字列を1行ずつ処理することをどのように期待していますか? SOコミュニティからの提案はありますか?
ありがとうございます!
、私はあなたがオールド・ファッションドのように変数を定義する方法で、すべての変数の初期化を見てみましょう示唆しますC(上の方)と、Perl自身が簡単に達成できる何かのためのbackticksの使用。 – innaM
ありがとう、Manni。ディレクトリコンテンツの取得はデモンストレーションの目的にすぎませんでした。私の実際のプログラムは、実際に別のプログラムを呼び出し、出力を処理します。そして、旧式の変数の初期化は、私がより多くのことを行うために必要なものです。しかし、私はしばしば古いスクリプトから切り取って貼り付けます。これが私の得意です。 :-)私はもっとうまくやろうとしています。 –