Perl разбивает текстовую строку (из HTML-страницы, текстового документа и т. Д.) По строке на массив? - PullRequest
1 голос
/ 17 июля 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

Вот идея, которая может вам помочь: вы можете 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>;
0 голосов
/ 17 июля 2010

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

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

даст вам куски, разделенные пробелами.Просто установите его на "\n", чтобы вернуться к тому, что было - или, что еще лучше, выйдите из области действия local $/ и дайте глобальному вернуться, на случай, если это будет что-то отличное от "\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 голосов
/ 17 июля 2010

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

my @lines = split(/\r?\n/, $scraped_text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...