Какая разница в этих вызовах для печати Perl? - PullRequest
3 голосов
/ 04 апреля 2011

Где разница между следующими двумя утверждениями?

print "surname=" ,$myVal, "\n";

и

print "surname=" .$myVal. "\n"

Я проверял их иоба возвращают один и тот же результат.Есть ли разница?

Спасибо

Ответы [ 5 ]

8 голосов
/ 04 апреля 2011

Первый напечатает каждый элемент в списке, отделенный $,.Последний сначала объединяет все, поэтому не нужно ничего разделять.Если $, не содержит чего-либо для печати, между утверждениями нет существенной разницы

5 голосов
/ 04 апреля 2011

print может принять список, который вы передаете.Print просто сделает свое дело (то есть выведет) на все элементы в списке, которые surname=, $myVal и \n

. Во втором примере сначала нужно объединить все, а затем распечатать.

Использование запятых не совпадает, что также является различием между ними.

3 голосов
/ 04 апреля 2011

Программист Perl, вероятно, написал бы это как:

print "surname=$myVal\n";

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

my @var = qw(some data);

print "value=", @var, "\n";
print "value=". @var. "\n";

Разница заключается в количестве аргументов, передаваемых в функцию печати.Если вы используете оператор конкатенации (.), Тогда ваши аргументы объединяются в одну строку, и print получает один аргумент.Если вы используете запятую, то print получает список аргументов.

Конечно, можно смешивать методы в одном вызове печати. ​​

print "surname=" ,$myVal . "\n";

Еще один хороший пример - использованиевозвращаемое значение из местного времени.

print 'The time is ', localtime, "\n";
print 'The time is '. localtime, "\n";
2 голосов
/ 05 апреля 2011

Как уже говорили ранее, . объединяет строки и , разделяет элементы массива.

При работе с формой . следует учитывать одну проблему - это проблемы с производительностью в некоторых очень специфических сценариях из-за управления памятью: версия . должна сначала создать новую строку в памяти и продолжать расширять адресную память Может ли кто-нибудь подробнее остановиться на этой части?). Если вы печатаете это в цикле миллион раз с тысячами конкатенаций очень больших строк, версия . даст вам очень низкую производительность по сравнению с версией ,. Это все равно что глотать целый файл в память против обработки строка за строкой. Но простые смертные не заметят эту проблему в повседневной жизни с современными компьютерами.

1 голос
/ 04 апреля 2011

Насколько я знаю, print также может принимать список, что, как мне кажется, имеет место с первым фрагментом кода (разделенный запятыми).Второй (с '.') - просто добавление строки, другими словами, первый вызов отправляет три аргумента для печати, а второй отправляет один.

edit: вот страница документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...