• ベストアンサー

関数「exists」と「defined」の違いは?

関数「exists」と「defined」の違いが分かりません。 「exists」はハッシュにしか使えないため「defined」 より特殊な関数なのでしょうが。 $a{$i} = 0 unless defined $a{$i}; $a{$i} = 0 unless exists $a{$i}; ↑の二つの文は等価ですよね?

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

キーが存在するがその値が未定義、という場合があるので等価ではない。 --------------------------------------------- my %a = ("x"=>undef); if ( defined($a{"x"}) ) { print qq(\$a{"x"} is defined\n); } else{ print qq(\$a{"x"} is not defined\n); } if ( exists($a{"x"}) ) { print qq(\$a{"x"} exists\n); } else{ print qq(\$a{"x"} does not exists\n); }

gle_gle
質問者

お礼

非常に分かりやすい例をありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

先に回答されているように等しくありません。 exists は $hash{'key'} の key 自体が存在しているか調べられます。 exists の結果が偽なら defined も偽になりますが、 defined が偽でも、key 自体が存在していれば exists は真を返します。

gle_gle
質問者

お礼

回答1への補足、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • if~notとunlessの違い

    if~notとunlessの違いについてお聞きしたいのですが。 以下の、unlessに関する私の解釈でどこか間違っているところがあったら、教えてください。 unlessは主節の内容を否定するための「唯一の条件」を示す働きがあり、「~する場合を除いて」という意味になる。 I’ll be surprised unless Ann comes to the meeting. という文を「もし、アンがその会に来なかったら驚きだ(いつも来てるから)」という意味で使えないのは、上の文だと、「アンがその会に来る場合を除いて他のどの場合でも(太郎が来ても、花子が来ても)、私は驚く」という意味になってしまうからである。 よろしくお願いします。

  • EXISTSを使ったDELETE文

    「SELECT文の件数」と、 「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。 【SELECT文】※2件返ってきます。 SELECT   a.部署コード,   a.社員コード FROM   社員マスタ a,   組織マスタ b WHERE   a.部署コード = b.部署コード 【DELETE文】※50件 DELETEされます。 DELETE TABLE   社員マスタ WHERE   EXISTS   (   SELECT     a.部署コード,     a.社員コード   FROM     社員マスタ a,     組織マスタ b   WHERE     a.部署コード = b.部署コード   ) 環境はSQLSERVER2005です。 件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。 宜しくお願いします。

  • DELETE 文とEXISTSの使い方について(Oracle10g)

    DELETE 文とEXISTSの使い方について(Oracle10g) 2つのテーブル(A、B)を外部結合して、B側がNULLとなったレコードを A側から削除する、というDELETE文が作りたいのですが、 EXISTS句を使ってみたもののどうも使い方がわからず苦戦しています。 目的は2つのテーブルを同期させる事で このSQLを実行する時点で、常にA>Bになっています。 目的を達成できるSQLを教えてください。 <削除対象レコードをSELECTするSQL> SELECT * FROM A, B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ; <上をDELETE文にしてみたつもりが、削除0件になってしまうSQL> DELETE FROM A WHERE EXISTS( SELECT 1 FROM B WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY1 IS NULL ) ;

  • ベキ関数と指数関数の違い

    天文学関係の本を読んでいると、 「ガンマ線バーストの残光は、時間に対してベキ関数で減光する」 という文の直後に、 「自然現象で時間のベキ関数に従うものはとてもめずらしい。」 「たいていの自然現象は指数関数で表せるのに…(例:放射性同位体の減衰の様子)」 といったことが書かれていました。 私は、ベキ関数と指数関数は同じものだと根拠もなしに思っていましたが、どうやら違うようでした。 ベキ関数と指数関数の違いを教えてください。

  • ハッシュ関数

    ハッシュ関数について悩んでいます. ハッシュ関数の例として以下Wikiの引用です http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0 unsigned int hash(char *s) { unsigned int h = 0; for (;*s != '\0'; s++) { h = h * 137 + *s; } return h % 1987; } このハッシュ関数において, 「hの更新計算で用いる137という数は、2(7乗)+2(3乗)+2(0乗) というものであり、乗法した後にも2進数表現の下位の桁にも 情報が残るようになっている。そのため前の方の文字の情報が 桁あふれによって失われることはない。」 と記述されているのですが,私が考えてしまうのは以下の通りです. 「最終的にハッシュ値は合計を1987で割った余りになるのだから, 下位の桁(1~1987)に情報を残さなければならない. それぞれのsの上位から下位までの情報を合計の数値の下位に 残すのであれば,137は掛けるのではなく割るべき.」 もちろん私の考え方が間違っているのはわかりますが, なぜ137を掛けるのかを理解できません. どなたかわかりやすくご教授いただけたら幸いです.

  • プログラムがmain関数から始まらない??

    C言語初心者です。よろしくお願いします。 return文について勉強している途中だったのですが、次のプログラムを実行してみたところ、わからないことが出てきたので質問させていただきました。(ほとんど自分で作ったプログラムではないです) #include <stdio.h> /* 関数a()はintを返すと指定 */ int a() {     if (1) {          /* ここで関数a()は終わります */          printf("yes1\n");          return 300;     }     pritnf("yes2\n");     /* ここは通りません */     printf("this is a()\n");     return 10; } int main() {     int i;     /* 関数a()の返り値を変数iに代入します */     i = a();     printf("i = %d\n", i);     return 0; } このプログラムの出力結果は yes1 i = 300 となるのですが、 1.以前「main関数からプログラムは開始する」というようなことを学習したのですが、このプログラムではyes1が出力されていることからa関数からプログラムが始まっていませんか? 2.a関数のif文の中のreturn 300;でプログラムが終了しないのはなぜですか? 知識のある方、どうか教えてください。 よろしくお願いします。 ※ このプログラムを表示させる際、Tabキー及び半角では適度な空白スペースを作ることができなかったので、プログラムを見やすくするための空白スペースは全て全角スペースで作ってあります。(もしかしたら普通に表示させる方法があるのかもしれませんが、わかりませんでした。)

  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • 仮定法との違い

    私は今、高校生ですが、いかんせん仮定法の概念がよくわかりません 例えば、中学などで習うifは以下のような文 If I have a lot of money, I will want to buy a car. ですが、これを仮定法に変えた場合 If I had a lot of money, I would want to buy a car. となりますが、これらの違いは何なのでしょうか?(自作の文なので文法・文脈的におかしいかもしれませんが・・・)仮定法と中学で習う[if]の使い方違いをわかりやすく教えてください。

  • 【SQL】existsでの商演算

    閲覧ありがとうございます. 現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます. 例として,A,Bと名付けた2つのテーブルを最初に用意します. [テーブル1(名前:机1)] | 番号 |氏名|年齢| 好物 | --------------------------- | 12 | あ | 1 | りんご | | 23 | い | 1 | すいか | | 23 | い | 1 | りんご | | 45 | え | 3 | すいか | | 45 | え | 3 | りんご | [テーブル2(名前:机2)] | 好物 | ---------- | りんご | | すいか | この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました. select 氏名 from 机1 A where exists( select * from 机2 B where A.好物 = B.好物); [求めている結果表示] | 番号 |氏名| ------------- | 23 | い | | 45 | え | [実際に表示された結果] | 番号 |氏名| ------------- | 12 | あ | | 23 | い | | 23 | い | | 45 | え | | 45 | え | 実行すると (1)氏名が重複で表示されてしまう (2)「りんご」のみ好物の「あ」も表示されてしまう という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります. 長文・駄文すみませんでした. まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.

  • 関数呼び出しについて

    今cygwin 上でC++の勉強をしているのですが 以下の2つのプログラムの違いがよくわかりません どなたかよろしくお願いします <プログラム1> #include<iostream> using namespace std; int a(); int main(){ cout << abs();  return 0;} int a(){ cout << "test\n";  return 1;} <プログラム2> #include<iostream> using namespace std; int a(int i); int main(){ cout << a(1);  return 0;} int a(int i){ cout << "test\n";  return i;} プログラム1では関数a()内の"test"が出力されるのですが プログラム2ではa(int i)内の"test"は出力されません。 この違いはどこにあるのでしょうか? 同じプログラムでint a() と int a(int i)を double a() と double a(double d)にすると この違いは生じません。なぜaの戻り値をint に設定したときだけ この違いが生じるのでしょうか?

このQ&Aのポイント
  • コロナ陽性の判断方法について説明します。体調が悪い場合は、一般的な風邪の症状との違いに注目しましょう。コロナの症状は、発熱、咳、呼吸困難などが主な特徴です。もし症状が重い場合や懸念がある場合は、保健所や医療機関に相談することをおすすめします。
  • 体調不良の場合、検査に行くかどうか迷うこともあるかと思います。しかし、体調不良の原因がコロナである可能性がある場合は、積極的に検査を受けることが重要です。自宅待機や他人との接触を避けながら検査の予約をしましょう。
  • まとめると、コロナ陽性の判断方法は症状の特徴に注目することです。体調不良の場合は、保健所や医療機関に相談し、検査を受けることが大切です。ハッシュタグ:#コロナ陽性判断方法 #体調不良時の検査
回答を見る