【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を見よう。
0623612
02/05/11 17:45ID:???文字列の "head:" と "abc." は固定です。"head:" は必ず、行頭に
1回しか出てきませんが、"abc." は色んなところで複数回出てきます。
"def" は固定ではないので >>615 の場合だと、"def" 以外の時は
機能しなくなってしまいます
0624nobodyさん
02/05/11 18:03ID:???勉強する気は無いんかと。()でグルーピングして * とか + とか {m,n} とか知らんのかと。
$hoge =~ s/(?:abc\.)+//;
0627nobodyさん
02/05/11 19:19ID:???0628しょぼいSE
02/05/11 19:32ID:QCHMLNRj他人様のホームページをインラインフレームで表示するときに、表示した他人様のページのスクロールバーを消す方法ってある?
CGIでできるかと思ったけど、方法がわからん(−−;
0630612
02/05/11 19:51ID:???> 勉強する気は無いんかと。()でグルーピングして * とか + とか {m,n} とか知らんのかと。
ありがとうございます。ほとんど昨日、今日perl始めたばっかりの房なので…
() って、$1 とかに突っ込む以外にも効果あるんですね。
?: が無くても期待する結果が同じなのが謎なのでその辺を自分で勉強します
0631nobodyさん
02/05/11 20:19ID:???完璧に見切れます、というのならともかく「ほぼ」じゃダメだろ。
そもそも完璧じゃなさそうなのだが。まあ>>629が真実なんだろうな。
0632nobodyさん
02/05/11 20:23ID:???それはHTMLとかCSSの仕事。
HTMLならscrolling="no"、CSSならoverflow: hidden;あたり。Web製作板へGO。
0634616
02/05/11 22:28ID:???0635nobodyさん
02/05/12 00:32ID:Kq9I9f0Mどうすればいいのでしょうか?
おしえてください。
0637nobodyさん
02/05/12 00:39ID:???6文字で。
my @word = (0..9,'a'..'z','A'..'Z');
my $rand = '';
$rand .= $word[int rand @word] for (1..6);
0639nobodyさん
02/05/12 00:47ID:???0641パルお
02/05/12 01:40ID:eZiXZjwU0642nobodyさん
02/05/12 02:08ID:???>いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
>
>1:自分はこう言う事がしたい。
>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ、良い回答は良い質問から。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
というわけで>>641 2:3:が無いよ、と言わせてもらって >>4に載ってるここ見た?
http://member.nifty.ne.jp/hippo2000/perltips/lwpcook.html#COOKIES
0643nobodyさん
02/05/12 03:52ID:???my $num = shift;
print "$num => ", unpack("C*", chr($num)), "\n";
255 => 255
256 => 196128
257 => 196129
なんでこうなるの?
0644nobodyさん
02/05/12 14:08ID:9L9P3cqpuse Any〜でのデータベース使用の準備の後、
dbmopen〜|die〜;
tie〜|die〜;
の両方が死にます。
WindowsMeではパーミッション666のDBMデータベース使えないのでしょうか?
それともPerl5を入れれば改善されるのでしょうか?
激しく既出だとは思うのですが…
0645nobodyさん
02/05/12 14:56ID:???がいしゅつ以前の問題だろ…。
何でも良いからマニュアルの演算子の項を見れ。
ちなみに、それだとあらゆるプラットフォームで確実に死ぬ。
0646645
02/05/12 14:59ID:???それならそもそもuseをした時点で死ぬだろ。
0647nobodyさん
02/05/12 16:08ID:4Ko6xKbIたまに無限ループを作ってしまうことがあります。
その時にPerl.exeを強制終了させたいのですが、タスクマネージャから落とそうとすると
アクセスが拒否されて落とす事が出来ません。
再起動すれば問題無いのですが、煩雑ですし、Perl.exeが走ったままで使いつづけるのも怖いので
解決方法があればお教え願いたいです。
0648644
02/05/12 16:26ID:???すみません。|演算子は||の書き込みミスです。
Perlは5かもしれません。よく分かりません。
一応、がんばって自力で途中まで調べました…。
use DB_File;
はどうなんでしょう?とりあえず帰ったら試してみます。
これでだめだったらどうしよう…。
0650664
02/05/12 16:46ID:???何をやっているか…標準クラスモジュールのスコープを使用可能にしているのでは?
Perlは5でした。結局、tieが通らないのが問題だと思います。
Perl附属データベースを優先的に使用するように指定できれば良いのでは…
と思ってはいるのですが…やりかたが…
0651nobodyさん
02/05/12 17:28ID:???やっぱり何やってるかわかってないじゃん。
つーか、「〜すれば良いのでは?」と思うなら勝手にそうしてください。
やり方がわからないならGoogleってください。
ここはあなたに相槌を打つスレじゃないので。
0652nobodyさん
02/05/12 20:41ID:???0653nobodyさん
02/05/12 22:30ID:???0654nobodyさん
02/05/12 23:20ID:???unpackは1Byteずつ処理。
どうもリストコンテキストで評価されてそんな数字になっているみたいだね。
chrはUTF-8の文字列を返しているみたいだけど… 詳しい方、解説キボン。
my $num = 256;
print "$num => ", join ', ', unpack("C*", chr $num), "\n";
print "$num => ", ord chr $num, "\n"; # chrの反対はord
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:???■ このスレッドは過去ログ倉庫に格納されています