Текстовая строка разделения Perl (от страницы HTML, текстового документа, и т.д.) с методической точностью в массив?

Это - своего рода странный вопрос, по крайней мере, для меня, поскольку я точно не понимаю то, что полностью вовлечено в это. В основном я делал этот процесс, где я сохраняю очищенный документ (такой как веб-страница) к a .txt файл. Затем я могу легко использовать Perl, чтобы считать этот файл и поместить каждую строку в массив. Однако это не делает этого на основе никакой видимой вещи в документе (т.е. это не идет разрывами строки HTML); это просто знает, где новая строка, на основе .txt формат.

Однако я хотел бы отключить этот процесс и просто сделать то же самое из переменной, так вместо этого я буду иметь то, что было бы содержанием .txt файл в строке и затем я хочу проанализировать его, таким же образом, линию за линией. Проблема для меня состоит в том, что я не знаю много о том, как это работало бы, поскольку я действительно не понимаю, как Perl смог бы сказать, где новая строка (предположение, что я не иду разрывами строки HTML, поскольку часто это - просто веб-.txt файл (который представляет моему скребку, www:mechanize, как веб-страница), я очищаю, таким образом, нет никакого HTML, чтобы пройти). Я полагаю, что могу сделать это использование других параметров, таких как пробелы, но интересно знать, существует ли способ сделать это с методической точностью. Любая информация ценится.

Я хотел бы сократить фактическое сохранение файла для сокращения проблем, связанных с полномочиями на серверах, которые я использую, и также просто любопытно, если я могу сделать процесс более эффективным.

1
задан Svante 17 July 2010 в 13:50
поделиться

3 ответа

Вот идея, которая может вам помочь: вы можете открыть из строк , а также файлов.

Итак, если вы делали это раньше:

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

Вы можете просто сделать это:

open( my $io, '<', \$text_I_captured ); 
my @list = <$io>;
2
ответ дан 2 September 2019 в 22:59
поделиться

Используйте переменную $/, которая определяет, на чем разрывать строки. Так:

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

даст вам куски, разделенные пробелами. Просто верните значение "\n", чтобы вернуть все как было - или, что еще лучше, выйдите из локальной области $/ и позвольте вернуться глобальной, на случай, если изначально это было что-то другое, чем "\n".

Вы можете вообще отказаться от этого:

local $/ = undef;

Чтобы читать целые файлы одним махом. А затем итерировать их, как вам нравится. Только учтите, что если вы сделаете split или splice, вы можете в итоге копировать строку снова и снова, используя много процессора и много памяти. Один из способов сделать это с меньшими затратами:

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

Если вы разбиваете строку на части по новой строке, например. \G соответствует либо началу строки, либо концу последнего совпадения, в пределах /g-тегированного регекса.

Еще один странный кусочек - $/=\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"; }

Думаю, вы сможете получить любую комбинацию того, что вам нужно...

0
ответ дан 2 September 2019 в 22:59
поделиться

Трудно сказать, что делает ваш код, поскольку у нас его нет; было бы легче помочь, если бы вы разместили то, что у вас есть. Однако я попробую. Если вы скопируете текст в переменную, у вас будет строка, в которой могут быть встроенные разрывы строк. Это будет либо \ n (традиционный Unix-символ новой строки), либо \ r \ n (традиционный Windows-символ новой строки). Так же, как вы можете разделить пробел , чтобы получить (в первом приближении) слова в предложении, вы можете вместо этого разделить последовательность новой строки, чтобы вставить строки. Таким образом, единственная строка, которая вам понадобится, должна быть

my @lines = split(/\r?\n/, $scraped_text);
0
ответ дан 2 September 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: