【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を見よう。
一部のドメインからの送信が規制されているらしいという話を聞いたことある
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:???0755747
02/05/20 01:05ID:???でもよーわからん、、、
ノートに書き写して後でゆっくり考えてみます。
ありがとう!
0756nobodyさん
02/05/20 01:11ID:???0758741
02/05/20 05:06ID:VDOXGDf5実際、\r・\r\n(あと\t)がどのような状態で入っているのか
cgiのコンソールで書かせて、HPに表示させるためです。
ただ長いスペースが空いているのではわからないので、
表示できる形に直しているのです。
>>746
そのとおり。XMLソースを加工しています。
問題をはっきりするため、読みこんだ$ファイルを
$a=~s/\r\n/\\r/ig;
$a=~s/\t/\\t/ig;
##デバック
$a=~s/\\r/\r\n/ig;
$a=~s/\\t/\t/ig;
して書きこんでいるだけなのですが、
書きこみ前と後のXMLファイルをVCでバイナリで開いてみると、
どうやら0D0Aが0Aに変わってしまっているようなのです。
何が問題なのでしょうか?
0759関係ないけど
02/05/20 05:30ID:???s///になんでiを付けてるのでちゅか?
デバッ ク ってなんでちゅか?
<pre>じゃだめでちゅか?
表示させるために置換したものを、なんで再びファイルに書くのれちゅか?
0760あとね
02/05/20 05:36ID:???0762とんちんかん
02/05/20 14:27ID:827vrQS8してるんですが、ちょっとした理由でこのログ ファイルが Unicode 形式になってしまいまいた。
でこのスクリプトで読み込んでみたら案の定白紙のテキスト ファイルを作ってくれました。
Perl で UCS2 のファイルの読み書きってできるんでしょうか?
Jcode.pmとかって使うんですか?
教えて君ですみません。
0763nobodyさん
02/05/20 16:08ID:???yes.
0764nobodyさん
02/05/20 20:31ID:???例えば
a==bで尚且つcの場合"あいうえお"を返す。a==bで尚且つcで無い場合"アイウエオ"を返す。
a==bでなかったら"123"を返す。それ以外は"---"を返す。
それで
if(a==b){if(c){z="あいうえお"}else if{(c){z="アイウエオ"}
}
else if{(a!=b){z="123"}
}
}
else{z="---"}
だと、当たり前のようにエラーになります。教えて君ですみませんが皆さんの力を貸して下さい。
0766nobodyさん
02/05/20 21:08ID:???もし $A eq $B かつ $A eq $C のとき $Z="あいうえお";
そうじゃなくて $A eq $B かつ $A ne $C のとき $Z="アイウエオ";
そうじゃなくて $A ne $B のとき $Z="123";
それ以外のとき $Z="---";
if && elsif else
0769nobodyさん
02/05/20 21:38ID:yMovYRK1$img = Image::Magick->new;
$img->Read( $file );
$img->Crop( $w, $h, $x, $y );
$img->Write( $file2 );
とやることで一ヶ所の切りだしはできるのですが、
格納している画像をカットしてしまうので、部分コピーするか、
元画像をコピーしようと思います。
ループの中に
$img2= $img->Clone;
を入れて、 $img2 に対して処理を行うことにしましたが、
Cropが有効にならなかったり、前回と同じ位置が吐き出されたりと
うまくいきません。
指定範囲を別の変数にコピーして、そこから書き出すということを
やりたいのですが、どのようにしたらいいでしょうか?
0771長瀬 愛
02/05/20 22:16ID:95UXUtUeカッコの数があわないのではないか。
それはともかく、この判定条件ではz="---"の文には
至らない気がするがまあいいや。
if(a==b){
if(c){
z="あいうえお";
}else if(c){
z="アイウエオ";
}
}else if(a!=b){
z="123";
}else{
z="---";
}
>>768
グレシャムの法則というのがあってね以下略
0772nobodyさん
02/05/20 22:17ID:???0773771 長瀬 愛
02/05/20 22:30ID:95UXUtUeくどいけど旅の恥はかきすて。
if($a==$b){
if($c){
$z="あいうえお";
}elsif($c){
$z="アイウエオ";
}
}else{
$z="123";
}
初心者は何がわからないかもわからなくて、検索もできません。
答える気がねーなら、煽ってんじゃねーヴォケが
ここは”一応”初心者スレなんだから。
オレモナー。
0775nobodyさん
02/05/21 02:20ID:iePDZE0bSSI/.htaccessが使用できないサーバ上にPerlで作成した単純なテキストを返すCGIをアップロードしました。
IEのアドレスエディットボックスに直接CGIのアドレスを入力すると正常動作しています。
これをindex.htmlがロードされると同時に読み込みたいのですが
CGIの参考書に載っている<!--exec cmd="hoge.cgi"-->や<img src="hoge.cgi">の呼び出し方が出来ません。
この他にindex.htmlと同時にhoge.cgiを読み込む方法がありますでしょうか?
0777nobodyさん
02/05/21 02:58ID:OppOtViG「SSI/.htaccessが使用できないサーバ」ですから
<!--exec cmd="hoge.cgi"-->
は使えません。
「単純なテキストを返すCGI」ですから
<img src="hoge.cgi">
はイメージデータが返さなければ意味がないです。
<script src="hoge.cgi"></script> で呼び出して、
ソースを下記のように javascript に書き換えましょう。
$text = "出力する文字列";
print "Content-type: text/plain\n\n";
print "document.write('$text')\;\n";
exit;
0778775
02/05/21 03:11ID:iePDZE0bご丁寧なレスありがとうございました。
早速試してみます。m(__)m
0780nobodyさん
02/05/21 03:53ID:1dGqnG5G学内BBS作ってるんですが、全員同じプロクシなので、
ほかに手っとり早く個人識別する方法はありますでしょうか。
0781nobodyさん
02/05/21 04:01ID:???(1)全員に固有のIDとパスワードを配布する。
(2)書き込みは係りの人に紙に書いて手渡しにする。
(3)自分だけ書き込み出来るようにすれば、おそらく書き込んだのは君だ。
(4)名前を書かせ、それを信じる。
0782775
02/05/21 04:04ID:iePDZE0b試して見ましたが、どうやらそのようですね。
ASAHIネットがCGIのβサービスを開始したからCGIの勉強を始めようとしたのですが・・・
うーん、他の人達は一体どのように対応しているのかなぁ???
もう少し調べて見ます。
ご指摘ありがとうございました。
0784nobodyさん
02/05/21 04:11ID:1dGqnG5Gうーん、2chのIDみたいなのとかつけたら
面白がると思うんだよね。
5) 300カ国の人間が300人自分の言語で書く。
0786nobodyさん
02/05/21 06:14ID:???今度IISでPerl使うんですけど、選択に迷ってまして、
どんなもんでしょ?
0790nobodyさん
02/05/21 10:59ID:???ActivePerl → 処理系名
ですよ。
0794nobodyさん
02/05/21 13:04ID:???どうしてもうまくいかない箇所があるのでどなたか教えてください。
書き込まれる本文を「$message」としたとき、
$message =~ s/(http:\/\/[ほげほげ]+)/<a href=\"$1\">$1<\/a>/ig;
こんな感じになると思うんです。
そこで、
$message =~ s/(http:\/\/[\w\.\,\/\~\-\+\=\#\%\&\?\(\)]+)/<a href="$1" target="_blank">$1<\/a>/ig;
こういう記述でやってみました。
ところが、どうしても以下のような「,」が続くURLや、
ttp://k-tai.impress.co.jp//cda/article/news_toppage/0,,9441,00.html
以下のような「&」が入るときに、URLのリンクがそこで途切れてしまうのです。
ttp://news.lycos.co.jp/company/story.html?q=20bloombergki1580637&cat=10
試行錯誤してみたのですが、詰まってしまいました。
どなたか教えて頂けませんか?
0795nobodyさん
02/05/21 13:50ID:???http://www.din.or.jp/~ohzaki/perl.htm#httpURL
■ このスレッドは過去ログ倉庫に格納されています