Perl (Логическое отрицание + побитовое отрицание)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Perl

Сообщение BratSinot »

Доброго времени суток!

Начал изучать Perl. Сваял код, который убирает строки коментарии(#) и пустые строки.

Код:

use Fcntl; sysopen(F, $ARGV[0], O_RDONLY); @f=<F>; close F; sysopen(F, $ARGV[0], O_WRONLY|O_TRUNC|O_CREATE); foreach $str (@f) { ($str !~ /^#/&&$str !~ /^$/)?printf(F $str):0; } close F;

Поскольку код писал не полностью я, я непонимаю некоторых моментов. А именно вот этот:

Код: Выделить всё

$str !~ /^#/

На кой черт нам нужно инвертировать символ '#', а потом еще и отрицат полученный результат? И вообще, у нас $str это срока, как мы строку сравниваем с одним символом?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: Perl

Сообщение /dev/random »

BratSinot писал(а):
28.03.2011 20:21

Код: Выделить всё

$str !~ /^#/

На кой черт нам нужно инвертировать символ '#', а потом еще и отрицат полученный результат? И вообще, у нас $str это срока, как мы строку сравниваем с одним символом?

Прочитайте что-нибудь про регулярные выражения. "^" означает инверсию _только_ после открывающей квадратной скобки. В начале регулярного выражения он означает "начало строки".
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Perl

Сообщение BratSinot »

/dev/random писал(а):
28.03.2011 20:37
BratSinot писал(а):
28.03.2011 20:21

Код: Выделить всё

$str !~ /^#/

На кой черт нам нужно инвертировать символ '#', а потом еще и отрицат полученный результат? И вообще, у нас $str это срока, как мы строку сравниваем с одним символом?

Прочитайте что-нибудь про регулярные выражения. "^" означает инверсию _только_ после открывающей квадратной скобки. В начале регулярного выражения он означает "начало строки".

Не, не, не, я про !~.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: Perl

Сообщение /dev/random »

BratSinot писал(а):
28.03.2011 20:40
Не, не, не, я про !~.

Здесь только одно отрицание. "!~" означает "не соответствует регулярному выражению". Где вы второе отрицание увидели, если не в "^"?
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: Perl

Сообщение liaonau »

BratSinot писал(а):
28.03.2011 20:21
Поскольку код писал не полностью я, я непонимаю некоторых моментов. А именно вот этот:

Код: Выделить всё

$str !~ /^#/

На кой черт нам нужно инвертировать символ '#', а потом еще и отрицат полученный результат? И вообще, у нас $str это срока, как мы строку сравниваем с одним символом?

Что вообще в вашем понимании «инвертировать символ '#'»? Что такое инверсия символа? Где конкретно это в коде?
Вы случайно, не «~» этим называете?
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: Perl

Сообщение liaonau »

BratSinot писал(а):
28.03.2011 20:21
И вообще, у нас $str это срока, как мы строку сравниваем с одним символом?

Мы сравниваем начало — «^» строки с символом «#». А вообще, в целом, в perl нет понятия «символ» в смысле типа данных. Есть только скалярный тип данных, который может быть числовым или строковым.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Perl

Сообщение BratSinot »

Так, я так понял !~ это один оператор? Я просто их принял за два отдельных.
Спасибо сказали:
liaonau
Сообщения: 390
ОС: gentoo

Re: Perl

Сообщение liaonau »

BratSinot писал(а):
28.03.2011 20:59
Так, я так понял !~ это один оператор? Я просто их принял за два отдельных.

Здесь ~ это связывание с переменной (=~ или !~). Без него применяется к $_. Это не унарное побитовое отрицание.
Спасибо сказали: