Почему символы новой строки не печатаются в этом коде Perl? - PullRequest
1 голос
/ 22 июля 2009

У меня есть простой Perl-код:

#!/usr/bin/perl

use strict;   # not in the OP, recommended
use warnings; # not in the OP, recommended

my $val = 1;
for ( 1 .. 100 ) {
    $val = ($val * $val + 1) % 8051;
    print ($val / 8050) . " \n";
}

Но когда я запускаю его, вывод:

bash-3.2$ perl ./rand.pl
0.0002484472049689440.000621118012422360.003229813664596270.08409937888198760.92
... <snipped for brevity> ...
2919250.9284472049689440.3526708074534160.1081987577639750.2295652173913040.1839
751552795030.433540372670807bash-3.2$

Я что-то не так делаю?

Ответы [ 3 ]

18 голосов
/ 22 июля 2009

C:\> perldoc -f print:

Также будьте осторожны, чтобы не следовать напечатать ключевое слово с левой круглой скобкой если вы не хотите соответствующий правая скобка, чтобы прекратить аргументы для печати - вставьте + или поставить круглые скобки вокруг всех аргументы.

Следовательно, вам нужно:

print( ($val / 8050) . "\n" );

или

print +($val / 8050) . "\n";

Оператор, который у вас есть, печатает результат $val / 8050, затем объединяет "\n" с возвращаемым значением print и затем отбрасывает полученное значение.

Кстати, если вы:

use warnings;

тогда perl скажет вам:

   print (...) interpreted as function at t.pl line 5.
   Useless use of concatenation (.) or string in void context at t.pl line 5.
3 голосов
/ 22 июля 2009

Это скорее комментарий, чем ответ, но я не знаю, как еще его сделать, и вопрос все равно уже получен.

Обратите внимание, что использование слова вместо печати аккуратно обходит весь вопрос. То есть

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my $val = 1;
for ( 1 .. 100 ) {
    $val = ($val * $val + 1) % 8051;
    say ($val / 8050);
}

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

0 голосов
/ 22 июля 2009

Возможно, что строка интерпретируется следующим образом

(print($val / 8050)) . " \n";

т.е. скобки используются в качестве разделителей для списка аргументов функции, а "\ n" отбрасывается без уведомления. Попробуйте:

 print( ($val/8050) . "\n" );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...