2014-10-31 2 views
2

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

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

КОД

while (<>) { 
    my @flds = split /,/; 
    DO STUFF HERE; 
    ETC; 
    print join ",", @flds[ 0, 1, 3, 2 ]; # switches 3rd element with last 
} 

SAMPLE DATA

1,josh,Hello,Company_name 
1,josh,Hello,Company_name 
1,josh,Hello,Company_name 
1,josh,Hello,Company_name 
1,josh,Hello,Company_name 
1,josh,Hello,Company_name 

МОИ РЕЗУЛЬТАТЫ - Ногами вниз линию.

1,josh,Company_name 
,Hello1,josh,Company_name 
,Hello1,josh,Company_name 
,Hello1,josh,Company_name 
,Hello1,josh,Company_name 
,Hello1,josh,Company_name,Hello 

* желательные результаты **

1,josh,Company_name,Hello 
1,josh,Company_name,Hello 
1,josh,Company_name,Hello 
1,josh,Company_name,Hello 
1,josh,Company_name,Hello 
1,josh,Company_name,Hello 

Я знаю, что есть что-то делать с Chomp, но когда я грызть первый или последний элемент, все \ п удаляются. Когда я использую chomp на любом промежутке, ничего не происходит. Может ли кто-нибудь помочь?

+1

Если ваша система имеет 'perldoc', я бы рекомендовал ее использовать, когда у вас есть вопрос о конкретной функции , Это довольно удобно просто запустить из вашей оболочки, и документация действительно хороша. Выполните следующие действия: 'perldoc -f ' или в этом случае ['perldoc -f chomp'] (http://perldoc.perl.org/functions/chomp.html) (я также добавил ссылку на онлайн-версия). Обратите внимание, что документация для 'chomp' содержит пример кода, который очень похож на ваш код. – ThisSuitIsBlackNot

+0

Очень круто! Большое спасибо за подсказку, я очень часто нуждаюсь в тяжелых примерах для функций! @ThisSuitIsBlackNot – JDE876

ответ

4

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

while (<>) { 
    chomp; # Automatically operates on $_ 
    my @flds = split /,/; 
    DO STUFF HERE; 
    ETC; 
    print join(",", @flds[0,1,3,2]) . "\n"; # switches 3rd element with last 
} 
+0

или 'say join ',", @flds [0,1,3,2]; ' – ikegami

0
while (<>) { 
    chomp; 
    my @flds = split /,/; 
     ... rest of your stuff 
} 

В цикле while, так как каждая строка обрабатывается, $_ устанавливается на содержание линии. chomp по умолчанию действует на $_ и удаляет кортежи задней линии. split также по умолчанию использует $_, так что работает нормально.

Технически, что будет происходить, последний элемент в @flds включает в себя завершающий \n из линии - например. $flds[3].

0

грызть() функция удаления (обычно) любого символ новой строки от конца строки. Обычно мы говорим, что он фактически удаляет любой символ, который соответствует текущему значению $/(разделитель входных данных), и $/defaults для новой строки.

Пример 1. Чередование строки Чаще всего вы будете использовать chomp() при чтении данных из файла или из пользователя. Например, при чтении пользовательского ввода из стандартного входного потока (STDIN) вы получаете символ новой строки с каждой строкой данных. chomp() действительно полезен в этом случае, потому что вам не нужно писать регулярное выражение, и вам не нужно беспокоиться об удалении необходимых символов.

while (my $text = <STDIN>) { 
chomp($text); 
print "You entered '$text'\n"; 
last if ($text eq ''); 

}

Пример использования и вывод этой программы:

слово Вы ввели 'слово' некоторый текст Вы ввели 'текст'

Вы вошли ''

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