トップページ⇒php
1001コメント364KB

Perl コーディング初心者質問コーナー Part36

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/07/14 13:23ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0243nobodyさん04/07/28 06:15ID:???
>>1読め
0244nobodyさん04/07/28 06:17ID:???
その友人に聞け。
ここで聞くのは筋違い。
じゃなければ金出してプロに頼め。
0245nobodyさん04/07/28 14:36ID:???
>>244はきついい方だけど、ちゃんとした問題解決だよ
>>242はもう少しがんばれ
0246nobodyさん04/07/28 16:26ID:???
>>245
むしろ普通だと思うが
友達が作ってくれたんだからその友達に聞くというのが、普通の人間の行動だと思うが
0247nobodyさん04/07/28 18:30ID:+xurfTPE
perlでCGIを組んでいます。
そのCGIにアクセスがあったときに、
そのフォルダ内のHTMLファイルを返すにはどうしたらいいのでしょうか?
ググろうにも・・・どうキーワードを打ち込んでいいのか分からないのでここへ来ました。

# 今はprintでJavaScriptを含むHTMLを出力して、
# そのJavaScriptで目的のHTMLファイルを読み込ませているのですが、
# どうも・・・
0248nobodyさん04/07/28 18:40ID:???
>>247
3回ゆっくり読みましたが、
何言ってるかわかりませんでした。
0249nobodyさん04/07/28 18:43ID:???
>>247
ジャンプさせる
0250nobodyさん04/07/28 18:45ID:???
>>247
キーワード「open」
0251nobodyさん04/07/28 18:47ID:???
>>247
ここ書込んだときに「しばらくおまちください」みたいなページ出たよな?
それが答えの1つだ。
あとは。。。ロケーションヘッダでぐぐれ
0252nobodyさん04/07/28 19:00ID:???
>>249-251
と言うことは、>>248は日本語が読めないヴァカと言うことでつか?
0253nobodyさん04/07/28 19:23ID:H19oR7EL
perlで作成したCGIを10分事に自動実行させたいと考えています。
そこでcronを使って実現しようとしているのですがうまくいきません。

■動かしたいファイル:xxx.cgi
(4行目で require 'abcd.pl'; を記述してます)

■実行した手順
telnetでログイン
 ↓
crontab -e
 ↓
0-59/10 * * * * /home/www/●●●/public_html/xxx.cgi
 ↓
:x で終了

すると、line 4. (実行しているファイルの4行目)がエラーだと
いう記述のメールは届いてしまいます。
メールの原文は下記の通りです。
Can't locate ./abcd.pl
in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 . /usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503)
at /home/www/●●●/public_html/xxx.cgi line 4.

上記の通りなのですが、
うまく実行させるにあたりご教授願えればと思います。
025424704/07/28 20:05ID:???
ありがとうございます。

>>248
ごめんなさい。

>>249-250
それでググってみます。

>>251
しばらくお待ちくださいから飛ぶのはmetaタグのやつですよね。
JavaScriptでもmetaタグでも、どっちにしてもページを介さなければならないのが
ちょっと・・・

「ロケーションヘッダ」でもググってみます。
0255nobodyさん04/07/28 20:09ID:???
>>253

エラーの意味は分かるよな?
cronの実行ユーザーにパスがないんだよ
絶対パスで書くか、use libでパス通せ
0256nobodyさん04/07/28 20:10ID:???
つーかcronで動かしてる時点で、CGIじゃねーんだけどな
0257nobodyさん04/07/28 23:04ID:???
>>253
それのどこがperlのコーディングの質問なんだよ。
0258nobodyさん04/07/28 23:28ID:???
>>257
スレタイ読めない半島の人間なんだよ。許してやれよ。
0259nobodyさん04/07/29 07:52ID:Y1hnbGEZ
>>234
Whileの前でもう一度ファイルを開いたら
なんとか動きました。これでお客さんになんとか見せれそうです。

ありがとうございました
0260nobodyさん04/07/29 09:03ID:???
PERLのオブジェクト指向について

通販サイトの注文CGIをPERLで作っていて疑問。オブジェクト指向で書き上げたいんだけど、
とりあえずEcomという名前のモジュールを作って、それのコンストラクタで単価、商品名等の基本部分を
設定。Ecomのコンストラクタが返すオブジェクトの初期プロパティに商品名とかのハッシュリファレンスを持たせる。

で、疑問なのはこのオブジェクトは当然モジュールEcomのメソッドを全て使用できるわけだけど
一体この場合のメソッドって一体何?

クラスにおけるメソッドの役割みたいなものがはっきりしない(理解できない)
っていうかどういう意味合いで使えばいいのかというか;ちょっと例を出してみる。
1.コンストラクタが返すオブジェクトの強化、改造のため
2.コンストラクタが返すオブジェクトのプロパティを参照して何らかの処理をして、呼び出し元に値を返す。
3.?思いつかない

未完成であるオブジェクトを完成させるのがクラスのメソッドなのか?みたいにも思うけど、
イマイチ。どう捉えれば一番すんなりいくのかな?
0261nobodyさん04/07/29 09:44ID:???
コーディング 【coding】

プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
0262nobodyさん04/07/29 14:11ID:???
>>260
http://www5a.biglobe.ne.jp/~n_rieko/perl/10.htm
0263nobodyさん04/07/29 14:34ID:???
>>260
http://perl.infoware.ne.jp/documents/perlboot.ja.html
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
http://perldoc.jp/docs/perl/5.8.0/perltooc.pod
http://www.melma.com/mag/85/m00014785/a00000001.html

あと駱駝と黒豹と Effective Perl 。
026426004/07/29 17:04ID:???
>>261
ごめんよ
>>262-263
ありがとう見てみるよ。

ところでperldocってperlの仕様書みたいなもの?和訳もあるの?
0265nobodyさん04/07/29 17:55ID:???
>>264
Perl の配布パッケージに含まれている公式な説明書。> perldoc
和訳は駱駝本がそうであるとも言えるし、perldoc.jp のように有志の
手による部分訳もある。
026652204/07/29 19:47ID:???
駱駝本って高いの?
0267nobodyさん04/07/29 19:50ID:???
>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0268nobodyさん04/07/29 19:57ID:???
267 名前: nobodyさん [sage] 投稿日:04/07/29 19:50 ID:???
>>266
>>6を1行ずつ声に出して三唱。
_| ̄|○
0269nobodyさん04/07/29 20:38ID:???
>>259の客がもの凄く可哀想だ。
0270nobodyさん04/07/29 21:19ID:???
>>269
デモで見せるだけならまだいいが、ロックあのまま
で予約になんか使った日には...
0271nobodyさん04/07/29 21:31ID:???
このDBはロックだ。そしてこのデモを目にした客たちもロックだ。
0272nobodyさん04/07/30 12:42ID:As0li0gB
Perlで配列に入っている要素の数を知りたい場合ってどうやるんです?
[0]から順に数字が入っている事が前提でかまいませんので。
0273nobodyさん04/07/30 13:07ID:???
>>272
$n = $#array + 1;
か
$n = @array;
配列はスカラコンテキストだと要素数を返す。
0274nobodyさん04/07/30 15:59ID:???
>273
Thx.ありがとう。
0275nobodyさん04/07/31 00:34ID:k0R22EX1
配列の要素がいろいろな数字だとして、
2個以上配列の中に要素としてある数字を、
配列として読み込ませるにはどうすればいいですか?

具体的に言うと、
@array = (0,2,3,2,0,4,1);
こういう配列から
@req = (0,2);
こんな配列が作りたいんですけど・・・
0276nobodyさん04/07/31 01:02ID:???
for (@array){
$hash{$_}++;
}
for (keys %hash){
$hash{$_} > 1 and push(@req, $_);
}
027727504/07/31 01:08ID:k0R22EX1
>>276
Thxです!
0278nobodyさん04/07/31 01:10ID:???
( ゚д゚)・・・
0279nobodyさん04/07/31 03:22ID:???
どうせなら
push(@req,$_) if $hash{$_} > 1;
の方がいいと思った。
0280nobodyさん04/07/31 04:52ID:???
オレなら

foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}

とループひとつで済ませるかな。
0281nobodyさん04/07/31 08:53ID:???
if ++$hash{$_} >= 2;

==2だと「要素が二個だったら」になるぞ。
0282nobodyさん04/07/31 09:47ID:???
>>281
@arrayに2回以上出現する要素を@reqにひとつずつ
入れるのだから、==でいいはず。>=2だと
@array=(2,2,2)のときに@req=(2,2)になっちゃう。
0283nobodyさん04/07/31 11:26ID:JonE4G7J
初めて書き込みします。

perlを勉強しようと思いますが、
主にcpanを使ったwebプログラミングを作っていきたいと思いますが、
何をどこからやれればよいか途方に暮れています。_| ̄|○

参考になるサイトや本を探しても全然勉強にならない。
※ある程度知っている人向けが多い・・・_| ̄|○

猿でもわかるcpanやcpanを使ってのperlやcgiについて
参考になるサイトや書籍をご紹介いただければ幸いです。

お礼はアフィリエイトリンクを踏んで本を買います。
そしたら、利益供与(?)いたします。
0284nobodyさん04/07/31 14:49ID:RsJc0bwQ
Perlをはじめたくて、ActivePerlをインストールしたのですが、
Perlやppm等のコマンドを打つと、
'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と表示されます。
何度か再インストールしても、Perlフォルダを消してみても同じでした。
どなたか解決策教えていただけませんか?
0285nobodyさん04/07/31 14:53ID:???
pathをちゃんと通した?
0286nobodyさん04/07/31 15:04ID:???
>>284
pathって打ってみて、表示されたリスト内にperl.exeのフォルダがなければパスが通ってない。
設定はシステム→詳細設定→環境変数から。pathを選んで好きな位置にフォルダを追加する。
(他のフォルダとは ; で区切る)
0287nobodyさん04/07/31 15:25ID:???
>>283
cpan、cpan言ってないでまずはperl自体を勉強汁。そうすれば、cpanのことも自ずと分かってくる。
ちなみに、webにあるperl講座とかは殆どが始めてやる香具師用だ。
それがちゃんと探してから言った言葉なら、冗談抜きで理解力無いんだと思うぞ。
perlの事がそこそこ分かってきて、cpanのライブラリも利用しようということになったら下のサイトが大いに役に立つだろう。
http://www.cpan.jp/
0288nobodyさん04/07/31 15:28ID:RsJc0bwQ
ありがとうございます。
pathと打つと、
PATH=C:\WINDOWS\system32;"%path%;C:\Perl\bin;C:\Perl\bin\;C:\WINDOWS;C:\WINDOWS\
system32\WBEM;
と表示されます。
perl.exeはC:\Perl\binに入っていたので、大丈夫だと思うのですが…。
0289nobodyさん04/07/31 16:16ID:???
再起動してみれ
0290nobodyさん04/07/31 18:24ID:???
"%path%

おもいっきりおかしいとこあるじゃん!
0291nobodyさん04/07/31 19:50ID:???
( ゚ д゚) …

何をどうやったらそんなものが紛れ込むんだろう
0292nobodyさん04/07/31 22:49ID:JonE4G7J
>>287
�dクス。勉強汁よ・・・
0293nobodyさん04/08/01 02:50ID:???
前前スレくらいで、QandA集を作るって言ってたものです。
忘れてたんですが、ちょっと思い出して作ってみたんですが、どうでしょう。
Subjectは適当に付けて、Question&Answerはほどよくコピペするといいと思います。
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
0294nobodyさん04/08/01 03:19ID:???
>>293
乙!

これから一覧が長くなると探すのが大変だから
検索機能あるといいね。
0295nobodyさん04/08/01 07:05ID:???
チャットのログファイルを読み込んでHTMLをはき出すCGIを作っています。

画像のURLがあった場合、その画像を拾ってきてサーバに保存する機能を付けたのですが、
画像のあるサーバが落ちている場合などは
connectがエラーを返すまでに時間がかかってしまいます。
connectがタイムアウトする時間を設定することはできないのでしょうか?
Windows上のサーバでCGIを動かすのでalarmが使えずに困っています。
0296nobodyさん04/08/01 08:00ID:???
その画像の著作権の方は大丈夫なのか?
029729504/08/01 08:47ID:???
著作権ですか
どういう画像が貼られるかわからないのでなんとも・・・
アプロダも似たようなものだと思うんですがどうなんでしょうね
0298nobodyさん04/08/01 08:53ID:???
チャットにIMGタグで張られた画像がそのままだとF5アタックと変わらんしな。
029929504/08/01 09:43ID:???
OpenNapのチャットログなのでタグの心配はないんです
0300nobodyさん04/08/01 11:30ID:???
>>295
普通は timeout 設定できるやろ
君がどういうライブラリ/クラス/関数使ってるかわからんのでやりかたはなんとも言えんが
0301nobodyさん04/08/01 12:11ID:???
>>293
半自動化できそうだな。
0302nobodyさん04/08/01 12:25ID:???
wget なら窓でもあったっけ?
0303nobodyさん04/08/01 13:19ID:???
普通にあるし
0304nobodyさん04/08/01 14:40ID:???
>>293です。
登録してから再編集する機能をつけました。 このシステム自体荒らしに弱いのが難点なので、バックアップ機能もつけておきます。

>>301
やっぱり、人の手で判別して人の手でちょっと編集するのが一番だと思うのですが。

暇だったら登録お願いします。
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
0305nobodyさん04/08/01 14:43ID:???
>297
アプロダも「自分で描いた絵」なら全く無問題。
他人の絵を無断でアプしたら著作権侵害。
他人がやっているから自分もいいと考えるのはただの自己厨。
そういうシステムを作ろうってなら、まずは著作権を勉強しろ。
0306nobodyさん04/08/02 05:33ID:???
foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}

++$hash{$_} == 2 ここの部分の意味教えてください・・・
0307nobodyさん04/08/02 05:50ID:???
>>306
hash : http://www5a.biglobe.ne.jp/~n_rieko/perl/4.htm
++ : http://www5a.biglobe.ne.jp/~n_rieko/perl/5.htm#5-1
== : http://www5a.biglobe.ne.jp/~n_rieko/perl/5.htm#5-4
$_ : http://www5a.biglobe.ne.jp/~n_rieko/perl/6.htm#6-4
0308nobodyさん04/08/02 12:10ID:???
>>306
$hash{$_} の値をインクリメントして「から」、2 と数値比較。
0309nobodyさん04/08/02 13:08ID:???
require 'lib.pl';
$lib = new LIB;
とやってlib.plにpackage LIB;
とやって、
print "Content-type: text/html\n\n";
とやってもエラーがでます。
「require 'lib.pl';」
「$lib = new LIB;」
この2つの行を消したらエラーは出ずに表示されるんですが、
なんでエラーがでるのでしょうか?
0310nobodyさん04/08/02 13:23ID:???
lib.pl の中に
new サブルーチンあるの?
0311nobodyさん04/08/02 16:44ID:???
>>309
エラーログ見ろ
0312nobodyさん04/08/02 20:51ID:???
「エラーがでます」だからどうした?言いたいことはそれだけか?
0313nobodyさん04/08/03 08:57ID:bp7Se8/y
スレッド天国 http://specters.net/cgipon/ のスレッド式掲示板の
スクリプトを改造してる形になるんですが、リンクをクリックしたら
ある変数に値を代入(ここでは$#aaaに1を入れたい)するというのは
どうすればいいんでしょうか?そのあとにIFを設置して条件分岐の材料に
したいのですが、下の通りにやっても処理されてくれません。元の文はこれです。

$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D">);

で、これを

$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D" $#aaa=1>); とか、
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D&$#aaa=1">); とかにしても
うまく動作しないんです。こういう処理って無理なんでしょうか?
0314nobodyさん04/08/03 09:23ID:???
>>313
無理。あーんど、スレ違い。
0315nobodyさん04/08/03 20:27ID:???
PerlでLinuxサーバにコマンドを打ってそれを実行させる?ような
記述方法をお聞きしたいと思います。

例えば、Perlで作ったフォームに「Shutdown」というボタンがあったとして
このボタンを押すと「shutdown -h now」というコマンドがサーバに
反映されてサーバ機が止まるような。

こういうことって出来るのでしょうか?
0316nobodyさん04/08/03 20:30ID:???
>>315
例のshutdownの実行には、root権限が必要そうだが、コマンドを実行するだけなら、exec(), system(), open(), ``などの方法がある
0317nobodyさん04/08/03 20:35ID:???
>>315
sudoでapacheに権限与えて実行
0318nobodyさん04/08/03 20:55ID:???
>>316
openで指定のファイルを開いてprintですか?

これなら方法はわかるし、できるかも。。
0319nobodyさん04/08/03 23:10ID:???
(゚Д゚ )ハァ?
0320nobodyさん04/08/03 23:49ID:???
うーん。>>316-317を見て「そうあっさり答えるのが普通なの?」と
思ったんだけど、俺が神経質すぎるだけなのかなあ。

フォームのボタンで/sbin/以下をごにょごにょするって話にしては
なんだか呆気なく感じたんだけど、気にしすぎ?

# スレ違いでごめんなさい。
0321nobodyさん04/08/03 23:53ID:???
>>320
んー、なんで?
0322nobodyさん04/08/04 00:04ID:???
popenじゃなくてopenなの?、perlって
0323nobodyさん04/08/04 00:07ID:???
>>322
そうなんだよ
だから、書き捨てスクリプト作るときには
涙出るほど便利
032432004/08/04 00:17ID:???
>>321
うまく言えないんだけど、
入門書にある「print `pwd`; してみよう」レベルのことを尋ねてる人が、
「ブラウザから鯖を halt させたい」ってところに引っかかったのかな。
最近、セキュリティがアマアマの自宅鯖を見すぎてるだけかも。
0325nobodyさん04/08/04 00:43ID:???
>>324
共有鯖ならばシャットダウンに必要な権限を得られないから問題無い。
シャットダウンに必要な権限が得られる個人鯖ならどうなろうと知ったこっちゃないので、やっぱり問題無い。
032632004/08/04 00:50ID:???
>>325
わかりやすい意見をありがとうございます。
2行めを読んで激しくスッキリしました。

コーディングと関係ない話で引っ張って失礼しました。
0327nobodyさん04/08/04 01:14ID:???
アパティをオペレータ権限で動かせ!!
032830904/08/04 17:21ID:???
>>310
!!
すいません、ありませんでした。
ご返答はりがとうございます
0329nobodyさん04/08/05 06:51ID:A93W0UIN
Perlのオブジェクト指向の解説サイトを色々読んでるけど、アクセスメソッドを作るか迷ってるんだけど
みんなはちゃんと、アクセスメソッド作ってやってる?

今作ってるやつはオブジェクトのメンバ変数(プロパティ)が結構な数あるからいちいち個々に対するアクセスメソッドを
作るのは冗長な気がするんだよね。中にはハッシュとかもあるし;

シンボリックリファレンスありにすれば1個で済むような気がするけど、知恵を貸してください。
033032904/08/05 07:03ID:A93W0UIN
とりあえずコンストラクタの一例
sub new{
my $self = shift;
my %form;
foreach ( split /&/,shift ) {
( my $a , my $b ) = split /=/;
$b =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$form{$a} = $b;
}
bless {
form => %form
},$self;
}

ちょっとプロパティを減らしたけど、とりあえずこんな感じ。
それでmainの方で
my $obj = Testclass->new($ENV{'QUERY_STRING'})
としてから随時HTML出力途中に
$obj->{form}{hoge}
として参照したいけど、これをアクセスメソッドを介してのものに変えたい。



0331nobodyさん04/08/05 08:28ID:???
>>329-330
http://perldoc.com/perl5.8.4/pod/perlsub.html#Autoloading
http://perldoc.com/perl5.8.4/pod/perltoot.html#AUTOLOAD--Proxy-Methods
0332nobodyさん04/08/05 08:54ID:o7gPPImy
連想配列の添え字を全て小文字にする関数もしくは処理を
教えて頂けないでしょうか?phpのarray_change_key_case
http://php.s3.to/man/function.array-change-key-case.html
のようなものを探しております。
0333nobodyさん04/08/05 08:58ID:???
>>332
@new{ map lc, keys %old } = values %old;
033432904/08/05 09:01ID:A93W0UIN
英語読めねよ
0335nobodyさん04/08/05 09:08ID:???
@a=qw/1 2 3 4/;
@_[0]=\@a;

この@_[0]をデリファレンスするにはどうsればいいですか?
@@_[0]
@$_[0]
とかではできませんでした。

それと
@$#_[0]
みたいなことをして、配列の最後の番号を知りたいんですが、どうすればいいですか?
0336nobodyさん04/08/05 09:38ID:???
>>335
@_[0]=\@a;は正しくない。正しくは$_[0]=\@a;
デリファする時は@{$_[0]}のように{ }で囲む。
要素見るときは$_[0][N]、最大添字は$#{$_[0]}。
0337nobodyさん04/08/05 09:43ID:???
>>334
>>6
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Autoloading
http://perldoc.jp/docs/perl/5.8.0/perltoot.pod
0338nobodyさん04/08/05 10:20ID:???
RFCとか、大事なものはほとんど英語だよ。
日本語のマニュアルしか受け付けないって人は止めた方がいいと思うよ
033932904/08/05 10:54ID:A93W0UIN
>>337
ありがと。でもアクセスメソッドとのつながりがイマイチわからん。
下のはアクセスメソッドのこと書いてるけど、冗長だよね。
ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
使えるやつにしたいんだけど、ゆっくり自分で考えるよ。ありがとう。

>>338
ほんと日本人には不利だよね。というか英語圏の人間はそれだけでずいぶん楽なんだろうな。


034033504/08/05 11:02ID:???
>>336
ありがとうございました!できました^^
0341nobodyさん04/08/05 11:46ID:???
>>338
>ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
>使えるやつにしたい

無理だろ。どんなクラスでもこのアクセスメソッドで完全にokなんてのがあったら、有名になってるって。
できたら金やるよ
0342nobodyさん04/08/05 11:47ID:IwD+3Zuu
やり方はけっこうですので、質問させて下さい。
jcode.plで受け取ったデータを「EUC」に変換した後、
EUC特有の「全角英数→半角英数」の処理を施し、
その後再び、「SJIS」に変換する、といった処理は可能でしょうか?
■ このスレッドは過去ログ倉庫に格納されています