Попытка понять вывод Perl split () - PullRequest
0 голосов
/ 24 мая 2011

У меня есть несколько строк текста, которые я пытаюсь использовать функцией разделения Perl для преобразования в массив.Проблема в том, что я получаю некоторые необычные дополнительные символы в выводе, в частности, следующую строку "\ cM" (без кавычек).Эта строка появляется там, где в исходном тексте были разрывы строк;однако (я считаю) эти разрывы строк были удалены в тексте, который я пытаюсь разбить.Кто-нибудь знает, что происходит с этим явлением?Я разместил пример ниже.Спасибо.

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

10b2obo12b2o2b$6b3obob3o8bob3o2b$2bobo10bo3b2obo4bo2b$2o4b2o5bo3b4obo
3b2o2b$2bob2o2bo4b3obo5b4obob$8bo4bo13b3o$2bob2o2bo4b3obo5b4obob$2o4b
2o5bo3b4obo3b2o2b$2bobo10bo3b2obo4bo2b$6b3obob3o8bob3o2b$10b2obo12b2o!

Вот мой код Perl, который должен выполнять разбиение:

while(<$FH>) {
    chomp;
    $string .= $_;
    last if m/!$/;
}

@rows = split(qr/\$/, $string);
print;          # a dummy line to provide a breakpoint for the debugger

Это то, что выводит отладчиккогда доходит до строки «печать».Проблема, с которой я пытаюсь разобраться, появляется в строках 3, 7 и 10:

DB<10> p $string
2o5bo3b4obo3b2o2b$2bobo10bo3b2obo4bo2b$6b3obob3o8bob3o2b$10b2obo12b2o!
DB<11> x @rows
0  '10b2obo12b2o2b'
1  '6b3obob3o8bob3o2b'
2  '2bobo10bo3b2obo4bo2b'
3  "2o4b2o5bo3b4obo\cM3b2o2b"
4  '2bob2o2bo4b3obo5b4obob'
5  '8bo4bo13b3o'
6  '2bob2o2bo4b3obo5b4obob'
7  "2o4b\cM2o5bo3b4obo3b2o2b"
8  '2bobo10bo3b2obo4bo2b'
9  '6b3obob3o8bob3o2b'
10  "10b2obo12b2o!\cM"

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Отладчик, вероятно, использует \cM для представления Ctrl-M, который также известен как возврат каретки (а иногда \r или ^M).В текстовых файлах Windows используется пара CR-LF (возврат каретки, перевод строки) для представления конца строки.Если вы прочтете такой файл в системе Unix, ваш chomp скинет Unix EOL (однострочный перевод), но оставит CR как есть, и в результате вы получите блуждающие CR в вашем файле.

Для такого файла, как у вас, вы можете просто удалить все конечные пробелы вместо использования chomp:

while(defined(my $line = <$FH>)) {
    $line    =~ s/\s+$//;
    $string .= $line;
    last if($line =~ /!$/);
}
3 голосов
/ 24 мая 2011

Знаете, изменение разделителя ввода файла сделает этот код намного проще.

$/ = '$';

my @rows = <$FH>;
chomp @rows;

print "@rows";
2 голосов
/ 24 мая 2011

Вы не говорите, в какой ОС вы работаете. Посмотрите на binmode и что он говорит о \ cM, и что их позиция совпадает с окончанием строки вашего входного файла:

http://perldoc.perl.org/functions/binmode.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...