2010-07-17 5 views
1

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

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

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

ответ

2

Вот идея, которая может помочь вам: у ou can 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

спасибо, это именно то, что я ищу .. Я попробую это – Rick

0

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

my @lines = split(/\r?\n/, $scraped_text); 
0

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

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

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

Вы можете устранить его полностью:

local $/ = undef; 

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

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

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

Еще один странный лакомый кусочек - $/=\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 «s:

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

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

+0

Спасибо за сообщение .. однако проблема в том, что я не чтение из файла , его взято из строковой переменной, и я хочу вообще не использовать файл – Rick

+0

@rick: первая и последняя части - это строки: бит о '\ G' и бит о передаче скалярной ссылки на' open' , файлов не требуется. Надеюсь, поможет. – eruciform

 Смежные вопросы

  • Нет связанных вопросов^_^