Используйте переменную $/
, это определяет, на что разбивать строки.Итак:
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"; }
Я думаю, вы можете получить любую комбинацию того, что вам нужно ...