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

【Perl】初心者コーナー Part15

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/08/08 23:19ID:???
いらっしゃーい、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あたりを見よう。
075674602/09/08 13:26ID:???
>>755
いえ、していません。必要なのでしょうか?
075774702/09/08 13:30ID:???
>756

nameなどのデータを入力
↓
入力されたデータを受け取る
確認画面表示
↓
入力されたデータを送っていない
データが空っぽ
0758nobodyさん02/09/08 13:44ID:???
>>754
>gotoなどと言ってみるテスト。
( ´,_ゝ`) プッ
075974602/09/08 14:01ID:???
hiddenで書き出しても、うまく送信できません。
なには他に注意点はあるのでしょうか?
荒らしてゴメン。
0760nobodyさん02/09/08 14:04ID:???
>759
ソースをtxtにしてアプれ。
多分一斉につっこんでくれる。
0761nobodyさん02/09/08 14:08ID:???
>>759
HTMLを覚えてこい
データの送受信を覚えてこい
日本語覚えてこい
0762761?02/09/08 14:11ID:???
htmlファイルへの書き込みのときに現在は下のようにしているのですが
これだとhtmlファイルを見ると\nが効いて改行されているのですが
cgiファイルでは改行されていないので見にくいです。
ヒアドキュメントを使って print HTML <<HEADER ではだめでした。
どうしたらよいでしょうか?

open(HTML, ">hoge.html") || &error("ファイルが開けません");
print HTML "<HTML>\n<HEAD>ここにタイトルやスタイルシートなどをごちゃごちゃと</HEAD>\n<BODY>\n";
close(HTML);
0763762?02/09/08 14:17ID:???
説明する能力って大事だよね
076474602/09/08 14:25ID:???
もういいです。さいなら。
0765nobodyさん02/09/08 14:29ID:???
print pack('C*', map{$_+180}(1,27,0,35,23,27,12,42,17));
0766nobodyさん02/09/08 14:29ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0767nobodyさん02/09/08 14:45ID:971QY8yx
a.sh(sh)で定義した変数をperlで書いたスクリプトで参照したいのですが
どのように書いたらよいですか?

a.sh
#!/bin/sh
STR=testtxt
↑
(このSTRという変数をperlのスクリプト内で使いたい)
0768nobodyさん02/09/08 14:52ID:???
-- test.sh ------------------------------
#!/bin/sh
export STR=mona
/usr/bin/perl test.pl

-- test.pl ----------------------------
#!/usr/bin/perl
print "STR = $ENV{STR}\n";
0769nobodyさん02/09/08 16:11ID:QxRWekvC
他人がWindowsで作成したiモード用のcgiを直すことになったのですが、
iモード用作成は初めてで、
しかもMacなので、どうやってテストすればいいか分かりません。
iモードツールみたいなもののMac版ってないですかね?
教えて下さい。
0770nobodyさん02/09/08 16:27ID:???
マルチ氏ね
0771nobodyさん02/09/08 16:30ID:fnlZSMGR
GoogleのクロールにCGIの実行結果を反映させるには、どのような点に注意すればいいですか?
0772nobodyさん02/09/08 21:22ID:???
>>771
どうやらGoogieは、「〜.cgi」で終わってるリンクは無視するけど、
「〜.cgi?***」となってるリンクは拾う模様。
***の部分はテキトーで構わないので、Googleに拾って欲しければ
そのCGIへリンクを張る時に、「<a href=〜.cgi?hoge>」とでもしておけばよし。
まぁ俺調べに過ぎないのでダメだったらすまそ。
つってもスレ違いぽいけど。
0773nobodyさん02/09/08 21:42ID:???
>>762
open(HTML, ">hoge.html") || &error("ファイルが開けません");
print HTML "<HTML>\n";
print HTML "<HEAD>ここにタイトルやスタイルシートなどをごちゃごちゃと</HEAD>\n";
print HTML "<BODY>\n";
close(HTML);
0774nobodyさん02/09/08 22:08ID:wn4ctmfO
Proxyをはじくものを作りたいんですが、どうやったら判別できますか?
0775適当02/09/08 22:12ID:???
>>774
if(!$ENV{'HTTP_HOST'}){
print"カエレ";
exit;
}
0776nobodyさん02/09/08 22:13ID:???
>744
漏れ串くらいしか無理。
A串は無理。
診断君でも見てな。
0777nobodyさん02/09/08 22:13ID:???
既存のものを見習え。
077877502/09/08 22:18ID:???
HTTP_HOST>REMOTE_HOST
077974102/09/08 22:19ID:gqIGmvuo
鬱。
0780nobodyさん02/09/09 00:56ID:ocbC3C/Q
copal2の構文チェックってどうやるの?
0781nobodyさん02/09/09 01:41ID:ewVE42mB
はじめまして
初心者なのでよろしくお願い致します

CGIを単独で実行できるEXEにするようなツールはありませんか?
postやgetで受信した変数を判断し、ローカルでそれっきりで動くもの
そういうものはありませんか?
0782nobodyさん02/09/09 01:47ID:???
CGIってのが、PerlならPL2EXEとか。
0783Rikuta02/09/09 01:50ID:4uRhXRlu
掲示板を作成しています。
長くなったタイトルや、URL表記を途中まで取得し、
残りを「....」としたいのですが、正規表現ではどうするのでしょうか。
@subject = split(//,$subject);
@subject = splice @subject,0,40;
undef $subject;
foreach (@subject){
$subject = $subject.$_;
}
print $subject;
としたのですが、当然というか・・・日本語では化けてしまいます。
Jperlを使用しないでどうすればよいでしょうか。
0784nobodyさん02/09/09 01:52ID:ewVE42mB
782>>
ありがとうございます
試して見ます
078574102/09/09 02:12ID:2XJWXXjE
鬱。ダレモコタエテクレナイヨー
078674102/09/09 02:49ID:2XJWXXjE
チョトIDガカコイイカモ
0787nobodyさん02/09/09 03:05ID:???
>>783
$subject =~ s/([\W])/sprintf("%%%02X",unpack("C",$1))/ge;
078878702/09/09 03:07ID:???
↑URLエンコードしてしまう
0789nobodyさん02/09/09 03:08ID:EyAemdpt
>>783
$n = 40;
$subject = substr($subject,0,$n+1);
$tmp = chop($subject)."\0".$tmp while($subject);
$tmp =~ s/(?<=[\x81-\x9f\xe0-\xfc])\0(.)\0/$1\0\0/g;
$subject = substr($tmp,0,$n*2).'....';
$subject =~ tr/\0//d;
print $subject;

>>741
読み込みオープンのロックは1。それも他の書き込みに対するロックなので
読み込みには無力。
書き込みで開いてロックしときな。
079078302/09/09 03:18ID:???
>>787
表示上で使用しますので、エンコードはちょっと・・・

>>789
ありがとうございます。
うまくいきました。
0791nobodyさん02/09/09 03:26ID:???
>>790
エンコードして切ってデコードって言いたいんじゃないの?こんなふうに。

$n = 40;
$subject = substr($subject,0,$n+1);
$subject =~ s/([\W])/sprintf("%%%02X",unpack("C",$1))/ge;
$subject = substr($subject,0,$n);
$subject =~ s/(%[a-f\d]|%)$//i;
$subject =~ s/%([a-f\d]{2})/pack("H2",$1)/egi;
print $subject;
079279102/09/09 03:42ID:???
あ、これじゃエンコードしてる意味無いね(;´Д`)
0793nobodyさん02/09/09 03:43ID:PULoisdM
空行は/^$/にマッチするのは分かるんだけど
空行を削除するにはどうしたらいいんですか?

あたりまえだと思うけど
while(<STDIN>){
s/^$//;
}
としても駄目なんです。。
0794nobodyさん02/09/09 04:47ID:???
>>793
@line = <IN>;
$n = @line;
for($i=0; $i<$n; $i++){
if($line[$i] eq "\n"){
$line[$i] = '';
}
}

かな…?
0795名無しさん@Meadow02/09/09 05:44ID:???
>>793
print unless /^$/;

で逝けますYO

0796T女の竹田02/09/09 07:59ID:???
>>783
Shift-JIS
$subject = ($subject =~ /([\x0-\x7e\xa0-\xdf]|[\x81-\xbf\xe0-\xfc][\x40-\xfc]){40}/s) ? $& : $subject;

EUC-JP
$subject = ($subject =~ /([\x0-\x7e]|[\x8E\xA1-\xFE][\xA1-\xFE]){40}/s) ? $& : $subject;

これでどうかな?
0797nobodyさん02/09/09 09:52ID:OPX6Zz9+
ド初心者なんですがスマソ
パスワードが違ったらはじくのを作りたいんですが正しく動作しません
どこをどう直せばいいでしょうか?

if ($pass != xxxx){
print "aho";
exit;
}
0798nobodyさん02/09/09 10:05ID:???
>>797
eq
0799nobodyさん02/09/09 10:16ID:OPX6Zz9+
>>798
パスワードが違ったらahoと表示させたいんですよ
eqだと合ってたらahoですよね?
0800 ◆JAPH9PWA 02/09/09 10:26ID:???
>>799
そこまでわかってて何故neにたどりつけないのか謎
ちなみにパスワードは暗号化したほうが良いよ
0801nobodyさん02/09/09 10:41ID:OPX6Zz9+
>>800
neでやっても500Internal...がでてきちゃうんですよ
0802nobodyさん02/09/09 10:54ID:OPX6Zz9+
言い方がまずかったですね

passが違う場合にif内を実行したらcgiを終了させるものを作りたいんですよ
(passが合ってるならifより後を実行)
0803 ◆TpctYDQ6 02/09/09 10:56ID:YALFpbWA
if ($pass ne "xxxx"){
print "aho";
exit;
}
で、エラーなら問題は別のところでしょ。
0804nobodyさん02/09/09 11:04ID:OPX6Zz9+
>>798-803
print "Content-type: text/html; charset=EUC-JP\n";
を加えたら正しく動きました。スマンコ
首釣って逝ってきます。
0805nobodyさん02/09/09 19:03ID:???
>>804

やっぱりただのバカか
0806nobodyさん02/09/10 01:33ID:???
>>794,795
その方法でいけました。
ただ、
while(<STDIN>){
s/hoge/hage/;
s/omeko/sasete/;
print;
}
みたいな置換と一緒に空行を削除したい
場合はどうすればいいの?
ifをネストすればいけると思うんだけど
書けないので教えてください。
0807適当さん02/09/10 06:52ID:???
>>806
while(<STDIN>){
if($_ ne"\n"){
s/hoge/hage/;
s/omeko/sasete/;
print;
}
}
0808nobodyさん 02/09/10 12:40ID:???
質問があります。
今日が、その年その月の第何週何日目か?
を求める方法を教えて下さい。
例えば今日の場合、第2週の3日目なので
出力結果を23と得たいです。
お願いします。
0809名無しさん@Meadow02/09/10 12:47ID:???
>>806
while(<STDIN>){
next if /^$/;
s/omae/bakaka/;
s/omae/ahoka/;
print;
}
でもええよ。
0810nobodyさん02/09/10 12:59ID:???
>808
($sec , $min , $hour , $mday , $mon , $year , $week) = localhost(time);
print (int($mday/7)+1)*10 + $week ;
0811nobodyさん02/09/10 12:59ID:???
>810 =~ s/localhost/localtime/;

∧‖∧
0812nobodyさん02/09/10 13:02ID:???
>810
それだと2-6日は必ず第1週になるよ…
0813nobodyさん02/09/10 13:29ID:???
0814∧‖∧02/09/10 13:46ID:???
>812
仕様書の意味取り違えてました。

($sec , $min , $hour , $mday , $mon , $year , $week) = localtime(time);
print (int(($mday+8-$week)/7))*10 + $week;

かな?
0815T女の竹田02/09/10 19:32ID:???
カレンダーとかかな?
>>808を読むと日曜が始まりみたいだけど、それなら

($sec , $min , $hour , $mday , $mon , $year , $wday) = localtime(time);
として、

第何週かは
int(($mday + 12 - $wday) / 7)

何日目かは
$wday + 1

だと思う。たぶん…
0816nobodyさん02/09/10 20:37ID:???
>>810
>>815
ランダムに日付を変えて何度かテストしてみても
期待通りの結果が得られて大丈夫でした。
ちなみに、利用するのは
いつも巡回する複数サイトの一部記事を
引っこ抜いて表示させるものです。
新しく追加するサイトのファイル名が
今回質問させていただいたフォーマットでした。
ありがとうございました。
0817nobodyさん02/09/10 21:40ID:ApnEpI8H
Perl 5.6.1、Vine2.5で勉強してます。プログラミングはPerlが初めてです。
リャマ本第2版、P172の問題2が分かりません。
題意は、Unixのmvコマンドと同じ働きをするプログラムを書け、
という内容で、ヒントとして、第2引数がディレクトリの場合も考慮せよと。

で、漏れの解答はこんな感じです。変数の名前、正規表現の
区切り文字は末尾の解答例に合わせてます。

($old, $new) = @ARGV;
if (-d $new){
$basename = $old;
$basename =~ s#^/.*/##g;
$new = $new . "/$basename";
}
rename($old, $new) or
die "Cannot rename $old to $new: $!";

一応は思った通りの動きをします。メデタシ。

ところが、解答例は、4行目が以下のようになってる。
($basename = $old) =~ s#.*/##s;
勿論、こちらも思った通りの動作をしますです。
かっこは、漏れの解答での3行目と4行目を合体させてだけなので
無視するとして、よく分からないのは、右辺です。

1) s/ は置換だけど、後の/sは一体何?
2) .*/ だと、頭の/が残るような気がするんだけど。。。

なんでだろう。。。?

0818nobodyさん02/09/10 21:44ID:Lqs0IC/U
http://yahooo.s2.x-beat.com/
081981702/09/10 21:45ID:ApnEpI8H
自己レスですが、(2)は、たった今、自分の書いたのをみて分かりました!
ルートディレクトリの「/」も 「.*/」で、「.」にマッチするやん!
ってゆーか、これだと、
# test.pl aaa ~/bbb
の場合、エラーになるよね?
ニョロがマッチしないから。。。

で、1)の方は、おながいします。

0820nobodyさん02/09/10 21:45ID:???
>>817
1)については
ttp://namazu.org/~tsuchiya/perl/info/perl-ja_44.html#SEC44
082181702/09/10 21:59ID:ApnEpI8H
>>820サン、ありがとうございます。

ははぁ、なるほど!
文字列を単一行として扱う、ということですね。
だけど、この問題の場合、こんなオプションが必要なのでしょうか?
勘違いしているかもしれないけど、漏れの理解では、深いディレクトリ
を処理すると、引数が複数行になってしまうことがあるかもしれないので
sをつける、と思ってるのですが、この考えによると、普通mvするとき
引数に改行なんか入れないですよね?
そもそも、んな深いディレクトリを掘ることってあまりないので、
今まで思いもよらなかったし、そもそもmvコマンドで引数に改行
入れてもいいのかどうかも分からん。。。

0822nobodyさん02/09/10 22:32ID:???
いくら長くても一行だと思うが。
0823nobody02/09/11 02:17ID:Zh9eBVFz
”どこが間違っているのかわかりません”的なものじゃないんだけど

crypt関数の使い方で聞きたいことがあります。

(例)
print "文字列を暗号化します。適当に文字をいれて下さい\n";
$get = <STDIN>
$key ="sp";
$pass = crypt($get,$key);
print "暗号化された文字列は$passです\n";

この$keyの部分は任意の二文字を入れるんだけど
それってどういう意味があるんでしょうか?
これによって暗号化される結果などが違ってくるのでしょうか??。
特に意識することではないんでしょうか?

0824nobodyさん02/09/11 02:21ID:???
>>807>>809
親切にありがとう。
微妙に本にかいてなかったので助かりました。
0825nobodyさん02/09/11 02:41ID:???
>>823
>結果などが違ってくるのでしょうか
全然変わる。
0826nobodyさん02/09/11 03:06ID:???
>>823
そんなの、それを実行してみればすぐに解りそうなもんだが?
0827nobodyさん02/09/11 03:13ID:???
(`Д´)
0828nobodyさん02/09/11 12:43ID:???
PERLでURLを指定してそこのソースを取得する方法を知っている方、
どうかおしえてつかーさい。
0829nobodyさん02/09/11 12:58ID:???
>828
「LWP」で検索。
0830nobodyさん02/09/11 13:13ID:l0g0P0Oz
ライブラリを読み込む際、いちいちrequire **.plってかかなきゃダメでつか?
7枚くらい読みこまなきゃいけないんですけど長ったらしくて。
0831nobodyさん02/09/11 13:17ID:???
>>830
>ダメでつか?
>7枚くらい
( ´,_ゝ`) プッ
0832nobodyさん02/09/11 14:44ID:???

 馬 鹿 ば っ か し だ な(藁





おれをふくめてな。
0833nobodyさん02/09/11 15:06ID:???
「オ・・・ッ  オクッ・・
オクレ兄さあああああああああああああああんッッッ
0834名無しさん@Meadow02/09/11 16:09ID:???
>>830
別ファイル(仮にloading.plとする)に
require "a.pl";
require "b.pl";
.
.
.
って書いといて、本ファイルでは
require "loading.pl";
だけで逝けるよ。
さすがに、require "a.pl", "b.pl" ...;はだめでしょ。


0835nobodyさん02/09/11 17:07ID:???
>>834
ナルホド。
>require "a.pl", "b.pl" ...;
はい。ダメですたw
ありがとござました。
0836nobodyさん02/09/11 18:55ID:???
改行だとわかってるときはchompよりchopのほうがいいの?
0837nobodyさん02/09/11 18:59ID:???
\r\nも\nしか削らない<chop
byとほほパパ
0838nobodyさん02/09/11 20:31ID:ofaOgNiv
初心者なんですが、変数から特定の文字列を探す方法ってないですか?
すまそ。教えてください。
0839nobodyさん02/09/11 20:32ID:???
>838
index

後は検索しる。
0840nobodyさん02/09/11 20:39ID:ofaOgNiv
>>839
indexって何番目にあるかを検索するだけですよね?
どうやって使うのかが分からないです。
0841nobodyさん02/09/11 20:45ID:???
>840
特定の文字列を探したかったんでしょ?
使い方は検索しる。

文字列を探して抜き出してどうこうしたいってなら、
substrを使うとか、indexを使わず正規表現に頼るとか。
後は検索しる。
084283902/09/11 20:48ID:ofaOgNiv
>>840
使い方何となく分かりました。ありがとう!
0843nobodyさん02/09/11 21:12ID:???
ユーザー関数を定義する事ってできますか?
0844名無しさん@Meadow02/09/11 21:48ID:???
ユーザー関数を定義しる:
ユーザーが作ったサブルーティン、ライブラリ、モジュール。
(反対語:)組み込み関数

ユーザー定義を関数にするんじゃないか?
0845nobodyさん02/09/11 21:49ID:wdtzvpz4
できます。
0846nobodyさん02/09/12 02:13ID:???
>>837
>\r\nも\nしか削らない<chop

\n について勉強したほうがいいよ
084784702/09/12 14:36ID:???
$syu =~ s/<br>/\r\n/g;
$value =~ s/<br>/\r/g;
$value =~ s/<br>/\n/g;
このようにフォームデータを変換するのと逆に、
すべてのOSの改行文字に対応して、改行を<br>に変換することはできますか?

フォームのtextareaのvalue=""にログを入れたいのですが。
084884702/09/12 14:37ID:???
一行目の$syuは$valueの間違いです。
0849nobodyさん02/09/12 14:42ID:???
出来ない。
つーか、\nで十分。
085084702/09/12 14:45ID:???
>>849
分かりました。
0851nobodyさん02/09/12 17:28ID:???
for($NUM = 0; -e "$NUM.jpg" == 1; $NUM++){

print "<a href=\"$NUM.jpg\">$NUM</a>";

}
としたのですが、上手く動きませんでした。
For文は
for(NUM =0; ここの条件が成り立ってるとき動作する; NUM++)
こういう事ではないのでしょうか?

while文で
while(-e "$FileAddress$NUM.jpg" eq "1")
こうしたらできたのですが・・・
085285102/09/12 17:34ID:???
ファイルが連番で[1-20].jpgである場合、

-e でファイルが存在を調べるか、
readdir で一覧を取得するか どちらかを考えたのですが
どちらの方が効率が良いと思うでしょうか?

ご教授頂けないでしょうか、お願いいたします
0853nobodyさん02/09/12 17:51ID:???
Benchmark.pm で調べれ
0854>>84702/09/12 18:16ID:???
$syu =~ s/\x0D\x0A/<BR>/g;
$syu =~ s/\x0D/<BR>/g;
$syu =~ s/\x0A/<BR>/g;

>>847
この産業で出来るぞ。

0855nobodyさん02/09/12 18:18ID:???
>>854
<BR> を改行に変換したかったんじゃないのか?
■ このスレッドは過去ログ倉庫に格納されています