Perlの構文 open("","") || &xxx  はどんな処理をしているのですか?

[上に] [前に] [次に]
じぇい [E-Mail] 1999/09/09(木) 13:26:49
 初めて利用させていただきます。
Perlの勉強をはじめたばかりの初心者です。
今、ネットで入手した、アクセスカウンターのソースを解析して
勉強しているのですが、
 open(LOG,">$logfile") || &error
という構文の || &error の部分がどういう条件で
&error のルーチンにとんでいるのかが わからないのです。
よろしくお願い いたします。

ワイ 1999/09/09(木) 13:36:19
"foo||bar"ってのは、C言語と同じで「または」と言うことです。
perlではこれを使った場合、fooの結果が真の場合には(全体で真となることが確定するため)barは実行されません。fooの値が偽の場合はbarは実行されます。
つまり、質問の場合の文をif文で書くと

if(!open(LOG,">$logfile")){
  &error;
}
と言うような感じになります。

じぇい 1999/09/09(木) 13:40:52
追記:
今回参考にさせていただいた、ソースは
http://www.kent-web.com/
のなかのアクセスカウンター《DREAM COUNTER》です。
(&errorはその中独自のルーチンですよね。
質問件名では&xxxと 書いたのに、おかしな事を
かいて すいませんです。)

じぇい 1999/09/09(木) 13:48:00
[[解決]]
 ワイさん ありがとうございます。
こんなに早くに答えが得られるとわ!!!
また単純な構文の疑問がでそうなので、そのときは
この掲示板を利用させていただきます。
***
Perl(perl for win32)用の
リファレンスでいいものがあれば教えてほしいです。

B-Cus 1999/09/09(木) 15:44:39
> また単純な構文の疑問がでそうなので、そのときは
> この掲示板を利用させていただきます。
単純な構文の疑問が出たら、本を読んで調べるべきでは?

 ../199909/99090108.htm
も同じ。知らない関数が見つかったら、毎回ここで聞くつもりですか?

B-Cus 1999/09/09(木) 15:50:12
オンラインがいいなら
 http://www.att.or.jp/perl/
 http://www.att.or.jp/perl/man/index.html
とかさ。まぁ本も買った方がいいと思うけど。

じぇい 1999/09/09(木) 16:28:19
 何冊か参考で本は使用してるのですが、イマイチ
使い勝手が悪いんですよ。(知識不足もありますが)
肝心の部分の説明がなかったり、添付のCD-ROMのソースと
本書の内容がちがったり と。掲示板のQ&Aのほうが、知りたい
情報が、的確に(しかも早く)入手できるので、甘えてました。
Perl5のページアドレスは、早速ブックマークに登録しました。
ありがとうございます。

mm 1999/09/10(金) 00:13:33
>"foo||bar"ってのは、C言語と同じで「または」と言うことです。
>perlではこれを使った場合、fooの結果が真の場合には
>(全体で真となることが確定するため)barは実行されません。
正確に言えば、C言語の場合もfooの評価結果が真の場合は、
barは評価されません。

BASICやPascalでは、このような論理式でbarが評価されるかどうかは、
処理系依存になります。
(ただし、barを評価しても無駄なので、まともな処理系なら最適化
によって評価は省略すると思いますが…Delphiでも既定値では評価しません)

でも、Cやperlでは、barを評価しないことが言語仕様として
保証されています。
このような保証があれば、fooが真の場合にbarを評価すると問題が
あるような場合(例えば配列の範囲を超えたアクセスになるとか)
にも安心してbarを記述できるようになるからです。

また、Cやperlでは、式にセミコロンを付ければ文になります。
従って、perlでは、これを利用して
foo || bar;
というような文を制御文のように使っている訳です。
(barを評価しないことが保証されるだけでは、ダミーの代入文
などにして使う必要があるので、あまり意味がなくなります)

なお、Cでもこのような使い方はできますが、私はそのような
ソースを見たことがありません(あまり好ましい書き方とは
されていないのでしょう)。
また、Lispでは、普通に (or foo bar)という使い方をします。
if文も論理式もLispでは関数にすぎないからだと思われます。
perlのこの使い方は、ここから来たのではないかと思ってるのですが…?

じぇい 1999/09/10(金) 09:17:30
 mmさんありがとうございます。
perlは、c言語・Basicの開発経験者
には、覚えやすい言語なんでしょうか?
コボルとVBAしかしらなかったので、
少々とっつきにくかったです。

mm 1999/09/10(金) 22:38:07
>perlは、c言語・Basicの開発経験者には、覚えやすい言語なんでしょうか?
COBOLもVBAもよくは知らないんですが、VBAってBASICの仲間じゃないんですか?
それはともかく、言語の系統でいえば、Algol→Pascal→C→perl
みたいな流れがあるんで、FORTRAN→BASIC やCOBOL(どういう系統になるの?)
などに比べれば、C言語を知っていると、perlになじみ易いとは思います。
また、Cの言語仕様を多く採用しているので、覚える手間も減るでしょうね。

今回の件のように、式(foo||bar)にセミコロンを付けて文だと言い張って、
肝心の式の評価結果は惜しげもなく捨ててしまうような記法は、少なくとも
手続き型の言語では、C言語系に特有のような気がします。
また、ifがあるのにunlessが用意されているのは、同じことをするのに
複数の方法が提供されるperl的な思想の表われだと思います。

>コボルとVBAしかしらなかったので、少々とっつきにくかったです。
C系の言語の経験のない方が、perlのどこにとっつきにくさを感じたのか、
とても興味があります。よろしければ、教えてください。

じぇい 1999/09/13(月) 09:13:53
 まずは、Perlの本が、<初心者向け>とは
書いてあっても、cで言うところの… や
BASICでは… という記述が多く、cは知らんちゅうねん!!
と言う私には、そこから分かりにくかったですね。
 IF unless のような独特の表現方法も、COBOLにはない
ものでしたし。その点VBAは、COBOLをやった人間でも、
見たことの有る表記方法で、プログラムが書けたので
やりやすかったです。
 なによりも わたしが新米ってのが、最大の理由だと
思いますけど。。。
 こんなお返事でよろしかったでしょうか?????

mm 1999/09/14(火) 01:59:15
>こんなお返事でよろしかったでしょうか?????
本題とは関係のない疑問にお答え頂きありがとうございます。
いろいろ参考になりました。

なお、if とか unless っていうのは、見かけだけの違いで、
基本的にはBASIC や COBOLの IF と変わりはないし、
慣れの問題という気がします。

[上に] [前に] [次に]