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

【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を見よう。
 
0267nobodyさん02/05/03 16:43ID:???
>>266
$str = join '', map {
    /^</ and $_ = join '',
        map { /["']$/ or $_ = lc; $_ } split /(["'])([^\1]*\1)/; $_
} split /(<[^>]*>)/, $str;

こんな感じかな? 適当スマソ。
0268nobodyさん02/05/03 18:01ID:7wVKBbUQ
#! c:/perl/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

これをローカルで試そうとして、http://127.0.0.1/chapter1/1.cgi
と入力しました。が、なぜかダウンロードしてしまいます。(保存するか聞いてくる)
text/htmlにするとちゃんとブラウザに表示されます。
解決策教えてください。
0269nobodyさん02/05/03 18:06ID:???
どういう風に解決したいのかがわからん・・・・
0270nobodyさん02/05/03 18:06ID:???
>>268
いろんなブラウザで試してみた? IEだとたまにそうなる。
0271nobodyさん02/05/03 18:13ID:7wVKBbUQ
>>269
ダウンロードせずに、結果をブラウザで表示させたいんです。

>>270
Netscape6で確かめたらちゃんとできました。Opera6.01だとだめでしたが。
どうもありがとうございました。
0272nobodyさん02/05/03 19:17ID:???
ファイル情報を取得するにはどうすれば良いですか?
0273nobodyさん02/05/03 19:24ID:???
>>272
ファイル情報って例えばドンナンデスカ
0274cova02/05/03 19:26ID:???

スカラ変数 = (stat(ファイルハンドル または ファイル名))[インデックス番号];

---------------------------------------------------------------------

インデックス番号

0 → ファイルシステムのデバイス番号
1 → iノード番号
2 → ファイルのモード
3 → ハードリンクの数
4 → ファイル所有者のユーザID
5 → ファイル所有者のグループID
6 → デバイスID
7 → ファイルサイズ(バイト単位)
8 → 最終アクセス時間
9 → 最終変更時間
10→ iノード変更時間
11→ ファイルシステムI/Oの最適ブロックサイズ
12→  割り当て済みのブロックサイズ
0275cova02/05/03 19:27ID:???

data.datというファイルの最終アクセス時間を取得する場合は

$accesstime = (stat(data.dat))[8];

という感じ
0276nobodyさん02/05/03 19:29ID:7hc2ohlW
>267
それだと Foo="Bar" の組み合わせが複数あると最初の一つしかできませんでした。
というか自分がその事書いてなかった。。逝ってきます。
0277nobodyさん02/05/03 19:32ID:???
>>275
Web上のファイル情報は取得できないのでしょうか?
0278nobodyさん02/05/03 20:01ID:???
>>276
ごめんなさい……。
直すついでにPerlメモの『HTMLタグの正規表現』(のコメント抜き)を取り入れてみました。
ttp://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag

my $tag_regex_ = q{[^"'<>]*(?:"[^"]*"[^"'<>]*|'[^']*'[^"'<>]*)*(?:>|(?=<)|$(?!\n))};

$str = join '', map {
    /^</ and $_ = join '',
        map { /["']$/ or $_ = lc; $_ } split /(["'])(.*?\1)/s; $_
} split /(<$tag_regex_)/o, $str;

で、試してみたら <!DOCTYPE まで小文字になって鬱。
0279nobodyさん02/05/03 20:07ID:???
>>278
<!DOCTYPE

って、必ず1行目だっけ?だったら、最初の1行目だけスキップすれば?
0280nobodyさん02/05/03 20:20ID:???
>>279
xml宣言もあるのでそうとも限らない.
まあ指摘の通り>>278に特殊な場合の処理を足していけばいいだけだね.
0281nobodyさん02/05/03 20:22ID:???
>>280
カキコしたあとで気づいた…
1行目に記述されてても、複数行に渡って書いているのもあるな…
0282nobodyさん02/05/03 20:40ID:???
>278-281
うまく動きました。ありがとうございました。
あと、<!DOCTYPEは削除してしまうので特に問題ないです。
0283nobodyさん02/05/03 21:05ID:vg/qOBA6
初めまして。
さっそくですが、質問です。
これはどういういみですか?第2引数がわかりません。
push(@sqcookie, "${name}_${value}");
0284nobodyさん02/05/03 21:05ID:???
http://と打つと自動的にリンクされるようにしたいのですが(本文の変数は$FORM{'comment'} )

$url = '([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)';
$FORM{'comment'} =~ s/$url/<a href=\"$url\" target=\"_top\">$url<\/a>/g;

こうしても上手くリンクされますか?
028528402/05/03 21:06ID:???
誤字

こうしても上手くリンクされますか?
↓
こうすると上手くリンクされますか?
0286nobodyさん02/05/03 21:09ID:???
>>284

そのコードで動かしてみればいいじゃん
0287nobodyさん02/05/03 21:11ID:???
>>277

ファイル情報って具体的にどういう情報を知りたいんだYO
0288nobodyさん02/05/03 21:11ID:???
>>286
おれもそうおもったw
0289nobodyさん02/05/03 21:13ID:???

$scalar = "10";

$scalar += 10;

とやらないで,いきなり

$scalar += 10;

とやるとスカラ変数'$scalar'にはundef値である0が代入されていますが

このundef値って何て読むんですか?アンダフ値でいいの?
029028402/05/03 21:21ID:???
284です。
実際に試してみましたが、無理でした・・・。

どうすればURLが自動リンクされるのでしょうか?
0291nobodyさん02/05/03 21:22ID:???
>>289
あんでふじゃない?
定義されていないって意味
0292nobodyさん02/05/03 21:29ID:???

なるほど アンデファイン undefine の略か

じゃあ人前で使うときはアンデファインでいいや
0293nobodyさん02/05/03 21:29ID:???
>284
後方参照($1とか$2とか)は知ってる?
029428402/05/03 21:33ID:???
>>293
すみません。
全然知りません。
KENT WEBのCGIにはあったけど・・・
0295nobodyさん02/05/03 21:34ID:???
undefinedだろ ボソ
0296_gnuzip02/05/03 21:34ID:???
     _,∩_         _,∩_           _,∩_
    (_____)ゝ、     (_____)    y     (_____)
    / :: :: :: ヽ 〉     /-‐:: ::‐-ヽ /       / :: :: :: ヽ
   _./ (・ )ll(・ ) ∨     _/  0) i! 0) ∨      _/ ( ・)i!(・ ) ゙、_
 // :: :: ∈ゝ :: ::ヽ   // ::  ‐-‐ :: ヽ    //  :: ー一 :: ヽ\
. ゝ/:: :: ::  :: :: ::ヽ  ゝ/ :: ::  ::  :: :: ヽ   ゝ/ :: ::  ::  :: :: ヽく
   ̄ ̄ | ̄ ̄ | ̄ ̄     ̄ ̄ | ̄ ̄ | ̄ ̄     ̄ ̄ | ̄ ̄ | ̄ ̄
       |     |             |     |             |     |
    ⊂!     !つ        ⊂!     !つ        ⊂!     !つ      
教えてあげないよ!ジャン!
0297nobodyさん02/05/03 21:40ID:???
>>295

そうなの?
0298さゆ ◆ugYa5.J6 02/05/03 21:51ID:???
>>284
()でくくった部分にマッチした文字列は$1とか$2で参照できる。

$FORM{'comment'} =~ s/$url/<a href="$2" target="_top">$2<\/a>/og;
0299nobodyさん02/05/03 21:52ID:???
>>277
HEADでヘッダだけ持ってくれば、
ある程度わかるよん。
0300nobodyさん02/05/03 22:08ID:CL/oAkFo
imode用の「accesskey=」をcgiにリンクさせたいんですが、どうすればいいでしょうか?
0301nobodyさん02/05/03 22:10ID:???
>>284
役に立たない細かい事を色々と。$urlの中の([^=^\"]|^)は余分。

あと、文字クラス[〜]の中ではほとんどの文字はエスケープしなくてもいい。
ただし"-"はマジカルインクリメント(例:[a-z])の効果があるから最初か最後に置く。
[\w\.\~\-\/\?\&\=\@\;\#\:\%]+ → [\w.~/?&=@;#:%-]+

つかここで聞くよりPerlメモを・・・・ (ボソ
0302pear@空気固定 ◆FRUIT8pk 02/05/03 22:27ID:???
>>300
意味がわかりません。

<a href="test.cgi" accesskey="1">
ということかな?
0303nobodyさん02/05/03 22:47ID:???
>>301
マジカルインクリメントは ++ っしょ。
0304nobodyさん02/05/03 23:02ID:apBthE5H
別スレでやったらスレ違いっぽかったので こっちで

\n\n〜 と複数続いていたら
\n一つだけに やるのは どうすればよいのでしょうか?

s/[\n]*$/\n/g
でうまくいきませんでした
0305nobodyさん02/05/03 23:14ID:???
s/\n+/\n/g;
030630402/05/03 23:16ID:???
>>305
ありがと
0307nobodyさん02/05/03 23:33ID:???
>>303
マジカルインクリメントって .. じゃねーの?
030830302/05/03 23:49ID:???
>>307
ちがうー。
0309nobodyさん02/05/03 23:55ID:???
>>308
そなの? perlopのRange Operatorsにそれっぽい事が書いてあったんだけど。
++はどうマジカルなの?
0310nobodyさん02/05/04 00:05ID:???
パターンマッチングについて質問させてください。
テキストファイル内の文字列をjcode.plにてEUCに変換後、
ひらがだけを抜き出したいのですが、検索対象文字リストを
tr/ぁ-ん//cd にすると結果が文字化けしてしまいます。
この場合、検索対象文字リストはどのように指定したら良いのでしょうか?
031130302/05/04 00:08ID:???
>>309
Perlでは、数字じゃないものもインクリメントできるから、マジカル。
perlop の Auto-increment and Auto-decrement のとこに
「オートインクリメントオペレータには、ちょっとしたマジックが
仕込んである」と書いてある。

perlopには
「レンジオペレータは、数字じゃないものが来た時、マジカルインクリメント
 アルゴリズムを使う」
って書いてあるよぅ。
0312nobodyさん02/05/04 00:09ID:???
>>310
オレは、そういうときは jperl を使います。
031331002/05/04 00:12ID:???
>>312 さん
やっぱりjperl使うしかないのですかねぇ・・・。
0314nobodyさん02/05/04 00:16ID:???
>>310
>>3の[お薦め]に載ってるPerlメモってサイトを参考にしてみては?
0315nobodyさん02/05/04 00:16ID:???
>>311
んー。諒解しました。本家は ++ なわけね。
0316nobodyさん02/05/04 00:26ID:GNJILI/X
質問です。
ログファイルの$hoge[3]にそれぞれ数字がありまして
その数の合計を求めるにはどうすれば宜しいのでしょうか?
ログファイルは\tで区切ってあります。
031731002/05/04 00:26ID:???
>>314 さん
実はすでにあちらのメモも試したのですが、うまくいかなかったのです。
でも、実際のところはどこがうまくいっていないのか理解できていないので
うまく適用できていなかったのかもしれませんが・・・。
0318nobodyさん02/05/04 00:33ID:???
>>316
改善されてねーな

112 :nobodyさん :02/05/03 18:40 ID:???
>>110
「ログファイルの$hoge[3]」って何よ。
「ログファイルは\tで区切ってあります」ってのはレコード区切りが\nでデータ区切りが\tって事か?

わかるように書いてくれ。いや、大体わかっているんだけどな。
0319nobodyさん02/05/04 00:35ID:???
>>316
\tで区切ってるログファイルの4番目のとこに数字があるってこと?

$count=0;
open(FILE,"./$filename");
while(<FILE>){
@hoge=split(/\t/);
$count+=$hoge[3];
}
close(FILE);
print $count;
0320nobodyさん02/05/04 00:46ID:???
>>318
漏れもワラタ。
0321nobodyさん02/05/04 00:49ID:???
>>310
$_ = '文字コードがEUCの場合ね';
s/\x82[\x9F-\xF1]//g;
print;

これでひらがなだけ削れる
逆は自分で考えれ
0322nobodyさん02/05/04 00:49ID:???
>>317
$hoge ="123あいうえ456さしすせ-*/アイウabcdエオ";

$Zhiragana = '(?:\xA4[\xA1-\xF3])';
$hoge =~ s/$Zhiragana//g;

EUCこれでできるよ。
実行したら print $hoge; で表示されるのは
123456-*/愛上尾アウabcdエオ

あなたはどう書いてるの?EUCにコンバートするところとかは?
0323nobodyさん02/05/04 00:53ID:/IfudcOZ
他のサーバーにある画像ファイルのファイルサイズを取得するにはどうすれば良いでしょうか?
0324nobodyさん02/05/04 00:54ID:???
上のShift_JISだった
EUCはこうか
s/\xA4[\xA1-\xF3]//g;
0325321,32402/05/04 00:56ID:???
>>322が書いてるし 逝ってこよ…
032631002/05/04 00:56ID:???
>>321 ( >>324 ) さん
ありがとうございます!うまく動きました。
trを使っていたのが間違いだったのでしょうか??
兎にも角にも、ありがとうございました。
0327nobodyさん02/05/04 00:56ID:???
>323
LWPを使う。
0328nobodyさん02/05/04 00:57ID:???
(´-`).。oO(今日は妙に活気があるね…)
0329nobodyさん02/05/04 00:58ID:???
>>322
実行されて表示されるの違った結果かいちゃいました。ごめん
0330nobodyさん02/05/04 00:59ID:???
>>328
全部自作自演です。
033131002/05/04 00:59ID:???
>>322 さん
お答えありがとうございます。そちらも試したのですが
SCALAR(0xc963c4)
のエラーがでてしまいます・・・。なぜでしょう?
0332_gunzip02/05/04 01:00ID:???
質問するほうも、答えるほうも、はっきり言わせてもらうが
レベルが低いよ。
033331002/05/04 01:02ID:???
>>322 さん
とりあえず、入力される文字列は全て
jcode::convert(\$hoge, 'euc');
にてeucにコンバートしております。
で、とりあえずいまはWin2000上のコマンドプロンプトで動かしているので
出力前にsjisにして出力しています。
0334nobodyさん02/05/04 01:04ID:/IfudcOZ
>>327
LWPですか・・
ちょっと調べてきます・・・
0335nobodyさん02/05/04 01:05ID:???
>>332
(´-`).。oO(はっきり言わせてもらうがレベル高かったら質問しないよ…)
033631002/05/04 01:06ID:???
>>322 さん
何度もレスすみません。動きました。こちらの記述ミスでした。
ただ、「イ」が消えてしまうのはやはりコード上の問題でしょうか?
0337nobodyさん02/05/04 01:07ID:???
(´-`).。oO(>>332 は放置で…はいはい、次の方〜)
0338nobodyさん02/05/04 01:08ID:???
★★★ 質問者はコードを晒せ ★★★
0339nobodyさん02/05/04 01:09ID:???
>>332
騙りウザイ
0340nobodyさん02/05/04 01:10ID:???
if ( $situmonsha{'sex'} == $female ) {
 print "写真うpしる!話はそれからだ!\n";
}
else {
 print "逝ってヨシ!\n";
}
0341nobodyさん02/05/04 01:11ID:???
(´-`).。oO(_gunzipは共有コテハンじゃないのにねぇ・・・はい、次の方〜)
034231602/05/04 01:15ID:GNJILI/X
>>319
エラーになっちゃいました。
$count+って使えます?
0343さゆ ◆ugYa5.J6 02/05/04 01:20ID:???
>>342
うちではエラーでないぞ。
コピペミスじゃない?
0344nobodyさん02/05/04 01:35ID:???
>>342
+ と += の違い分かりますか?
0345_gunzip02/05/04 01:37ID:???
レベルが低いと言ったのは、1 に書いたことを無視した質問のしかたや
過去レスで何度も答えている内容をいまだに質問してくるということで、
そのために答えるほうもまとを得ない答えになってしまっているということ。
034634202/05/04 01:38ID:???
>>344
わかりませんです。
0347nobodyさん02/05/04 01:43ID:???
>>346
perlの本を読み直しましょう。
本もってないなら、買ってね。
0348nobodyさん02/05/04 01:50ID:???
>345 =~ s/_gunzip/_gnuzip/
暇な奴だな(w
0349pear@空気固定 ◆FRUIT8pk 02/05/04 01:52ID:???
>>344
$x += 50; # $xに50を足す
$x = $x + 50; # $xに50を足す
0350nobodyさん02/05/04 01:56ID:???
>>348
漫画でよくあるネタだよね(w
↓ここに投稿したくなった。
バカの一つ覚えな展開2
http://comic.2ch.net/test/read.cgi/comic/1019059437/
0351nobodyさん02/05/04 01:58ID:???
↑何が言いたいのかわからん。
0352nobodyさん02/05/04 02:00ID:???
どうでもいいネタでいつまで盛り上がってるんだ。
0353nobodyさん02/05/04 02:08ID:???
LWPって何?
0354nobodyさん02/05/04 02:11ID:???
>>353
http://www.google.com/search?hl=ja&q=lwp%82%C1%82%C4%82%C8%82%C9%81H&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
035535202/05/04 02:13ID:???
>>350 よくわからん。
>>353 LibWww-Perl の略じゃないの?
http://www.linpro.no/lwp/
Perl関連でなけりゃLight Weight Processの略かもしれないがな。
0356nobodyさん02/05/04 02:47ID:???
>>327
他の方法はないですか?
0357nobodyさん02/05/04 02:54ID:???
なぜlwpでは駄目だと判断したのかを書いたら?
0358ん〜さっぱわからん02/05/04 04:11ID:qVSStWkL
とある、ファイルがある。
んで、そのファイルには20行のテキストデータがあって
その1行の文字数はマチマチである。

さて、このファイルの5行目から10行目までのデータを
読み込みたい。

でも、ファイル全部を読み込んで後から整形するのはいやだ。
どうすればいいのだろうかぁ?
0359nobodyさん02/05/04 04:13ID:???
>>356
あとは、wgetやWWWcp等の外部コマンドを呼ぶしか、簡単な方法は
無いと思う。
めんどくさい方法でもいんなら、Socket使ってうりうりやる方法もある。
0360nobodyさん02/05/04 04:15ID:???
>>358
foreach(1..5) {
 <IN>;
}
foreach(1..5) {
 push(@data,<IN>);
}
でどうかね。
0361nobodyさん02/05/04 04:19ID:Wv66U69I
FreeBSDのWebサーバ上に、簡単なテストのPerlCGIを設置しよう
としているのですが、ブラウザから呼び出すと何故か動きません。
「500 Internal Server Error」とエラーメッセージが出てしまいます。
文字コードも置き場所もパーミッションも.htaccessも問題無いと思うし、
TELNETで単体実行してもちゃんと動きます。
エラーログを見ると、「Premature end of script headers」となっています。
・・・スクリプトヘッダーの時期尚早の終わり?とな?ん?
他の人が作っていたCGIを見てみても、とりあえず一行目の
「#!/usr/local/bin/perl」というのは一致しているし・・・

皆さん、どうぞ知恵をお貸し下さい。
0362ん〜さっぱわからん02/05/04 04:25ID:qVSStWkL
>>360
そんなに簡単にできちゃうの?もうずいぶんと長い間悩んでいるのだが
でも、それって結局ファイル全部読み込んでるのと同じじゃないのだろうか?
0363nobodyさん02/05/04 04:28ID:???
>>361
改行コードがDOS改行になってるっていうオチはないか。
とりあえず、telnet経由で単独で実行した結果の先頭5行くらいコピペ
してちょ。
036436502/05/04 04:29ID:???
>>362
んなこたーない。
1〜5行目までは読んで捨ててるのでメモリに残らないし、
11行目以降は、読んでさえいない。
0365なんとなくわかってきた02/05/04 04:38ID:qVSStWkL
>>364
んん、なんとなくわかってきますた。すいませぬ。

つまりは2ch掲示板の
最新50 1-100 100-200 200-300
っつーのをやりたいのですが、やはりこの方法でやっているのでしょうか?
036636102/05/04 04:39ID:Wv66U69I
>>363
秀丸を使って、EUCからS-JIS、JIS、UNICODEにUTF-8まで試してみました。
以下は単独実行の結果です。
dalrq000@sv29:~/public_html/acjik/abcd/cgilib>./jiktes.cgi
Content-type: text/html

<html>
<body bgcolor=silver text=navy>
<h1>CGI TEST</h1>
length:<p>
IP Addres:<p>
data:<p>
(以下略)
・・・どんなでしょうか?
■ このスレッドは過去ログ倉庫に格納されています