【Perl】初心者コーナー Part12
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/04/27 23:17ID:1NNXdNspいらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
CGIの質問は【CGIだけどなんか質問ある Pert 6 】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【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を見よう。
0655nobodyさん
02/05/13 07:46ID:???動的変数作ってしまって、プログラム終了まで使われなくなった変数って
やっぱシステムリソース喰ったままなんですかね?
「もう、この変数は使わない〜」と思ったら、undef した方がいいの?
それとも、コンパイラが適当に判断してくれたりするんだろうか?
$a = "(・v・)";
$b = 12345;
{
# ここで $a と $b 使う。これ以降は使用されない
}
{
# 新たに変数 $c を割り当てる。しかし、$a $b が使われていないので
# $a $b 用の領域を使って確保される?(暗黙の undef とか?…)
$c = "( ゚д゚)";
}
0656nobodyさん
02/05/13 07:58ID:???-wとuse strict;とuse warnings;$|=1;も入れて可能な限りエラーをなくして見たりしてるんですが
なぜか
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
と
Use of uninitialized value in string eq(またはneとか==とか!=とか。) at C:\***.cgi line n.
というエラーは消えてくれません。
動作にはまったくこれといって支障ないですけど、なんとなく気になってた疑問なのでちょっと聞いてみました。
0657nobodyさん
02/05/13 10:50ID:???理由はメッセージに書いてあるじゃないか。変数は初期化しろ。
とわいえ、俺もこのwarningはウザイと思う場合もある。そん時はno warnings;〜;use warnings;ではさむ。
0659nobodyさん
02/05/13 16:13ID:e7rLHiwbmy $patch = system("diff file1 file2");
system ("diff file1 file2 >patch.diff");
print qq|$patch\n|;
これをまとめるのはどのようにしたらよろしいのでしょうか?
my $patch = system("diff file1 file2 >patch.diff");
print qq|$patch\n|;
では表示が 256 になってしまうので宜しくお願いします。
0660nobodyさん
02/05/13 20:22ID:???何がしたいのか分からないのでこの答えが妥当かどうかはわかりませんが
$patch = `diff file1 file2`;
0661656
02/05/13 21:29ID:???変数のところじゃなくて、
Use of uninitialized value in concatenation (.) or string at C:\***.cgi line n.
が出るのは
print <<"EOF";
の行なんです。これを指摘されるのは何でなんでしょう?
print <<"EOF";
〜
EOF
内で使われる変数は全部use var qw[$a $b 〜];というふうにあらかじめ書いてるんでが。
ヒアドキュメントになにか決まりごとでもあるんでしょうか?
0662nobodyさん
02/05/13 21:47ID:???宣言と初期化は違う。
宣言しただけだと変数の中身はundefだから、そんな感じで怒られる。
初期化(空文字列を代入するとか)をしておけばエラーは出なくなる。
0663656
02/05/13 22:55ID:???use strict;
use var qw[$a $b 〜$z];
$a=$b=$c=〜$z="";
{
print <<"EOF";
〜
$a
$b 〜
$z
EOF
}
とやってみましたが、やっぱりprint <<"EOF"; を指摘されます。別に問題なく動くということは
print <<"EOF";で出るUse of uninitialized value in concatenation (.) or string at C:\***.cgi line n.は
やっぱり意味の無いエラーなんでしょうか。
0664nobodyさん
02/05/13 22:56ID:S5I/8Zh9selectall_arryとかで値を抜き出す時に使う変数が理解不能です。
$@hogehoge とか $$_[1] って奴です
一応$_[1]とかは解りますが$@を会わせたり$$でjobid以外の使い方が今いち理解できません。
0666nobodyさん
02/05/13 23:13ID:???$patch = `diff file1 file2`;
open (FH, ">patch.diff");
print qq|$patch|;
print FH qq|$patch|;
0668nobodyさん
02/05/13 23:30ID:???途中で変数にundefが代入されたんだろう。
試しにprint文の直前でprintに関わる全ての変数に対して defined $z or $z = ''; してみれ。
0669nobodyさん
02/05/14 00:14ID:ZpKcImQq1ディレクトリ内のファイル数が多くなるとアクセスが重くなったり、サーバーに問題が起きたりするのでしょうか。
サーバーはファイルにアクセスするときに1ディレクトリずつ辿っていくとするなら遅くなりそうですが。
5000ファイルとかでも大丈夫でしょうか。
0670nobodyさん
02/05/14 00:21ID:???WinソフトならCPU使用率のグラフでも見ればいいんですが、サーバ上となると。
CGIスレで聞こうと思ったんですが、言語に依存しそうなのでこちらでよろしいですか?
0671nobodyさん
02/05/14 00:26ID:i98930LO0672nobodyさん
02/05/14 00:39ID:o5LDH6aT-d:DProf とか。
CGIなら
#!/usr/bin/perl -d:DProf
とかで。
0673670
02/05/14 00:55ID:???CGIのほうではエラーで起動できず、DOSプロンプト(WinME+Apache)のほうではなにも表示せず終了なのですが。
0674670
02/05/14 01:04ID:???ありがとうございましたm(_ _)m
…と言っても、そんなファイルは見つからない〜のw。
0675nobodyさん
02/05/14 01:21ID:???Perl内部ではメモリ開放されるだろうけど、OSには返されないだろ、
ってクックブックに書いて有ったきがする。つ〜わけで、システム
リソースは喰ったまま。スクリプトが終了した時点で全て回収
される。
ただmyを使用すれば、新たな変数宣言時に跡地が有効利用されて、
全体としてメモリ使用量が減る、ってことになるんですかね。
0676656
02/05/14 02:11ID:???>>668 どうもです。
とりあえずそれをやってみます。
undefってやっぱりPOSTから分解したときに対応している値が空だとundefが入っちゃうんでしょうか?
***.cgi?a=&b=123だと$a=$FORM{'a'};は中身はundefなのか''空なのかどっちになってるのかよくわかってないです。。
0677nobodyさん
02/05/14 03:03ID:???>POSTから分解したときに対応している値が空
その場合はundefじゃないと思うよ(空)。分からない時は
defined $FORM{'a'} ? print "定義済み〜\n" : print "未定義〜\n";
しちゃえば?
>>672
質問した者では無いんですが、良い事を教わりました。
0678nobodyさん
02/05/14 09:12ID:???0680nobodyさん
02/05/14 11:32ID:???abnormal termination...
0681nobodyさん
02/05/14 13:14ID:???0682nobodyさん
02/05/14 14:04ID:???http://www.perldoc.com
0683nobodyさん
02/05/14 14:27ID:cCd3d73ehttp://www.xxx.com/cgi-bin/bbs/
のように表示しようと思ったんですが、1つのスクリプトで.shtmlと.cgiを表示させようとすると.shtmlのときにContent-type: text/htmlが表示されてしまいます。
そこでヘッダーに
if($ENV{'SCRIPT_NAME'} eq 'xxx/cgi-bin/bbs/') {
print "Content-type: text/html\n\n";
}
とかいて可変型の出力をさせるとhttpdでは動いたんですが、サーバへ送るとエラーになります。
こういうことってできないんでしょうか。
宣伝をしたいんじゃないの?
0688nobodyさん
02/05/14 17:49ID:ggUNICfm宣伝ではありません。適当に書いただけです。
同じスクリプトをbbs.cgi(元のスクリプト)とindex.shtmlの両方で呼び出したいんですが、
if($ENV{'SCRIPT_NAME'} eq 'xxx/cgi-bin/bbs/bbs.cgi') {
print "Content-type: text/html\n\n";
}
と書くとエラーになってしまうんです。
ようするにbbs.cgiを読んだときにはContent-type: text/htmlを出力して、index.shtmlを読んだときにはContent-type: text/htmlを出力しないようにしたいと思って。
0689nobodyさん
02/05/14 18:40ID:IM/zSuxhif( $ENV{'SCRIPT_NAME'} =~ /bbs\.cgi/ ) {
print "Content-type: text/html\n\n";
}
としてみてはどうでしょう。
0690688
02/05/14 22:30ID:gZX6Mv2hうまく動きました。簡単でしたね(汗)
0691nobodyさん
02/05/15 07:19ID:???これを8バイトごとに区切って、
@sort に代入していくにはどうすればいいですか?
split 関数では区切り文字がないとダメなので…
区切り文字はなく、とにかく8バイトずつ区切りたいです。
よろしくお願いします
0692nobodyさん
02/05/15 07:33ID:???0693nobodyさん
02/05/15 07:33ID:???readで一定量づつ読み込んでからunpackで分割
0694nobodyさん
02/05/15 12:25ID:???@sort = <FILEHANDLE>;
これでもいけなかったけ。確かめてないけど。
# バージョンが低いとだめっぽいが
0695TO
02/05/15 15:52ID:+mZA1LnLフォームメールを使い会員宛に情報を送るCGIプログラムをテストしています。
PCやJskyでは無事メールは届きますがi-modeには届きません。
自分の携帯だけかなと思い、友人のi-modeに送ってみたが届きません。
ただしOUTLOOKなどのメーラーを使うと送ることは出来ます。
着信拒否の設定も何もしていないのに...
考えられる原因って何かありますか?
※独自ドメインをレンタルサーバーで運用しています。
一部のドメインからの送信が規制されているらしいという話を聞いたことある
0697TO
02/05/15 16:40ID:???共有型のレンタルサーバ使用で、
sendmailから送られるメールのMessage-Id:が
レンタルサーバ会社名なので、
もしかして他サイトが迷惑メールを送信したために
規制されてるのかな?うーん...
0698nobodyさん
02/05/15 22:07ID:DvGtt9Y8MLDBMについて詳しく説明しているページや
使い方を教えてください。
0699nobodyさん
02/05/15 22:09ID:???http://www.google.co.jp/
ここのフォームにMLDBMと書いてボタンを押すとお望みのページが出てきます。
0700nobodyさん
02/05/15 23:16ID:???use IO::File;
my @ary = IO::File->new('data.txt')->getline =~ /.{0,8}/g;
{ local $" = "\n"; print "@ary" }
>>694
perl5.005 より前だと使えないけど、今となっては問題ないような。
ちなみに、整数へのリファレンスでないといけない。
my $str = 'abc8defg8hijkl';
$/ = 8;
open my ($h), '<', \$str;
print "$.: $_\n" while <$h>;
$/ = \8;
open $h, '<', \$str;
print "$.: $_\n" while <$h>;
0701nobodyさん
02/05/15 23:26ID:hRG/E5t+sub foo {
my %hash = @_;
}
って正しい?
0702nobodyさん
02/05/15 23:42ID:???0703nobodyさん
02/05/16 02:38ID:I5/FxZ58下のコードをサーバ(version = 5.004_01)で実行すると、
uninitialized value警告が大量に出て、@aはソートされません。
でもローカル(version = 5.6.1)では警告無しでソートされるようです。
これはどうすればいいですか?
#!/bin/perl -w
# perl version = 5.004_01
use strict;
sub cmp($$);
my %h;
for (my $i = 1; $i <= 30; $i++) {
$hash{$i} = rand;
}
my @a = sort cmp (keys(%h));
print @a;
sub cmp($$)
{
my ($i, $j) = @_;
return ($i <=> $j);
}
0706nobodyさん
02/05/16 02:56ID:???CPANでも逝ってくれ。
窓用のActivePerlならactivestate.comへ。
……activestate[s]にして全然違うところへ飛ぶ罠にご注意(w
0707nobodyさん
02/05/16 09:05ID:????
別にむちゃくちゃってわけじゃないだろ。
何故こんな質問が出るのか少しばかり謎ではあるが。
>>703
Perl5.6以前ではsort用比較関数は$aと$bを参照しなけりゃならんのよ。
つまり
sort { $a <=> $b } @array;
とするわけだ。
# プロトタイプの設定で@_でも参照できるようにしたのは
# おそらく別パッケージでも簡単に動かせるようにする為だろうね。
ついでに、cmpはPerlの組み込みキーワードなんで
サブルーチンの名前にするのはやめたほうが無難かもしれない。
特に問題なく動いてるようだし、構わないのかもしれないが。
0708nobodyさん
02/05/16 21:25ID:???DB_Fileを使って、
-------------------------
use DB_File;
$DB_BTREE->{'flags'} = R_DUP;
my $d = tie %db, 'DB_File', 'data.db', O_RDWR|O_CREAT, 0600, $DB_BTREE;
if(my $count = $d->get_dup($key)){
print "key: $key ($count times)\n";
}
-------------------------
というふうに、データベースに指定したキーに対応するデータが
1つ以上存在する場合、その重複数を数えつつ処理したいのだけど、
このifの条件式に問題点はありますか?
0709nobodyさん
02/05/16 21:40ID:???ローカル環境でCGIデバグして、動いていたものがほんちゃん用の
鯖にうpしたらエラーだった…
telnetでコマンドライン実行した所、↓のコードがダメだった
# 駄目
delete $hoge[ $i ];
# OK
delete $hoge{ $i };
単なるコーディングミスなんだけど、なんでローカルの perl では
コンパイル通っていたんでしょうか?
0710709
02/05/16 21:57ID:???0711げ鬱
02/05/17 01:00ID:Yz0hLQt9どこがまちがっているのでしょうか。。。
ちなみにperl -CPAN -e shellで関係するモジュールはインストール済みです。
-----
#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
require 'jcode.pl';
my $ua = new LWP::UserAgent;
my $request = new HTTP::Request('GET', $ARGV[0]);
my $response = $ua->request($request);
if($response->is_success) {
$html_response= $response->content;
}else{
print $response->error_as_HTML;
}
0712げ鬱
02/05/17 01:00ID:Yz0hLQt9foreach (@html_response) {
if ($_ =~ m/name="?[^"]*"? value="?[^"]*"?/g) {
$data{'$1'} = $2;
}
if ($_ =~ m/NAME="?[^"]*"? value="?[^"]*"?/g) {
$data{'$1'} = $2;
}
if ($_ =~ m/NAME="?[^"]*"? VALUE="?[^"]*"?/g) {
$data{'$1'} = $2;
}
}
while(($key, $val) = each レta) {
push @key,$key;
push @val,$val;
}
$data1 = join(',',@key);
$data2 = join(',',@key);
&save_data;
sub save_data
{
$save_url = "./data.txt";
open(IN,">>$save_url");
flock(IN,2);
print IN "$data1\n$data2 \n";
flock(IN,8);
close(IN);
}
-----ここまで
0713厨房
02/05/17 03:50ID:bHXEkEom教えて下さい。
0714nobodyさん
02/05/17 04:09ID:???楽勝。
0715厨房
02/05/17 04:17ID:bHXEkEomご指導ご鞭撻、よろしくお願いします。
0716nobodyさん
02/05/17 11:12ID:kkxtU/zb「文字連結」ってどうやるの?
配列に入れて、joinするのはめんどいけど、
正規表現とかでやり方はないっすか?
0717nobodyさん
02/05/17 11:42ID:???ハァ?何が肢体のかワカラソ。
$catedstr = join "", $str1, $str2;
とか
$catedstr = $str1 . $str2;
のことじゃないよな?
0718nobodyさん
02/05/17 15:08ID:jYg7e4+R文字列の500文字目に"abcde"を入れるには
どういたら良いのですか?
0721nobodyさん
02/05/17 16:18ID:???0723時雨
02/05/18 22:28ID:T/2gJeJW0724nobodyさん
02/05/18 23:38ID:???掲示板のフラットボタン?こういうことですか?
<input type="submit" value="送信" style="border:solid 1px #000000">
これはスタイルシートつかってます。
Web制作板のCSSスレに載ってるサイト見て勉強してください。
0725nobodyさん
02/05/18 23:41ID:???たぶん平べったく見えるボタンの事だよね。それならスタイルシート。
border: 1px solid silver; とか。板違いなのでWeb製作板へ。
0726nobodyさん
02/05/18 23:41ID:???0727nobodyさん
02/05/19 01:22ID:AQpyLtDPsub a
{
my %hash = (a=>0,b=>1,c=>2) ;
return %hash ;
}
my %myHash = a() ;
こんな感じなんですけど、添削してくれませんか、ねた無しで・・・
0729727
02/05/19 01:45ID:AQpyLtDPレスありがとう御座います、確認不足でした。
うまくいけてました。
0730nobodyさん
02/05/19 08:13ID:???それはCGIの一部でローカルでテストする環境無いヤシが質問しているのか?
0731nobodyさん
02/05/19 12:20ID:fEY33UPf0734nobodyさん
02/05/19 16:04ID:Y5d1n8OFスクリプトを見られないように文字化けさせるやりかたがあるときいたのですが、
変換させる用にマクロメディアかマイクロソフトかで何かを
ダウンロードしてこないといけないと裏技の本に書いてあったそうです。
書店に本を探しに行ったのですが見つからず。もしご存じでしたら教えて下さい。
0735727
02/05/19 16:09ID:???自分の事?、
あるよ、Vine Linux2.?と、Slackware8、WinじゃCygwinも
自分の今回の確認ミスは、結果のハッシュ構造の確認をDumoer使っていたため、
リファレンス先のハッシュは問題無く表示されるけど、
直接ハッシュ指定すると正しく表示してくれないみたい、
常識?
0737nobodyさん
02/05/19 16:18ID:???0738734
02/05/19 18:53ID:81BFGvHeすみません。
おっしゃるとおりJavascriptのことです。
ソースのJavascriptを文字化けさせて、読めなくする方法だとききました。
わかりますでしょうか?
0739
02/05/19 19:02ID:2IiQOx1u情報お待ちしてます。
0740nobodyさん
02/05/19 19:11ID:???そこまでわかってんならスレ違い,というよりも板違い
0741nobodyさん
02/05/19 19:24ID:F0t0o3W7(WINのユーザー・FREEBSD上のcgi)
HPでデバックするため、
読み込んだファイルを
¥r¥nを¥¥rに書き換えて処理して、
¥¥rを¥r¥nに直して
改めてファイルに書き込んでいます。
1回目はちゃんと処理するのですが、
2回目以降、¥r¥nを¥¥rに書き換えて処理の部分が実行されていないようです。
書き換えられたファイルも一見何も変わってないようなものはないので
八方ふさがりになっています。
ファイルを書き込むときに
BSD上で¥r¥nが何かに変更されているとかしか考えられません。
そのようなことは起こりうるのでしょうか?
0742741
02/05/19 19:39ID:F0t0o3W70D0Aが、0A0Aに変わってしまっていました。
でも、
s/\\r/\r\n/ig;
してるんですよね。
何でだろう。
0743734,738
02/05/19 20:47ID:gBCciPdKあああ、すみませんでした!
今気付きました!
ここは[Perl]の初心者コーナーだったのですね。
「初心者」という部分しか目に入ってませんでした。
申し訳ありませんでした。
0745nobodyさん
02/05/19 21:01ID:???バックスラッシュと小文字の r ってこと?
なんでそんなことするのか理解に苦しみます。
0747nobodyさん
02/05/19 23:50ID:CPJQ1VYR@list=(102,105,111,205,245,250,297,312,322,456,473,479,482,499);
こんなかたちに分解したいんですけど
@list1=(102,105,111);#----------頭が1
@list2=(205,245,250,297);#------頭が2
@list3=(312,322);#--------------頭が3
@list4=(456,473,479,482,499);#--頭が4
出来るだけシンプルにやりたいなぁと思ったわけです。
で初心者の僕ががんばって考えたのは
$i=1
foreach(@list){
while($_ !~ /^$i/){#--$iの値を配列要素の先頭の数字とマッチするまで増やす
$i++;
}
push(eval("\@list"."$i"),$_);#---新しい配列「@list+$i」に配列要素を追加
}
というもので、当然というか配列と変数をくっつけるevalが
効かなかったんですよね。
なんかよい方法はないものかと。
いっぱい間違ってるかもしれませんが、簡潔な方法があればよろしくおねがいします。
0748nobodyさん
02/05/20 00:09ID:???for (@list) {
die 'あほ' unless(/^(\d)/);
push @{"list$1"}, $_;
}
0749747
02/05/20 00:49ID:dmmb40il大変短くして頂いてありがたいのですがエラーがでました。
スミマセン
0751nobodyさん
02/05/20 00:58ID:???@list=(102,105,111,205,245,250,297,312,322,456,473,479,482,499);
foreach (@list) {
next if !/^(\d)/;
eval sprintf 'push @list%s,$_',$1;
}
print @list1,"\n";
print @list2,"\n";
print @list3,"\n";
print @list4,"\n";
<>;
0752747
02/05/20 01:00ID:dmmb40ilpush @{"list$1"}, $_;
ココだけコピって使ったんですけどね
0753nobodyさん
02/05/20 01:01ID:???#!/usr/local/bin/perl
use IO::Socket;
use IO::Select;
@servers = ('www.zdnet.co.jp','www.asahi.com',);
print "Content-type: text/html\n\n";
foreach $server (@servers){
$socket = IO::Socket::INET->new(PeerAddr => $server,
PeerPort => 80,
Proto => 'tcp',
);
print $socket "GET /index.html\r\n";
print $socket "Host: $server:80\r\n";
$socket->flush();
print <$socket>;
}
これでページを取得出来るんですが、
ページを全部読み込んでしまいます。
これを一部のみ読み込むにはどうすればいいのでしょうか?
と、、、
print <$socket>;
これを変数にあてはめて表示するにはどうすれば、、、。
0754747
02/05/20 01:01ID:???■ このスレッドは過去ログ倉庫に格納されています