[PR]ネットとスマホ OCNでまとめておトク!

CGIの勉強をしているのですが、
$value
@value
の意味はわかるのですが、
*value
の意味がわかりません。
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

* は「型グロブ」です。


Perl5において、「参照」はリファレンスを指しますので、この場合正しくありません。

Perlでグローバル変数を使うと、各パッケージに存在する「名前テーブル」が参照されます。
名前テーブルの実体はハッシュで、キーが変数名、値がその変数へのポインタです。

しかしPerlでは、1つの変数名に対し、複数の意味を持たせることができます。
例えば $value と @value です。
この2つの変数において、名前テーブルハッシュのキーは、どちらも value です。
これだと両方の値を格納することができませんよね?

これをうまく実現するために、名前テーブルハッシュの値は、複数のスロット(部屋)でできています。
ちょうどCの構造体のような形です。
この「名前テーブルの区画をなす、複数スロットで構成された構造体」が型グロブです。

型グロブ *value からスカラー値を取り出すには
  ${*value}
とします。
配列値を取り出すなら
  @{*value}
です。
Perlは $value という記述を見つけると、名前テーブルから value を探し、そこからスカラー値を取り出しているのです。

ちなみに名前テーブルは、
  %パッケージ名::
というハッシュとして実際にアクセスできます。
特にパッケージ宣言をしていなければ、パッケージ名は main となります。
これを使って先ほどの $value や @value にアクセスするには
  ${$main::{value}}
  @{$main::{value}}
とします。

型グロブも1つのデータなので、代入などを行うことができます。
  *other = *value
とすると、*value の全スロットの値が *other に代入されます。
各スロットの値はポインタなので、$other という記述で $value をアクセスできるようになるのです。
同じく @other で @value がアクセスできます。

Perl4にはリファレンスが無かったので、この型グロブを使って参照渡しをしていたのですが、Perl5ではリファレンスを使うのが主流です。
(一部のリファレンスで実現できない機能を、型グロブで実現しているモジュールもあります。)
また、冒頭で書いた通り、型グロブはグローバル変数にのみ存在します。
my変数には型グロブが存在しないので、ご注意ください。
(local変数はグローバル変数を一時退避させて使うだけなので、グローバル変数と考えることができます。)
    • good
    • 0

参照渡しです。


下記参照。

参考URL:http://flex.ee.uec.ac.jp/texi/perl/perl_144.html
    • good
    • 0
この回答へのお礼

回答有り難うございました。
まだperl初心者の自分にとっては難解ではありますが。

お礼日時:2003/03/19 12:38

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QCGIでの500エラー

CGIサイトを作成中の者です。
CGIをサーバーに転送して動作確認をしたらサーバーエラーになってしまいます。
サーバーに問い合わせて、以下が原因でエラーになっていることはわかりました。

Unrecognized character \x90 at ./miuinit.pl line 100.
Compilation failed in require at miumgr.cgi line 11.

でもCGI初心者なので、”\x90”が何をさすのか、2番目の文ではどこを直せばいいかわかりません。

サーバー会社では自分でCGIを修正せよとのことです。
よろしくお願いします。

Aベストアンサー

miuinit.pl 100行目
@room2 = ("ミントの部屋", "チェリーの部屋", "ライムの部屋");
で、"" ダブルクォーテーションで閉じられてないか、
全角スペースが、ソースコードに含まれている可能性があります。

この行をよく見て修正してみては?
または、この行ではなく、前の行かもしれない。

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

QCan't use string ("0") as an ARRAY ref の原因について

Perl 5.6を使っております。
Perlで原因不明なエラーに直面して困っております。
Can't use string ("0") as an ARRAY ref while "strict refs"
というエラーが発生しているのですが
これは良くあるミスとして何が原因でしょうか?

Aベストアンサー

No.2です。書き漏らしてましたが、エラーメッセージの内容がよくわからない時は

use diagnostics;

しましょう。

Qcgiとplとpm

掲示板ソースをダウンロードするとplやpmという拡張子のものがありました。中身はPerlでした。
拡張子の使い分けを教えてください。

適当に4つのルールを書いてみましたので、間違っていたり、追加するルールがありましたから教えてください。

1 ブラウザがそれ自身にアクセスし、ブラウザのアドレスバーに表示させるならcgiにするべき。

2 Perlのpackageの機能を使うなら、パッケージファイルはplかpmでなくてはならない。

3 Perlのrequireの機能を使うなら、その外部ファイルはplでなくてはいけない。

4 Perlのuseの機能を使うなら、その外部ファイルはpmでなくてはならない。

Aベストアンサー

基本的に拡張子は、あっても無くてもなんでもOKです。ただ、モジュールには.pmをつけなければなりません。
また、webサーバによってCGIとして使える拡張子に制限がある場合があります。

1.について
言語として、特に拡張子を.cgiにしなければならないというのはありません。.plでも.doでも.hoge
でも基本的には大丈夫ですが、大抵運用するwebサーバによって使える拡張子が制限されています。.cgiしかダメなサーバとか。

2.について
そのような制限はありません。拡張子は何でもOKです。
ただ、前述の通りwebサーバによって拡張子の制限がかかっている場合はCGIとしては実行できません。

3.について
そのような制限はありません。拡張子は何でもOKです。

4.について
その通りです。use関数の対象になる外部ファイルは.pmでなければなりません。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Q正規表現のパターンに変数を指定したい

perlでパターンマッチを行う際、正規表現で行いますが、パターン文字列内に変数を指定したい場合はどうすればよいのでしょうか?

if ($ENV{HTTP_USER_AGENT} =~ /$pattern/) {
 :
}

というようなことをしたいのですが、うまくいきません。
方法はありますでしょうか?

Aベストアンサー

$dat = 'abcdefg';
$pattern = 'cde';

if($dat =~ /$pattern/){ print "01\n";}
if($dat =~ $pattern){ print "02\n";}

結果
01
02

普通にマッチしますよ。
$patternの内容に問題あるのでは?
内容を再度確認してみてください。

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

QPerlで変数を使用した置換ができない

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

Aベストアンサー

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;


人気Q&Aランキング