1

何がこれに完全に関与しているのか正確には理解していないので、少なくとも私にとっては奇妙な質問です。基本的に、スクレイピングしたドキュメント (Web ページなど) を.txtファイルに保存するこのプロセスを行ってきました。次に、Perl を使用してこのファイルを読み取り、各行を配列に入れることが簡単にできます。ただし、ドキュメント内の目に見えるものに基づいてこれを行っているわけではありません (つまり、HTML の改行ではありません)。.txtフォーマットに基づいて、新しい行がどこにあるかを知っているだけです。

ただし、このプロセスを省略して、変数内から同じことを実行したいので、代わりに、.txtファイルの内容を文字列にして、同じ方法で解析したいと思います。 、 1行ずつ。私にとっての問題は、Perl がどのように新しい行がどこにあるのかを知ることができるかを本当に理解していないため、これがどのように機能するかについてあまり知らないことです (HTML の改行を使用しないと仮定すると、よくあることです)。単なる Web ベースの .txt ファイルです (私のスクレーパー www:mechanize に Web ページとして表示されます)。空白などの他のパラメーターを使用してこれを行うことができると思いますが、行ごとにこれを行う方法があるかどうか知りたいです。どんな情報でも大歓迎です。

ファイルの実際の保存を減らして、使用しているサーバーのアクセス許可に関連する問題を減らしたいと思っています。また、プロセスをより効率的にできるかどうかも知りたいです。

4

3 に答える 3

2

これがあなたを助けるかもしれない考えです:あなたはファイルだけでなく文字列openからもできます。

したがって、これを行っていた場合:

open( my $io, '<', 'blah.txt' ) or die "Could not open blah.txt! - $!";
my @list = <$io>;

あなたはこれを行うことができます:

open( my $io, '<', \$text_I_captured ); 
my @list = <$io>;
于 2010-07-17T18:13:38.953 に答える
0

コードが目の前にないため、コードが何をしているのかを判断するのは困難です。あなたが持っていたものを投稿した方が助けやすいでしょう。しかし、私はそれを試してみます。テキストを変数にスクレイプすると、改行が埋め込まれている可能性のある文字列が作成されます。これらは、\n(従来のUnix改行)または\r\n(従来のWindows改行シーケンス)のいずれかになります。スペースで分割して文の単語(の最初の近似値)を取得できるのと同じように、代わりに改行シーケンスで分割して行を取得できます。したがって、必要な1行は次のようになります。

my @lines = split(/\r?\n/, $scraped_text);
于 2010-07-17T12:17:20.600 に答える
0

変数を使用し$/ます。これにより、何を改行するかが決まります。そう:

local $/ = " ";
while(<FILE>)...

スペースで区切られたチャンクが得られます。元の状態に戻すには、 に戻すだけです。または、最初から別のものであった場合に備えて、スコープから出て、グローバル スコープを"\n"元に戻すことをお勧めします。local $/"\n"

あなたはそれを完全に取り除くことができます:

local $/ = undef;

ファイル全体を 1 回のスラープで読み取る。そして、好きなようにそれらを繰り返します。splitaまたは aspliceを実行すると、大量の CPU と大量のメモリを使用して、文字列を何度もコピーすることになる可能性があることに注意してください。より少なくそれを行う1つの方法は次のとおりです。

# perl -de 0
> $_="foo\nbar\nbaz\n";
> while( /\G([^\n]*)\n/go ) { print "line='$1'\n"; }
line='foo'
line='bar'
line='baz'

たとえば、改行で物事を分割している場合。タグ付きの正規表現\G内で、文字列の先頭または最後の一致の末尾に一致します。/g

もう1つの奇妙な情報は$/=\10...整数へのスカラー参照を与えると(ここでは10)、レコード長のチャンクを取得できます。

# cat fff
eurgpuwergpiuewrngpieuwngipuenrgpiunergpiunerpigun
# perl -de 0
$/ = \10;
open FILE, "<fff";
while(<FILE>){ print "chunk='$_'\n"; }
chunk='eurgpuwerg'
chunk='piuewrngpi'
chunk='euwngipuen'
chunk='rgpiunergp'
chunk='iunerpigun'
chunk='
'

詳細: http://www.perl.com/pub/a/2004/06/18/variables.html

これをFMの使用の回答と組み合わせると、次のようになります。

$data = "eurgpuwergpiuewrngpieuwngipuenrgpiunergpiunerpigun";
open STRING, "<", \$data;
while(<STRING>){ print "chunk='$_'\n"; }

必要なもののすべての組み合わせを取得できると思います...

于 2010-07-17T16:17:35.947 に答える