[SOLVED][perl] open or not die !?

oyuriyu

Почему-то в перле такой код не работает :

open FILE, "$MYFILE" or {
# fine, no file yet. who cares :)
something else
}

Perl хочет, чтобы после or был чётко один оператор. Как это можно побороть ?
PS
open FILE, "$MYFILE" or if (1) {...}
тоже не работает
РЕШЕНИЕ

unless (open($input, $filename {
print STDERR "Can't open $filename: $!\n";
return;
}

uncle17

чорд... вот только сегодня тот же самый вопрос возникал кучу раз в PHP

oyuriyu

моя прога про голосования уже здорово шурстит по разным турам и всё обсчитывает, вот код подкрашиваю, чтобы на ошибки проверялось на всякий пожарный

oyuriyu

Solution:

unless (open($input, $filename {
print STDERR "Can't open $filename: $!\n";
return;
}

kruzer25

if - не оператор
А что-нибудь вроде
if(!(open FILE, "$MYFILE"  {
# fine, no file yet. who cares :)
something else
}

в перле работать не будет?

oyuriyu

хз,можешь проверить

ava3443

Perl хочет, чтобы после or был чётко один оператор.
Perl хочет чтобы or использовался подобающе бинарному оператору, возвращающему дизъюнкцию своих аргументов
В твоих примерах первым аргументом будет значение выражения open FILE, "$MYFILE" (не-ноль в случае успешного открытия файла, undef в случае ошибки).
Пытаться использовать блок в качестве второго аргумента - странно, ведь блок не является выражением.
Если очень хочется несколько операторов после or поставить - раздели из запятыми и возьми все вместе в скобки. Если я правильно помню, должно заработать.
В общем, я тут фигню наверное написал, а по делу - ботай perldoc perlop

kruzer25

Можно подумать, я этот тред завёл.
Тебе это нужно, ты и проверяй. А у меня и перла-то нету.

kruzer25

вот только сегодня тот же самый вопрос возникал кучу раз в PHP
Ботай пост а, он всё правильно объяснил (по крайней мере, для php).

uncle17

да не, я к этому выводу и сам в итоге пришел, но было бы удобно - чисто по-человечески код писать

wwoland

а может этот блок просто в do{} взять?

kruzer25

Очень простой способ понять, правильно ли написал - заключить всё в if.
Сам-то как думаешь, if(fopen(...) or do { ... } ) { } - будет синтаксически правильной конструкцией?
ЗЫ: В принципе, особые извращенцы могут пользоваться fopen(...) or eval(... но это медленно и неудобочитаемо (никакой подсветки синтаксиса, перехода к определениям...)

pitrik2

Perl хочет чтобы or использовался подобающе бинарному оператору, возвращающему дизъюнкцию своих аргументов
дык значит можно использовать несколько or?
опенфайл or операция1 or операция2 ...;

kruzer25

Ага, но если тее это надо, чтобы выполнить несколько операций, если не удалось открыть файл - нихрена не выйдет, если операция1 вернёт true, никакие другие операции выполнены не будут.

yolki

if(!blabla) эквивалентно unless(blabla)

tokuchu

Очень простой способ понять, правильно ли написал - заключить всё в if.
Сам-то как думаешь, if(fopen(...) or do { ... } ) { } - будет синтаксически правильной конструкцией?
ЗЫ: В принципе, особые извращенцы могут пользоваться fopen(...) or eval(... но это медленно и неудобочитаемо (никакой подсветки синтаксиса, перехода к определениям...)
Ты не прав. Оператор do{} можно применять как раз для этого, чтобы вставить блок в подобных местах:

$ cat > test.pl
#!/usr/bin/perl

0 or do { print "test\n"; print "test2\n"; };
if (0 or do { print "test\n"; print "test2\n"; }) { print "test3\n"; }
^D
$ perl test.pl
test
test2
test
test2
test3

sbs-66

Сама идея такого синтаксиса была в том, чтобы выполнить тривильное действие в какй-то случае ошибки, обычно - аварийно завершить программу. Т.е. чтобы не писать
unless( fopen(...) ) {
// some code
}
когда some code - тривиальная операция.
Но нахрена использовать этот синтаксис вместо полноценного
unless( fopen ) {
// много кода
}
я не понимаю. Это примерно то же самое, как спросить, а можно ли кроме переменной $_ использовать ещё пару-тройку переменных по умолчанию, чтобы применять к ним всем регулярные выражения одновременно, вместо того, чтобы дать этим переменным имена. Или можно ли в foreach в PHP использовать сразу несколько массивов и сложные выражения для итерации и условия конца цикла, вместо того, чтобы использовать цикл for.

tokuchu

Какая нафиг разница для чего? Вопрос был в том как это сделать. Такая возможность есть (do{}). А хорошо это или плохо - это уже другой вопрос. В перле, вообще говоря, много подобных спорных моментов.

feliks28

А хорошо это или плохо - это уже другой вопрос
Т.е. нормально на вопрос "Известны сумма и произведение двух чисел. Как их найти?" отвечать "Перебором" ?

zya369

ты можешь перебрать множество комплексных чисел?

feliks28

А ты отведенные типу биты перебрать не можешь что ли? %)

zya369


PS вообще-то это был риторический оффтопик
ЗЗЫ не везде ж можно побитам все перебрать

feliks28

Ну мы же не в Study. Следует учитывать контекст

tokuchu

Т.е. нормально на вопрос "Известны сумма и произведение двух чисел. Как их найти?" отвечать "Перебором" ?
Ну тут немного другое. Просто в Перле полно конструкций подобного вида и сделаны они для того, чтобы можно было сокращать запись. Ну такая идеология у Перла. Если бы это была Ява какая-нибудь, тогда можно было бы хаить - типа некошерная конструкция не должна использоваться и тому подобное.
Оставить комментарий
Имя или ник:
Комментарий: