まずは次ぎのソースをご覧になって下さい。

&a
&b
&c

sub a {処理一番}
sub b {処理二番}
sub c {処理三番}

上記のプログラムでまず「sub a」の処理をさせます。
次に「sub b」の処理をさせます。
次に「sub c」の処理をさせます。
が、しかし「sub b」の処理の中で条件文があり、条件に満たない場合は「sub a」の中の「処理1番プログラム」の中の途中からまたスタートさせたい(処理を返えしたい)と思っています。
そのような事が出来るでしょうか?どうか教えて下さい。
お願いします。

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

A 回答 (2件)

 sub a の中に分岐を作って、引数で処理し分けるのが一般的じゃないでしょうか。


 すでに2つの引数が使われていたとすると、3つ目の引数としてフラグを用意します。

 このとき、フラグの値が0なら今まで通り最初から処理するけど、1なら途中から、という具合。
    • good
    • 0

$proc_no = 1;


$flg = 0;
while($proc_no){
if($proc_no == 1){
($proc_no, $flg) = &a($flg);
} elsif($proc_no == 2){
($proc_no, $flg) = &b($flg);
} elsif($proc_no == 3){
($proc_no, $flg) = &c($flg);
} else {
$proc_no = 0;
}
}

ってのはどう?
各サブルーチンで次に実行する番号($proc_no)と処理フラグ($flg)を返す。
終了するときは $proc_no を0にする。$flg によってサブルーチンの実行位置を
決定する。
    • good
    • 0

この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 がないプロバイダの場合に困るので、あんまり使わないんですよ。

Qif (条件) { 処理 } 

秀丸エデッタを使っていますが、
if (条件) { 処理 } の処理の中にif (条件) { 処理 }を
何回も入れると{ の締めくくりの }がどれが対応する }か
判りにくく困っています、
フリ-ソフトで良いのがありましたらお願いします。

Aベストアンサー

秀丸には対応する括弧を強調(色分け)表示する機能があるはずですが、
それでもわかりにくいということでしょうか?
「その他」-「ファイルタイプ別の設定」の「カラー」タブの中に
対応する括弧の強調という項目がありますから、
色を変えてみてはいかがでしょうか?

大抵の場合はエディターの色分けに頼るより、
行頭にTABやスペースを入れてインデントするほうが見やすくなります。

if (***) {
 if (----) {
  #-------
  #-------
 } else {
  #-------
  #-------
 }
} else {
 for (*,*,*) {
  #-------
 }
  #-------
}

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ファイルに実行可のパーミッション付けてみたらどうです?

QPerlでの$ENV{REMOTE_ADD}の信ぴょう性を教えてくださ

Perlでの$ENV{REMOTE_ADD}の信ぴょう性を教えてください。

Perlによる、CGIサイトを運営しています。
IPアドレスを$ENV{REMOTE_ADD}で取得し、Firewall内プライベートアドレス(10.*.*.*)以外はloginをしないと内容が表示されないようにスクリプトをつくり、Firewallの内外から動作確認し、きちんと動いていたのでそのまま運用していました。
ところが、先日海外(ハワイ)に行った際、アップルストアでそのサイトにアクセスした際にloginなしで内容が表示されてしまいました。

アップルストアに置いてあったPCなので、IP偽装などは行っていないと思われますので、どうして見えるのだろうかわかりません。
$ENV{REMOTE_ADD}で取得した値は信ぴょう性がないのでしょうか?それとも、10.*.*.*はグローバルアドレスとして使用可能なのでしょうか?

Aベストアンサー

REMOTE_ADDR は、そのCGIを動かしているWWWサーバがCGIのために付けている情報です。
接続元のIPアドレスが正しくないと、TCP/IPによる通信そのものが成り立ちませんから、詐称はできません。
(TCP/IPの通信は文通みたいなものです。差出人住所を詐称した場合、手紙を一方的に送ることはできても、詐称したまま文通(相互に何度も手紙のやりとり)をすることはできません。文通できているということは、差出人住所は詐称ではないということです。同じように、TCP/IPで通信できているということは、相手のIPアドレスは詐称ではないということになります。)
ですので「REMOTE_ADDR がWWWサーバの通信相手のIPアドレスを示している」ことについては信用して問題ありません。

ただし、この情報はあくまで「WWWサーバの通信相手」のIPアドレスですから、proxyを通してアクセスした場合には、REMOTE_ADDR はproxyのIPアドレスになります。

WWWサーバが、インターネット外部に対して reverse proxy を通して公開するような環境になっている場合には、WWWサーバ自身はproxyと通信していますから、proxy自体がfirewall内にあれば、そのIPアドレスが10.*.*.* である、という環境はありえます。ですが、質問者さん自身がfirewall内外での動作確認をしているとのことなので、この可能性はないでしょう。

そうなると、質問者さんの状況では、「REMOTE_ADDRのチェック方法が間違えている」可能性が高いのではないかと思います。

正規表現/^10\.\d+\.\d+\.\d+$/でチェックしているのなら大丈夫だと思いますが、例えば、
正規表現/10\.\d+\.\d+\.\d+/でチェックしてたりする(前後に^/$が無い)と、その前後に何か文字が入っていてもマッチしますから、「210.3.4.5」もマッチするといったことになります。

REMOTE_ADDRのチェックをしているコードを補足で出してくれれば、そのあたりについてのアドバイスができるかもしれません。
あと、WWWサーバのアクセスログが残っているのであれば、そのCGIへのアクセスを確認することで、どういうアクセス元に対して誤動作したのかがわかるので情報として参考になるでしょう。

REMOTE_ADDR は、そのCGIを動かしているWWWサーバがCGIのために付けている情報です。
接続元のIPアドレスが正しくないと、TCP/IPによる通信そのものが成り立ちませんから、詐称はできません。
(TCP/IPの通信は文通みたいなものです。差出人住所を詐称した場合、手紙を一方的に送ることはできても、詐称したまま文通(相互に何度も手紙のやりとり)をすることはできません。文通できているということは、差出人住所は詐称ではないということです。同じように、TCP/IPで通信できているということは、相手のIPアドレス...続きを読む

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のそれぞれバージョンで挙動が違うみたいで
普段はあまり利用しないですね。

Qfor ( … ){}の処理ができません

いままで正常に動いていた cgi(perl)に次のようなセンテンス

for ( $cnt=0 ; $cnt<2 ; $cnt++)
{
my $before = "snow06b.gif"; #変換前の名前
my $after = "snow06x.gif"; #変換後の名前
rename($before,$after);
my $before = "snow06x.gif"; #変換前の名前
my $after = "snow06b.gif"; #変換後の名前
rename($before,$after);
}

を追加したところ、cgi 全体が動かなくなってしまいました。

for ( … ){ 
}

の中の処理はこの cgi の他の箇所でも行っていて、正常に実行されることが分かっています。中の処理をはずして

for ( $cnt=0 ; $cnt<2 ; $cnt++)
{
}

だけにしてもこの cgi の他の処理を実行しなくなります。自分のパソコンの中にある他のperl のプログラムの中のループの処理と見比べてもどこが悪いのか分かりません。何が原因なのかお教え願えれば幸いです。

初歩的な質問で申し訳ありません。

いままで正常に動いていた cgi(perl)に次のようなセンテンス

for ( $cnt=0 ; $cnt<2 ; $cnt++)
{
my $before = "snow06b.gif"; #変換前の名前
my $after = "snow06x.gif"; #変換後の名前
rename($before,$after);
my $before = "snow06x.gif"; #変換前の名前
my $after = "snow06b.gif"; #変換後の名前
rename($before,$after);
}

を追加したところ、cgi 全体が動かなくなってしまいました。

for ( … ){ 
}

の中の処理はこの cgi の他の箇所でも行...続きを読む

Aベストアンサー

No.1さん、No.2 さんがおっしゃる通り、一番臭いのは $cnt だと思います。

for ( $cnt=0 ; $cnt<2 ; $cnt++)



for ( my $cnt=0 ; $cnt<2 ; $cnt++)

に直して試してください。

例えこれが原因で無かったとしても、 my は付けるべきです。

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でも当然可能ですし、どちらかにしかでき...続きを読む

Q@{$protocol_name}

usr strict;
をつかって、

$protocol_name = "pppoe";

@{$protocol_name}

のような使い方をしたいと思っていますが、

Can't use string ("pppoe") as an ARRAY ref while "strict refs" in use at ./ctest.pl line 152, <RCFG2> line 7

のようにエラー表示がでてしまいます。
どうしたら回避できるでしょうか。

Aベストアンサー

@pppoe という配列を生成する段階でハッシュ等扱いやすい変数に格納しておくのが定石だと思います。

・ハッシュにハードリファレンスで格納する方法
$protocol{pppoe} = \@pppoe; # 代入
@{$protocol{$protocol_name}} # 参照
# @pppoeとしましたがもちろん無名配列でかまいません。

・分岐させる方法
if($protocol_name eq "pppoe"){
... = @pppoe;
}elsif ...

・シンボリックリファレンスだけ許可させる方法
no strict 'refs';

・%main::から引く方法
@{$main::{$protocol_name}}

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

Q正規表現のm{}

正規表現の記述で、m{}と書くサンプルを目にしたのですが、このmと中括弧は何を意味するのでしょうか?

以下、Hタグにマッチするかをテストする正規表現のサンプルです。
$_ = "<H3>ヘッダ3</H3>";
if ( m{<(H\d)>(.+)</\1>} ) {
print "found!!";
}

Aベストアンサー

「m」は正規表現マッチで、
通常の /・・・・/ と基本的に同じ働きです。
違うところは、mの後に非英数字や各種括弧(), <>, {}, []を使って、
正規表現を括ることができることです。
すなわち、
 /abc*/
 m#abc*#
 m{abc*}
などは、全部同じ意味です。
スラッシュがたくさんはいる正規表現を書くときなど、いちいちエスケープしなくて良いので便利、ですね。


人気Q&Aランキング

おすすめ情報