"use strict" プラグマを使ったスクリプト内で、

・定数(グローバルかつ不変)
・グローバル変数

を宣言するには、どのようにすればいいのでしょうか。

windows 2000, ActivePerl 5.6.1

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

A 回答 (1件)

確か、perl は純粋な意味での定数を定義することができなかったような。



ただ、代入できなくするだけなら、

*var = \100;

のようにすれば、エラーは出してくれます。

あと、perl は my 等で宣言しなければ、全てグローバルだったはずです。
適当に代入した変数が、関数の中で適当に使えます。
    • good
    • 0
この回答へのお礼

お礼が遅くなって申し訳ないです。

定数を利用するまでもなく、リファレンスや、
そのエイリアスを利用する事で賄える事を知りました。

愚問に解凍をいただき、ありがとうございました。

お礼日時:2001/12/02 17:20

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

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

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

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

Qperl niftyについて。use CGI;

画像アップロードのスクリプトを作ろうと思っているのですが、

use CGI;
という記述をすると、ここでエラーに引っかかります。
下はperl checkerでのエラー表示です

Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10.
BEGIN failed--compilation aborted at a.cgi line 10.

参考URLはここ
http://www.topstudio.co.jp/~kmuto/html/node38.html

niftyでは使えないようになってしまっているのでしょうか?

また、CGI.pmを使わないファイルアップロードの仕組みを解説しているサイトを知っている方がいたら、教えてくださいませ。

画像アップロードのスクリプトを作ろうと思っているのですが、

use CGI;
という記述をすると、ここでエラーに引っかかります。
下はperl checkerでのエラー表示です

Can't locate CGI.pm in @INC (@INC contains: /usr/local/lib/perl5/5.00503/sun4-solaris /usr/local/lib/perl5/5.00503 /usr/local/lib/perl5/site_perl/5.005/sun4-solaris /usr/local/lib/perl5/site_perl/5.005 .) at a.cgi line 10.
BEGIN failed--compilation aborted at a.cgi line 10.

参考URLはここ
http://www.topst...続きを読む

Aベストアンサー

 cgi-lib.pl というモジュールを使うのが一般的です。
 この "cgi-lib.pl" という文字列をキーワードに検索すると、たくさん出てきますよ。

 自分だけで使う場合はともかく、フリーソフトとして公表するときは CGI.pm がないプロバイダの場合に困るので、あんまり使わないんですよ。

Quse strictを宣言してlocal変数を使うには?

Perl初心者です。初歩的な質問ですが、
サブルーチンの中で my だと、その下の{ }
ブロックではmyで宣言したローカル変数がスコープされないので 
localを使うのではないかと思いますが、
それだと、use strictではエラーになります。
こんなときどう処理したらよいのでしょうか。

Aベストアンサー

> なんか、よい本などあればご紹介していただけたら、ありがたいなと、思います。

私は以前、文法が Perl とかなり似ている C/C++ で仕事をしていたので、覚える時にはリファレンス(「CGI&Perlポケットリファレンス」技術評論社)くらいしか必要ありませんでした。
そのため、入門書として推薦できる本を残念ながら知りません。

変わりに技術系書籍のレビュー(?)サイトを紹介しますので、そちらで良さそうな本にあたりをつけて、書店で実際に見ながら選ばれるとよいと思います。

参考URL:http://www.1point.jp/~book_2ch/webprog/perl.html

Qc言語とperlのcgi設定方法

(Arch linuxにてlighttpdサーバを立ち上げています)
cgiは一般にperlが多いとは思いますが、C言語からのcgiも試みています

perlによるcgiを有効にするにはlighttpd.confの設定に以下を追加

 server.modules += ( "mod_cgi" )
 cgi.assign = ( ".cgi" => "/usr/bin/perl")
 static-file.exclude-extensions = ( ".cgi" )

C言語から作成したcgiを有効にするにはlighttpd.confの設定に以下を追加

 server.modules += ( "mod_cgi" )
 cgi.assign = ( ".cgi" => "")
 static-file.exclude-extensions = ( ".cgi" )

同一のサーバ下で「"/usr/bin/perl"」「""」ともにを有効にする設定方法はありますでしょうか
よろしくお願いいたします

(Arch linuxにてlighttpdサーバを立ち上げています)
cgiは一般にperlが多いとは思いますが、C言語からのcgiも試みています

perlによるcgiを有効にするにはlighttpd.confの設定に以下を追加

 server.modules += ( "mod_cgi" )
 cgi.assign = ( ".cgi" => "/usr/bin/perl")
 static-file.exclude-extensions = ( ".cgi" )

C言語から作成したcgiを有効にするにはlighttpd.confの設定に以下を追加

 server.modules += ( "mod_cgi" )
 cgi.assign = ( ".cgi" => "")
 static...続きを読む

Aベストアンサー

同じ拡張子で…ということかと思われます。>#1

で、該当のものを試したコトはありませんが……

>cgi.assign = ( ".cgi" => "")
に設定して、perlの方は
http://www.perl-labo.org/junbi/iamperl.htm
の設定を行い、cgiファイルに実行可のパーミッション付けてみたらどうです?

Quse strictとグロブ?

cgi-lib.plのReadParseの引数でParamグロブを使った場合、
use strict;をすると、必ず以下のエラーが表示されます。

use strictはそのまま使いたく、他の部分も厳密にチェックしたいのですが
何かよい方法はありますか?


use strict;
require 'cgi-lib.pl';

&ReadParse(*Param);
my $MODE = $Param{'MODE'}; <----- errro Variable "%Param" is not imported at

Aベストアンサー

use vars qw/%Param/;

Qなぜ CGI は Perl 言語で作成/動く環境が多いのか。

最近 CGI に興味をもちここで質問しながらネット検索をしました。
すると Perl 言語での CGI サンプルが一番多く C 言語で作る CGI の
サンプルが少し見つかりました。
私の使っている無料サーバーでも CGI は使えますが Perl 言語だけ有効です。
セキュリティの問題で SSI と組み合わせた C 言語の CGI は実行出来ないようです。

質問内容:
(1)なぜ CGI は Perl 言語が一番多いのか?→PHP、Cもあるのに
(2)なぜ無料サーバーの多くが Perl 言語しか使えないのか?
(3)処理の重い CGI を使うとサーバーがダウンするので使わないようにと
 私の使っている無料サーバー(infoseek)でなっています。どの程度の
 処理のことでしょうか?

上記の3つまたは1つでもアドバイスをして欲しいです。
回答をお待ちしています。

Aベストアンサー

>(1)なぜ CGI は Perl 言語が一番多いのか?→PHP、Cもあるのに
Cのコンパイルはどうする気ですか?
共有型のレンタルサーバでSSHログインができてCのコンパイルまでさせてくれる
サービスは自分は知りません。
PHPに関してはサーバの方針でしょうね。
infoseekはinfoseekになる前のfreewebの頃からPerlだけ利用できました。
途中から仕様変更して全サーバに対してPHPをインストールするのは手間でしょうから

>(2)なぜ無料サーバーの多くが Perl 言語しか使えないのか?
PerlもPHPも使えるサーバも結構ありますよ。

>(3)処理の重い CGI を使うとサーバーがダウンするので使わないようにと
今の利用規約は知りませんが自分の知っているときは
箱庭系、チャット系、CGIゲーム系はだめですね。

>modによりperlの難点であった実行速度も改善されていますし。
CGIモードとmod_perlのそれぞれバージョンで挙動が違うみたいで
普段はあまり利用しないですね。

Quse strict;

Global symbol "@exec_test_list" requires explicit package name at ./ctest.pl line 384.
Global symbol "@exec_test_no" requires explicit package name at ./ctest.pl line 384.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 397.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 406.
Global symbol "$name" requires explicit package name at ./ctest.pl line 413.

use strict;を書くと以上のようなエラーメッセージが
出力されます。どうしたら、以上のようなエラーを
回避できるでしょうか?教えてください。

Global symbol "@exec_test_list" requires explicit package name at ./ctest.pl line 384.
Global symbol "@exec_test_no" requires explicit package name at ./ctest.pl line 384.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 397.
Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 406.
Global symbol "$name" requires explicit package name at ./ctest.pl line 413.

use strict;を書くと以上のようなエラーメッセージが...続きを読む

Aベストアンサー

use strict;
を使うと、使用する変数は必ず宣言してから使わないといけなくなります。
例えば
my $name; #局所変数
our $name; #大域変数
あるいはパッケージ指定変数
$main::name;
のようにして扱う必要があります
おそらく、変数を宣言しないで使用しているために、そのようなエラーメッセージがでる(宣言しない場合は、パッケージ名による修飾がいるという意味)と思います。

QPerlとphpのCGI版

Perlは文書に最適化された言語だと今日知りました。
そこで思ったのですが、PerlとphpのCGI版の場合だと
ファイルの読み書きなどを考えてみたところ、速度にさほど違いはないのでしょうか?
mod_perlとphpのモジュール版の速度は同じくらいだと聞きます
となればphpのCGI版はさほど早くなく、Perlと同程度じゃないかと思ったわけです

どなたか教えてください!

Aベストアンサー

たびたびすみません。
ANo.1 で紹介した比較の、CGI版もありました↓
http://www.hippo2000.info/perl/tbench.htm

やはり結果は、同じようなもの、のようですね。
結局、処理する内容によって勝敗が異なるので一概には言えないと思いますが、それは同時に「それほど微妙な差である」ことを意味すると思います。つまり絶対的な優劣はないです。
それこそプログラマーの好みや事情で決めれば良いレベルだと思います。「DBならPHP」などと言われることもありますがperlでも当然可能ですし、どちらかにしかできないこともなく、PHPは初心者にも簡単で覚えやすい、という利点もあります。

ちなみに私は、特にどちらが好きというのはありませんが、なぜかCGI版perlとmod版PHPが比較されることが時々あり、そして決まって「PHPのほうが速い」などと不可解な結論に…、というのが疑問なんですよね。
推測ですが、perlのほうが圧倒的に歴史が長いため、CGI版さらには旧いバージョンが対象にされてしまっているのでは、と考えています。
そのような不公平な勝負では、ついつい不利な方を応援したくなります(笑)。

さらに言えば、「PHPのほうが簡単」というのもちょっと疑問で、ご存知かと思いますが、そもそもperlは「Practical Extraction and Report Language」の略、dakara222さんのおっしゃるように本来テキスト処理を大得意とするレポート言語です。便利ゆえにWebサイトに設置してページの出力に使うことが多いですが、本来、たとえば手元のウィンドウズにインストールしておいて、「HTMLファイルそのもの」を大量に作らせる、なんていうことや、DBのソースを作ったり、システム管理者が設定ファイルの編集によく使っている、など、大変便利な本来の(?)使い方があります。
PHPはHTML文書内での使用に特化したものですから、そのために最適化されているわけで、当然そこだけでの比較はおかしいんですよね。

なんだかperl寄りの意見になってしまいましたが(苦笑)…、正しい情報を持ってケースバイケースで使い分けるのが一番ですね。

たびたびすみません。
ANo.1 で紹介した比較の、CGI版もありました↓
http://www.hippo2000.info/perl/tbench.htm

やはり結果は、同じようなもの、のようですね。
結局、処理する内容によって勝敗が異なるので一概には言えないと思いますが、それは同時に「それほど微妙な差である」ことを意味すると思います。つまり絶対的な優劣はないです。
それこそプログラマーの好みや事情で決めれば良いレベルだと思います。「DBならPHP」などと言われることもありますがperlでも当然可能ですし、どちらかにしかでき...続きを読む

QPerlで use strict して our変数

Perl 初心者です。初めて質問します。

test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。

環境 : WindowsXP / ActivePerl 5.14.2


--------------------
* test_sub.pl
--------------------
#!/usr/bin/perl
use strict;

our $hoge = 'HOGE';

1;
--------------------
* test_main.pl
--------------------
#!/usr/bin/perl
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
--------------------

これを実行すると、
Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r
というエラーが出ます。

require する前に、test_main.pl のほうで our($hoge); と宣言したり
参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、
これらをしないとできないものなのでしょうか。

use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい…

継承のようなことをしたいのです。

ちなみに以下試してみたソースです。

--------------------
* test_main.pl
--------------------
#!/usr/bin/perl

########################################
# NG
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;

########################################
# OK our変数を宣言しておくといける
=pod
use strict;

our ($hoge);
require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
=cut

########################################
# OK 参照する際にパッケージ名を指定すればいける
=pod
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $main::hoge;
=cut

########################################

########################################
# NG
=pod
use strict;

use base qw(test_sub);

print "Content-type: text/html\n\n";
print $hoge;
=cut

########################################
--------------------
* test_sub.pm
--------------------
#!/usr/bin/perl
package test_sub;
use strict;

our $hoge = 'HOGE';

1;
--------------------

NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。

もしご存じの方がいらっしゃいましたら教えてください。
よろしくお願いします。

Perl 初心者です。初めて質問します。

test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。

環境 : WindowsXP / ActivePerl 5.14.2


--------------------
* test_sub.pl
--------------------
#!/usr/bin/perl
use strict;

our $hoge = 'HOGE';

1;
--------------------
* test_main.pl
--------------------
#!/usr/bin/perl
use strict;

require 'test_sub.pl';

print "Content-type: text/html\n\n";
print $hoge;
--------------------

これを実行すると、
Global symbol "$...続きを読む

Aベストアンサー

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるファイルの取り込みは実行時に行われます. つまり
require 'test_sub.pl';
とあってもコンパイラは test_sub.pl の中は見ません. したがって「test_sub.pl の中の our」はコンパイル時には影響を与えません.
・また, our の有効範囲はレキシカルスコープに制限されています. そして「1つのソースファイル」はレキシカルスコープとなりますから, require をコンパイル時に行っても「test_sub.pl の中の our」は test_sub.pl の中 (もちろん our 以降の) でしか有効ではありません.

余談ですが, use strict もレキシカルスコープで有効となります. つまり, 「test_sub.pl の中の use strict」はそれを require した test_main.pl では無効です (し, 逆に require する前に test_main.pl で use strict してもそれは test_sub.pl には影響しません)

端的に言えば「our するなりパッケージで修飾するなりしてください」となります.

詳細はこんな感じ:
このエラーはコンパイル時のエラーであって実行時のエラーではありません. つまり, 実行に先立つコンパイルのときに「use strict が有効なのに my も our も state もされていない (かつパッケージ名での修飾もされていない) 変数 $hoge が現れた」というエラーです.

「require されたファイルの中に our がある」のは確かですが, 次の 2つの理由によりそれは影響しません:
・use とは異なり, require によるフ...続きを読む

QCGI/Perl

CGI/Perlについて1から学びたいと思い、本を買おうと思っているのですが、たくさんありすぎて、どれを買えばわかりません。
CGIやPerlについてはまったくの初心者です。
いい本があったら教えてください。

Aベストアンサー

超簡単なCGI/Perlを学ぶ本は

技術評論社
速習webプログラミング
perl/CGI超入門
藤森水絵著

がいいと思います

(でもこの本JAVASCRIPTでできることたくさん乗ってるけどね・・・)

参考URL:http://www.gihyo.co.jp/books/syoseki.php/4-7741-1662-9

Quse strictが効かない (PERL)

たびたびお世話になっております。

PERL version 5.14.2 をWindows 7 のコマンドプロンプトから起動して使っています。

use strict;
と一行目に書くと 宣言されていない変数があれば拒絶されるとのことで


#!/usr/bin/perl
use strict;
use warnings;

$a = 10;

print "$a\n";

というスクリプトを書きました。が、すんなり動いてしまいます。

use strict;
は どうすればうまく効くのでしょうか。

ご指導お願いします。

Aベストアンサー

$aと$bは定義済みの変数であるため、my宣言せずにuse strictしていてもエラーになりません。
perlのわかりづらいところでもあります。

http://perldoc.jp/docs/perl/5.14.1/perlvar.pod
---
$a
$b

sort() を使うときの特殊パッケージ変数です; "sort" in perlfunc を 参照してください。 この特殊性により、$a と $b は、たとえ strict 'vars' プラグマを 使っているときでも (use vars や our() を使って) 宣言する必要が ありません。 これを sort() 比較ブロックや関数で使えるようにしたい場合は、 my $a や my $b としてレキシカル化しないでください。


人気Q&Aランキング

おすすめ情報