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

【Perl】初心者コーナー Part14

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/07/18 16:34ID:jemWJhH3
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0352nobodyさん02/07/25 06:50ID:???
>>351 >>1を読め。

それにしても、このスレッドも堕ちたな...。
0353nobodyさん02/07/25 07:35ID:???
>>337

perlしかわからないのですが・・

0354nobodyさん02/07/25 07:45ID:???
>>353
そんなに大きな違いがあるのか?
0355nobodyさん02/07/25 08:33ID:???
>>351

if $351 == aho {
$351 = itteyoshi;
}
0356nobodyさん02/07/25 08:35ID:???
>>355
動かんぞ?それ。
0357nobodyさん02/07/25 12:08ID:???
if ($_351 == "aho") {
$_351 = "itteyoshi";
}
035835702/07/25 12:09ID:???
if ($_351 eq "aho") {
$_351 = "itteyoshi";
}
0359nobodyさん02/07/25 12:26ID:???
>>354

関数が違うので分かりません
0360nobodyさん02/07/25 13:19ID:???
renameとunlinkを使いたいのですがうまくいきません。
rename (aaa.txt, bbb.txt);
でやると実行権限がないとエラーが出ます。念のためaaa.txtのパーミッションを777に
したんですけどダメでした。
unlinkは unlink aaa.txt; とやるのですがファイルが無いとエラーが出ますなんででしょう。
0361nobodyさん02/07/25 13:32ID:???
>>360
パーミッション777のファイルがリネームもアンリンクもできないということは、
ファイルシステムが壊れています。OSを再インストールしましょう。
0362nobodyさん02/07/25 13:34ID:???
OSというのは、サーバーのOSが壊れてるって事ですか?
たぶんそれはないと思うんですけど。
0363nobodyさん02/07/25 13:34ID:???
ディレクトリのオーナー、パーミッションはどうなってんのよ
0364nobodyさん02/07/25 13:35ID:???
>>362
起こっている現象から推測すればそういうことになります。
0365nobodyさん02/07/25 13:57ID:???
http://cgi.tripod.co.jp/hello_baby/cgi-bin/aiueo.cgi
中身
#!/usr/bin/perl
require 'jcode.pl';
rename aaa.txt bbb.txt;
print "Content-type: text/html\n\n";# HTML文出力宣言
print "エラー:$!";

何がダメなのかさっぱりわからないです。ちなみにここはパーミッションとかは関係ないみたいです。
0366nobodyさん02/07/25 13:59ID:???
http://members.tripod.co.jp/hello_baby/aaa.txt
0367nobodyさん02/07/25 14:07ID:av9ITDXM
aaa.txt, bbb.txt
じゃないの?
0368nobodyさん02/07/25 14:17ID:???
すいません、出来ました。
でも今度はファイルが無いとエラーが出ます。
ファイルはちゃんとありますよね・・?
0369nobodyさん02/07/25 14:22ID:???
まだやってたんか。。。$ENV{'PATH'}を出力してみ。
0370nobodyさん02/07/25 14:22ID:v0Zz+Fi9
rename ("../aaa.txt","../bbb.txt");
こうしているんですが。
0371nobodyさん02/07/25 14:24ID:av9ITDXM
Tripodの特殊事情じゃないの。別鯖とか。よくしらんけど
0372nobodyさん02/07/25 14:24ID:???
>>370
そんなこと書かれてもそっちのディレクトリ構造知らんし。
0373nobodyさん02/07/25 14:25ID:v0Zz+Fi9
#!/usr/bin/perl
require 'jcode.pl';
# rename ("../aaa.txt","../bbb.txt");
print "Content-type: text/html\n\n";# HTML文出力宣言
print "$ENV{'PATH'}<br>";
print "エラー:$!";

何も出ないですね。。
0374nobodyさん02/07/25 14:26ID:v0Zz+Fi9
/cgi-bin/aiueo.cgi
/aaa.txt

こういう感じです。
0375nobodyさん02/07/25 14:29ID:???
>>374
ほんとにそうか?ホスト名が分かれているからCGI専用のサーバが分かれて
いるんじゃない?実際のディレクトリ構造とマウントポイント・エイリアス・
リンクなどもあるからニンともカンとも。
0376nobodyさん02/07/25 14:39ID:???
サーバのFAQ位読めよ
つーかローカルでテストやれや
外でするならKENTの設定変える以外触るな
0377nobodyさん02/07/25 15:00ID:???
renameとかってOSによって動くか動かないかわからないみたいだから
サーバー上でやらないと意味ないじゃん。
0378nobodyさん02/07/25 15:14ID:???
るせんだよ チンカス夏厨
FAQ読めっつってんだろ ああ??
おまえ日本語の不自由な方か?
0379nobodyさん02/07/25 15:24ID:???
>>378
FAQ読んだけどrenameという単語は出てこなかったです。
そんなにカッカしないでヒントになるところ教えてください。
0380nobodyさん02/07/25 15:29ID:???
tripod.co.jpはCGIはcgi.tripod.co.jpサーバ
普通のファイルがmembers.tripod.co.jpサーバ
0381nobodyさん02/07/25 15:46ID:v0Zz+Fi9
#!/usr/bin/perl
require 'jcode.pl';
rename ("http://members.tripod.co.jp/hello_baby/aaa.txt","http://members.tripod.co.jp/hello_baby/bbb.txt");
print "Content-type: text/html\n\n";# HTML文出力宣言
print "$ENV{'PATH'}<br>";
print "エラー:$!";

こうやったけどダメでした。
0382nobodyさん02/07/25 15:48ID:???
>>381
痛いな。
0383 02/07/25 16:00ID:???
>>381
それだけでrenameできると勘違いしている新種の厨房(推定:中学校1年生 オナニーの覚えたて。)
0384nobodyさん02/07/25 16:02ID:???
痛いのはわかったんで何が違うのか教えてください。
0385nobodyさん02/07/25 16:03ID:???
別サーバのファイルにはLWPとか使わないとアクセスできません。
おとなしくcgi-bin/以下にファイルを置きましょう。
0386nobodyさん02/07/25 16:09ID:???
どうして、別サーバーなのに、一回のftpで両方つながるんでしょうか。
というか、一つのサーバーにつないでいるのにあたかも他のサーバーのディレクトリも見えるなんて不思議です。
0387nobodyさん02/07/25 16:13ID:???
#!/usr/bin/perl
require 'jcode.pl';
rename ("aaa.txt","bbb.txt");
print "Content-type: text/html\n\n";# HTML文出力宣言
print "$ENV{'PATH'}<br>";
print "エラー:$!";

aiueo.cgi と aaa.txt を同じディレクトリに置きました。
エラー:No such file or directory と出ました。
今度は何がいけないんですか?
そんなファイル無いと言われても確かに同じディレクトリにあります。
どうしてこんなに分からず屋なんでしょうか。
0388nobodyさん02/07/25 16:14ID:???
ftpでつながるのはftpサーバ(ftp.tripod.co.jp)です
members,cgi,ftpそれぞれ別なんです。
0389nobodyさん02/07/25 16:15ID:???
>>387
errorでてもファイル名は書き換わってないですか。
0390nobodyさん02/07/25 16:19ID:???
はれ!?
ほんとだ!
変わってる!!
なんでだ!?
0391nobodyさん02/07/25 16:49ID:???
そろそろ場違いだと気付いて欲しいんだけど?
0392nobodyさん02/07/25 17:02ID:???
じゃどこで聞けばいいんですか?
0393nobodyさん02/07/25 17:06ID:???
>>378
>>382
>>383
お前ら、見ていて不快だからくるな。
0394nobodyさん02/07/25 17:10ID:???
>392
tripodのサポート。
0395礼儀厨房02/07/25 17:10ID:???
�@レンタルCGIでチャットをおきたいです
�APeriへのパスの指定とディレクトリをいじってみたけど
�Bわかりませんでした。パスの指定とは基本的にどういうことなのでしょうか?
借りたサーバーのQAにいってもよくわかりませんでした。もっとも外国鯖なので
翻訳したのが少々わかりづらかったかなと・・・
借りた鯖はPROHOSTINGです パスの指定、ディレクトリの仕方をご教授ください
お願いします
0396nobodyさん02/07/25 17:11ID:???
>>395
Peri -> Perl
0397nobodyさん02/07/25 17:12ID:???
>395
惜しいな。
>いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
「コーディング」のスレなんだ。
設置は別のところで聞いて。
0398礼儀厨房02/07/25 17:14ID:???
>>397
あ・・・そうですね^^;
すいませんでした。ご親切にどうもです^^では
0399nobodyさん02/07/25 17:17ID:???
http://www.google.com/search?sourceid=navclient&q=PROHOSTING+FAQ

ここから探せばすぐ分かるよ
0400礼儀厨房02/07/25 17:20ID:???
>>399
スレ違いの意見に答えてくれてありがとうです><
0401XSについて再び102/07/26 02:39ID:???
俺は前スレでXSネタであらしたヤシだ(dat落ち中)
ここで適当に受け答えしてる奴らほんと全員シネヨ。(特にコテ)
今日ひさしぶりにperlxstut.txtみてやっとわかったよ。
手順言うからメモしろチンカスども。
環境はWin ActivePerlな
ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe
でnmake ダウソ ファイル名はnmakeとかに直しとけ
0402XSについて再び202/07/26 02:40ID:???
h2xs -A -n Xstest でXS用のモジュールスクリプトフォルダができる
cd Xstestして Xstest.xsに
void
hello()
CODE:
printf("Hello. Tinkasu Boy!\n");
とかく。チンカスはそうお前の事だ。
んでperl Makefile.PL
nmake
nmake install
0403XSについて再び302/07/26 02:41ID:???
で確認だ。
#!/usr/bin/perl(まぁDOSならいらんがな)
use Xstest;
Xstest::hello();
でそれ実行できればOKだ。OK?糞Perler。
お前らが20代とかだったら俺は泣くね。
0404nobodyさん02/07/26 02:47ID:???
シーン。。。
0405nobodyさん02/07/26 05:42ID:???
XSチュートも読まずに(読めずに?)スレ一本分も悩んでたのかあ
前に5.7絡みでgunzipが講釈してた様なきがするけど
やっぱり●●は想像を絶する位●●なのかなあ
0406nobodyさん02/07/26 06:08ID:???
CGI実行ユーザー名を獲得する事って可能でしょうか?
0407nobody02/07/26 06:20ID:???
whoami
040840602/07/26 07:35ID:???
有難う御座いました。
0409nobodyさん02/07/26 07:51ID:???
>>408
use User::pwent;
my $pw = getpwuid($$);
print $pw->name;
0410 ◆JAPH9PWA 02/07/26 08:58ID:???
とりあえずnmake15.exeってのはnmakeインストーラ、
というか圧縮されたプログラムなんで、実行するとnmake.exeとnmake.errってファイルが出来る(だったかな)
だからrenameの必要はないはずなんだけどなぁ。彼は実際にやってみたんだろうか。
0411nobodyさん02/07/26 09:19ID:???
>>401-403
低脳にして粘着とは救いようがないな。
0412nobodyさん02/07/26 09:29ID:???
>>411
煽りはスピードが命。
0413nobodyさん02/07/26 13:48ID:???
opren(file-handle, "filename") || &error("ファイルが開けません");

この || って、ダメだったらって意味ですか?
0414nobodyさん02/07/26 13:50ID:???
>>413
もしくは。

ifの中のと一緒だ。

前の式がtrueなら後ろの式は評価されないと言う性質を逆手に取った
他の言語ユーザに見せたらどつき倒されそうな処理です。
0415nobodyさん02/07/26 14:02ID:???
perlでしかやらない方がいいという書き方って事ですか。

あと、
sub auto_link {
  $_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\">$2<\/a>/g;
}
これはURL文字列を自動的にリンクにするサブルーチンですけど、
自分は正規表現が複雑なのはわかりません。
でもサブルーチンは便利で引数だけ渡せば意図する結果を返してくれます。
サブルーチンの中の正規表現をわざわざ噛み砕いて理解する必要はありますか?
まぁ、これがわからないと自分でいちから作れないという訳になってしまいますが。
0416nobodyさん02/07/26 14:03ID:???
>>414
括弧の多い言語では普通ですが、何か?
0417nobodyさん02/07/26 14:09ID:OgCRHfVm
1:自分はこう言う事がしたい。

 script01.plをuser01で実行し、その中からsystem関数を使って
script02.plを実行させたい。
 ただし、script02.plは、user02が実行したものとしたい

2:それでこんな風にやってみたが・・・

 perl -h で起動オプション調べてみましたが、起動ユーザーを指定
する方法がありませんでした。

 何か、スクリプトを起動するユーザーを選択する方法ってないでしょうか? 
0418nobodyさん02/07/26 14:17ID:???
>>417
script02.pl をsetuidモードにでもしとけ。
0419nobodyさん02/07/26 14:39ID:???
>>416
そうか?Cとかで


fp = fopen("m","r") || printf("error!");

なんてコード書いたら多分干される。
0420nobodyさん02/07/26 14:49ID:OgCRHfVm
>>418

googleで調べたら、chmod 4755 script02.pl でsetuidモードになるようです
が、やはりだめでした。

script02.pl は、PostgreSQL への INSERT文を集めたスクリプトなんですが
database not connecti が出ますね。

いや、言わないでください。GRANTでデータベースの方に権限与えれば
っていうのは重々判ってはいるんですが、script01.plを実行するユーザは
nobodyにしたいんですよね。将来、CGIにする為。
dbにnobodyの権限を与えるのを躊躇ったものですから、script02.pl を
PostgreSQLユーザーの権限にしておいて、実行ユーザーを換えようと
思ったんです。

どうも、この方法はだめなようですから、GRANTを検討してみます。
0421ハニホ・ヘニハ02/07/26 15:09ID:???
>>420
接続時のパスワード設定すりゃいいじゃん。病院いっとく?
0422nobodyさん02/07/26 15:31ID:???
サブルーチンの終わりの
return $hoge;
↑ってどういう意味があるんですか?
0423ハニホ・ヘニハ02/07/26 15:34ID:???
>>422

>>1をよく読みましょう。それくらいなら検索いっとく?
0424nobodyさん02/07/26 15:52ID:NvB7dZaP
サブルーチンを呼んだ側に戻り値を返す。
042542202/07/26 15:54ID:???
>>423
ゴグってみましたんですがいい所があったのに僕の頭のメモリーが足りませんでした。
0426nobodyさん02/07/26 15:55ID:???
if(-e hoge.txt){ print "OK"; }
else{ print "NO"; }

cgiファイルと同じディレクトリにhoge.txtがあるんですけど
NOしか出てきません。なぜですかね。
他のファイル演算子も試しても全部elseになっちゃいます。
042742202/07/26 15:55ID:???
>>424
ありがとうございます。
それなんですが無くても動作する場合とかがあるんですが。
どういうことですか?
042842202/07/26 15:57ID:???
if(-e $hoge){print "f";}
else{print "b";}
0429nobodyさん02/07/26 16:00ID:???
>>427
Perlは一番最後に処理されたステートメントが「自動的」に
戻り値になる:

sub FOO_1 { 1 }
sub FOO_2 { return 1 } # FOO_1 と戻り値は一緒

sub BAR { FOO_1() } # 戻り値はFOO_1の戻り値
0430nobodyさん02/07/26 16:00ID:???
>>427
無い場合は最後に評価した値を返す
0431nobodyさん02/07/26 16:01ID:NvB7dZaP
戻り値を必要としないサブルーチンだったら要らないというだけでしょ。
returnを書かなかったら最後に評価された式の値が返るんじゃないの。たしか。

>>426
サーバがIISかPWSとか?
0432nobodyさん02/07/26 16:01ID:NvB7dZaP
すごいかぶったね。
0433nobodyさん02/07/26 16:01ID:hk7TA9Ju
http://js-web.cside.com/
0434nobodyさん02/07/26 16:02ID:???
>>426
それってhoge.txtを""でくくってないからとかいうオチでは?

例えばコマンドライン上から以下を実行するとOKはプリントされないけど

perl -e 'print "OK" if -e hoge.txt'

これはOKってでるみたいよ:

perl -e 'print "OK" if -e "hoge.txt"'

これまたuse strict;しないからそういうエラーがでるわけだ・・・
043542602/07/26 16:08ID:???
えっと、ftpでつないだときに表示されるディレクトリの一番上から記述したら
一応ファイルがあることは確認できました。
$a = "home/***/html/cgi-bin/hoge.txt";
if(-e $a){ print "OK"; } else { print "NO"; }
でOKでした。
で、renameしたいので、
$b = "home/***/html/cgi-bin/hoge2.txt";
rename ($a,$b);
としましたが、アクセス権が無いとエラーが出ます。
hoge.txtを777にしてもだめです。
ファイル演算子でアクセス権を確認すると全てOKでした。
なぜでしょうか。
043642202/07/26 16:10ID:???
>>429
sub BARみたいな使い方があるんですね。
初めて知ったことなので勉強になりました。
ありがとうございます。
>>430-431
最後に評価された式の値が帰るような書き方をすればreturnは別になくてもいいのですね。
>>434
そんな気がしました。
043742202/07/26 16:13ID:???
>>435
$a="hoge.txt";
$b="hoge2.txt";
rename($a,$b);
043842202/07/26 16:15ID:???
>>435
ごめんたぶん間違い。
043942202/07/26 16:16ID:???
$dir="hoge";
$dir$a
$dir$b
こうかな?
0440nobodyさん02/07/26 16:16ID:???
>>436
単一式のルーチンだったらreturnははしょってもいいと思うけど、
基本的には見易さとメンテの事を考えてちゃんとreturnを使用するのを
お勧めする
044142602/07/26 16:16ID:???
えっと、ディレクトリの一番上から書くというのは関係なかったみたいです。
で、
$a="hoge.txt";
$b="hoge2.txt";
rename($a,$b);
で試すんですけど、「Permission denied 」とエラーが出ちゃいます。
0442nobodyさん02/07/26 16:17ID:???
>>437
"home"の前にスラッシュが抜けてるとかいうオチではないだろうか・・・
044344202/07/26 16:18ID:???
間違った。>>435だった
0444nobodyさん02/07/26 16:18ID:???
>441
ディレクトリのパーミッション変えろ。
044542602/07/26 16:21ID:???
>>444
で、で、でで、出来ました。
755を757にしたら成功しました。
でも、勝手にパーミッション変えても平気なんでしょうか。
他の人のcgiファイルとかもあるんですけど。。。
044642202/07/26 16:22ID:???
>>440
returnは毎回使いことにしました。
ご教授ありがとうございます。
044742602/07/26 16:23ID:???
cgi-binのディレクトリのアクセス権を変えるのはなんとなく嫌なので
cgi-bin/mycgi/hoge.cgi
cgi-bin/mycgi/hoge.txt
と、cgi-binの中に専用のディレクトリを作って、mycgiのパーミッションを757にした時
cgi-binは755のままでも平気ですか?
0448nobodyさん02/07/26 16:25ID:???
>>447
調子にのるな! 聞く前に自分で試せ! 典型的なバカだなオマエは。
044942602/07/26 16:28ID:???
す、すいません!調子に乗りました!
自分で試します!!
0450nobodyさん02/07/26 16:30ID:???
>典型的なバカ
ワロタ
0451nobodyさん02/07/26 17:20ID:???
>>447
何を持って平気と言うか分からんが
そんなに心配ならcgi-binディレクトリのパーミスを400にでもしとけば?
■ このスレッドは過去ログ倉庫に格納されています