【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0588579
02/12/20 20:35ID:AHOklkZ9どうもありがとうございました。
私はIDにAHOと出るくらいアホなんで
こんなのもわからないんです。
0589579
02/12/20 20:41ID:AHOklkZ9print "<option " . $selected . " value=" . $data[1] . ">" . $out[0] . "\n";
}
あと、この部分は何のためにあるんですか?
0590nobodyさん
02/12/20 20:54ID:Av7thQVn特定のディレクトリのサイズを取得するためにはどうすればいいんでしょうか?
unixプログラムならduで一発なんですが
setuidなもんで外部プログラムがうまく動かないっス
0591nobodyさん
02/12/20 21:00ID:mZ5RE2AI>>540
よろしくお願いします、、
0592nobodyさん
02/12/20 21:09ID:???0593fg
02/12/20 22:02ID:1ptZgAGxthe errors. Depending on the server configuration, you can also run this script under CGIWrap
debugging. Usually, either rename or link the script temporarily to a file which ends with .cgid
extension, or add a AddHandler cgi-script-debug .cgi line to your .htaccess file
このエラーはいったいなんでしょうか?
解読出来ませんでした。
imgboard v1.22 R6 です。
0594571
02/12/20 22:32ID:???聞いて
0595571
02/12/20 22:32ID:???0599nobodyさん
02/12/20 23:34ID:???別に難しいことじゃない。
エラーの内容自体は最初の.までだ。
後はシステムからのありがたいアドバイス。
辞書ひけ。ヴォケ。
0600546
02/12/20 23:40ID:???冗長とか言って悪い。俺は心情的な富豪的プログラミングの信奉者なんで。
>>554の出したヒントにより、3行に集約できた。
open ( IN, 'file' );
%hash = grep { chomp } <IN>;
close ( IN );
ソースは短ければ短いほどいい。と思う。
0602546
02/12/21 00:14ID:???open ( IN, 'file' );
$eval = join ( '', <IN> );
close ( IN );
$eval = '%hash = qw('.$eval.');';
eval $eval;
これなら、途中で余分な改行が入ってたり、
改行のかわりにタブや半角スペースが入っていても問題なく読み込める。
ま、そゆことで。
0603nobodyさん
02/12/21 00:20ID:???$line = '谷口 腕太 タニグチ ワンタ 1977年生まれ';
@token = split / /, $line;
$line = "$token[0] $token[1]\,$token[2] $token[3]\,4token[4]";
print $line;
# 谷口 腕太,タニグチ ワンタ,1977年生まれ
これからは、こんな糞みたいなフォーマットで記録せずに、
最初からきっちり設計するんだぞ。
0604nobodyさん
02/12/21 01:00ID:???0605nobodyさん
02/12/21 09:46ID:???名前: 谷口, 腕太
フリガナ: タニグチ, ワンタ
生年: 1977
などというデータ仕込まれてパニックに陥るんだろうな。
0606nobodyさん
02/12/21 09:57ID:94hGjCxm入力されたsjisの日本語をcryptしてパスワードを発行することに
何か問題があるのでしょうか。
文字によってサーバーエラーになるとか、
文字によって暗号化したものにセキュリティホールが発生するとか。
文字の長さは同じです。
0607nobodyさん
02/12/21 10:47ID:???0608nobodyさん
02/12/21 11:08ID:???のポート80の部分ってどうやってわかるんですか?
$ENV{hoge}でしょうか?
0609544=547=550
02/12/21 11:21ID:???普通は、ポートスキャンするしかない。と思う。
Via:に入ってたりするかもしれないけど・・・
0610nobodyさん
02/12/21 11:31ID:QdhN2u6I0611お?
02/12/21 12:00ID:SSXanoCBSSIからCGIを呼び出したらクッキーの読み書きが出来ない問題もここでお聞きしてよろしいでしょうか?
単体では動くのですが、
execでCGIを呼び出すと引数が送れないので
include virtual="cgi-bin/xxx.cgi?yyy"
で呼んでます。
0614お?
02/12/21 12:51ID:???早速のレスありがとうございます。
色々WEBで検索をかけて無理そうだとは思ったのですが、スキルの高いこちらの方々なら何か力技でも無いだろうかと思いまして。
やはり無理ですか。ありがとうございました。
>>613
私は普段javaSc切ってますので出来るだけ使いたくないんです。
0615nobodyさん
02/12/21 16:42ID:???力技ていうなら<img>タグでクッキー発行する為だけの
イメージ吐いてみる。
0616お?
02/12/21 22:34ID:???ありがとうございます。
取りあえず別の方法で逃げました。
imgタグで呼び出すのも試したのですが、他の方のスクリプトを参照して真似ても、どうも正常に動かないので投げました。
まだまだ基本が出来てません。
ありがとうございました。
0617nobodyさん
02/12/22 01:52ID:???0618lopper
02/12/22 02:19ID:iYo7T5onEncode::JP には、
$euc_jp = encode("euc-jp", $utf8);
と書いてあるが、utf8 の文字列からしか変換できんのか?shiftjis 変換は
from_to( "shiftjis", "euc-jp", $strings )
をすれば出来るが、変換元文字コードを指定しなければならん。自動で判別して
文字コードを変換するにはどうさればいいのか?
0619_gunzip ◆eiH/XdoCNg
02/12/22 03:54ID:???use Encode::Guess;
---------------------------
#!/usr/bin/env perl
use strict;
use Encode;
use Encode::Guess qw[euc-jp shiftjis 7bit-jis];
my $jpstring = "日本語文字列";
my $utf8_string = decode("Guess", $jpstring);
my $encode = guess_encoding($jpstring, qw[euc-jp shiftjis 7bit-jis]);
0620lopper
02/12/22 13:08ID:dY2TGdd7Guess モジュールって $jpstring が短い文書の場合、判別つかずに
shiftjis or euc-jp
などと返してしまうのですよね。
たとえば上記を $jpstring = '結論' とすると判断がつかず
$encode の中身は 'shiftjis or euc-jp' が入ってきます。
やっぱりそういうものですか。
0621nobodyさん
02/12/22 13:38ID:y/X/HeeKif ((-M $lockdir) * 86400 > 600)
このような処理があります。
変数の前に-Mや-Eなどを見かけるのですが、検索が掛けられませんのでこれら-をつけた英字の総称(?)を教えてください。
0623621
02/12/22 14:02ID:???ありがとうございました。
検索を掛けても2件しかヒットしなかったですが、少し情報が入りましたのでなんとか自力で調べてみます。
ありがとうございました。
0625621
02/12/22 14:23ID:???ファイルテキスト演算子で検索していますた・・・
色々詳しく解説しているサイトを見つけましたのでゆっくり勉強します。
本当にありがとうございました。
0626りゅう
02/12/22 17:29ID:9RnyP9Mxgifのグラフィックカウンターを作りたいんですけど。
全然、先が見えてきません。
どなたかご教授よろしくお願いします。
サイトを検索してもSSIのやつがほとんどなんです。
(´・ω・`)ショボーン
0627nobodyさん
02/12/22 17:38ID:???http://www.kent-web.com/count/index.html
0628nobodyさん
02/12/22 18:11ID:???てキーワードで検索かけよう。
とほほさんのgifcat.pl使うと簡単
0630nobodyさん
02/12/22 19:57ID:???本にあったサンプルを記述して動かしてみたのですが、
何も表示されません。シンタックスエラーはないですし、
記述ミスもなさそうなのですが、windows環境では
走らないのでしょうか。
<目指す結果>
[ABCABC]
[WindowWindow]
<ソース>
while (<DATA>) {
chomp;
/ (\w{3}) (\w{3}) / && ($1 eq $2) && print "[$&]\n";
/ (\w{6}) (\w{6}) / && ($1 eq $2) && print "[$&]\n";
}
__END__
ABCABCDEFG
X-WindowWindows
0631nobodyさん
02/12/22 19:58ID:???HTTP-Lite
Time-HiRes
のインストール法がよくわからないんですけど
誰か教えてもらえませんか?
0632nobodyさん
02/12/22 20:03ID:???/(\w{3})(\w{3})/ && ($1 eq $2) && print "[$&]\n";
/(\w{6})(\w{6})/ && ($1 eq $2) && print "[$&]\n";
でしょ。/ /の中の空白には意味があるよ。
0633nobodyさん
02/12/22 20:09ID:???あああああ、本当だ…。
もしあのままの記述だと、空白がないとマッチしないという事に
なるのですね。なるほど。
レスありがとうございます。とても勉強になりました。
0634nobodyさん
02/12/22 20:30ID:???http://pc.2ch.net/test/read.cgi/php/1032704121/917 マルチ
0635nobodyさん
02/12/22 21:55ID:ICjO1mQtkill INT => $pid;したいんですが。
0636yumi
02/12/22 23:28ID:???0637nobodyさん
02/12/23 00:08ID:???systemは無理だろう。execならpidは代わらないからexecする前にpid取っとけ。
つーか、普通execする前にforkしたときに親の方で取っとく。
0638nobodyさん
02/12/23 00:36ID:3vP0jNwS「ActionScript+CGIプログラミング」(ソフト バンク)ではスレッド
を立てられないのですが、少なくともデザインだけはオリジナルに
したいです。どこかにいい資料はないでしょうか?
0639nobodyさん
02/12/23 01:21ID:cOyl9Q7wどうもうまくいきません。
open GZIP, "| /usr/bin/gzip -d";
print GZIP @compressed;
こんな感じで実行してみましたが
結果が標準出力に出力されて、受け取れないです。
どうしたらいいですか?
0640nobodyさん
02/12/23 01:27ID:???0641nobodyさん
02/12/23 01:38ID:cOyl9Q7wレスありがとうございます。
なるほど、ファイルを経由させれば簡単ですね。
ですが、ファイルを経由しないで、解凍結果を受け取りたいのです。
@compress -> gzip -> file
file -> gzip @decompress
これは分かるのですが
@compress -> gzip -> @decompress
このように処理したいのです。もう一つお願いします。
0642640
02/12/23 02:06ID:???パイプ "|" を使うと内部でフォークされて子プロセスの標準出力へ吐き出される
っぽい。。。
0643nobodyさん
02/12/23 02:12ID:cOyl9Q7w0644( _。。)_ バタ。 ◆eJlUd9keO2
02/12/23 10:28ID:???単純な「フォームから送られてきたGETデータ」で躓いてます。
<FORM METHOD="GET" ACTION="ans_check.cgi" TARGET="main_disp">
<INPUT TYPE="HIDDEN" NAME="question" VALUE="001">
Ans. <INPUT TYPE="TEXT" NAME="ans">番
<INPUT TYPE="HIDDEN" NAME="dummy" VALUE="ABCDEFGHIJKLMN">
<INPUT TYPE="SUBMIT" VALUE="プレゼント開封">
</FORM>
とした時(Ansには1234と記入・・・) $ENV{'QUERY_STRING'}の中身が
question=001&ans=1234&dummy=ABCDEFGHIJKLM
と、末尾1文字(たまに2文字)抜けてる時点でなんかヤバそうなのですが、さらに
このデータに対して
@buff = split(/&/, $ENV{'QUERY_STRING'});
とした際のbuffの中身が
buff[0] = 'question=00'
buff[1] = 'and=123'
buff[2] = 'dummy=ABCDEFGHIJKL'
とさらに末尾が1文字消えてしまっているのです……。
可能性…何が考えられるでしょうか? お力添えお願い致します。
0645( _。。)_ バタ。 ◆eJlUd9keO2
02/12/23 10:34ID:???さらに buff を = で split すると・・・
($key,$val) = split(/=/); の結果
$key='questio' $val='00'
$key='an' $val='123'
$key='dumm' $val='ABCDEFGHIJKL'
と今度は分割の先頭($key)が一文字抜ける……ワケわかりません。 T−T
0646nobodyさん
02/12/23 10:41ID:???ソースを示せ。
まずはそれからだ。
どうせchopかchompを入れちまってるだけだろう。
0647nobodyさん
02/12/23 11:05ID:???#!/usr/bin/perl
$pid = open P, '-|';
die unless(defined($pid));
if ($pid) {
このブロックで受け取る
while (<P>) {
print;
}
} else {
close P;
my $pid2 = open GZIP, '|-';
die unless(defined($pid));
if ($pid2) {
このブロックで書く
print GZIP <STDIN>;
} else {
exec 'gzip', '-d';
}
}
if ($pid) {
} else {
このブロックは
close P;
open GZIP, 'gzip -d' || die;
print GZIP <STDIN>;
でもよい。
}
0648( _。。)_ バタ。 ◆eJlUd9keO2
02/12/23 11:12ID:???Σ(゜д゜ ) PHPとちがって末尾1文字なんでも消すのかッ > chop
ごめん、私が悪かった。 せっかくの休みなのにマヂでごめん。
0651nobodyさん
02/12/23 13:42ID:???『=>』
これってどういう動作をする物なんでしょうか?
宜しければ教えて下さい。お願いします。
0652nobodyさん
02/12/23 13:46ID:???0653nobodyさん
02/12/23 14:14ID:???p 10 #=>10
print("こんにちは") #=>こんにちは
0654nobodyさん
02/12/23 15:27ID:UoY7N20E0655nobodyさん
02/12/23 16:01ID:???0656nobodyさん
02/12/23 16:19ID:3KeBindS今までずっとcount.cgiとかでそのままHTMLに数値を出力していたのですが、
<img>タグで呼び出すにはどうするんでしょうか?
count.cgiと呼び出すカウンターの違いはなんなんでしょうか?
どうかご教授お願いします。
0657nobodyさん
02/12/23 16:51ID:mDd0PRmu今までのcount.cgiは「文字」を返す。
画像の場合は、<img src="img_count.cgi">で呼び出す。
img_count.cgiは、画像(の中身)を返すCGI。(readしてprint)
こうすれば、ブラウザがHTMLを読んだ後に画像としてimg_count.cgiを取りに行く。
0658nobodyさん
02/12/23 17:31ID:???foreach(split(/&/,$i)){
/=/;
$in{$`} = $';
}
read(STDIN,$i,$ENV{CONTENT_LENGTH});
foreach(split(/&/,$i)){(
$key,$val) = split(/=/,$_);
$in{$key} = $val;
}
どちらが効率が良いでしょうか。
あんまり変わりません?
0659nobodyさん
02/12/23 19:16ID:???ヒントだけでもいいのでお願いします。
0660nobodyさん
02/12/23 19:25ID:???foreach(配列){
if(/xxx/でマッチしたら){その行を削除}
}
0661nobodyさん
02/12/23 20:14ID:???レスありがとうございます。
ループを使ってマッチしたら、その行を削除というのは分かるのですが、「その行を削除」の所が分からないんです・・・
while(@配列){
if($_ =! /zzz/){
push (@新しい配列,$_);
}
}
@配列 = @新しい配列;
こんな感じでしか思い付かないのですが、何かいい方法お願いします。
0662nobodyさん
02/12/23 20:30ID:???0663nobodyさん
02/12/23 20:43ID:???perl -w -e '%s = (a , 1); print $s{a};'
perl -w -e '%s = (a => 1); print $s{a};'
0664641
02/12/23 20:50ID:???そのように外部プロセスと通信するのですか。
手持ちのWindows環境だと、'-|'は(forkを使っているみたいなので)
動きませんが、UNIX環境で試した所、見事に動いてくれました。
それと調べた所、IPC::Open2という標準モジュールでも
外部プロセスとの通信ができるようで、こちらを使うことにしました。
わざわざサンプルコードまで付けて頂き、ありがとうございました。
謎が一つ解けました。。
0665nobodyさん
02/12/23 20:51ID:???それで悪い理由は何?
=!の部分がわけわからんけど。
0666nobodyさん
02/12/23 20:54ID:???速度を軽視するのは良くないが、だからと言って、自分に不相応な高速化に挑んで安定性や保守性がなくなっては意味がない。
高速化のコードを教えられても、自分で保守しきれないと思ったら、自分でわかるやり方に戻すのも利口な人間の判断だよ。
プログラミングはタイムトライアルじゃないんだから。
0667nobodyさん
02/12/23 21:11ID:???0668659
02/12/23 22:00ID:???ありがとうございます。
その方が僕のよりかなり良さげですね。
>665
=!じゃなくて!=でした。
何か配列を無駄に出し入れしている気がしたので。
0669nobodyさん
02/12/23 22:08ID:???0670nobodyさん
02/12/23 22:40ID:ty3RFcqjその選択した結果をb.cgiに送りb.cgiで結果を表示、ファイルに書き込み
をするということができています。
これをa.cgiで選択したものをa.cgiに送り表示、ファイルに書き込みさせたいのですが
どうやらhiddenという、コマンドをもちいて
1回目と2回目のページの閲覧を場合わけすればできるみたいなんですが
どうやればいいのですか?
<INPUT type="hidden" name="action" value="write">
こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
0671nobodyさん
02/12/23 22:44ID:ExE7e9sR0672nobodyさん
02/12/23 23:12ID:???> <INPUT type="hidden" name="action" value="write">
> こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
書き込みフォームのなかにこれを入れておくと、CGI側では他のフォームと同じように
$in{action} という感じで値が取り出せる。(この場合、中身はもちろん write)
ただ単にCGIが呼ばれただけだと $in{action} の中身は空。
これをCGIの冒頭で判断して、表示だけするなり書き込みするなり処理を行う。
ちなみに"action"と"value"の部分は、他の name の中身と重複しなければ
好きな文字列でいいよ。
0673nobodyさん
02/12/23 23:14ID:/nqoyrjh0675670
02/12/24 01:03ID:o+cSQN2k$in=$form{action};
if($in eq "write"){
&write_file;
}
<FORM METHOD="POST" ACTION="a.cgi">
<INPUT TYPE="submit" VALUE="実行">
<INPUT TYPE="hidden" name="action" value="write">
こんな感じでやれば、ただページを閲覧した1回目の時は何もしないで
フォームを選択した2回目のときはifの中の&wite_fileを実行するってことでよいですか?
0676nobodyさん
02/12/24 01:32ID:???微妙に甘い。それではwriteがあった場合、
write_fileが実行されるが、その後で本来の表示もされる。
if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
exit;
この方がよかないか?
0677670=675
02/12/24 01:57ID:o+cSQN2kread(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$cgi_url = './hid.cgi';
$in=$form{action};
if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
print "Content-type: text/html\n\n";
print <<"END";
<FORM METHOD="POST" ACTION="$cgi_url">
<tr><td align=right>選択<br></TD><td align=left>
<select name="box"><option><option value="1">yes<option value="0">no</select></td></tr><br>
<INPUT TYPE="submit" VALUE="実行">
<INPUT TYPE="hidden" name="action" value="write">
END
sub write_file{print "2回目ですね<br>";}
sub read_file{print "1回目ですね<br>";}
exit;
これだとできないんですけどなぜですか?
0678nobodyさん
02/12/24 02:03ID:???>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ。
>良い回答は良い質問から。一緒に勉強しましょう。
0679nobodyさん
02/12/24 02:28ID:???HTTPヘッダ吐く前にprintしたらいかんだろう。
print "Content-Type: text/html\n\n";
をif の前に置く。
0680nobodyさん
02/12/24 10:42ID:???アホを怒ったりはしないが自分で努力せずに「聞きゃいいや」って考え方に
教える気力を奪われる
>>589 はどういう場合に実行されるか考えれば貴方にとって必要か不必要か
判るはず。アホを自慢せずに自力で考えましょう
0681nobodyさん
02/12/24 16:14ID:V710Vuw6rindexって便利そうなのですが、
1バイトずつ戻ってくれるのでしょうか。
頭から調べなおすのでしょうか。
0682nobodyさん
02/12/24 21:26ID:0ZCnncs6eval "use $module";
と書いてみました。
しかし、useとevalでぐぐってみてもヒットしません。
不安なので、ベターな方法を教えてください。
0684nobodyさん
02/12/25 00:41ID:???use Module LIST
use Module
Imports some semantics into the current package from the named module,
generally by aliasing certain subroutine or variable names into your package.
It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
0685nobodyさん
02/12/26 02:12ID:wZ43brtnっていうのは使えませんかねぇ。
0686685
02/12/26 02:53ID:wZ43brtn実は685を書き込むまで参照を知りませんでした。
cのポインタみたいに理解しているのが間違いなのだろうか…?
$i = 774;
$ip = \$i;
$$ip++;
if( fork() ){
while(1){
print "親:$$ip\n";
$$ip++;
sleep(2);
}
}else{
sleep(1);
while(1){
print "子:$$ip\n";
sleep(2);
}
}
■ このスレッドは過去ログ倉庫に格納されています