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


Автор: OutlawZ 18.4.2009, 22:54
Доброй ночи, собственно смешная проблема, но все же проблема, под вечер решил немного покодить и столкнулся с проблемой вывода решения двух переменных:
Код

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.KOI8-R');

sub start()
{
 print "Введите значение X:";
 $x = <STDIN>; chomp($x);
 print "Введите значение Y:";
 $y = <STDIN>; chomp($y);
 
 $plus  = $x + $y;
 $minus = $x - $y;
 $mno   = $x * $y;
 $dele  = $x / $y;

 print "Сложение: " . $plus . "\n";
 print "Вычитание: " . $minus . "\n";
 print "Деление: " . $dele . "\n";
 print "Умножение: " . $mno . "\n";
}
sub next_()
{
 $i = $j = 2;
 $d =.781;
 $char = '&';
 $define = 12 + 6;

 print "i=$i" . "\n" . "j=$j" . "\n" . "d=$d" . "\n" . "char=$char" . "\n";
 print "define=$define" . "\n";
 print "Введите целое значение K:";
 $k = <STDIN>; chomp($k);
 print "k=$k" . "\n";
 print "define * j= " . $define * $j . "\nd + k= " . $d + $k . "\n";
}
start();
next_();

Проблема в строчке print "define * j= " . $define * $j . "\nd + k= " . $d + $k . "\n"; вывод "define * j= " . $define * $j выводит все правильно а вот строчка "\nd + k= " . $d + $k . "\n"; выводит просто 2 вот результат:
Код

outlaw@outlaw-laptop:~/Документы$ perl al.pl
Введите значение X:4
Введите значение Y:5
Сложение: 9
Вычитание: -1
Деление: 0.8
Умножение: 20
i=2
j=2
d=0.781
char=&
define=18
Введите целое значение K:2
k=2
2


Решил сделать так:
Код

 print "define * j= " . $define * $j . "\nd + k= ";
 print $d + $k . "\n";

Выводит все правильно вот результат:
Код

outlaw@outlaw-laptop:~/Документы$ perl al.pl
Введите значение X:4
Введите значение Y:5
Сложение: 9
Вычитание: -1
Деление: 0.8
Умножение: 20
i=2
j=2
d=0.781
char=&
define=18
Введите целое значение K:2
k=2
define * j= 36
d + k= 2.781


Вопрос, почему он не хочет принимать print "define * j= " . $define * $j . "\nd + k= " . $d + $k . "\n"; ?? Зарание спасибо )

Автор: vadiml 18.4.2009, 23:48
Попробуйте:
print "define * j= " . $define * $j . "\nd + k= " . ($d + $k) . "\n";

А вообще если Вы пропишите 
#!/usr/bin/perl -w
или
use warnings;

То Вам perl напишет почему так.

Так же могу посоветовать всегда использовать
use warnings;
А если Вам надо исключить какой-то кусок из предупреждений, лучше написать:
no  warnings;
# Ваш хитрый русок кода
use warnings;



Автор: OutlawZ 19.4.2009, 00:07
Спасибо smile

Автор: amg 19.4.2009, 11:55
Цитата(OutlawZ @  18.4.2009,  22:54 Найти цитируемый пост)
Вопрос, почему он не хочет принимать print "define * j= " . $define * $j . "\nd + k= " . $d + $k . "\n"; ??
Проблема - в неправильном приоритете операций. Попробуйте исполнить такую команду (она расставит скобки), и сразу станет ясно:
Код
perl -MO=Deparse,-p -e 'print "define * j= " . $define * $j . "\nd + k= " . $d + $k . "\n";'

Команду эту нужно исполнять из консоли (cmd в винде). Если у Вас винда, то внешние одинарные кавычки (из cmd не не понимает) нужно заменить на двойные, а все остальные двойные кавычки заэкранировать. 
Потом попробуйте то же самое, заменив все точки на запятые.

Автор: vadiml 19.4.2009, 14:11
amg
Ну это долго, это не для ленивых...
добавление ключа -w проще и сразу напишет:
Argument "define * j= 6\nd + k= 4" isn't numeric in addition (+) at qqqq.pl line строка
и гораздо универсальнее

Автор: ginnie 19.4.2009, 15:06
vadiml, с точки зрения универсальности B::Deparse как раз более универсален, а use warnings поможет лишь в части случаев (когда будут предупреждения).

Автор: amg 20.4.2009, 06:25
Цитата(vadiml @  19.4.2009,  14:11 Найти цитируемый пост)
Ну это долго, это не для ленивых...
добавление ключа -w проще
Ключ -w само собой нужен. Но часто же бывает, что синтаксис правильный, поэтому предупреждения не будет, а последовательность выполнения операций программист и перл понимают по разному. Типичный пример:
open F, $file || die;

А насчет долго не для ленивых - я как раз ленив, поэтому эту операцию просто посадил на кнопку редактора.

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