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

Perl 初心者コーナー Part24

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0884_03/06/26 16:23ID:???
http://homepage.mac.com/hiroyuki44/
0885nobodyさん03/06/26 16:33ID:???
コードに直で漢字を書く以外で変なことが起きたことが無いので、
jcode:converが怪しい
0886nobodyさん03/06/26 16:41ID:???
>>883
>jcode::convert(\$value,'euc', 'euc','z');
3つ目にeucを指定してEUCtoEUCじゃ、実際に変換が行われるのは
zオプションの半角カナ→全角カナ変換だけだろ

jcode::convert(\$value,'euc', '','z'); じゃないのか?
0887nobodyさん03/06/26 16:43ID:???
pack("C", hex($1))ってよく見かけるけど、なんでpack("H2", $1)にしないの?
なんか理由あるのかね?
0888nobodyさん03/06/26 17:00ID:???
>>887
pack("H2", $1)の方が早いけど、そうすると何故か人気が出ないというジンクスがある。
0889nobodyさん03/06/26 17:12ID:???
pack("C", hex($1))とpack("H2", $1)はどう違うの?
0890nobodyさん03/06/26 17:23ID:???
>887
多分 kent-web とかの配布スクリプトが hex 使ってるから
>889
同じ
速度が違う
0891nobodyさん03/06/26 17:37ID:???
原因不明の症状に悩んでおります・・・。
申し訳ありませんがご助言をお願いできませんでしょうか。

1: Perlスクリプトで色んなサイトのhtmlソースを一気に取得してきたい。
2: それでこんな風にやってみました。

 ※メインのスクリプトにて
 foreach(@url_list){ # @url_listに各サイトのurlが入っている。
 @source = &get($_);

 (いろいろな処理)

 }

 ※サブルーチン(別ファイル)にて
 sub get{

 (socketを使ってソースを取得し、@backに格納)

 return(@back);
 }

3: うまくいかないサイトがちらほらあります。
 <付加的情報>
 ・問題なく取得できるサイトも多くある。
 ・Hostヘッダは送っている(=バーチャルホストが原因ではない?)。
 ・うまくいかないサイトでも、サブルーチン内ではそのソースをprintできる。
 (=実は取得できている?)

 <自分の考え>
 ・特定のサイトの時だけ、メインのスクリプトに@backが帰って来ない?
 ・特定のサイトの時だけ、そもそもサブルーチン内で配列に格納されていない?
089289103/06/26 17:38ID:???
これ以上の原因を調べようがなくて八方塞状態です。
足りない情報などあったらすべてお答えしますので、
何とぞよろしくおながいします。<(_ _)>
0893nobodyさん03/06/26 17:43ID:???
>>891
ステータスコードは確認している?

# なんかPerlと関係ない話題のような・・・
0894nobodyさん03/06/26 17:54ID:???
俺も>>886に同意。
HTMLの文字コードがEUCだからって、EUCが送られてくるとは
限らないよ。たまたまIEなんかはそういう実装になってるだけで。

あと、単にブラウザが文字コードを判定ミスしてるってことはない?
Content-Type行を、

print "Content-Type: text/html; charset=EUC-JP\r\n\r\n";

みたいにしてみ。
0895nobodyさん03/06/26 18:09ID:???
icab とかは EUC のページでも SJIS で送信するらしいね
0896nobodyさん03/06/26 18:22ID:???
>>895
んでそういうのを平気で「ブラウザのバグ」とか言うプログラマが居るんだよな。
0897nobodyさん03/06/26 18:26ID:???
逝ってよしだな。
089889103/06/26 18:29ID:???
>>893
ありがとうございます。しかし申し訳ありません。原因は凡ミスでした・・・。
891の「(いろいろな処理)」のほうがマズかったようです。
質問する前にもっとしつこく調べてみるべきでした。本当にすみません。
0899nobodyさん03/06/26 18:52ID:???
>>898
おいおい、解決したから満足ですさようならーってのはナシでしょ。
善意とは言え、他人の手を煩わせたんだから、
その凡ミスを晒して他の初心者に貢献するのが
ギブアンドテイクっていうもんじゃないか?
0900nobodyさん03/06/26 19:05ID:???
>>899
「この掲示板は自分のためにある」by 891
0901nobodyさん03/06/26 19:12ID:???
>>900
そりゃ本7の名言だろ
0902nobodyさん03/06/26 20:03ID:???
<FORM accept-charset="euc-jp" ・・・
とか。
0903nobodyさん03/06/26 20:10ID:???
>>902
それ、すごく正しいけどIEもNNも実装してなかった気がする。
ちょっと今すぐ試せないけど。
0904nobodyさん03/06/26 20:13ID:???
>>902
んな風に書けるんだ。知らなかった。
0905nobodyさん03/06/26 20:36ID:fBG4qVY6
ファイルの読み書きとフォームデータを使う場合の二つの負荷はどっちがお得か教えて下さい。
サーバーの負荷はファイルの読み書き何byteに対してフォームデータ送信何byteと同じぐらいでしょうか?
0906nobodyさん03/06/26 20:53ID:???
>>903
そんなブラウザ今すぐ窓から投げ捨てた方がいい気がする。
0907nobodyさん03/06/26 20:55ID:???
>>903
今回の件についてはIEやNNなら実装していなくても問題ない。
0908nobodyさん03/06/26 21:12ID:8elJoZcA
Welcome..........

ホスト12-231-187-185.client.attbi.com

名前:
E-mail:
内容:



こちらでリロードしてください。 GO!
分からないことがあったら2ちゃんねるガイドへ。。。

プロキシー制限は、2ちゃんねるビューアを使うと回避できることがあります。


ワラタ
0909nobodyさん03/06/26 21:32ID:???
>>906
窓も一緒に投げ捨てた方がいい気がする。
0910nobodyさん03/06/26 22:00ID:0WiiLc+a
2つ(以上)の jpeg 画像ファイルを入力とし、
横に連結した1つの jpeg 画像ファイルを出力するプログラムを書け。
また、指定した位置に連結できるようにもせよ。

どなたか作っていただけませんか?
0911nobodyさん03/06/26 22:07ID:XYA3PmxJ
自分でコーディングしないのは初心者とは言いません
0912nobodyさん03/06/26 22:07ID:8elJoZcA
>>910
偉そうにマルチポストか。死ね。
0913nobodyさん03/06/26 22:29ID:???
>>910
うわぁ、最悪
0914nobodyさん 03/06/26 22:31ID:???
>>910
まじれすすると、モジュール要るし、
貴方にはソレを入れるとか、もしくはソレを使えるサーバーも用意できないと思われる。

もうちっと勉強してきなさい。
0915nobodyさん03/06/26 22:33ID:8elJoZcA
>>914
>まじれすすると、モジュール要るし、

自分の低レベルをカミングアウトせんでも・・・。
学生のうちに離散コサイン変換位覚えとけ。
0916nobodyさん03/06/26 22:54ID:???
>>915
>>914じゃないけど、俺も面倒だからモジュール使うかなあ。必須だとは思わんけど。

> 学生のうちに離散コサイン変換位覚えとけ。

プログラマで10年飯を食ってるけど、文系なのでそういうの苦手。
0917nobodyさん03/06/26 22:55ID:???
>>915
自分で実装するのもなー。
社会人になってからじゃあ、確かに時間がないから、今のうちっちゃ今のうちだが。
091889103/06/26 23:08ID:???
>893,>899
本当にバカですみません。どういう凡ミスかを簡単に申しますと、
htmlソースの<body>から</bocy>までの間だけ切り取ろうとしていた部分で
$_ =~ /^<body/i → $_ =~ /<body/i のように直したという感じの話です。

ちなみに実は他にも問題山積みであまり解決していないので
>解決したから満足ですさようならー
という状況でもなかったりするのですが。
0919nobodyさん 03/06/26 23:21ID:???
>>915
あふぉか・・・そんな処理入れて使い物になる実行速度でるよ
0920nobodyさん03/06/26 23:24ID:???
>>915
何のためにいろいろとモジュールが公開されているのか・・・。
0921nobodyさん03/06/26 23:29ID:???
でるのかよ
0922nobodyさん03/06/26 23:30ID:???
>>919がよくわからない。
入力ミスか?
0923nobodyさん 03/06/26 23:33ID:???
どっちにしろPerlでは向かない処理やね
0924nobodyさん03/06/26 23:37ID:???
(´-`).。oO(やっぱりGD.pmかなぁ、、、)
0925nobodyさん03/06/26 23:55ID:???
おお、聞き逃げかと思ったらちゃんと戻ってきた。尊敬。わざわざありがと。
関係ないけど、

> どういう凡ミスかを簡単に申しますと、

と書いた次の瞬間に↓

> </bocy>

なんか性格出ててちょっと好感度アップ。
0926nobodyさん03/06/26 23:58ID:???
>>923
昔、月の満ち欠けのレンダラーを何を思ったかPerlで書いた事があったが、
恐ろしく遅かったのを覚えてるな。
ただの球体なのに、500x500程度の画像に数分かかってた。
まぁ俺のアルゴリズムが自己流で糞だったのもあるけど。

でもCで書き直したら一瞬で計算できたよ。
0927nobodyさん03/06/27 00:55ID:???
WinXPでrenameを使ってみたところ失敗してしまい
$!に permission deniedが入っていました。

やったことをまとめるとこの様な感じです
・renameの第二引数には既に存在しているファイルを指定し上書きしたい
・第一、二引数のファイルは共に存在する
・両ファイル共に読み取り専用のチェックは入っていない

openでの書き込みやmkdirなどその他のファイルシステム関数は普通に使えます。
Windowsなのでパーミッションは要らないと思っていたのですが
この場合どこに原因があるのでしょうか?
どうかよろしくお願い致します
0928nobodyさん03/06/27 01:12ID:???
>>927
どんなコードでやってるんだ?
問題なくできるし、できないならアクセス権とか確かめてみれ
0929nobodyさん03/06/27 06:01ID:???
(・∀・)ボスィー!!
0930nobodyさん03/06/27 07:24ID:???
>927
自分も同様な処理で同じエラーが出たが、
アクセス権を考えるのが面倒くさいので、
存在しているrename先ファイルをunlinkした。
0931nobodyさん03/06/27 09:38ID:???
>>930
普通はそう考えるよな
0932nobodyさん03/06/27 09:45ID:???
すみません。
超初心者な質問です。

if だと何かが真なら…って分岐になりますが、
「これら全てが真なら」とか「全てが偽なら」って記述をスマートに書くにはどのように書くのが一般的なのでしょうか?

頭悪いので
if(){
if(){
if(){
}
}
}
こんな記述使ってます。
見にくいです。
0933nobodyさん03/06/27 09:47ID:???
>>932
andじゃ駄目なの?

if($a == 1 and $b == 2 and $c == 3){
全てが真の時の処理;
}else{
一個でも違ったら;
}
093493203/06/27 11:05ID:???
ありがとうございます。
頭が悪いのか、andとか、全然使いこなせないんです。汗
0935nobodyさん03/06/27 11:20ID:???
>>932=934
これ、見た目だけの問題じゃなくて、動作速度とかにも影響するから
ちゃんと覚えておいた方がええよ。
093637403/06/27 11:22ID:???
ふーん。そういうことを話し合ってるスレかここは
0937nobodyさん03/06/27 11:36ID:???
そうですが、何か?
0938nobodyさん03/06/27 12:32ID:???
>>934
お前、高校くらい出てから来い。数学Aの履修範囲だ。
0939nobodyさん03/06/27 12:51ID:???
>>935
まじで!?
0940nobodyさん03/06/27 12:57ID:???
>>939
if文をまとめたぐらいでは体感的な速度差はない。
ただ、日頃から>>932のようなコーディングをする人は、自分でも理解できなくなるような
スパゲッティコードを書いたり、非常にパフォーマンスの悪いアルゴリズムを使ったりと
間違った方向に進みがち。
まあ何にせよ、基本はきっちりと押さえとけってこと。
0941nobodyさん03/06/27 13:01ID:???
push @houselist, \%HOUSE;
したあと、
$houselist[あれこれ]->{id}
が重複するものを、
@houselist から取り除く(※)にはどうすればいいのでしょう?
※取り除くというか、1つだけ残したいです。
0942nobodyさん03/06/27 13:21ID:???
>>941
こんな感じかのう

@check = ();
@houselist = grep { !$check{$_->{id}}++ } @houselist;
0943nobodyさん03/06/27 13:22ID:???
Perlらしいコードだなぁ
0944nobodyさん03/06/27 13:35ID:???
>>939
>>934が言っているように、ほとんど体感は無いけどね。
ただ、漏れは仕事の都合上、xGB単位のファイルの処理とかするんだけど、
そうなってくると、細かいところでかなり違ってくる。
といっても、1時間が55分に短縮されるとか程度だけど。
どっちかってーと、>>934の言うとおり、わかりやすく書く、ってことが
重要かと。
0945nobodyさん03/06/27 13:36ID:???
s/>>934/>>940/;
0946nobodyさん03/06/27 13:40ID:???
xGB単位, xGB単位, xGB単位
           ∧∧
         ヽ(=゚ω゚)ノ″
         〜( ×)
(=゚ω゚)ノぃょぅ    U U

0947nobodyさん03/06/27 13:42ID:gWCPnMBP
変数で正規表現を使えるのでしょうか???
sub func{
$str = $_[0];
foreach(@list){
if(/$str/){
$result = $_;
}
}
return $result;
}
みたいに検索条件を変数にしたい時はどうすれば良いのでしょうか?
094894203/06/27 13:42ID:???
@check = (); じゃなくて、%check = (); だった。スマソ
0949nobodyさん03/06/27 13:44ID:???
>947
正規表現じゃなくてindex使え。
0950nobodyさん03/06/27 13:47ID:???
>>947
それでいいのでは
095137403/06/27 14:01ID:???
もまいらひまだな

print s//uc join('',unpack('A1 x4 A1 x7 A1 x4 A1', <<EOT))/e && $_,"\n";
Just another Perl Hacker
EOT
0952nobodyさん03/06/27 14:03ID:???
ひまですが、何か?
0953nobodyさん03/06/27 14:24ID:gWCPnMBP
レスTHX
>>950
全部にマッチしてしまうので、必ず最後の要素番号返してくれます。
>>949
調べてみます。
095494703/06/27 14:25ID:???
>>953>>947です
0955nobodyさん03/06/27 14:32ID:???
>>953
変数を正規表現に使うときは、メタ文字が入っているとうまくいかないから、
quoteする。
metaquote($str)または\Q$str\E
全部にマッチしちゃうってのは、/^$str$/してないから、一部にひっかかって
るんじゃないかな。

095694103/06/27 14:38ID:???
>>942
やばい、何をやっているかわからない。。。
けど理解してがんがってみます。
ありがとうございます。
095794703/06/27 14:39ID:???
>>949,>>950,>>955
>>955の書き込みを見る前にindexでとりあえずの解決しました。
for($i = 0;$i < @list;$i++){
$idx = index($list[i],$str);
if($idx ne -1){
$result = $i;
}
}
としました
ありがとうございました。
>>955さんのが原因かと思われるのでそちらも勉強してみます。
感謝です
095895003/06/27 14:55ID:???
「変数に正規表現を」って言うから、引数にメタ文字を入れてるんだと思った……
要は正規表現を使って(変数に入った)文字列を検索したかったのね。
095994703/06/27 15:02ID:???
>>958
ごめん、よくわかんない(TT
0960nobodyさん03/06/27 15:07ID:???
CSVからデータを読み込んで、ちょっとした条件でしぼりこんで一覧表示するだけなのに、
一覧のうち1部だけが文字化けするって、
何が考えられますか?


なお、スクリプトは、EUC(スクリプト中の処理も全てEUCで処理してます)、
CSVはSJIS、HTML吐き出しもSJISです。

文字化けしてしまってるところは、EUCになっちゃってます。
0961nobodyさん03/06/27 15:14ID:???
>>960
文字コード変換を自動判別に頼ってるため、Shift_JIS文字列をEUC
と見間違えるんだと思う。

CSVの1レコードとかテーブル全体を一括で文字コード変換するか、
明示的に変換元と変換先の文字コードを文字コード変換ルーチンに指示
するかすれば問題は起こりにくくなる。

あと、いわゆる半角カナが多いShift_JIS文字列もEUCと誤認識
しやすい(場合によっては区別が付かない)。
0962nobodyさん03/06/27 15:15ID:???
条件ってのが、EUCで比較しててそのまま出力に流してしまってるからでは?
0963nobodyさん03/06/27 15:21ID:???
>>960
スクリプトとデータの文字コード統一しる。
その方が変換しないで済むから早いだろうに。
0964nobodyさん03/06/27 15:54ID:???
>>956
この方法の解説は確かperlメモに書いてあった。
だがしかしperlメモ説明がくどいから逆に分かり難いかも。
でも便利だから一度は見ておけば?
0965nobodyさん03/06/27 17:01ID:???
bccに2人を入れたいとき、
メールソフトと同じように、

$bcc = 'amano@alive.ne.jp, mine@alive.ne.jp';
if (!open(OUT,"| $sendmail -t")) { &error('申し訳ありませんが何らかの原因で処理できません.'); }
#中略
print OUT "Bcc: $bcc\n";
#後略
で問題ないですよね?

実験だと問題なさそうなんですが、
環境に依存するとなんなんで、一応質問・・・
0966nobodyさん03/06/27 20:05ID:???
$sendmail に sendmail のパスが入ってるんだろうけど、
その sendmail が Sendmail とは限らない。

とか言ってみるテスト。
ようはそのプログラム次第ってこと。
Socket使うとかしてみたら?
その手のモジュールも転がってるし。
096796503/06/27 20:21ID:???
>>966
いや、sendmailのパス入ってます。
sendmailだったら、他の環境によらず大丈夫ってことですか?

Socketの勉強は、まだ少しペンディングにしてるので。。。
0968nobodyさん03/06/27 20:24ID:???
>>967
適当なライブラリ探してきたら、Socket知らないでもできそうですよ。
やったことないですが。
0969nobodyさん03/06/27 20:53ID:???
(´-`).。oO(この世にはsocketしか知らない香具師もいるのよねぇ、、、@この板を荒している香具師とか)
0970nobodyさん03/06/27 21:05ID:???
(´-`).。oO(本7か…)
0971nobodyさん03/06/27 21:26ID:???
sendmail の sendmail と qmail の sendmail で利用可能なオプションとか違うよ。
それ以外のは知らないけど。
つか、スレ違いぎみな気が。
0972ふつー03/06/27 22:05ID:???
use Net::DNS;
use Net::SMTP;
0973nobodyさん03/06/27 22:34ID:???
すんごい素朴な疑問なんですが、
なぜみんなヒアドキュメントを使うんでしょう?

   print << "END_OF_HTML";
      ほげ
      ふが
      ひげ
END_OF_HTML
っていう風に、最後を、インデントつけれないから、すごくコードがみづらくなって、
個人的にはいやなんですけど。
(なんかのオライリー本にもそんなことかいてあったきがする)

やっぱり、END_OF_HTMLみたいに意味をかけるからいいんでしょうか?

ちなみに自分は、ほとんど
       print qq|
             ふが
             ほげ
            |;
ってやってます。
097496503/06/27 22:36ID:???
やばい、qmailとsendmailてまったく別物だと思ってました。
(だから、>>971 でqmail の sendmail ってなんだ?と思った)
スレ違いぎみなので、逝って勉強してきます。
0975nobodyさん03/06/27 22:39ID:???
>>973
料理本でも立ち読みしてくれ
0976nobodyさん03/06/27 22:58ID:???
>>973
   print << "  END_OF_HTML";
      ほげ
      ふが
      ひげ
   END_OF_HTML
097797303/06/27 23:25ID:???
>>975
料理本ってなんかの隠語?
097897303/06/27 23:26ID:???
>>976
そ、それも、気持ち悪くないですか?個人差かな?
0979nobodyさん03/06/27 23:33ID:???
まあ、あまり深いインデントにならないコードを書いて気休めにするしかないな
0980nobodyさん03/06/27 23:36ID:???
まぁ、個人の好き嫌いじゃないの?
'
hoge
';
<< 'HOGE';
hoge
HOGE
ちなみに私は前者が多いかな。
インデントがと言うか、楽だから。
0981nobodyさん03/06/27 23:41ID:???
>977
クックブック
0982nobodyさん03/06/27 23:42ID:???
>>977
オライリーのPerl本を色々物色してれば分かる。
098398203/06/27 23:43ID:???
かぶった
レス数が950を超えています。1000を超えると書き込みができなくなります。