2010-02-22 6 views
2

Я видел этот ОднострочникЧто означает {в конце однострочного интервала Perl?

perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file 

здесь: How can I sum values in column based on the value in another column?

, и я не помню, как «{» в конце работы. Не могли бы вы объяснить, как это работает?

+6

Перл заставляет мои глаза болеть. – JasCav

+2

Просто выглядит как кодовое гольф-решение. – kennytm

ответ

16

От Perl help:

 
-n assume "while (<>) { ... }" loop around program 

Это чисто операция текстуальное, поэтому он дает эту программу:

while (<>) { $_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{ } 

Это злоупотребление переключателя -n, поскольку цикл в то время как закрывается рано из-за непревзойденного } в оригинальной программе. Но закрытие }, добавленное переключателем -n, все равно должно соответствовать чему-то, и поэтому в конце программы должен быть добавлен дополнительный {, хотя он ничего не делает.

Другими словами, единственная причина, по которой последний { заключается в отсутствии синтаксической ошибки.

+2

Может быть приятно отметить -MO = Deparse – ysth

+0

Мы показываем несколько примеров в «Эффективном программировании на Perl», 2nd Edition_, которые используют этот трюк. :) –

+3

Лучшим способом выполнить это (на мой взгляд) было бы использование блока 'END {}'. –

Смежные вопросы