Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Проблема "склеивания" строки из фаила и из STDIN


Автор: StargazerV 3.4.2010, 19:08
Если коротко, то я пытаюсь прочесть строку из файла, получить к ней дополнение от пользователя из STDIN и обьеденив их вместе, куда-то положить. Куда-то, котопу, что это не важно, куда. Проблема именно с объединением.

Код


open(PROGFILE, $progFile) or die $!;

while($row = <PROGFILE>)
{
    chomp($row);
    
    print("\n$row\n");
    print("Enter row documentation:\n");
    
    chomp($tempInput = <STDIN>);
    
    print($row.$tempInput) ;
}

close(PROGFILE);



в результыте подобного кода, получаю к примеру следующие результаты:

строка из открытого файла
Enter row documentation:
документация

документацияытого файла

т.е. при объединении данные как бы накладываются один на другой, вместо объединения.

Есть мысли?

Автор: shamber 3.4.2010, 19:24
Начните с простого
Код

use strict;

Автор: StargazerV 3.4.2010, 19:27
уже есть.

я не уточнил, та часть, которую я выложил, это только проблематичная часть, т.е. не весь код. Есть и use strict; и всякое разное.

Добавлено через 50 секунд
На всякий случай, вот ВЕСЬ код

Код

#!/usr/local/bin/perl 

use warnings;
use strict;
use diagnostics;

#varibles declaration
my $numArgum;
my $progFile;
my @documentedFile;
my $tempInput;
my $row;

#checking number of arguments received
$numArgum = @ARGV;

if($numArgum == 0)
{
    print("\nPlease enter your program file name for description:\n");
    
    chomp($progFile = <STDIN>);
}
elsif($numArgum > 1)
{
    print("\nToo many agruments.\n");
    print("usage: my_prog.pl <file_name>\n");
    exit(1);
}
else
{
    $progFile = $ARGV[0];
}

open(PROGFILE, $progFile) or die $!;

while($row = <PROGFILE>)
{
    chomp($row);
    
    print("\n$row\n");
    print("Enter row documentation:\n");
    
    chomp($tempInput = <STDIN>);
    
    print($row.$tempInput) ;
}

close(PROGFILE);

exit(0);

Автор: shamber 3.4.2010, 19:32
StargazerV, описанных вами проблем не испытываю. У меня все печатается как и ожидается.
test.txt
Код

<?xml version="1.0" encoding="windows-1251"?>
<!-- Generated by Oracle Reports version 6.0.8.14.2 -->
<message class="80020" version="2" number="2080">

test.pl
Код

my $progFile = 'test.txt';
open(PROGFILE, $progFile) or die $!;

while($row = <PROGFILE>)
{
    chomp($row);
    print("\n$row\n");
    print("Enter row documentation:\n");
    chomp($tempInput = <STDIN>);
    print($row.$tempInput) ;
}
close(PROGFILE);


Код

<?xml version="1.0" encoding="windows-1251"?>
Enter row documentation:
3
<?xml version="1.0" encoding="windows-1251"?>3
<!-- Generated by Oracle Reports version 6.0.8.14.2 -->
Enter row documentation:
5
<!-- Generated by Oracle Reports version 6.0.8.14.2 -->5
<message class="80020" version="2" number="2080">

Автор: StargazerV 3.4.2010, 19:38
мде.... а это уже совсем грустно.

возможно проблема в интерпритаторе перла?

изначально пишу все под линукс. Запускаю через cygwin, в котором установлен perl.
Если кто не в курсе, cygwin создает под windows оболочку линуска.

Но я попробую сейчас запустить скрипт на прямую в линуксе, возможно прблема в cygwin, хотя сомнительно.

Автор: shamber 3.4.2010, 19:49
Цитата(StargazerV @  3.4.2010,  19:38 Найти цитируемый пост)
изначально пишу все под линукс. Запускаю через cygwin, в котором установлен perl.
Если кто не в курсе, cygwin создает под windows оболочку линуска.

Но я попробую сейчас запустить скрипт на прямую в линуксе, возможно прблема в cygwin, хотя сомнительно. 


ЩИТО?

Автор: StargazerV 3.4.2010, 20:12
Да в принципе ничего. Корочи проблема в том, что запускается все это под линуксом (так надо). И под линуксом испытывается вышеуказанная проблема. в Win не пробовал, но и не надо.

Автор: shamber 3.4.2010, 20:24
StargazerV, а нормальный Linux не пробовали запускать?

Автор: StargazerV 3.4.2010, 20:27
пробовали, пробовали. Результат тот же.

Автор: shamber 3.4.2010, 20:36
StargazerV, Я тоже пробовал smile только что. Результат плачевный.

Автор: StargazerV 3.4.2010, 21:06
Мде... т.е. проблема в том, как линукс обрабатывает перл, а не в коде. Странно. Возможно, нужно что-то где-то добавить в коде... хз, как это решить.

Автор: Logo 4.4.2010, 17:08
У меня нормальный вывод. Ubuntu 9.10.
Проверь, не закрался ли символ возврата каретки \r в строки. Скорее всего в файле виндовый перевод строки \r\n и символ \r остается.

[offtop]
Правильно
Код

while(defined($row = <PROGFILE>))

Автор: NuINu 4.4.2010, 19:46
Цитата(StargazerV @  3.4.2010,  19:06 Найти цитируемый пост)
Мде... т.е. проблема в том, как линукс обрабатывает перл, а не в коде. Странно. Возможно, нужно что-то где-то добавить в коде... хз, как это решить.

какая дикость, как язык поворачивается так сказать ))), помимо того что это просто не грамотно, еще так грешить на линукс )), который здесь совершенно не причем.

к гадалке не ходи это проблема в \r и в том что chomp убирает только \n
решалась бы банально
$/ = "\r\n";

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

while($row = <PROGFILE>)
{
    chomp($row);
    $row =~ s/\r//;



кстати если бы вы выводили данные в файл а не на терминал результат был бы иным, попробуйте. ) 

Автор: StargazerV 5.4.2010, 19:42
Да, с \r я бы сам не дошел.

Большое спасибо, очень помогло!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)