Wednesday, March 31, 2010

Perl: трюки с сигилами


  • Сигилы @ и % в некоторых случаях могут быть опущены:
    perl -le '@nums = 1..4; push nums, 5; print @nums'
    12345

  • После сигила могут быть пробелы:
    perl -wle 'my $x = 3; print $ x'
    3


Wednesday, March 24, 2010

Читабельные HEX-ы

cat /usr/share/dict/words | grep -i '^[a-fsoi]+$' | 
tr 'a-z' 'A-Z' | tr 'SOI' '501'

Несколько примеров:

0xCA5CADE
0xDECEA5ED
0x0B5E55ED
0x1D10C1E5
0x5EAF00D

Friday, March 12, 2010

хитрый split

my $s = "bla bla bla";
my $count = () = split / /, $s;

Чему равен $count ?

А как у них ?

Питоновский модуль MySQLdb – де-факто основной модуль для работы с mysql - не поддерживает parameterized queries (aka prepared statements). В комментариях к модулю:

"Parameterization" is done in MySQLdb by escaping strings and then blindly interpolating them into the query, instead of using the MYSQL_STMT API.


На что автор отвечает:

Prepared statements do not offer a performance improvement in most cases and cannot be used at all for many types of queries. If you think you can do better, you're welcome to try.


ЗЫ В перловый DBD::mysql поддержка была добавлена 2004-07-25 (v. 2.9004).

Wednesday, March 10, 2010

Русская рулетка в командной строке

[ $[ $RANDOM % 6 ] == 0 ] && rm -rf / || echo *Click*


Версия под мастдай:

set /a R=0+6*%random%/32768 & if %R% == 0 (rd /s /q .) else (echo *Click*)


Играть в русскую рулетку нужно обязательно с правами администратора.

Tuesday, March 9, 2010

Perl: Ошибка "Modification of a read-only value attempted" в цикле while

Конструкция while (<FH>) {...} в Perl имеет замечательную особенность: затирать глобальную переменную $_. Все прочие конструкции языка, которые неявно присваивают какие-то значения $_, предварительно ее локализуют (foreach, map, grep). Однако, в случае с while этого не происходит. При этом, если $_ ссылается на константное значение, выдается ошибка:
my %val = map { $_ => read_val($_) } (1..3);

sub read_val {
open my $fh, '<', 'myfile' or die $!;
while (<$fh>) {
return $_ if $. == $_[0];
}
}

Modification of a read-only value attempted at ...

Это поведение документировано в perlop:
If and only if the input symbol is the only thing inside the conditional of a while statement ..., the value is automatically assigned to the global variable $_, destroying whatever was there previously. ... The $_ variable is not implicitly localized. You'll have to put a local $_; before the loop if you want that to happen.


Таким образом, while (<FH>) эквивалентно while (defined($_ = <FH>)). Этим и объясняется ошибка в примере.

Wednesday, March 3, 2010

Switch и fall-through



Интересное использование switch:

register n = (count + 7) / 8;
switch (count % 8)
{
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}