2017-02-05 13 views
-2

Я написал perl-скрипт для сопоставления двух наборов данных. Когда я запускаю программу, используя терминал Linux, вывод испорчен. Кажется, что выход перекрывается. Я использую Fedora 25. Я пробовал код в Windows, и он отлично работает.perl output messed up в fedora, ubuntu

Такая же проблема есть и на Ubuntu.

DESIRED:

адам 123 JOHN 321

TOM 473 BENTLY 564

и так далее ....

ВЫВОД, что я получаю:

ADAM 123n 321

TOM 473TLY 564

и т. Д.

Я проверил код на Windows, и он отлично работает. Хотя та же проблема остается на Ubuntu 16.04 lts.

помогите пожалуйста.

код:

use warnings; 

open F, "friendship_network_wo_weights1.txt", or die; 
open G, "username_gender_1.txt", or die; 

while (<G>){ 
    chomp $_; 
    my @a = split /\t/, $_; 
    $list{$a[0]} = $a[1]; 
} 
close G; 

while (<F>){ 
    chomp $_; 
    my @b = split /\t/, $_; 
    if ((exists $list{$b[0]}) && (exists $list{$b[1]})){ 
     $get = "$b[0]\t${list{$b[0]}}\t$b[1]\t${list{$b[1]}}\n"; 
     $get =~ s/\r//g; 
     print "$get"; 
    } 
} 

close F; 
+2

Показать, что код поможет ... – Dada

+2

У вас есть, вероятно, некоторые управляющие символы на выходе, возможно, прошли через вход. Перенесите вывод в файл и посмотрите на этот файл с помощью какого-либо редактора, отображающего эти символы (например, vim), или используйте hexdump или xxd. –

+0

Части концов строк Windows, CR или '\ r', сделайте курсор влево на * nix, но не создавайте новую строку. – choroba

ответ

1

Проблема заключается в Windows, символ новой строки является \r\n. На всем остальном это \n. Предполагая, что эти файлы были созданы в Windows, когда вы читаете их в Unix, каждая строка по-прежнему будет иметь завершающий \r после chomp.

\r является символом «возврат каретки». Это похоже на старую пишущую машинку, как вам пришлось переместить весь тип головной части назад на левую сторону в конце строки, компьютерные дисплеи были fancy typewriters called Teleprinters. Когда вы печатаете его, курсор возвращается к началу строки. Все, что вы печатаете после этого, перезаписывается. Вот простой пример.

print "foo\rbar\r\n"; 

Что вы увидите, это bar. Это потому, что он печатает ...

  1. foo
  2. \r посылает курсор обратно в начало строки
  3. bar перезаписывает foo
  4. \r посылает курсор обратно в начало строки
  5. \n переходит в начало следующей строки (не имеет значения, где находится курсор)

chomp удалит все, что находится в $/, с конца строки. В Unix это \n. В Windows это \r\n.

Существует несколько способов решить эту проблему.Один из самых безопасных - вручную удалить новые строки обоих типов с помощью регулярного выражения.

# \015 is octal character 015 which is carriage return. 
# \012 is octal character 012 which is newline 
$line =~ s{\015?\012$}{}; 

Это говорит, чтобы удалить, может быть, \r и определенно \n в конце линии.

+1

Альтернативно: 's/\ R \ z //' – melpomene

+1

Значение по умолчанию '$ /' всегда '\ n', никогда' \ r \ n'. – melpomene

+0

Если вы хотите удалить '\ r', зачем писать' \ 015'? Это не одно и то же. – melpomene