почему оператор print ведет себя в обратном порядке? - PullRequest
3 голосов
/ 27 января 2012

В моем Perl Progarm у меня есть следующий код:

@alpha=('toM','jERRy','mickeY','MARio');
print sort{$a cmp $b} @alpha,'  "***MIDDLE STRING***"  ';

здесь печатается

'"*** MIDDLE STRING ***"'

сначала, а затем отсортированный список @alpha. Почему он печатает в обратном порядке, когда

print "a","b";

отпечатки

аЬ

в правильном порядке. Я гуглил о помощи, но это говорит об «обратной» функции / методе perl, но я не использую эту функцию в своем коде. Я нашел ответы неуместными.

Я предполагаю, что это имеет дело с внутренней работой функции "print" с использованием структуры данных "stack", но я понятия не имею. Кто-нибудь, помогите мне.

Заранее спасибо ...

Ответы [ 3 ]

7 голосов
/ 27 января 2012
print sort {$a cmp $b} @alpha,'  "***MIDDLE STRING***"  ';      #1
print sort {$a cmp $b} (@alpha,'  "***MIDDLE STRING***"  ');    #2

print (sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';   #3
(print sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';   #4

print ((sort {$a cmp $b} @alpha), '  "***MIDDLE STRING***"  '); #5

print sort {$a cmp $b} @alpha;                                  #6
print '  "***MIDDLE STRING***"  ';

print sort(@alpha), '  "***MIDDLE STRING***"  ';                #7
print sort({$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';    #8

# 1 и # 2 эквивалентны: sort работает со списком, содержащим все элементы @alpha плюс строка, благодаря автоматическому выравниванию списков в Perl.Возможно, вы захотите добавить несколько скобок вокруг sort (# 3), но это вам тоже не поможет, поскольку оно интерпретируется как список из двух элементов (# 4): результат вызова print истрока.Таким образом, строка не будет напечатана, поскольку она не имеет ничего общего с print.

. Вы можете использовать дополнительный набор скобок (# 5) или разделить его (# 6), но зная sort {$a cmp $b} @alpha идентичен sort @alpha, вы можете опустить блок, и скобки станут простыми (# 7).И по тому же правилу, если вам нужна функция сравнения, вы можете поместить оба аргумента в sort в скобках, не , разделенных запятой (# 8).

Я такженравится определять подпрограммы для различных видов сортировки, чтобы сделать код проще для чтения:

sub numerically { $a <=> $b }
sub backward { $b cmp $a }

print sort(numerically @array);    # Sort numerically ascending.
print sort(backward @array);       # Sort lexicographically descending.
7 голосов
/ 27 января 2012

' "***MIDDLE STRING***" ' является аргументом для sort, поэтому он сортируется вместе с элементами @alpha.

Если вы хотите напечатать отсортированное содержимое @alpha, за которым следует эта строка, выможет сделать это:

print +(sort{$a cmp $b} @alpha), '  "***MIDDLE STRING***"  ';

Обратите внимание, что без унарного + круглые скобки применяются к вызову print, а запятая, предшествующая строковому литералу, является оператором запятой, а не разделителем между аргументами.(Да, это странная особенность языка.)

Проще написать это как два отдельных утверждения:

print sort {$a cmp $b} @alpha;
print '  "***MIDDLE STRING***"  ';
1 голос
/ 27 января 2012

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

print sort(@alpha), '***MIDDLE STRING***';

Это относится ко многим ситуациям, например:

print join(':', @array), "\n";
@array = map(uc, @foo), @bar;

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

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