perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプトの最後にまとめてあります。
同じサブルーチンは、他のスクリプトでも利用していますが、
エラーは出ていないのですが。

何が原因か、わかりません。
関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。
他のサブルーチンも認識しません。
KCacthの表示は同じ
&main::サブルーチン名 called になっています。
よろしくお願いします。

A 回答 (2件)

下記前提でよいでしょうか。


&lock(); ・・・(lockを呼び出している箇所)

sub lock    ・・・サブルーチン:lockの定義
{
・・・
}
上記は1つのソースファイル上にある。

とすると、考えられるのは、
1.undef (&lock); により未定義にしている。
2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様)
です。上記の2点はOKでしょうか?
    • good
    • 0
この回答へのお礼

tatsu99さん 
ご指摘ありがとうございます。

2.__DATA__のあとにsub lockを定義している為、でした。
perl初心者で__DATA__の使い方を知りませんでした。
無事解決しました。

お礼日時:2003/09/25 08:28

これだけではなんとも言えません(^^;


サブルーチンが定義されていないようにPerlには見えるということなのでしょうけれど。

まず、strict宣言についてですが、
一度はずして実行し、確認してみればいいかと思います。
(はずして動かなくなると言うことは普通ありませんから)

一瞬スペルミスの類かとも思いましたが、
前回の書き込みを見る限り他のルーチンも未定義になっているんですよね。
・・となると関係なさそうです。

一番可能性が大きそうなのは、
&lockが、mainパッケージではなくて、
他のパッケージ中にあるという状況ですが・・
(サブルーチンは別ファイルのライブラリやモジュール内を呼び出しているのでしょうか?)
    • good
    • 0
この回答へのお礼

natsuki_tkさん
ありがとうございます。
__DATA__の後にルーチンを呼び出しているのが、間違いだったようで、無事解決しました。

それとは別に、サブルーチンを別ファイルのライブラリやモジュール内で呼び出し方も、調べたいと思います。
ありがとうございました。

お礼日時:2003/09/25 08:35

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Q英語嫌いの原因

お世話になります。

英語が嫌いの方におたずねします。
英語ぎらいの原因は何だと思いますか?
昔の経験でも結構です。

英語が分からない。
受験英語がつまらない。
必要を感じない。
嫌な経験をした。
言葉自体に興味がない。
授業についていけない。
先生と相性が悪い。
勉強全体がきらいだ。
発音が上手くできない。

などの他に何か特殊な事でもけっこうですので話を聞かせていただけますか。よろしく。

Aベストアンサー

こんばんは

中学時代

中1
英語というもの自体わからなかった。また、何しに英語学と言う物が必要かもわからなかった。先生はいいとも、悪いとも思わなかった。

中2
先生のやり方が気にくわなかった。授業が始まる前に本文を黒板に書いていくことが。さらに、物語とかの内容が全く興味なかった。
ただ、この先生は一生懸命教えてるという事だけはわかった。

中3
先生は笑える人だった。ボー読みの日本語発音。
受験の為の内容だからかな。

高校1~3
1からだからやる気をだしたが、すぐにつまずき、挫折と苦痛、また外人と話さないし、英語が必要な仕事にもつくわけでもなく、大学行くわけもなしと、やる必要なしと思う。

専門1年
何で専門学校にまで英語がついてるのか疑問まみれ。
医療系だったから、医学に関しての英語ならまだしも、
普通の英語の授業。はぁ~とてつもなく苦痛だった
もちろんテストは・・・・・。

専門2年
この教え方には参った!!。本文を訳すとき、自分の訳と同じでないと、間違いというハゲでぶ中年。学校中からの嫌われ者。こんな授業は授業でなかった。

専門3年
ネイティブが先生だった。答えないなら答えなくて済んだし発言もしなくてよかったし、目だ立ちたがりやの男子が答えてたので、気楽でよかった。専門3年の授業が終わる頃、英語と絶好できて幸せを感じた。

そして、年月が過ぎ・・・・・

外人と知り合い、今、英語をやってます。一昨年とか去年は、片言でも、なんとか通じることに感動を覚える!!

そして今、成長しない自分。倦怠期ぎみ。イライラ。

ということで嫌いだった原因は自分の英語への関心度(これが1番の原因)、先生の教え方、教科書の内容に問題があったかと。

さとて、これから先はどうなるか最近わからなくなってます。

こんばんは

中学時代

中1
英語というもの自体わからなかった。また、何しに英語学と言う物が必要かもわからなかった。先生はいいとも、悪いとも思わなかった。

中2
先生のやり方が気にくわなかった。授業が始まる前に本文を黒板に書いていくことが。さらに、物語とかの内容が全く興味なかった。
ただ、この先生は一生懸命教えてるという事だけはわかった。

中3
先生は笑える人だった。ボー読みの日本語発音。
受験の為の内容だからかな。

高校1~3
1からだからやる気をだしたが、すぐ...続きを読む

Qサブルーチン内のサブルーチン定義について

サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。
'test'を10万回繰り返す文字列の生成を行い、その文字列長を表示する関数を funcA とします。その生成過程では、自分の関数内で宣言した再帰関数 funcB を呼び出します。


#! /usr/local/bin/perl
use strict;
my $time0;

for(my $i=0; $i<10; $i++){
  $time0 = times();
  &funcA();
  print((times() - $time0). "\n"); # funcAに掛かった時間
}

sub funcA {
  my $buffer = '';
  &funcB(1);
  print length($buffer) . " : "; # $buffer の文字列長
  
  sub funcB{
    my $n = shift;
    $buffer .= 'test';
    return if($n==100000);
    funcB($n+1);
  }
}

この結果が、
400000 :3.063
0 :0.468
0 :0.594
0 :0.766
0 :0.859
0 :1.11
0 :1.187
0 :1.141
0 :1.343
0 :1.469
となり、初回以降 $buffer の長さが0となるのも不可解ですが、funcA の実行時間が増加していくのも理解できません. これを

#! /usr/local/bin/perl
use strict;
my $time0;
my $buffer; # 注1 $buffer をファイル内大域変数として宣言

for(my $i=0; $i<10; $i++){
  $time0 = times();
  &funcA();
  print((times() - $time0). "\n");
}

sub funcA {
  $buffer = ''; # 注2 レキシカル変数宣言をやめた
  &funcB(1);
  print length($buffer) . " : ";
  
  sub funcB{
    my $n = shift;
    $buffer .= 'test';
    return if($n==100000);
    funcB($n+1);
  }
}

とすると、結果は
400004 :3.188
400004 :0.234
[以降、上にほぼ同じ]
と文字列長は正しいものの,初回以降のfuncA実行時間が極端に減ります.
内部ではどういうことが起こっているのでしょうか.

サブルーチン内で定義したサブルーチンで、思い通りにならない挙動で困っています。
'test'を10万回繰り返す文字列の生成を行い、その文字列長を表示する関数を funcA とします。その生成過程では、自分の関数内で宣言した再帰関数 funcB を呼び出します。


#! /usr/local/bin/perl
use strict;
my $time0;

for(my $i=0; $i<10; $i++){
  $time0 = times();
  &funcA();
  print((times() - $time0). "\n"); # funcAに掛かった時間
}

sub funcA {
  my $buffer = '';
  &fu...続きを読む

Aベストアンサー

funcAの変数$bufferは、my宣言が実行されるたびに初期化されますが、funcBに現れている$bufferは、その外側のfuncAの1回目の呼び出し時に初期化されたものが保持されます。

ドキュメントperlsubの「永続的なプライベート変数」が参考になるかと。

参考URL:http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html

Q英語が原因で・・?少し長いです。

質問をする場所に迷いましたが、英語が関係しているのでこちらでさせていただきます。
どうかご存知の方は回答をよろしくお願いします!

知り合いのお子さんが3歳から英語を始め、現在5歳で来年の春から小学生なんです。
お母さん曰く、最近人に指摘されて気づいたそうなんですが、お子さんの「さしすせそ」の発音が「しゃしぃしゅしぇしょ」になっているそうなんです。それと「たちつてと」が「たちちゅてと」だそうです。それが小さい頃から英語を始めたのも原因かも!?しれないね、と指摘された人に言われたらしいんです。
週1に1時間だけ英語に触れているだけで、そんなことってあるんでしょうか?
それにお母さんが指摘されて気づく位なら、そんなにひどくないとは思うんです。
私が実際にそのお子さんの言葉を聞いたわけではないのでなんとも言えないのですが・・
他のカテゴリーで調べてみると、舌が短いなどの原因は見つかりましたし、英語の講師をしている友人に聞くと、週1に1時間のペースで英語が原因なのはまずありえないし、それなら幼児で始めた子はみんななっている、と言っていました。

英語と幼児の発音の関係が気になり、質問をさせていただきました。
お母さんはこの発音で小学校になっていじめられたら・・と心配しています。
どうかそのお母さんを安心させてあげられるような情報をご存知の方はお返事をお願いします!!

質問をする場所に迷いましたが、英語が関係しているのでこちらでさせていただきます。
どうかご存知の方は回答をよろしくお願いします!

知り合いのお子さんが3歳から英語を始め、現在5歳で来年の春から小学生なんです。
お母さん曰く、最近人に指摘されて気づいたそうなんですが、お子さんの「さしすせそ」の発音が「しゃしぃしゅしぇしょ」になっているそうなんです。それと「たちつてと」が「たちちゅてと」だそうです。それが小さい頃から英語を始めたのも原因かも!?しれないね、と指摘された人に言...続きを読む

Aベストアンサー

こんにちは。

私の知り合いにも3~5歳位の子供が居る人が5人程いますが(全員一人っ子です)、その中の3人は(4歳が二人と5歳が一人)ご質問者さんのお友達さんのお子さんの様に“さしすせそ”が”しゃしぃしゅしぇしょ”、”たちつてと”が”たちちゅてと”になっていました。

ハーフの子が居る友達(日本でアメリカ人の男性と結婚し、家では英語と日本語両方を教えてます)も居ますが、彼女の息子さんは言葉そのものがごっちゃになる(“今日は何曜日?”と"What day is today?"がまざって“今日は何デー(day)?”と言ったりする)事は良くある様ですが、発音がおかしい事はありませんでした。

私はアメリカ在住14年で、こちらで出会ったアメリカ人の友達で、日本人の男性と結婚してハーフの4歳児がいる人がいます。旦那さんが日本人なので、彼女も日本語と英語、両方の教育をしてるのですが、その子の英語の発音は普通でしたよ。(勿論こちらにも独特の“赤ちゃん語”と言うのがあるので、あまり難しい発音が出来ない時もありますが、日本語/外国語を学んでいるから、と言う訳ではありません)

>週1に1時間のペースで英語が原因なのはまずありえないし、それなら幼児で始めた子はみんななっている、と言っていました。

私も同意見です。

私は18歳で渡米し、今ではアメリカで生まれたのかときかれる程の英語力に達しましたが、やはり、“小さい頃から英語に触れて来た”バイリンガルの人とはレベルが違います。ご質問者さんのお友達さんにも、この経験が原因で英語を教えるのをやめてしまわない事を祈ってます!子供の脳はスポンジですもの。発音がおかしいと言ってもまだ5歳。日本語だけしかしゃべれない子にもちゃんと発音が出来ない子はいます。

大丈夫!これにくじけずがんばって、お友達さんがお子さんを“本当のバイリンガル”にさせてあげられると良いですね。

とりあえず、“英語を早いうちから学んだから発音がおかしくなる”事は無いと思いますよ。

こんにちは。

私の知り合いにも3~5歳位の子供が居る人が5人程いますが(全員一人っ子です)、その中の3人は(4歳が二人と5歳が一人)ご質問者さんのお友達さんのお子さんの様に“さしすせそ”が”しゃしぃしゅしぇしょ”、”たちつてと”が”たちちゅてと”になっていました。

ハーフの子が居る友達(日本でアメリカ人の男性と結婚し、家では英語と日本語両方を教えてます)も居ますが、彼女の息子さんは言葉そのものがごっちゃになる(“今日は何曜日?”と"What day is today?"がまざって“今日は何デー(day)...続きを読む

Qサブルーチンの中にサブルーチンが書ける?

どこかのサンプルでサブルーチンの中にサブルーチンが書いてあったのですが、
元々Perlではそういう書き方が出来たのでしょうか?

Perl4、Perl5、Perl5.6、Perl5.8
どれでも使えるものかどうか知りたいです。

Aベストアンサー

>どこかのサンプルでサブルーチンの中にサブルーチンが書いてあったのですが、

そもそもその「サンプル」がないとお話になりませんが,

sub hoge{
my $a=shift;
sub huga{
print "naka\n";}
huga;
return $a;
}
print hoge(10);

この程度のことは当然可能です.たぶん,Perl4でも動くでしょう.
Perl5からはいわゆるコードリファレンスがあるので,
サブルーチンを返すサブルーチンや
サブルーチンを引数にするサブルーチンもかけます.

Q日本人が英語が苦手な原因の一つとシャドーイングについて

日本人が英語が苦手な原因の一つとシャドーイングについて

現在海外に留学中で、普段のコミュニケーションは英語で行っているものですが、
留学して日本人が英語が苦手な原因の一つに気づきました。
それは日本人の話す速度が他の国に比べて格段に遅いということです。
普段の会話のスピードを聞いていても海外の人の話す速度が
日本人にとってめちゃくちゃ早く感じるのは、日本人が日本語で話す速度が遅いために
感じるのではないかと思うようになりました。
そのため、英語の学習法の一つにシャドーイングという方法がありますが、あの方法は
もともと喋る速度が遅い日本人にとって、ナンセンスなんじゃないかとも思うようになりました。
みなさんはこの意見に関してどう思いますか?

Aベストアンサー

日本人が喋るスピードが遅いのは、日本語の習慣で、全ての子音の後に母音を補って発音しようとするからです。

例えばbuildingは英語では2音節ですが、日本人が発音すると「ビ・ル・ディ・ン・グ」で5音節になってしまうので、単純に考えても2.5倍の長さがかかってしまうことになります。
 
日本式の発音を止めれば、日本人でも英語を喋るスピードは速くなると思いますよ。
シャドーイングは日本式の発音をしていたらついていけないので、英語の話すスピードをあげる訓練にはもってこいだと思いますけれど・・・
 

 

QGUI::GetOpenFileName()でサブルーチンがない?

Perlの初心者ですがお教えください。
Windowsのファイル選択ダイアログを出そう思っています。教えてGooの過去履歴を見て、Win32API、GUI、Loft_binaryをインストールしました。
そして、
use Win32::GUI;
$ret = GUI::GetOpenFileName();
を実行しても、以下のエラーメッセージが出ます。
Undefined subroutine &GUI::GetOpenFileName called at getopen.pl line 2.
何が悪いのでしょうか?
OSはWindows2000-Proです。
一応、インストールしたときの結果を以下に載せておきます。Loft何とかの方もフォルダ内のinstall.batでインストールしています。
よろしくお願いします。
D:\Win32-GUI-1.05-PPM-5.8\Win32-GUI-1.05-PPM-5.8>ppm install Win32-GUI.ppd
Syncing site PPM database with .packlists...done
Unpacking Win32-GUI-1.05...done
Generating HTML for Win32-GUI-1.05...done
Updating files in site area...done
321 files installed
D:\Win32-GUI-1.05-PPM-5.8\Win32-GUI-1.05-PPM-5.8>ppm install Win32::API
Downloading ActiveState Package Repository packlist...done
Updating ActiveState Package Repository database...done
Downloading Win32-API-0.46...done
Unpacking Win32-API-0.46...done
Generating HTML for Win32-API-0.46...done
Updating files in site area...done
18 files installed

Perlの初心者ですがお教えください。
Windowsのファイル選択ダイアログを出そう思っています。教えてGooの過去履歴を見て、Win32API、GUI、Loft_binaryをインストールしました。
そして、
use Win32::GUI;
$ret = GUI::GetOpenFileName();
を実行しても、以下のエラーメッセージが出ます。
Undefined subroutine &GUI::GetOpenFileName called at getopen.pl line 2.
何が悪いのでしょうか?
OSはWindows2000-Proです。
一応、インストールしたときの結果を以下に載せておきます。Loft何とかの方もフォル...続きを読む

Aベストアンサー

Win32::GUI::GetOpenFileName では?
20秒くらいgoogleで検索しただけなので、外してるかもしれませんが。

Q英語に訳せる方、どうかお願いします!!! あなたが元気がないのは私の事が原因ではないかと、少し感

英語に訳せる方、どうかお願いします!!!


あなたが元気がないのは私の事が原因ではないかと、少し感じていました。
やっぱり、そうだったのですね。
あなたにプレッシャーを与えているつもりはないですが、あなたが感じていることに私は
罪悪感を感じます。

宜しくお願いします!!!

Aベストアンサー

I felt a bit that you don't look well because of me. Just as I thought I was. I feel guilt for what you feel but I have no intention of putting pressure on you.

Qperlのサブルーチンから画面に出力された内容を、別途htmlファイルに出力したい。

perl内のサブルーチンで処理された結果(htmlタグで構成されたもの)を別htmlファイルに出力したいです。

sub index {
print "Content-type:text/html; charset=utf-8\n\n";
&main;
exit;
}

上記cgiにアクセスすると、sub index内のサブルーチン(&main内で処理されたもの)が表示されます。

仮に以下のように処理すると、newfile.htmlの中に&mainとだけテキスト表示されます。

open (OUT,">newfile.html");
print(HFILE &main);
close (OUT);

&mainを展開した状態でhtml出力する方法を教えてください。
何卒よろしくお願いいたします。

Aベストアンサー

モジュールを使っていいなら方法4がおすすめ。

use strict;
use warnings;
use autodie;
use IO::Capture::Stdout;

sub main {
my $number = shift;
print "main function($number)\n";
}
my $file = 'hoge.txt';

# 方法1
{
local *STDOUT;
open STDOUT, '>', $file;
main(1);
close *STDOUT;
}

# 方法2
{
open my $fh, '>>', $file;
local *STDOUT = $fh;
main(2);
close $fh;
}

# 方法3 スカラー入出力を利用する
{
my $output;
open my $stdout, '>', \$output;
local *STDOUT = *$stdout;

main(3);
open my $fh, '>>', $file;
print {$fh} $output;
close $fh;
}

# 方法4 IO::Capture
my $capture_stdout = IO::Capture::Stdout->new;
$capture_stdout->start;
main(4);
$capture_stdout->stop;
{
open my $fh, '>>', $file;
print {$fh} $capture_stdout->read;
close $fh;

}

# 方法5 tie

---
$ perl foo.pl
$ cat hoge.txt
main function(1)
main function(2)
main function(3)
main function(4)

モジュールを使っていいなら方法4がおすすめ。

use strict;
use warnings;
use autodie;
use IO::Capture::Stdout;

sub main {
my $number = shift;
print "main function($number)\n";
}
my $file = 'hoge.txt';

# 方法1
{
local *STDOUT;
open STDOUT, '>', $file;
main(1);
close *STDOUT;
}

# 方法2
{
open my $fh, '>>', $file;
local *STDOUT = $fh;
main(2);
close $fh;
}

# 方法3 スカラー入出力を利用する
{
my $output;
open my $stdout, '>', \$...続きを読む

Q英語に翻訳お願い致します。 『カンボジアの地雷での死者の46%は子供です。 子供の被害を受ける原因は

英語に翻訳お願い致します。

『カンボジアの地雷での死者の46%は子供です。
子供の被害を受ける原因は、子供は警告の字が読めなかったり、好奇心でおもちゃと間違えて触ってしまったりするケースあるからです。その現状を受け、看板をなるべくわかりやすくするなど改良はされています。
子供の被害を減らしてほしいと願っています。』

Aベストアンサー

46% of the total number of dead caused by mine in Cambodia is children.This is because there are cases that children can't read the letters of alarm and they touch it in mistake for a toy with curiosity. On the basis of the real situation, it is being improved as notices can be understood as easy as possible.I hope the number of the child victims will decrease.

QPerlでIO::Socket::INET: connect: Unknown errorについて プロキシ設定?

PerlでIO::Socket::INET: connect: Unknown errorが発生します。IEを使う時でもインターネットに接続する場合、プロパティで192.168.1.1を設定しておりますが、
プロシキ接続できる、設定方法はあるのでしょうか?

Aベストアンサー

LWPを使っては如何でしょうか?

use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
$ua->proxy('http', "http://192.168.1.1:$proxyport/");
my $response = $ua->get("$targetURI");

参考URL:http://search.cpan.org/~gaas/libwww-perl-5.800/lib/LWP/UserAgent.pm


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報