Perlコーディング初心者質問スレ Part 42

このエントリーをはてなブックマークに追加
1nobodyさん
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
2nobodyさん:2005/05/25(水) 06:42:32 ID:PVpWgcdf
関連スレ
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc8.2ch.net/test/read.cgi/php/1101635909/

CGIだけど、なんか質問ある? Part 12
http://pc8.2ch.net/test/read.cgi/php/1097334246/

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

★負荷軽減対策委員会(Perl、PHP)★
http://pc8.2ch.net/test/read.cgi/php/1034645635/

Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

CGIに依存しないPerlの話題一般/Part2
http://pc8.2ch.net/test/read.cgi/php/1030548610/

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
3nobodyさん:2005/05/25(水) 06:44:34 ID:PVpWgcdf
4nobodyさん:2005/05/25(水) 06:45:16 ID:PVpWgcdf
5nobodyさん:2005/05/25(水) 06:45:59 ID:PVpWgcdf
6nobodyさん:2005/05/25(水) 06:46:54 ID:PVpWgcdf
7nobodyさん:2005/05/25(水) 06:50:07 ID:???
ム板Perlスレより

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
8nobodyさん:2005/05/25(水) 06:53:48 ID:???
関連スレ

正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/

9nobodyさん:2005/05/25(水) 09:00:35 ID:???
乙です。
前スレで教えてもらったperl講座
ttp://www.rfs.jp/sitebuilder/perl/
10nobodyさん:2005/05/25(水) 13:52:45 ID:5tMlS9wk
バイト数ではなく文字数を得たいのですが、スマートな処理方法は
ございますでしょうか。

例えば「12345あいうえお」の場合、「15バイト」として数えるのではなく、
「10文字」として数えるようにしたく思っております。

ご教示いただけますと幸いです。
11nobodyさん:2005/05/25(水) 13:57:51 ID:???
>>10
use encoding 'Shift_JIS'; # ソースのエンコーディングを指定する
print length('12345あいうえお');
12nobodyさん:2005/05/25(水) 17:26:48 ID:???
>>11
ご教示有難うございます。
しかしながら先方のサーバはバージョンが5.6みたいで、
使用できませんでした。

とにかく即レス有難うございました。
13nobodyさん:2005/05/25(水) 18:39:06 ID:kwD9lRlX
初心者なので、無知ゆえの行動を取っているかもしれませんが、指導お願いします。
長文ですが、よろしくお願いします。

1つのページに560個程度の項目があります。これをCGIで管理したいと考えています。
項目はチェックボックスx2、テキストx1、テキストエリアx2が90行と日付等に利用している
チェックボックスとテキストが数個です。

現在、自分で何とか改造できる更新記録系CGIを改造してどうにかしようとしています。
ただ、1つ問題があります。が…
560個もの項目(変数)を、表示ルーチンのsplit時の変数羅列や書き込み時のline(pushの時に利用してるもの)
に並べても大丈夫なのでしょうか?

さっき、変数を手打ちするのが大変だと思いエクセルののオートフィルを利用し変数をCSV出力し1行にしたら
PerlEdtiorが途中でフリーズとなってしまいました。

ソフトの限界があるのかもしれませんが、これで限界があるようだと、CGI上でも動作しないのでは?
と考えてしまします。あまり1行が長いとまずいということでしょうか?

1行でどうにかしたいのには訳があります。
>項目はチェックボックスx2、テキストx1、テキストエリアx2が90行
と先ほど書きましたが、この更新は1行ごとではなく、ランダムで何十行かまとめてする必要があるので、
1行ごとに「更新ボタン」とするのではなく、全部まとめて「更新」としたいからです。
もちろん、この考えに誤りがある場合、指摘してください。

そこで、1つ考えたのが、ログファイル・split時の変数羅列や書き込み時のlineを改行できないのか?と思いました。
これがOKなら問題解決しそうなのですが、ダメでしょうか?
splitで読み込み時に改行があるとまずいとかあるのでしょうか?

ログやsplit時の変数羅列が長すぎてはダメ、でも改行は出来ると言う場合は↑の問題まで教えていただけるとありがたいです。
1413:2005/05/25(水) 18:40:25 ID:kwD9lRlX
↑の続き。
もし、1行でダメで改行もダメな場合、質問の続きを書き込みます。
よろしくお願いします。
15nobodyさん:2005/05/25(水) 18:48:13 ID:???
> 1行ごとに「更新ボタン」とするのではなく、全部まとめて「更新」としたいからです。
一行ごとに複数回更新処理したらいいんでは?そういうことじゃない?

> PerlEdtiorが途中でフリーズとなってしまいました。
それはそのエディタがしょぼいだけ、とか。

そもそも、なんで560個もの変数が必要となるのかがさっぱりわからん。

16nobodyさん:2005/05/25(水) 19:25:13 ID:VuzyXB/A
在宅でphpのお仕事あります
[email protected]
までメール下さい
17nobodyさん:2005/05/25(水) 19:34:15 ID:10kxLICF
以前一度質問した内容ですが、よろしくお願い致します。
全部で11個のCGIから1つのデータファイル(テキスト)を参照させている
のですが、最近そのデータが消えることがあります。そのデータファイルは現在、
1500くらいのレコードがあり、追加書き込みができます。データが消えると
いうのは、1〜20レコードがすっぽり消えていたり、レイアウトがずれたりも
します。
 以前の質問時には、ファイルロックを書き込みできるCGIのみ記述していた
ので、読み込みのみのCGIにも記述すべきとのアドバイスを頂き、修正したの
ですが、再発してしまいました。
ファイルロックの記述は以下のような感じですが間違っているでしょうか?

if ( !open (ABC_OUT, ">$abc_file") ){
print "ファイル読み込みオープンエラー<BR>\n";
}
else{
eval{ flock(ABC_OUT, 2); };
(省略)

ファイルロックが機能しているか確かめる方法とかあるのでしょうか?
また、ファイルを掴んでいる人のPCがフリーズしたりしてファイルが壊れる
なんてこともあるのでしょうか?
18nobodyさん:2005/05/25(水) 20:21:45 ID:???
普通のファイルロック

 ロック処理
   ↓
  書き込み/読み込み処理
   ↓
 ロック解除処理

>>17のファイルロック

 読み込み処理
   ↓
  ロック処理
   ↓
19nobodyさん:2005/05/25(水) 20:36:39 ID:FbKjEBl3
my $hogehoge = new ABCD::Saitama;

my $st = $hogehoge->db->wakame('wake wakame');


上のような文章が出てきたんですけど、これは何をしてるんでしょうか?
解説できるかたがおりましたら、教えてください。
また詳しい説明が載ってるHPがあったら教えてください。
2010:2005/05/25(水) 20:37:07 ID:???
いろいろ調べ、

my $jp = $args =~ tr/\x8e\xa1-\xfe/\x8e\xa1-\xfe/;
my $asc = $args =~ tr/\x20-\x7f/\x20-\x7f/;

$jp / 2 + $asc;

これでとりあえず文字数を数えられるところまではできたのですが、
この場合、記号だけがちゃんと数えられません。
例えば「"」ですと、4文字と数えられてしまいます。
頭悪いのでこれ以上解決まで至りませんでした。

ご教示いただけますと幸いです。
21nobodyさん:2005/05/25(水) 20:37:27 ID:???
>>17
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/

http://www.tohoho-web.com/wwwperl2.htm#flock
22nobodyさん:2005/05/25(水) 20:40:47 ID:???
>>20
Jcode.pmでもできるぞ。それも入ってないのけ?

$length = $jcode->jlength();
returns character length properly, rather than byte length.
2310:2005/05/25(水) 20:49:01 ID:???
>>22
残念ながら入ってませんでした。
本当に困ったものです。
ご教示有難うございます。
24nobodyさん:2005/05/25(水) 21:34:35 ID:???
>>23
とりあえずシフトJIS限定で、

$jstr = '"12345あいうえお"';

print "$jstr = " . length($jstr) . "\n";

# SHIFT_JIS 2バイト文字を1バイト文字(j)に置換
$jstr =~ s/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/j/g;

print "$jstr = " . length($jstr) . "\n";

実行結果>"12345あいうえお" = 17
実行結果>"12345jjjjj" = 12
こんなん出ましたけど
25nobodyさん:2005/05/25(水) 22:09:41 ID:10kxLICF
>>18
ファイルオープンの前にファイルロックしろということですか?
26nobodyさん:2005/05/25(水) 22:13:26 ID:???
>>18 は何か勘違いをしている気がする。
2710:2005/05/25(水) 22:44:16 ID:???
皆様、ご教示有難うございました。

苦心の末、文字列計算ルーチンがなんとかできました。

sub char_count{
my $args = $_[0];

$args =~ s/\x0D\x0A|\x0D|\x0A//g;

my $ascii = '[\x00-\x7F]';
my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

my @chars = $args =~ /$ascii|$twoBytes|$threeBytes/og;

return ($#chars + 1);
}

これでちゃんとカウントされます。
Perlの小技さんのサイトに救われました。

丸半日かかりましたが、明日の納期に何とか間に合いました。
皆様に感謝いたします。
28nobodyさん:2005/05/25(水) 22:44:56 ID:???
>19
無理やり一言で言うなら、
ABCD::Saitamaのひとつである $hogehoge の要素 db への wakame('wake wakame')という関数の呼び出し。
チョー難しい。スレタイの通り「初心者」なら忘れるか丸暗記しろ。

いわゆる、オブジェクト指向的な書き方。
古いバージョンのPerlには存在しなかったものなので、載ってる書籍も少ない。
Perlが開発された当時にはオブジェクト指向という概念すら登場してなかったから無理も無いけど。
検索するときは「perl オブジェクト指向」あたりで検索するといい。

もし、Perlの他の部分はほとんど分かるがそれだけが分からないんだとしたら、巣立ちの時期。
そろそろ第二のプログラミング言語を学んでみる事をお勧めする。
文法上、それ以上難しい事はPerlには登場しないというのがひとつ。
加えて、Perl上でのオブジェクト指向の実装はかなり変なので、ただでさえ難しいオブジェクト指向の概念を初めて学ぶには結構キツい。
2910:2005/05/25(水) 22:50:18 ID:???
あ、Perlメモさんでした。

やはり神サイトです。
30nobodyさん:2005/05/25(水) 23:35:52 ID:???
変数に格納してある文字列を、S-JISにして文字コードのまま扱いたいんですが、
何か方法はありますでしょうか。
検索してみても、文字コードを変換する方法ばかりHITするもので。
お願いします。
31nobodyさん:2005/05/26(木) 02:16:27 ID:???
S-JISにして文字コードのまま扱いたい。って何?
具体例を示したほうがよろしいかと。
32アップロードの質問:2005/05/26(木) 02:16:50 ID:???
ファイルのアップロードについて質問させて下さい。
送信内容の確認ページを挟みたくて、下記の様な流れで
作成してみました。

(2)確認ページから、最後の(3)登録処理ページへデータを渡す為に
(2)確認ページ側のformをenctype="multipart/form-data"
としてやり、
<input type="file" name="temp" value="$FORM{'temp'} ">
として、最初の(1)ファイル選択フォームからのファイルデータを
受け取れないかと思ったのですが、
セキュリティー上、type="file" にvalueは与えられないとの事。。。

確認ページを入れたい場合、どの様にしたら良いのでしょうか。
どうかご教授下さいませ。
33アップロードの質問2:2005/05/26(木) 02:18:00 ID:???
#(1)ファイル選択フォーム(regist_form.cgi)
<form method="post" action="./regist_form.cgi">
<input type="text" name="name" size="20">
<input type="file" name="temp" size="40">
<input type=submit name="regist" value="登録">
</form>

     ↓

#(2)確認ページ(regist_form.cgi)
$FORM{$name} = $value;
     ・
     ・
     ・
<form method="post" action="./regist.cgi" enctype="multipart/form-data">
<p>$FORM{'name'} </p>
<input type="hidden" name="name" value="$FORM{'name'} ">
<input type="file" name="temp" value="$FORM{'temp'} ">
<input type=submit name="regist" value="登録">
</form>
34アップロードの質問3:2005/05/26(木) 02:18:42 ID:???
     ↓

#(3)登録処理ページ(regist.cgi)

use lib './lib';
use CGI::Lite;
require 'jcode.pl';

$cgi = new CGI::Lite;
my $directory = './file';
mkdir $directory, 0777 or die $! unless (-d $directory);

$cgi->set_directory ($p_dir) or die &error('ディレクトリが存在しません');
$cgi->add_timestamp(0);
%data = $cgi->parse_form_data;
35nobodyさん:2005/05/26(木) 03:45:31 ID:???
@array =(0,1,2,3);
$index= rand @array;
print $array[$index], "\n";
print "<BR>\n";print "<BR>\n";

配列の要素をランダムに取り出した時、
その要素を固定して留めるにはどうしたらいいでしょうか。
当たり前なんですが、更新ボタンを押すと要素が変化してしまいます。

こんな風に無理矢理別の変数に突っ込んでみようとしましたが
$array[$index]=$mem;
$memには何も記録されませんでした。
36nobodyさん:2005/05/26(木) 04:58:14 ID:???
>>19
my $hogehoge = new ABCD::Saitama;
my $st = $hogehoge->db->wakame('wake wakame');

 を書き直すと

my $hogehoge = ABCD::Saitama->new();
my $tmp = $hogehoge->db();
my $st = $tmp->wakame('wake wakame');

 と同等、意味は

1行目の左辺: ABCD::Saitamaパッケージで定義されているnew関数を呼出す。
1行目のnew関数: ABCD::Saitamaパッケージと関連付けされたリファレンスを返す。
1行目の右辺: new関数の戻り値であるリファレンスを$hogehogeに代入。
2行目の左辺: ABCD::Saitamaパッケージで定義されているdb関数を呼出す。
2行目のdb関数: 何かのパッケージと関連付けされたリファレンスを返す。
2行目の右辺: db関数の戻り値であるリファレンスを$tmpに代入。
3行目の左辺: 何かのパッケージで定義されているwakame関数に引数を渡して呼出す。
3行目のwakame関数: 引き数を受け取って何かの値を返す。
3行目の引き数: この場合の引き数とは'wake wakame'という文字列定数のこと。
3行目の右辺: wakame関数の戻り値である何かの値を$stに代入。
37nobodyさん:2005/05/26(木) 05:05:38 ID:???
>>36
あっ、左辺と右辺を書きまちごうたけど、まっいっか。
38nobodyさん:2005/05/26(木) 07:47:44 ID:???
>>32
fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
39nobodyさん:2005/05/26(木) 11:23:28 ID:7fGLJWg9
すいません質問お願いします。
自分で作った掲示板で、書込み内容を修正しようとおもったのですが、
削除機能がついてないので、ftpでログをダウンロードして
書込み内容を修正してからアップロードしたら
きちんと表示されなくなりました。

ログの保存方法は
title<>name<>kakikominaiyou
title<>name<>kakikominaiyou
見たいな感じ記録して
読み込みは
open(LOG,"$logname");
@log = <LOG>;
for($i=0;$i<@log;$i++){
}
なのですが、
@log = <LOG>のところで一行づつ読み込めてないようなのですが
どこに原因があるのでしょうか?お願いします。
40nobodyさん:2005/05/26(木) 11:49:50 ID:???
>>17
 まず open(ABC, ">") じゃなくて open(ABC, "+<") に変えるべき。

>>35
 >>37

>>39
 ヒント : $log = <LOG>; print $log; ってやったらどんな文字列が出る?
41nobodyさん:2005/05/26(木) 16:07:48 ID:???
お願いします。

がらくたBOOKさんの「SiteHistory」を改造中です。
ttp://tinkle.cside.com/book/cgi/cgi.htm
項目をがらりと変えたのですが、どうもうまくいきません。修正しようとすると、一番上の行のカウンターだけ残して全ログが消えてしまいます。
とりあえず、修正サブルーチンは以下の通りです。
---------------------
sub edit3 {
if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }
# ログファイル読み込み
open (FILE, "$data") || &error("ファイルが開けません");
@data = <FILE>;
close(FILE);
# カウント退避
$count = shift (@data);
foreach $line (@data) {
($no,$coview,$name,$tel,$genre,$floor,$all,$fday_i,$sday_i) = split(/<>/,$line);
chomp;
if ($no eq $in{'edit_no'}){
$line = "$no<>$in{'coview'}<>$in{'name'}<>$in{'tel'}<>$in{'genre'}<>$in{'floor'}<>$in{'all'}<>$in{'fday_i'}<>$in{'sday_i'}<>\n";
}else {$line = "$no<>$coview<>$name<>$tel<>$genre<>$floor<>$all<>$fday_i<>$sday_i<>\n"; }
push(@new,$line);
}
# ログを更新
unshift(@renew,"$count");
open(OUT,">$data") || &error("削除処理を失敗しました");
print OUT @renew;
close(OUT);
&admin;}
-----------
どこが間違っているのでしょう?
42nobodyさん:2005/05/26(木) 17:09:45 ID:???
それを丸投げって言うんだよ
43nobodyさん:2005/05/26(木) 17:27:51 ID:???
思考を放棄したら人としておしまいですよ
4439:2005/05/26(木) 18:44:15 ID:7fGLJWg9
>>40
レスありがとうございます。
試してみたところ
書込み内容の改行のところで一行と扱われてしまっているようです。
なにかいい方法はないのでしょうか?

わかりやすく言うと
title<>name<>書込み内容の改行
書込み内容の途中
title<>name<>書込み内容

上記のように出力されてしまいます。
45nobodyさん:2005/05/26(木) 19:16:41 ID:???
>>44
ログの改行コードの扱いを整理した方が良いと思う。
その掲示板の CGI やエディタや ftp クライアントなどが、
それぞれどんな改行コードを想定しているかとか改行コードを変換したりしてないかとか、
そういうあたりを。
46nobodyさん:2005/05/26(木) 20:31:30 ID:???
>>44
つまり、ログに保存するとき、例えば、

my $str = "その書き込み内容の改行";
$str =~ s/\r?\n/<br>/g;

とかで改行タグを無くしなさい。
1行ごとにログ保存してる掲示板とかならみんなやってることだぞ。
47nobodyさん:2005/05/26(木) 20:33:06 ID:3LXc6fmj
自サイト内アイテムを検索する場合の
検索システムのルーチンについて質問です。

1.検索結果と同じ数の変数を作り、
  検索結果をその変数に格納する
   ↓
2.1〜50件、または51〜100件までと表示する際、
  1の変数から取り出して表示する

という考え方で合ってますでしょうか。
4835:2005/05/26(木) 21:40:41 ID:4tEZgW2V
>40
すみません、どうして>37と書かれているのかわかりません
>37に書いてある事の意味は何となく理解できますが
難しすぎて応用の域に達しませんでした…。
49nobodyさん:2005/05/26(木) 22:25:58 ID:???
>>48
 >>40
 > こんな風に無理矢理別の変数に突っ込んでみようとしましたが
 > $array[$index]=$mem;
 > $memには何も記録されませんでした。

 >>37
 > 左辺と右辺を書きまちごうたけど
50nobodyさん:2005/05/26(木) 22:28:55 ID:???
>>47
ようわからんけどあってることにしとく。
51nobodyさん:2005/05/26(木) 22:45:13 ID:???
【ゴールデンレス】
  ∩ ・∀・)∩∩ ´∀`)∩  このレスを見た人はコピペでもいいので
   〉     _ノ 〉     _ノ10分以内に3つのスレへ貼り付けてください。
  ノ ノ  ノ  ノ ノ  ノそうすれば14日後好きな人から告白されるわ宝くじは当たるわ
  し´(_)   し´(_) 出世しまくるわ体の悪い所全部治るわでえらい事です
5235:2005/05/26(木) 23:12:36 ID:Q34ppmGc
>49
>36を一生懸命よんでまっすたごめんなさい…できました
ところで、>35に付け加える感じなんですが

$tmp01 = "シュウマイ";
$tmp02 = "餃子";
$tmp03 = "食いてぇ〜";
@array = (01,02,03);
$index = rand @array;
my $mem = $array[$index];

これで、$tmp.$memのようにして
print "$tmp.$mem"\n";
$tmp01〜$tmp03の中身(シュウマイとか)を表示させたいんですが
やっぱりうまく行きません……どうしたらいいでしょうか?
53nobodyさん:2005/05/27(金) 00:32:30 ID:???
>>52
$tmp01 = "シュウマイ";
$tmp02 = "餃子";
$tmp03 = "食いてぇ〜";
@array = ('01','02','03');
$index = rand @array;
my $mem = $array[$index];
print "${tmp.$mem}\n";
54nobodyさん:2005/05/27(金) 00:39:41 ID:???
>>53
@array = qw"シュウマイ 餃子 食いてぇ〜";
print "$array[rand@array]\n";
5553:2005/05/27(金) 04:39:59 ID:OuNiDnY3
レスありがとうございます、いろいろなやりかたがあるのですね。
表示ができました。

それと、どうしても詰まってしまったんですが
スクリプト上で、${tmp.$mem}を$tmp01〜$tmp03と認識させて、
以降の処理に使いたい場合はどうすれば良いのでしょうか?

$tmp01 = "0";
$tmp02 = "0";
$tmp03 = "0";
@array = ('01','02','03');
$index = rand @array;
my $mem = $array[$index];

${tmp.$mem} = 1;
#$tmp01〜$tmp03に1を代入したい

printで表示させた時はうまくいったのですが、スクリプト上だと
${tmp.$mem}を$tmp01〜$tmp03そのものとは認識してくれなくて、ここで止まってます
${tmp.$mem}の結果を該当する$tmp01〜$tmp03にすり替えるには…?
5653:2005/05/27(金) 05:03:41 ID:???
勘違いしてました、できますよねちょっと寝てきます

ぎゃぼー
57nobodyさん:2005/05/27(金) 06:32:17 ID:???
$tmp01〜$tmp03 を @tmp に変えれば use strict 下でも動いていろいろ楽だろうに。
何事も考え方一つだ! ・・・対位法でも学んでおくかい?
58nobodyさん:2005/05/27(金) 07:19:03 ID:???
こんな書き方も出来るけど、お勧めできない。
my $tmp01 = "シュウマイ";
my $tmp02 = "餃子";
my $tmp03 = "食いてぇ〜";
my @array = \($tmp01, $tmp02, $tmp03);
my $index = rand @array;
my $mem = ${$array[$index]};
print "$mem\n";

いつも思うのけど、なぜ配列を使うのを嫌うのだろう。
59アップロードの質問:2005/05/27(金) 07:28:24 ID:???
>>38
レスありがとうございます。

>fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
なるほど、そういう事なのですか。。。そう言われればそうですよね。

>アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
>ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
やはり最初のsubmitで送信してしまわないといけないのですね。。。
ご指摘の通り、確認画面でやめられた時の「ゴミ」が気になっていたので
なんとか確認ページからのアップロード処理を出来ないものかと思っていました。

とりあえず、疑問はなくなりスッキリしました。
ありがとうございます!
60nobodyさん:2005/05/27(金) 14:45:20 ID:???
use vars qw($A $B);

↑このvarsてのは何なのですか?
後qwとかqqとかもありますが、それについての詳細もお伺いしたいのですが
61nobodyさん:2005/05/27(金) 14:46:50 ID:???
そうやってひとつひとつここで聞いていくつもりか?
62nobodyさん:2005/05/27(金) 14:55:18 ID:???
>>60
 >>7
 あるいはぐぐればすぐでてくるっつ
63nobodyさん:2005/05/27(金) 15:11:30 ID:???
>>61
はい。
64nobodyさん:2005/05/27(金) 15:17:51 ID:???
>>63
さあ、はやく上司の愛想伺いに戻るんだ
65nobodyさん:2005/05/27(金) 15:18:50 ID:???
>>63
最低限、>>1くらい読みなさい。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません
6653:2005/05/27(金) 15:55:26 ID:???
>57
$tmp01〜$tmp03を@tmp('$tmp01','$tmp02','$tmp03')とまとめるという事でしょうか?

実は$tmpの01〜03以外にも、別の変数$soc01〜03があって
$tmp01の内容が$soc01に、$tmp02が$soc02に(以下略)…
対応している、という仕組みになってます
なので、数字だけ出して割り振ろうと考えてました。

配列を使うのを嫌うというか、有効な使い方がまだよくわからんとです…。
見てると多分効率悪いんでしょうね、ネットで調べながらやってるんですが応用は難しいです、

あ、>60は自分じゃないです
67nobodyさん:2005/05/27(金) 15:57:50 ID:???
>>65
当然読んでおります。マナーですから。
68nobodyさん:2005/05/27(金) 16:24:21 ID:???
>>66
こう使うって意味だと思う
@tmp = ("シュウマイ", "餃子", "ラーメン");
#$tmp[0] = "シュウマイ";
#$tmp[1] = "餃子";
#$tmp[2]= "食いてぇ〜";
@soc = (100, 200, 300);
$count = @tmp;
$index = int(rand $count);
print "$tmp[$index] $soc[$index]円";
69nobodyさん:2005/05/27(金) 17:20:12 ID:???
>>66
> 数字だけ出して割り振ろうと〜
余計配列とかのが適してない?
ハッシュ(連想配列)でもいいかもしれない。

my $tmp01 = 'シュウマイ';
my $tmp02 = '餃子';
my $soc01 = 100:
my $soc02 = 200:

ってやるより、

my %menu = (
    'シュウマイ', => 100,
    '餃子' => 200,
);

とかやった芳がわかりやすいと思わないかい?。
70nobodyさん:2005/05/27(金) 17:22:02 ID:???
ごめんちょっとtypoってるわ
71nobodyさん:2005/05/27(金) 17:56:56 ID:???
個人的には

my @db = (
{name=>'シュウマイ',price=>100},
{name=>'餃子',price=>200}
);

ってやるのが好き
Template Toolkit にもそのまま貼りつけられて楽だし
7253:2005/05/27(金) 18:10:05 ID:???
>68
この例でようやく直感的に理解できました、そうですよね変数をしまっておけるんですよね
正直な所、配列の本当の便利さがよくわかってませんでした、すごい便利なんですね、恥ずかしい

配列もちゃんと理解してなかったのにアレですが、>69のハッシュは使えそうだなと思ってました
ただ、要素をランダムに選び取るというのがどうやったらいいのか全くわからなくて
今までここでお世話なった分で何とか$tmpを取り出す所まではできたんですが、
@array = ('01', '02','03',);
$index= rand @array;
my $sed=$array[$index];
%hash = ($tmp01=>$soc01, $tmp02=>$soc02, $tmp03=>$soc03,);
%hash_value = reverse %hash;
print $hash_value{${soc.$tmp}};

$socの中身を一緒に取り出すというのができませんでした。
(eachだと1つではなく、全部取り出してしまいますよね?)
下2行のvalueの所をkeyに、socをtmpに変えても何も出てこない…
reverse関数で何故こういう結果が出るのかも実はよくわかりません……
7353:2005/05/27(金) 18:11:34 ID:???
>71のは…なんか…なんか……なんかすごいですね
よくわかりませんがすげえー そんなやり方もあるのか!
74nobodyさん:2005/05/27(金) 19:45:37 ID:???
>>72
それだとすごく >>68>>69 意味ないなw
どうしてもその 01, 02, 03, ってのは必要なの?
0, 1, 2, じゃだめなの?

どうしても 01, 02, 03 にしたいなら、こう書くのは?

my %hash = (
    '01' => { tmp => $tmp1, soc => $soc1 },
    '02' => { tmp => $tmp2, soc => $soc2 },
    '03' => { tmp => $tmp3, soc => $soc3 },
);
my @key = keys %hash; # ex) 01, 02, 03
my $index = rand @key # ex) 1
my $sed = $key[$index]; # ex) 02
my $r = $hash{$sed}; # ex) { tmp => $tmp2, soc => $soc2 }
print $r->{tmp}; # $tmp2
print $r->{soc}; # $soc2

1行1行やるのはまわりくどいけどとりあえず。
7553:2005/05/27(金) 20:10:30 ID:???
>73
ですよね…生かせてないなと思いつつ、どうしたらいいもんか思いつきませんでした…。

>0, 1, 2, じゃだめなの?
全然だめじゃないです。ファイルの名前つける時のクセで0つけてました

'01' => { tmp => $tmp1, soc => $soc1 },
あの、無知で恥ずかしいんですがこれってどうなってるんでしょうか?
01〜03がキーで{}の中身が値、{}の中で値が二種類ある、という状態でしょうか。
>71のも見て「?」ってなったんですが、ハッシュってキー1つに対して
値1つを格納しておく物だと思ってたんですが…1:1じゃない場合もあるという事 ??

まずは>73で教えてもらったので勉強してもちょっと頑張ってみます。
76nobodyさん:2005/05/27(金) 20:49:21 ID:C4o5Scf8
>>40
>>17ですが、遅レスですいません。
データ項目に点数という項目があり、データが追加される度に点数の降順に並べ替えて書き込みを
行っています。こういった場合でもopen(ABC, ">") を使わない方法はありますでしょうか?
77nobodyさん:2005/05/27(金) 20:53:42 ID:???
パンチ5分の2は元気かな
78nobodyさん:2005/05/27(金) 20:56:48 ID:C4o5Scf8
よろしくお願いします。
a.cgiからb.cgiを呼び出すときに、引数を渡したいのですが、
以下のような渡し方では根本的に間違っているのでしょうか?

【a.cgi側】
print "<FORM METHOD=\"POST\" ACTION=\"b.cgi?x=1>\n";

【b.cgi側】
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
}

としているのですが、$value にはなにも入っていませんでした。
79nobodyさん:2005/05/27(金) 21:53:12 ID:???
>>75
@array = (
{tmp=>'シュウマイ',soc=>100},
{tmp=>'餃子',soc=>200},
{tmp=>'ラーメン',soc=>500},
{tmp=>'チャーハン',soc=>400},
{tmp=>'半熟卵',soc=>50},
);
%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";
80nobodyさん:2005/05/27(金) 22:45:10 ID:???
>>79
こんなプログラム作ってみた。

%menu = (
'シュウマイ' => {soc=>100},
'餃子' => {soc=>200},
'ラーメン', => {soc=>500},
'チャーハン' => {soc=>400},
'半熟卵' => {soc=>50},
'チャーシュー' => {soc=>100},
'ライス' => {soc=>150},
'チャーシューメン' => ['ラーメン','チャーシュー','半熟卵'],
'ラーメンセット'=> ['ラーメン','ライス','半熟卵'],
'チャーシューメンセット' => ['チャーシューメン','ライス'],
'チャーハンセット' => ['ラーメン','チャーハン','半熟卵'],
'シュウマイセット' => ['ラーメンセット','シュウマイ'],
'餃子セット' => ['ラーメンセット','餃子'],
);
81nobodyさん:2005/05/27(金) 22:45:25 ID:???
@menu = keys %menu;
%hash = sub{menu=>$_[1],$_[0]->(@_)}->(sub{
my $code = shift;
my $key = shift;
if(ref $menu{$key} eq 'HASH'){
return(tmp=>$key,soc=>$menu{$key}{soc});
}elsif(ref $menu{$key} eq 'ARRAY'){
my @tmp;
my $soc;
foreach my $key(@{$menu{$key}}){
my %hash = $code->($code,$key);
push @tmp, $hash{tmp};
$soc += $hash{soc};
}
return(tmp=>join(":",@tmp),soc=>$soc);
}else{
return(tmp=>'',soc=>0);
}
},$menu[rand@menu]);
print "$hash{menu}\t[$hash{tmp}]\t$hash{soc}\n";
82nobodyさん:2005/05/27(金) 22:47:14 ID:???
>>78
hidden
83nobodyさん:2005/05/27(金) 23:31:46 ID:???
>>78
ヒント : action="b.cgi?x=1" の x=1 は $ENV{'QUERY_STRING'} に記録される。


>>75
0, 1, 2 、どっちでもいいなら >>71 および >>79 の方法にしとくのが一番いいかと。
まあ、>>79 はわざわざ %hash にしなくても、別に無名ハッシュのままでいいじゃん、とは思うけどな。

%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";

$hash = $array[ rand @array ];
print "$hash->{tmp} \t $hash->{soc} \n";

矢印演算子、覚えればいろいろベンリだぞ。


>>80-81 は・・・まあ好みで
84nobodyさん:2005/05/27(金) 23:41:49 ID:???
>矢印演算子、覚えればいろいろベンリだぞ。

何か違くね?
85nobodyさん:2005/05/27(金) 23:51:07 ID:???
・・・エ、何が?(:´д`) arrow operator ?
86nobodyさん:2005/05/28(土) 06:51:40 ID:???
>>85
>>83の一文だと、矢印演算子が万能みたいだって言いたいんじゃね?

そもそも>>75はリファレンスを知らなさそうだし
リファレンスをデリファレンスするのに
矢印演算子が使えるよってのが適切ではないかと
87nobodyさん:2005/05/28(土) 11:01:56 ID:???
便利なのは「矢印演算子」じゃなくて「リファレンス」だろ。
矢印演算子を全く使わなくてもデリファレンスやメソッドコールはできるからな。
88nobodyさん:2005/05/28(土) 11:19:45 ID:???
>>86-87
ああ、そうだね。 リファレンス。
それはわかるけど、でも >>83 のは >>79 に対して言ったんだけどなw

> %hash = %{$array[rand@array]};。
せっかくリファレンス使ってるのに、わざわざそんなくどい書きかたしなくても、って。
矢印知ってたら楽に書けるのになーと。

まあ誤解生ましたようで正直スマンかった。
89nobodyさん:2005/05/28(土) 11:49:47 ID:???
ああ、全然関係無い話ね。紛らわしい。
9075:2005/05/28(土) 12:47:52 ID:???
矢印演算子とリファレンス、ググって調べてみました。
>75の疑問がすんなり解決しました… 多次元配列って訳がわからなくて今まで無視してました

何か色々とお世話になってしまって、すごく助かりました
いただいたレスのスクリプトや内容を把握しきれてない部分が多いので、
名無しに戻ってまた勉強してきます。目が回りそうです。

もしまた詰まったら助けたって下さい〜このスレの人皆やさしい!幸あれ!ほんとありがとう!
91nobodyさん:2005/05/28(土) 13:44:25 ID:mN70gA2+
>>83
>>78ですが、おかげさまで分かりました。ありがとうございます。
92nobodyさん:2005/05/28(土) 19:21:59 ID:/z95VPw7
クエリを使用してマルチバイト文字を入力する為、以下のコードを作成しました。

>> test.cgi
#!/usr/bin/perl
#cgiはEUCで記述
require './jcode.pl';
print <<'END_OF_HEADER';
Content-type: text/html; charset=EUC-JP

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=euc-jp"></HEAD><BODY>
END_OF_HEADER
  $query = $ENV{'QUERY_STRING'}; #クエリ文字列を得る
  print &jcode'getcode(\$query); #入力されたクエリの文字コード
  &jcode'convert(*query, 'euc'); #EUCに変換
  print ' to ', &jcode'getcode(\$query), '<BR>'; #変換されたことを確認
  print '<A HREF="test.cgi?', $query, '">', $query, '</A>'; # 文字化け発生部分
print <<'END_OF_FOOTER';
</BODY></HTML>
END_OF_FOOTER
<<

3: 半角文字及び、一部の全角文字(あいうえお、アイウエオ 等)では成功。しかし、一部の全角文字(まみむめも、マミムメモ 等)で、文字化けを起こします。
マルチバイト文字の2バイト目が悪さをすると思ってEUCにしたんですが、このコードでは処理が不完全なようです。問題部分の指摘をどうぞよろしくお願いいたします。
93nobodyさん:2005/05/28(土) 20:47:58 ID:???
Jcode.pmとかEncode.pmは使えないの?
94nobodyさん:2005/05/28(土) 20:58:22 ID:???
どこでURL unescapeしてんだ?
95nobodyさん:2005/05/28(土) 21:01:04 ID:???
"文字化け"っつーか・・・
$query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
とかしてないけど平気なのか?
96nobodyさん:2005/05/28(土) 21:02:05 ID:???
かぶった orz
97926:2005/05/28(土) 21:08:01 ID:???
とりあえずIEに「http://〜/test.cgi?マミムメモ」とダイレクトに入力しちゃってる段階なので、
URLデコードは考えてません・・・。
9892:2005/05/28(土) 21:13:29 ID:???
URLデコードを入れて、
test.cgi?%83%7d%83%7e%83%80%83%81%83%82
(マミムメモ)でやってみましたが、結果同様でした。

ちょっと舌足らずでした。最初に上記の様にアクセスした時はうまくいくのですが、
それで出てきたリンクを使って再帰的にアクセスした時に文字化けを起こします。
99nobodyさん:2005/05/28(土) 21:43:25 ID:???
それは http://〜/test.cgi?マミムメモ みたいなリンクを出力してるからなんじゃないの?
100nobodyさん:2005/05/28(土) 22:59:52 ID:z135H4rk
if( @BUF==5 ){ … }
if( scalar @BUF==5) { … }

この二つの条件式の書き方で、下の方が良いとか上の方が良いと言うことはありますか?
101nobodyさん:2005/05/29(日) 00:02:47 ID:???
好きな方を使え
102nobodyさん:2005/05/29(日) 00:05:59 ID:???
>>101
サンクス。特にどっちでも良いんだね。
103nobodyさん:2005/05/29(日) 14:34:29 ID:I/a3Ab/R
初心者ですが、並び替えの基本を教えて下さい。

名前、点数、日付
A  80 20050529
B  100 20050523
C  70 20050525
D  80 20050524

というようなデータを点数の降順に並び替える場合はどうすれば良いのですか?
リストにセットしてsortを使っても、点数での並び替えは出来ないですよね?
一度ハッシュというものに点数をkeyとしてセットし、keyで並び替えたりする
のですか??でも同じ点数があった場合はまずいですよね?
なんかアホな質問ですいません。標準的な並べ替え方法を教えて下さい。
104nobodyさん:2005/05/29(日) 14:38:05 ID:I/a3Ab/R
>>103です。
記述し忘れましたが、同点の場合は、できれば日付の降順にしたいです。
105nobodyさん:2005/05/29(日) 15:17:33 ID:???
>>103
my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
);

my @sorted_array =
sort { $b->[2] <=> $a->[2] } # 日付で
sort { $b->[1] <=> $a->[1] } # 点数で
@array;
106nobodyさん:2005/05/29(日) 16:30:09 ID:???
>>104
my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
['E',70, 20050526],
['F',80, 20050526],
['G',50, 20050526],
);

my @sorted_array = sort {
$b->[1] <=> $a->[1] || # 点数で
$b->[2] <=> $a->[2] # 日付で
}@array;
107nobodyさん:2005/05/29(日) 16:37:41 ID:???
>>104
my @array = (
# 名前、点数、日付
{name=>'A',point=>80,date=>'2005/05/29'},
{name=>'B',point=>100,date=>'2005/05/23'},
{name=>'C',point=>70,date=>'2005/05/25'},
{name=>'D',point=>80,date=>'2005/05/24'},
{name=>'E',point=>70,date=>'2005/05/26'},
{name=>'F',point=>80,date=>'2005/05/26'},
{name=>'G',point=>50,date=>'2005/05/26'},
);

my @sorted_array = sort {
$b->{point} <=> $a->{point} || # 点数で
$b->{date} cmp $a->{date} # 日付で
} @array;

print map{"$_->{name}\t$_->{point}\t$_->{date}\n"}@sorted_array;
108nobodyさん:2005/05/29(日) 16:44:36 ID:???
>>103 >>104
my %hash = (
# 名前、点数、日付
'A' => {point=>80,date=>'2005/05/29'},
'B' => {point=>100,date=>'2005/05/23'},
'C' => {point=>70,date=>'2005/05/25'},
'D' => {point=>80,date=>'2005/05/24'},
'E' => {point=>70,date=>'2005/05/26'},
'F' => {point=>80,date=>'2005/05/26'},
'G' => {point=>50,date=>'2005/05/26'},
);

my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} cmp $hash{$a}{date} # 日付で
} keys %hash;

print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
109nobodyさん:2005/05/29(日) 17:04:57 ID:???
>>103
my @array = (
# 名前、点数、日付
[qw( A 80 20050529 )],
[qw( B 100 20050523 )],
[qw( C 70 20050525 )],
[qw( D 80 20050524 )],
);

my %hash = map{
$_->[0] => {
point => $_->[1],
date => $_->[2],
}
} @array;

my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} <=> $hash{$a}{date} # 日付で
} keys %hash;

print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
110nobodyさん:2005/05/29(日) 17:26:07 ID:???
>>103
print map{
"$_->[0]\t$_->[1]\t$_->[2]\n"
} sort {
$b->[1] <=> $a->[1] ||
$b->[2] <=> $a->[2]
} map {
[
grep {
!/^\s*$/
} split /\s+/
]
}grep{
!/^\s*$/
} split /\n/, q(
A 80 20050529
B 100 20050523
C 70 20050525
D 80 20050524
);
111nobodyさん:2005/05/29(日) 17:28:44 ID:w/eeChjM
すんません質問です。

open(FH,"subject.txt");
@list=<FH>;
close(FH);

と同等のことを、http://news19.2ch.net/newsplus/subject.txtからとってきて
やりたいんですが、どげんすればいいんでしょうか?

XP上でhttpdとActivePerlでテストしてる段階で行き詰ってます。
112nobodyさん:2005/05/29(日) 17:30:16 ID:w/eeChjM
>>111
そっくりそのまま落としてきて、subject.txtとして保存するんでもいいす。
むしろそれがしたいっす。
おながいします。
113nobodyさん:2005/05/29(日) 17:32:22 ID:???
LWP
114nobodyさん:2005/05/29(日) 17:44:34 ID:???
>>111
use LWP::Simple;

open(FH,">subject.txt");
print FH get 'http://news19.2ch.net/newsplus/subject.txt';
close(FH);
115nobodyさん:2005/05/29(日) 17:51:07 ID:???
>>111
use LWP;
open(FH,">subject.txt");
binmode FH;
print FH LWP::UserAgent->new()->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt'
)
)->content();
close(FH);
116nobodyさん:2005/05/29(日) 18:08:16 ID:???
>>112
use LWP;
open(FH,">subject.txt");
binmode FH;
print LWP::UserAgent->new(
agent => 'HogeHoge-Agent'
)->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt',
HTTP::Headers->new(
Referer => 'http://hogehoge/'
)
)
)->content();
close(FH);
117nobodyさん:2005/05/29(日) 18:35:04 ID:EsZHM8T2
>>111
ほれ、俺の力作
GET http://news19.2ch.net/newsplus/subject.txt > subject.txt
118nobodyさん:2005/05/29(日) 18:43:53 ID:???
>>111
>>116はファイルに保存できないねすまん。>>115の真似はせず一つづつ展開してみた。
use LWP;

my $url = 'http://news19.2ch.net/newsplus/subject.txt'; #取得したいコンテンツのURLを指定
my $user_agent = 'HogeHoge-Agent'; #ユーザーエージェント名を指定
my $referer_url = 'http://hogehoge/'; #参照元を指定
my $save_file = 'subject.txt'; #保存先のファイル名

my $ua = LWP::UserAgent->new(agent => $user_agent); #エージェントオブジェクトを作成
my $header = HTTP::Headers->new(Referer => $referer_url); #HTTPヘッダーオブジェクトを作成
my $request = HTTP::Request->new(GET => $url, $header); #HTTPリクエストオブジェクトを作成
my $respons = $ua->request($request); #サーバに接続してデータを取得
my $content = $respons->content(); #取得したコンテンツ内容を変数にコピー

open(FH,">$save_file"); #保存先ファイルを書込みモードでオープン
binmode FH; #保存形式をバイナリ形式に指定
print FH $content; #コンテンツ内容をファイルに保存
close(FH); #保存先ファイルを閉じる
119nobodyさん:2005/05/29(日) 19:05:27 ID:???
>>111
use LWP;
open(FH,">subject.txt");
binmode FH;
LWP::UserAgent->new(
agent => 'areyakoreya'
)->request(
HTTP::Request->new(
GET => 'http://news19.2ch.net/newsplus/subject.txt',
HTTP::Headers->new(
Referer => 'http://untara.kantara.com/tekitou.html'
Cookie => 'are=nani',
)
),
sub{ print FH $_[0] },
1024*1024
);
close(FH);
120nobodyさん:2005/05/29(日) 20:41:42 ID:QH9/XuV4
みなさんありがとうございます。ひとつひとつやってみます。
121nobodyさん:2005/05/29(日) 22:00:45 ID:I/a3Ab/R
質問お願い致します。
@wk_list[0] と$value の共に数値、文字が混在している場合、

if( @wk_list[0] eq $value || @wk_list[0] == $value ){

と記述すると、数値同士の場合はうまくいきますが、文字の場合違う
データと一致してしまいます。数値、文字が混在の場合の比較演算は
どうすれば良いですか?
122nobodyさん:2005/05/29(日) 22:23:47 ID:QH9/XuV4
>>111-112経過報告〜

とりあえず、localhostからhttp://localhost/subject.txtを呼び出して、コピーをローカルに作ることに成功しました♪

ありがとうございました。
123nobodyさん:2005/05/29(日) 22:28:02 ID:???
>>121
Scalar::Utilのlooks_like_numberで数値かどうかは調べられるから、
両方が数値なら==、どっちかが数値でなけりゃeqでいいんでねーの?
124nobodyさん:2005/05/30(月) 02:00:43 ID:sacYxvRr
>>122さらに経過報告〜

できましたー

んが!
鯖がそのcgiに広告つけやがる。javascriptはきだすcgiなんで、んなことされたら
台無しなんですが…というわけで、鯖探し中。とにかく、

解決したっぽいです、ありがとー
125nobodyさん:2005/05/30(月) 04:08:17 ID:???
昨日は回答がとても豪華だったみたいだなw
126nobodyさん:2005/05/30(月) 04:30:03 ID:???
>>105-110 >>113-119 ワロスw

>>124 print する Content-type を JS用に変えたら広告着かないサバも結構あるよ
127nobodyさん:2005/05/30(月) 11:33:30 ID:???
>>125
こういうのって設問から回答まで全部一人でやってたりすることってよくあるよね。
128nobodyさん:2005/05/30(月) 16:13:42 ID:efT5hV/s
いわゆる自作自演って香具師?
129nobodyさん:2005/05/30(月) 16:17:17 ID:???
かみいわゆるごっど
130nobodyさん:2005/05/30(月) 16:38:57 ID:???
あれを全部一人で書いたんなら
乙。とだけ言っておこう
ってか























んなわけないやろw
普通そういう考えに至らない。自演常習者ならではの発想。
131nobodyさん:2005/05/30(月) 17:25:33 ID:???
まあ俺も少なくとも >>106=>>107=>>108 だとは思うがなw
132nobodyさん:2005/05/30(月) 19:01:53 ID:2nqscNNy
>>123
looks_like_number ってライブラリか何かですか?普通に使える関数でしょうか?
できれば使い方を教えてもらえないでしょうか?
133nobodyさん:2005/05/30(月) 19:04:21 ID:???
>>132
「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。

perldoc Scalar::Util
134106,107,108:2005/05/30(月) 19:34:37 ID:???
くそっ、ばれたか!
135nobodyさん:2005/05/30(月) 19:37:51 ID:2nqscNNy
>>133
私の素人用の本には載っていなくて、検索でなんとか
【@bool = DBI::looks_like_number(@array);リストの各要素について、数値に見え
ばTRUE、そうでなければFALSEを返します。未定義、あるいは空文字であれば、undef
もしくは空文字を返します。】
ってのは見つけたのですが、そもそもScalar::Utilってのがさっぱり分かりません。
素人考えで昨日から if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
136nobodyさん:2005/05/30(月) 19:44:32 ID:???
ちっ!さすがに質問まで自作自演じゃあなかったか。
137nobodyさん:2005/05/30(月) 19:45:46 ID:Xh5clFyG
うざいやつら...
138nobodyさん:2005/05/30(月) 20:29:17 ID:???
よくわからんが、(一時的に)数値も文字として比較しては駄目なのか?
139nobodyさん:2005/05/30(月) 20:42:20 ID:2nqscNNy
>>138
比較対象データが、数値・文字混在で1000件ほどあって、比較元が
数値の場合は良いのですが、文字の場合、先に違うデータ(数値?)と
一致してしまうんです。
140nobodyさん:2005/05/30(月) 21:11:58 ID:???
ん?
@bool = DBI::looks_like_number(@array);
なら
if (DBI::looks_like_number($value))
は必ず真にならないか?
wantarray でちゃんと 0 か 1 で返してくれてるのかな。

あと
if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
の @wk_list[0] eq $value の部分
は、「数字の場合」、なんだから
$wk_list[0] == $value になるのでわ。
同じかも知らんが一応。

つーか数字に見えるかどうかくらい、そのモジュール使わなくても自作でできると思うがw
141nobodyさん:2005/05/30(月) 21:19:22 ID:???
>135
君はまずモジュールというものを知るべきだ。
その後、CPAN を知ることにより、より幸せになれるであろう。

ttp://search.cpan.org/search?query=Scalar%3A%3AUtils&mode=all
ttp://search.cpan.org/~gbarr/Scalar-List-Util-1.15/lib/Scalar/Util.pm

で、Perl が使える環境で perldoc Scalar::Util って実行したら下と同じドキュメントが見られるはず。
ちなみに、@wk_list[0] だとスライスなので、$wk_list[0] の間違いだと思う。
>123 に従って書いてみるとこんな感じ。

use Scalar::Util qw(looks_like_number);
if(looks_like_number($wk_list[0]) && looks_like_number($value) ? $wk_list[0] == $value ; $wk_list[0] eq $value) {}

「数字のように見える」だから君の求めている結果と違う可能性はあるけどね。
142nobodyさん:2005/05/30(月) 21:27:57 ID:???
それ使うと、$value が '123' か 123 か見分けられんの?
143nobodyさん:2005/05/30(月) 22:04:45 ID:???
>>142
looks like number = 数値のように見える

'123'と123を見分けるにはPerlレベルでは無理だし、見分けても意味ない。
144nobodyさん:2005/05/30(月) 22:05:43 ID:???
DBIにもlooks_like_number()はあるが、それだけのためならScalar::Utilの方を使うべきだろうな
145nobodyさん:2005/05/30(月) 22:08:01 ID:???
ああ、一応数値と文字列を見分けることもできるか。
ttp://search.cpan.org/~gaas/Perl-API-0.01/

これでperlapiの殆どの関数を利用できるようになる。
146nobodyさん:2005/05/31(火) 06:36:25 ID:???
$ENV{'TZ'} がないとき、サーバのタイムゾーンってどうやればわかるのかな?
JST とか GMT とか EST とかそういうの。
147nobodyさん:2005/05/31(火) 08:23:28 ID:???
perl -e 'print `date`, "\n";'
148nobodyさん:2005/05/31(火) 08:43:42 ID:???
おお、見れた! thx!
windows perl じゃ取れなかったけどw
149nobodyさん:2005/05/31(火) 08:45:01 ID:???
>>146
タイムゾーン関係の設定ファイルがあるがlibcのバージョンや
OSの作法によっていろいろ違いがあり、ポータブルなのを自前
で書くのはたいへんなのでDateTime::TimeZoneモジュールを使
うのが楽だろう。

use DateTime::TimeZone;
use DateTime;

my $tz = DateTime::TimeZone->new(name => 'local');
print $tz->name, "\n";

my $dt = DateTime->now;
print $tz->short_name_for_datetime($dt), "\n";
150nobodyさん:2005/05/31(火) 08:48:39 ID:???
use POSIXしてstrftimeの%Zという手もあるな。

use POSIX;
print strftime "%Z", localtime;
151nobodyさん:2005/05/31(火) 10:01:32 ID:???
うは いろいろ試してみたけど POSIX 軽く鬱るくらい便利だなw すげえ。

>>149 も ありー。
でも必要なモジュール多いし揃えても何故か動かなかったw スマン。
152nobodyさん:2005/05/31(火) 11:03:00 ID:TIA+apXZ
ここでいいのかどうかわかりませんが…

習作でperlでライブラリ及びdbを使わずに(なるべく多くの環境で動くことを目標に)
2ch風の掲示板を作ろうとしています。
んで、排他処理について質問…というか意見を伺いたいです。

板(blist.dat)、スレ(tlist.dat)、書き込み(スレid.dat)があります。
権限を持っていれば、板とスレも作成/論理削除が可能で、
同時に更新される可能性があります。
数は板・スレッド共に、00〜ffまで持てる物とします。

排他処理はロックファイルのリネーム方式で行おうと考えています。
なるべく軽快に動かしたい為、必要な時に必要な所だけロックをかけようと思っており、
そういう意図で必要になるロックファイルは
・lock_blist(板一覧用)
・lock_tlist(スレッド一覧用)
・lock_スレッドid(個別スレッド用)
となります。

これで組むと、ロックファイルが板の数*256個となり、最大で65536個になってしまうのですが、
これは設計としてアリ…というか必然なのでしょうか。それとも、ダメダメ(工夫の余地あり)なのでしょうか。

もちろんここに書き込む時点で多いなーという疑問を持っているのですが、
任意の一スレッドに書き込むたびに掲示板全体をロックするというのは、
それはそれで違うかなという気がしています。。

ご意見などありましたら、ご教授お願いします。
153nobodyさん:2005/05/31(火) 11:12:03 ID:???
書き込むたびにスレ一覧も更新するんじゃないの?

レス数とか
154nobodyさん:2005/05/31(火) 11:17:57 ID:???
あ、、、、
そうか。。。


その通りでした…orz

何ではまってたんだろう…ありがとうございますorz
155nobodyさん:2005/05/31(火) 16:14:18 ID:???
お願いします。

簡単なデータベースを動作させたいと思っています。
1つのページに2×4個データを表示させたいんです。
もちろんそれ以上の情報があれば次のページへと移動です。

この「2つ目で改行・8個目でページ終了、さらに次のページ移動やページ数を計算」
というものを勉強したいのですが、どこかに良いサイトや参考となるCGIはありませんか?
156nobodyさん:2005/05/31(火) 17:58:58 ID:???
たくさんあるデータをページ単位にするのとそれをページ内で
どう表示するかはわけて考えた方がいいだろうな。

前者は自分で作ってもいいが、Data::Pageとかそれっぽいのが
CPANにあるから適当に探して気に入ったものがあれば使うのも
いいだろう。次のページあるかないかとか、このページにある
データはいくつかなんてのはもちろんよく考えれば簡単に計算
で求まるとはいえめんどうだからね。もし自分で書くとしても
だらだらとスクリプトのあちこちでその場で計算しないで、
うまく手続きをまとめておくことをお勧めする。

後者はあんまり知らないのだがどうせ作るんならn×mで一般的
に作っておくと気がかわったときにいいかもしれん。

あとhtmlベタでスクリプトに埋め込むよりはTemplate Toolkit
とか使った方がすっきりするよ。
157nobodyさん:2005/05/31(火) 18:51:34 ID:md7jEE3a
PHPでいうincludeをperlでやるにはどうすればいいんですか?
158nobodyさん:2005/05/31(火) 19:16:24 ID:???
>>157
いちばん近いのはdoじゃないかと思う

159nobodyさん:2005/05/31(火) 19:19:00 ID:???
ファイルのパーミッションを調べる方法はございますでしょうか。

statでは調べられないみたいですが、もしもございましたら
ご教授いただきたい次第です。
160nobodyさん:2005/05/31(火) 19:20:33 ID:???
ちゃんと stat のリストの中にあるよ。
161157:2005/05/31(火) 19:41:37 ID:???
>>158
ありがとうございます
早速やってみます!
162nobodyさん:2005/05/31(火) 20:41:06 ID:???
>>160
勉強になりました。
有難うございました
163nobodyさん:2005/06/01(水) 05:35:45 ID:???
モジュールの中を見てるみると

require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
bootstrap なんか別のモジュール?;

みたいな流れがよくあるんですが、
これって何をやっているんでしょう?
164nobodyさん:2005/06/01(水) 10:36:57 ID:???
ExporterとDynaLoaderのマニュアル嫁
165nobodyさん:2005/06/01(水) 12:03:09 ID:???
>>164
んー、Exporterのほうはぐぐってみても日本語化されたマニュアルが見つからないのです。
動的にモジュールをロード?しているっぽいんですかね。
これを使えば、引数からモジュール名を得て、インポートするモジュールを選べたりするのでしょうか。
166nobodyさん:2005/06/01(水) 12:26:27 ID:???
>>165
ぐぐり方が悪すぎるんじゃ...

Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
167nobodyさん:2005/06/01(水) 21:46:59 ID:???
>>163
Exporterはモジュールのシンボル(通常はサブルーチン)を呼び出し元に輸出するためのモジュール。
DynaLoaderはCなどで書かれた外部サブルーチン(XS)をロードするモジュール。
詳しいことはぐぐるなりマニュアル読むなりせよ。

オブジェクト指向でPurePerlなモジュールを書く分にはどちらも無関係。
168nobodyさん:2005/06/01(水) 23:13:36 ID:4wa3Dv1b
すみません。sendmailを使ってメールを送る際に
ファイルを添付することは出来ませんか?
169nobodyさん:2005/06/01(水) 23:38:04 ID:???
>>168
できる。でもsendmailそのまま使ってあとは自分で作るのはお勧めしない。
search.cpan.orgでmailとかMIMEとかキーワードに検索するといろいろでて
くるのでなるべく利用するのが吉かと。
170nobodyさん:2005/06/02(木) 07:19:19 ID:???
>>167 "PurePerl" って何?
その言い方から予想するとプラグマ以外の他のモジュール使わないで単独で動くモジュールってことかな。
171nobodyさん:2005/06/02(木) 07:21:43 ID:???
DynaLoaderはXS専用じゃないよな。
172nobodyさん:2005/06/02(木) 12:06:12 ID:???
>>170
PurePerlってのは他の言語で書いたライブラリに依存せず、Perlのみで書かれたコードのこと。
どんなモジュールを使っているかは関係ない。
標準ライブラリだと、CGI.pmはPurePerlで、POSIX.pmはPurePerlじゃない。
といってもそんな厳密なものではなく、例えばData::Dumperなんかはコンパイル済みライブラリがあれば
その(速い)ルーチン、無ければPurePerlルーチンを自動的に選択して使用する。
非PurePerlモジュールに依存したPurePerlモジュールをPurePerlというか否かも意見の分かれ目だな。

>>171
まあXSインターフェイスを使わなくてもDynaLoaderを使うことはあるわな。
ここでは単に「外部サブルーチン」という意味でXSとした。
173nobodyさん:2005/06/02(木) 17:34:11 ID:???
>>172 おおなるほど!(゜∀゜) 勉強になったよありがとう!
174nobodyさん:2005/06/02(木) 18:02:31 ID:???
my ($i, $j) = (0, 0);
foreach (1 .. 10) { $i++; } continue { $j++; }
print " ($i , $j) \n";

こういうコードを実行すると、結果が (10 , 10) ってなるんだけど、これはいいの?w
(10 , 9) ってなってほしかったんだけど・・・ orz
175nobodyさん:2005/06/02(木) 19:32:12 ID:???
>>174
どこからどう考えても (10,10) なのだが・・・。

foreach節の最後に last until $i < 10; とでも付け加えれば
最後の continue は実行されないが。
176nobodyさん:2005/06/02(木) 19:41:55 ID:???
>>174
ラクダ3版の「4.4.3 foreachループ」の最後のあたりに
はっきりこのように書いてある。

while文と同様に、foreach文もcontinueブロックを持つことが
できる。continueブロックは、ループが普通に実行された場合
でも、nextが実行された場合でも、ループの各繰り返しの最後
に必ず実行される。
177nobodyさん:2005/06/02(木) 20:09:01 ID:QYKowdcj
if(-e $saitama){
print $saitama;
}

すいません↑これって何をしてるんですか?
-eで$saitamaが存在しているのかどうかを調べているんでしょうか
178nobodyさん:2005/06/02(木) 20:12:30 ID:???
> -eで$saitamaが存在しているのかどうかを調べているんでしょうか

正解。
179nobodyさん:2005/06/02(木) 20:15:16 ID:QYKowdcj
ありがとうございました
180nobodyさん:2005/06/02(木) 20:40:27 ID:???
my %d;
$text =~ s/\A([^\n]*)\n//s;
$d{title} = $1;

こんなのが出てきたんですけど、$1は、「上の正規表現『s/\A([^\n]*)\n//s』で一番最初にマッチングしたもの」であってますか?
181nobodyさん:2005/06/02(木) 21:05:27 ID:???
>>180
一番最初の括弧の中にマッチしたもの。
182nobodyさん:2005/06/02(木) 21:38:25 ID:U6HelXRG
すいません。教えて下さい。

名前 住所 電話
A氏 東京 1111111111
B氏 大阪 2222222222
C氏 愛知 3333333333
D氏 広島 4444444444

上記のようなデータファイルがあって、B氏だけの内容を変更したい時、
ファイルを出力用 ">" で開いて再度1レコードずつ書き込めばできる
のですが、出力用で開くと一旦データが全て消えて危険性が高いので、
入出力両用 "+<" 等で開き、他のレコードは保持したまま、B氏のレ
コードだけを書き換えるようなことは出来るのでしょうか?
183nobodyさん:2005/06/02(木) 21:45:15 ID:???
レコードのサイズを固定長にする。
184nobodyさん:2005/06/02(木) 21:55:58 ID:???
別ファイルに書いて、成功したらばrename
185nobodyさん:2005/06/02(木) 22:00:22 ID:U6HelXRG
>>183
他にも項目があって固定長には出来ないのですが、固定長にすると
対象レコードのみ書き換えられるのでしょうか?
>>184
成功したかどうかはどう判断すれば良いでしょうか?
186nobodyさん:2005/06/02(木) 22:19:38 ID:???
>>185
エラーが発生せずに、書き込み、クローズが完了したら成功。
もっと気にするなら、読み込んでベリファイ。
187nobodyさん:2005/06/02(木) 22:22:01 ID:???
if (変更前のファイルサイズ - 変更前の変更行のサイズ == 変更後のファイルサイズ - 変更後の変更行のサイズ) { rename 〜 } とかな。
他にも方法はいくらもあるけど、上のもそうだがいちいち聞くな、自分で考えろと。
188nobodyさん:2005/06/03(金) 06:02:35 ID:???
mod_rewriteをつかって
http://www.hoge.com/aaa/bbb/ccc.html へのアクセスが
http://www.hoge.com/index.cgi?aaa/bbb/ccc.html となるように書き換えをさせています。
RewriteRuleは→ ^(.*)$ index.cgi?$1 [L,QSA] こんな感じで。

で、http://www.hoge.com/aaa/bbb/ccc.html?ddd にHTMLフォームからPOSTで適当なクエリを送って、
そいつを取得したいのですが、
QUERY_STRING には aaa/bbb/ccc.html&ddd が入っているものの、
フォームからポストしたクエリが標準入力に来ていないっぽいのです。
フォームからポストするクエリの量を変えてやると CONTENT_LENGTH の値が変わるので、
全く送られていないわけではないみたいなのですが…
いったいどこに行ってしまったのか心当たりはありませんでしょうか?
189188:2005/06/03(金) 07:13:27 ID:???
自己レス
なんか全然別のつまらないところでミスっていただけでした……
板汚しすみません……
190nobodyさん:2005/06/03(金) 09:54:19 ID:lSpNwut+
超初心者でもわかるPHPの書籍探してるんですが、できれば、教えて頂きたいのですがよろしいでしょうか?
191nobodyさん:2005/06/03(金) 10:01:33 ID:???
だめに決まってるでしょ。
192nobodyさん:2005/06/03(金) 10:02:31 ID:???
PHPのスレが別にあるから、そっちで聞きなさい
193nobodyさん:2005/06/03(金) 16:31:13 ID:p0YkzVQc
sub lengthw {
local $_ = shift;
-(tr/\x00-\x7f//)+2*length
}

↑これはどんなことをしてるんでしょうか
lengthwは
if((lengthw $x) < 50){} のような使い方をしているみたいですが

どなたか分かる方がおりましたら解説希望です。
194nobodyさん:2005/06/03(金) 17:23:46 ID:???
if ( (文字列 $x のバイト数 x 2) - ($x の中のアスキー文字の数) > 50 ) { }
なにがしたいのかはよくわからん。
195nobodyさん:2005/06/03(金) 17:24:10 ID:???
不等号逆だー orz
196nobodyさん:2005/06/03(金) 18:09:23 ID:???
>>194
$_がunicode文字列でbytesプラグマの影響範囲内でなければ
lengthはバイト数じゃなくて文字数だな。

もしそうならアスキーの範囲は1,それ以外は2で文字幅を
数えてるような気がする。

条件が示されてないのでなんともいえんが。
197193:2005/06/03(金) 18:27:26 ID:p0YkzVQc
>>194-196
お答えありがとうございました!

というか

local $_ = shift;#←これがよく分かってないんです。
-(tr/\x00-\x7f//)+2*length #←これは_$が略されてるのは想像つくんですが。。

198nobodyさん:2005/06/03(金) 18:45:47 ID:???
>>196
結局見てみないとわからんねw

>>197
local $_ = shift;
↓=
local $_ = shift @_;
OK?
199193:2005/06/03(金) 18:52:05 ID:p0YkzVQc
うはー「@_」が略されてたんですね。
わけ分かりませんでした。ありがとうございました!

ちなみにbytesプラグマの影響範囲内ではありません。
200nobodyさん:2005/06/03(金) 18:56:41 ID:???
perlって略すような書き方が多いから、解析するのに苦労するよね。
use Time::Local
とか意味分かんないし
201nobodyさん:2005/06/03(金) 18:58:28 ID:???
use Time::Local のどこが意味分かんないの?
202nobodyさん:2005/06/03(金) 19:12:25 ID:???
use Time::Local って「Timeと言うクラスのLocalって関数を使えるようにしますよ」って意味でいいのかな?
203nobodyさん:2005/06/03(金) 19:23:19 ID:???
うーむ、略すような書き方とか解析するとか以前に、
それは単に君が勉強が足りてないだけのような気が。
204nobodyさん:2005/06/03(金) 19:47:19 ID:???
use Time::Local;
↓=
BEGIN {
    require 'Time::Local.pm';
    import Time::Local;
}
アンダースタンンドゥッ!?
205nobodyさん:2005/06/03(金) 19:59:28 ID:???
BEGINって何ですか?
206nobodyさん:2005/06/03(金) 20:25:00 ID:???
207nobodyさん:2005/06/03(金) 21:08:38 ID:???
Time::Localでどんなことが出来るようになるの?
208nobodyさん:2005/06/03(金) 21:17:01 ID:???
それぐらいぐぐれ。調べれば分かることを聞くスレじゃない。
209nobodyさん:2005/06/03(金) 21:21:50 ID:???
>>207
http://search.cpan.org/~drolsky/Time-Local-1.11/lib/Time/Local.pm

>>208
Perl に関してはググるより前に perldoc れ or CPAN れが必要な気がする。
210nobodyさん:2005/06/03(金) 21:26:58 ID:???
ぱーるどくれ!しーぱんれ!
211nobodyさん:2005/06/03(金) 21:27:04 ID:???
>>209
「れ」が余計です。
212nobodyさん:2005/06/03(金) 21:38:29 ID:p0YkzVQc
$a = $x if ($x !~ /[$kw]$/ or $rest !~ /^[$kw]/) and ($rest !~ /^[$kt]/ and $x =~ /[$kk]$/)
こんなのが出てきましたけど、私にはチンプンカンプンです。
これだけで申し訳ないのですが、↑が分かる人がいましたら、解説願います。
213nobodyさん:2005/06/03(金) 21:44:52 ID:???
おいおい、片っ端から質問していくつもりかよ・・・?
214nobodyさん:2005/06/03(金) 23:02:32 ID:???
215nobodyさん:2005/06/04(土) 14:08:36 ID:???
>>211
ググ「れ」のもじりだからおk
216nobodyさん:2005/06/04(土) 19:40:24 ID:???
>>215
言語感覚が滅茶苦茶だな。
217nobodyさん:2005/06/04(土) 22:52:44 ID:???
( ゚Д゚)…
218nobodyさん:2005/06/04(土) 23:48:24 ID:???
ファイルサイズの単位をバイトからメガバイトにして小数点第三位以下を切捨てするにはどうすればよいですか?

たとえば12345678を11.77にしたいです。
219nobodyさん:2005/06/04(土) 23:55:29 ID:???
my $chinko = 12345678;
my $manko = 100;

print int($chinko / (1024 * 1024) * $manko) / $manko;
220nobodyさん:2005/06/05(日) 00:02:38 ID:???
ありがとう!
221nobodyさん:2005/06/05(日) 00:43:39 ID:???
printf "%.2f",12345678/1024/1024;
222nobodyさん:2005/06/05(日) 04:55:26 ID:???
それ切り捨てじゃないし
223nobodyさん:2005/06/05(日) 13:21:23 ID:???
変数名なんとかしろよw
224nobodyさん:2005/06/05(日) 15:28:16 ID:???
質問があります。
↓のような場合で、

for($i=0;$i<=10;$i++){
$po[$i] .= int(rand(6));
}

これはあくまで例なのですが、似たような場合などでも、
randで選ばれる数字が同じものが続けて入ってしまう事が良くあるのですが、
これをもっとばらけさせたいのですが、何か方法があるのでしょうか?
上手く説明できずにすみませんが何卒よろしくお願いします。
225nobodyさん:2005/06/05(日) 16:27:58 ID:???
>>224
0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...

同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。

お手軽コース:
同じ数字の間はやり直す

少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。

226nobodyさん:2005/06/05(日) 16:42:19 ID:???
>>224
コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。

my @numbers;
my $last = $num = -1;
for(my $i = 0; $i <= 10; $i++){
$num = int(rand(6)) while($last == $num);
$numbers[$i] = $last = $num;
}
print @numbers;

# 11回振ってるようだが、いいんきゃーも?
227nobodyさん:2005/06/05(日) 18:10:57 ID:???
WindowsのMySQL+DBIの使い方で困ってます。詳しい方、教えてくれないでしょうか。

下のテーブルをセレクトしたいだけなんですが、mysqlのコマンド上ではちゃんと表示される日本語がPerlで出力させるとクエスチョンマークで表示されてしまいます。

↓こういう風に表示させたい。
>2005-06-05 17:27:47<>0<>ニュースタイトル!<
>2005-06-05 17:27:48<>0<>news title!<

↓こういう風になってしまう。
>2005-06-05 17:27:47<>0<>?????????<
>2005-06-05 17:27:48<>0<>news title!<

どうやったら日本語を出力できるんでしょうか。どなたかご教授お願いします。m(__)m

◆ソース(perl v5.8.6)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
228nobodyさん:2005/06/05(日) 18:11:25 ID:???
上の続き・・・

◆テーブル
| NEWS_DATE       | NEWS_IMPORTANCE | NEWS_TITLE     |
| 2005-06-05 17:27:47 |                 0 | ニュースタイトル! |
| 2005-06-05 17:27:48 |                 0 | news title!      |

◆DBステータス
mysql Ver 14.7 Distrib 4.1.12a, for Win32 (ia32)
Connection id: 1
Current database: testdb
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 4.1.12a-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: sjis
Db characterset: sjis
Client characterset: sjis
Conn. characterset: sjis
229nobodyさん:2005/06/05(日) 19:01:00 ID:??? BE:3921449-#
前回と同じ値だからといって再度乱数を発生させると、ループがかさばる可能性もあるですよ。

my @dice_seed = (1..6);
my @dice_rand;
for(reverse (0..$#dice)){
push @dice_rand, splice @dice_seed, rand $_, 1;
}
みたいな。。。
230nobodyさん:2005/06/05(日) 19:24:15 ID:???
>>227
たぶんこれ。オレも以前はまった。

ttp://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
の「mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは? 」
231227:2005/06/05(日) 20:35:05 ID:???
>>230
ログイン直後に SET NAMES sjis を追加したらできました!
ありがとう!!!
もう、perlあきらめてphpで開発しようかと思ってたら
phpでも同じだったんですね・・・

◆ソース(変更後)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$dbh->do('SET NAMES sjis');    # ←追加
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
232 ◆5KhTfX3Q0E :2005/06/05(日) 23:16:56 ID:???
はじめまして、よろしくお願いします。

1: HTMLを取得して例えば
<A href="http://www.**.co.jp/~sample/image/a.jpg">
<A href="image/a.jpg">
<A href=http://www.**.co.jp/~sample/image/a.jpg>
<A href=image/a.jpg>
とあるものをすべて
<A href="http://www.**.co.jp/~sample/image/a.jpg">
に統一したい。
2:
$url = $ENV{'QUERY_STRING'};
$url =~ s/$0//gi;
$surl = $url;
if($surl !~ /\/$/){$surl =~s/(.*)\/.*/$1\//i;}
use LWP::Simple;
$html = get $url;
&jcode'convert(*html,'sjis');
#携帯で見れるようにしたいのでテーブル等不要と思われるものを削除
#出来ればここも1行に統一できればうれしいです
$html =~ s/<(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
$html =~ s/<\/(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;

3: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます

これぐらいでよろしいのでしょうか。よろしくお願いいたします。
233nobodyさん:2005/06/06(月) 01:24:14 ID:???
>232
>これぐらいでよろしいのでしょうか。
もう少しやりたいことと何が問題なのかを整理して書いてくれ。
1と3って同じことだと思っていいのか?
とりあえず hoge/./ を取り除いたりまではしてない。

my $server = 'http://www.example.com'; # サーバのところまで
my $base = 'http://www.example.com/~sample/'; # 相対パス起点

sub absolute($)
{
my $str = shift;
$str =~ s/^"//;
$str =~ s/"$//;
if($str =~ m,^/,) {
return qq("$server$str");
} elsif($str =~ m,^http://,) {
return qq("$str");
} else {
return qq("$base$str");
}
}

$target =~ s,(<A[^>]*\s+href=)("[^"]*"|\S*)([^>]*>),$1.absolute($2).$3,eigm;

2: まとめればいいんだな?
$html =~ s/<\/?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
個人的には
$html =~ s,</?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt)[^>]*>,,gi;
の方が好きだな。
234nobodyさん:2005/06/06(月) 01:26:42 ID:???
>233
$target =~ は $html =~ だと思ってくれ。
235nobodyさん:2005/06/06(月) 01:31:08 ID:???
>232
度々申し訳ない。>>1 のテンプレ?に合わせようとしてたんだな。
でもやっぱり何が問題なのか、どこがポイントなのかを整理して欲しいとは思う。
236nobodyさん:2005/06/06(月) 14:15:56 ID:nLjgLi0T
質問させてください。
flockを使わずにflockと同じ動作する方法って、ありますか?
237nobodyさん:2005/06/06(月) 14:29:00 ID:???
そうさなあ。あれは何年前のことじゃったか…。
238nobodyさん:2005/06/06(月) 15:25:52 ID:???
なにもかも、懐かしい思い出じゃった…
239nobodyさん:2005/06/06(月) 15:44:24 ID:???
>>236
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
240nobodyさん:2005/06/06(月) 23:17:43 ID:???
本当になつかしい
241nobodyさん:2005/06/06(月) 23:52:50 ID:7fi2eBpp
実行ボタンクリックすると、フォーム内のデータをファイルに書き込むと言う
多分超簡単なものを作ってます。

ファイルをオープン後
$buff=<DAT>;
@buff=<DAT>;
としました。
これは、データの1行目と全てのデータを表示させたかったからなのですが
どうやら上記のように書くと@buffには、$buffを除いたものしか入ってこないようです。

簡単に、データの1行目、1行目を含む全データを格納したいのですが
どうしたらいいでしょうか。
242nobodyさん:2005/06/06(月) 23:58:16 ID:???
@buff=<DAT>;
$buff=$buff[0];
243241:2005/06/07(火) 00:07:20 ID:???
>>242
なるへそ…出来ました!
アザース!!!
244 ◆5KhTfX3Q0E :2005/06/07(火) 00:12:36 ID:???
>>233
できました、ありがとうございます
整理できていなくてすいませんでした
いまさらですが整理というか用途を書きますと

携帯からこのcgiにアクセスし、
****.cgi?http://www.abc.*.jp/
と言う形でみたいページのアドレスを指定します
指定されたアドレスをcgiで取得し、テーブルなどの携帯では不要なタグを切り捨てます
次に、アンカー?<A〜タグにあるhrefにこのcgiをかえすように、
href=****.cgi?リンク先
と言うようにかえたいので、hrefのぶぶは絶対パスに統一する必要があるのですがこの方法が分からずにいました
あともう一つ間違えてたら分かればでいいので教えていただきたいのですが、
>>232のソース+>>233パスを統一するソースのみのソースで何故かbodyタグまで消されるのですが、理由分かりますでしょうか
245nobodyさん:2005/06/07(火) 09:57:36 ID:???
正規表現の中に |B| があるから Bで始まるものタグが消されてるんじゃね?
Blockquote とか UL とかも消されてるはず。
もうちょっと正規表現考えた方が良かったね。 プ
246 ◆5KhTfX3Q0E :2005/06/07(火) 10:46:09 ID:???
>>245
たしかに…
気づきませんでした
ありがとうございます
247nobodyさん:2005/06/07(火) 12:03:54 ID:???
質問です。
↓これだけの文章だと、"newdir"というフォルダがなければ、作るまで永遠に繰り返すってことになりますかね?
while (!mkdir("newdir", 0755)) {
  
}
248nobodyさん:2005/06/07(火) 12:32:22 ID:???
サーバークラッシュさせたいってこと?
249nobodyさん:2005/06/07(火) 14:54:20 ID:???
↓こうやらないと、フォルダが作られたら、ループが終わっちゃうんでは?

while (!mkdir("newdir", 0755)) {
 rmdir("newdir"); 
}
250nobodyさん:2005/06/07(火) 15:29:22 ID:???
>>249
「作るまで永遠に繰り返す」だから作ったら終わっていいんじゃない?
251nobodyさん:2005/06/07(火) 16:38:25 ID:???
>>247-250
これってどこでフォルダが作られてるの?
while(この部分)←この部分でフォルダが作られる?!
252nobodyさん:2005/06/07(火) 17:02:56 ID:???
Yes. mkdir は フォルダを新しく作ったら 1、失敗した場合は 0 を返す。

なので、もし既にnewdirフォルダが存在していた場合、無限ループになるわけで。
253nobodyさん:2005/06/07(火) 17:26:57 ID:???
>>252
ありがとうございました!
254nobodyさん:2005/06/07(火) 17:46:05 ID:???
で、なんの役に立つんだ、ソレ、、、
255 ◆wSkAcTBWJw :2005/06/07(火) 17:50:20 ID:Jzx4SwvB
質問です。

\%hogehoge と記述した場合、どのような意味を成すのでしょうか?

具体的には↓のような文章なのですが、

return \%hogehoge if (rename($hogehoge{path}, $hogehoge{cureer}));

ifの中が真(renameに成功)の場合は\%hogehogeの中に何かを入れているのでしょうけども、
よく分かりません。どなたか教えてください。
256nobodyさん:2005/06/07(火) 18:06:11 ID:???
リファレンスで調べよ
257nobodyさん:2005/06/07(火) 18:22:21 ID:???
横から補足。
「perl リファレンス」でぐぐれって事な
258nobodyさん:2005/06/07(火) 18:39:51 ID:???
renameに成功した場合は
hogehoge{path}を戻り値がリファレンスとして返される。
259nobodyさん:2005/06/07(火) 18:46:16 ID:???
あ、違う
renameに成功した場合は
$hogehoge{cureer}を戻り値とし、リファレンスとして返される。
260nobodyさん:2005/06/07(火) 18:56:32 ID:???
>>255

> \%hogehogeの中に何かを入れているのでしょうけども、
何も入れてないでしょ。
renameに成功したら、return \%hogehoge を実行してるだけ
261nobodyさん:2005/06/07(火) 19:59:03 ID:???
とにかくリファレンスを理解しろ。話はそれからだ。
つーかそれからの話などそれで消えてなくなる。
262nobodyさん:2005/06/07(火) 20:07:48 ID:???
>>259は何を言ってるんだ?
263nobodyさん:2005/06/07(火) 20:24:23 ID:???
>>262
何か勘違いしてるのでしょう。ほっとけば気づくのでは。
264nobodyさん:2005/06/07(火) 20:33:44 ID:B1nXEBrs
open(FILE, "+>$file");
$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);

ファイルから値とって、1増やして上書きしたいんですけど、上の通りにしてもできないんです。
$fileの初期値を1にして、上の通り実行すると、$fileが空っぽになる

open(FILE, "+<$file");
$xx = <FILE>;
$xx++;
print FILE $offCount;
close(FILE);

こんな感じで追加書き込みモードにすると、うまく行くので、変数にはちゃんと値が入ってるみたいです。

ご指摘お願いします。
265nobodyさん:2005/06/07(火) 20:44:04 ID:???
>>264 下のでできたならいいじゃん。
$offCount ってなんだよ。
+> はまず最初にファイルを真っ白にするんだが。
266nobodyさん:2005/06/07(火) 21:48:12 ID:???
cgi(perl)で書くHTMLについて質問させてください。

@hoge という配列に適当な文字列を複数pushして、
<textarea>@hoge</textarea>とすると、テキストエリア内で各要素の間に半角スペースが入ってしまいます。

簡単にこの半角スペースを消す方法や、別の楽な書き方はないでしょうか?
foreachで書いていくのが妥当でしょうか?
267nobodyさん:2005/06/07(火) 22:01:43 ID:B1nXEBrs
>>265
すいません、$offCount は $xx と脳内変換しといてください・・・
追加書き込みモードじゃなくて、上書きしたいんですができます?
268nobodyさん:2005/06/07(火) 22:05:05 ID:???
>>266 join
269nobodyさん:2005/06/07(火) 22:41:21 ID:???
>>266
$,
270nobodyさん:2005/06/07(火) 22:42:15 ID:???
>>266
$"を空文字列にする
271nobodyさん:2005/06/07(火) 22:48:25 ID:???
そういや mod_perl 使うと $\ とか $, が効かなくなるのはどうにかならんのかな。

>>267
seek truncate tell とかで検索しとけ。
272nobodyさん:2005/06/08(水) 00:46:36 ID:???
>>268-270
ありがとうございます。$"=undef; とするとかなり簡潔になりました。
273nobodyさん:2005/06/08(水) 02:11:43 ID:3Bw2MIjp
>>271
ごめんわからへん
274nobodyさん:2005/06/08(水) 07:35:48 ID:???
>>272
俺も若い頃 print FILE "@log"; とか書いてスペース入るのが困って foreach (@log) { print FILE $_; } とか書いてた甘酸っぱい記憶を思い出したよ・・・ orz
275nobodyさん:2005/06/08(水) 09:55:34 ID:???
ttp://www.ipa.go.jp/security/awareness/vendor/programming/a04_01.html
↑を見てsysopenを使おうとしたんですが、Fcntlを使わなければmodeの指定は出来ないんでしょうか?
固定の数値なら直値で打っちゃうんだけど、環境依存するものですか?
276nobodyさん:2005/06/08(水) 10:04:49 ID:???
>>275
建前上は環境依存するものなのでFcntl使っとけ。
いちいちいくつになってるか調べたりこの環境では
OKか気にするのは無駄。
277nobodyさん:2005/06/08(水) 11:35:43 ID:???
>>276
ありがとうございます。
やはり環境依存する可能性があるものなんですね。。
迷うorz
278nobodyさん:2005/06/08(水) 18:09:13 ID:iGltiuvK
foreachの使い方についてご質問させてください
配列の要素をすべてではなく一部飛び飛びで
取り出したいのです。

$count = @DATA_N;
foreach (5..$count) { 処理 }

とすれば5番めの項目から最後までと言うことらしいのですが
では1番目と5番目以降というように
いくつか項目を飛ばして取り出すには
どのようにすればいいのでしょうか?
よろしくお願いいたします。
279nobodyさん:2005/06/08(水) 18:33:55 ID:???
foreach (1, 5..10, 15..$count)

つーか配列の "5番目の項目" の添え字は [4] なのは理解してるよね? 一応釘
280nobodyさん:2005/06/08(水) 18:47:04 ID:iGltiuvK
ありがとうございます
>添え字は [4] なのは理解してるよね? 一応釘
はい[0]から始まると言うことは理解しております:汗
そうですね「,」で区切ればいいのですね。
「..」は「から〜まで」と言う風に理解すればいいのですね!
勉強になりました。
ありがとうございました。
281nobodyさん:2005/06/09(木) 01:19:34 ID:???
/usr/tmp とかのテンポラリーなディレクトリがあったら、これって勝手に使っていいのかな?
CGI.pm だと使ってるようだから?、後始末さえしっかりやればいいのかのう。
282nobodyさん:2005/06/09(木) 11:30:41 ID:???
open(LFILE,"+<$logfile");
@log = <LFILE>;

($sec,$min,$hour) = localtime(time);
$aftertime = "$hour:$min:$sec unixtime:" . time ;
$data = "$aftertime \n";
unshift(@log,($data));
while($log){
print LFILE $_;
}
close(LFILE);

質問です
$logfileに時間を一番上に追加してゆく処理を行いたいと思い、
↑のようにコーディングしたのですが、全く更新されません。
なぜですか?
283nobodyさん:2005/06/09(木) 11:51:59 ID:???
>>282
問題点1:
while($log) → foreach (@log)

問題点2:
LFILEの中身を呼んだ後seekしてないのでこのままでは続きから書かれるだろう

問題点3:
そもそもファイルの頭に追加するという設計を見直した方がいい。
末尾への追加は簡単だが、頭へ追加しようとすると全部書き直しになるので
普通はそういうことははじめからしなくていいようにしとくものだ。
284nobodyさん:2005/06/09(木) 12:12:41 ID:???
設計し直し、っていうか勉強し直しが必要なような。
285nobodyさん:2005/06/09(木) 12:27:48 ID:???
出来ました!
頭に追加したほうが、見やすいので、そういう設計にしました。
ありがとうございました!
286nobodyさん:2005/06/09(木) 13:53:02 ID:r/eHxoG7
特定の条件でCGIからメールが
送信できなくてこまってます・・

www.hoge.co.jp サーバで
メール送信CGI mail.cgi があって
ここからメールを送信させているんですが
送信先メールアドレスが

[email protected] とか [email protected] のような
hoge.co.jp サーバ以外への送信ならうまくいくんですが

[email protected] とか [email protected] への
送信だとうまく送信されない(届かない)ようなんです。

mail.cgi自体は同じものを使用していて
@hoge.co.jp 以外のメールアドレスへの送信はうまくいっているので
sendmail の問題?なのかもしれませんが
何か調べる必要がある点などありましたらご教授お願いします。
287286:2005/06/09(木) 13:55:21 ID:r/eHxoG7
ちなみにですが
メールが届かないメールアドレス([email protected] とか [email protected] )自体は
他のメーラやWEBメールから送信されたメールを
正常に受信できてます。

あくまで www.hoge.co.jp 上の mail.cgi から
[email protected] へメール送信しても届かない・・・という感じです。
288nobodyさん:2005/06/09(木) 13:55:42 ID:???
意味がわかんね
289286:2005/06/09(木) 14:19:27 ID:r/eHxoG7
すんません、もっかい整理します。

www.hoge.co.jp 上に mail.cgi を設置しています。
mail.cgi の内容は次のような感じです。

  mail.cgi
  ----------------------------------
  $head = "From: [email protected]\n";
  $head .= "To: [email protected]\n";
  $head .= "Subject: TEST MAIL\n";
  $head .= "Date: $Date\n";
  $head .= "Content-type: text/plain\n";
  $head .= "Mime-Version: 1.0\n\n";

  $body = "テスト";

  open(MAILER, "| /usr/sbin/sendmail -t") || exit(0);
  print MAILER $head;
  print MAILER $body;
  close(MAILER);
  ----------------------------------
290286:2005/06/09(木) 14:20:03 ID:r/eHxoG7
ここで

  $head .= "To: [email protected]\n";

の送信先部分が [email protected] だと
メールを送信してもメーラ側で受信できず(届いていない)

  $head .= "To: [email protected]\n";

のように [email protected] 以外へメールを送信した場合は
正常にメーラ側でメールを受信できる状況です。
なので、コードがおかしい分けでなく
www.hoge.co.jp 上の sendmail か何かの設定がおかしいのかも
しれませんが・・・。なんなんでしょう・・。

ちなみに [email protected] のメールアドレス自体は
他のメーラやWEBメールから送信したメールを
正常に受信できています。
291nobodyさん:2005/06/09(木) 14:54:19 ID:???
"@hoge" の部分が配列として評価されて "" になっちゃってんじゃないの?
シングルクオートで囲むか "\@hoge" とエスケープしてみ。

ていうか、 abc.co.jp とか test.co.jp とか実在するドメインを例に使うな。
予約ドメインの example.co.jp とか example.ne.jp とか example.jp とかを使え。
292nobodyさん:2005/06/09(木) 17:33:54 ID:???
input type="file"で指定されたcsvファイルをデータとして読み込みたいんですが、
モジュールを使わないという前提で、参考になるサイトはありませんでしょうか。
ぐぐり疲れました・・・orz
293nobodyさん:2005/06/09(木) 18:27:43 ID:???
>>292
http://www.studyinghttp.net/body#Form-data
理解できなきゃ素直に CGI.pm 使うなり、
CGI.pm バラして必要なトコだけパクりなされ。
294nobodyさん:2005/06/10(金) 00:38:57 ID:gI851X9W
sss
295nobodyさん:2005/06/10(金) 00:52:30 ID:gI851X9W
上の誤投稿でした、すんません
質問なんですけど、shiftやpopは先頭か末尾ですよね。
そういうのじゃなくて配列の任意のデータを削除したいんですが、どうやるんでしょう?
296nobodyさん:2005/06/10(金) 01:22:16 ID:???
splice
297nobodyさん:2005/06/10(金) 09:07:37 ID:???
>>293
ありがとうございます。
とりあえず隅から隅まで読んでみますー
298nobodyさん:2005/06/10(金) 10:31:53 ID:???
>>295 いつの日か delete も使えるようになったよね
299nobodyさん:2005/06/10(金) 11:01:32 ID:n3jB9OmG
初歩的な疑問ですんません
# 処理
my %in;
&decode;
&html if (!$in{send});

$inや%inは何か特別なのでしょうか?
300nobodyさん:2005/06/10(金) 11:07:59 ID:???
なんで特別とか思ったの?
301nobodyさん:2005/06/10(金) 11:23:36 ID:???
302nobodyさん:2005/06/10(金) 12:00:39 ID:???
CGI.pmのメソッドradio_groupで作成されるオブジェクトにラベルタグを付けたいです。

<input type="radio" name="yes" value="1">はい
<input type="radio" name="yes" value="2">いいえ

<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
<input type="radio" name="yes" value="2" id="yes2"><label for="yes2">はい</label>
にしたい。

メソッド改造は汎用性が無いので
正規表現とかでなんとかならないでしょうか?
303nobodyさん:2005/06/10(金) 12:01:26 ID:???
304nobodyさん:2005/06/10(金) 12:04:13 ID:???
どうでもいいけど、 <label><input /></label> のが気持ちがいいよ。
305299:2005/06/10(金) 12:06:16 ID:n3jB9OmG
ありがとうございます
ページを読みましたが$inはなかったです。
306299:2005/06/10(金) 12:12:11 ID:n3jB9OmG
cgi-lib.plの中に%inという連想配列があるからなのですね!
ありがとうございます。
早速cgi-lib.plをみてみます。
307nobodyさん:2005/06/10(金) 12:26:18 ID:???
あぼーん
308302:2005/06/10(金) 12:29:51 ID:???
>304
私もそう思うけど

<input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label>
なら、とりあえず

%labels =('1','<label for="yes1">はい</label>');
$co->radio_group(
           -name=>'yes',
           -values=>['1','2'],
           -labels=>\%labels);

で、いけるんで・・・。
これもむちゃくちゃ使いにくいけど。(・・`)
309nobodyさん:2005/06/11(土) 01:51:46 ID:KxmWI2vs
質問です。

配列の中から文字列を検索して、
その文字列が含まれている配列の添え字を取得することはできますか?

例えば、
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";

みたいな配列@dataがあって、そのなかから"72歳"という文字が
含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
310nobodyさん:2005/06/11(土) 02:23:38 ID:???
use strict;
my @data;
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my $str = "72歳";
for ( 0..$#data ) {
 if ( $data[$_] =~ /$str/ ) { print; }
}
__END__
311nobodyさん:2005/06/11(土) 02:46:40 ID:???
$data[0]="おじいちゃん<>76歳";
$data[1]="おばあちゃん<>72歳";
$data[2]="おとうさん<>56歳";
$data[3]="おかあさん<>52歳";
my$str = "72歳";
for(0..$#data){
print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/;
}
312nobodyさん:2005/06/11(土) 03:03:41 ID:???
print map { $_->[0] } grep { (split /<>/, $_->[1])[1] =~ m/$str/ } map { [$_, $data[$_]] } 0 ..$#data;
313nobodyさん:2005/06/11(土) 03:03:43 ID:???
@index = grep m/72sai$/, 0..$#data;
314313:2005/06/11(土) 03:05:12 ID:???
index そのままマッチテストした。だめだね。
315312:2005/06/11(土) 03:06:40 ID:???
>>313
オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
316nobodyさん:2005/06/11(土) 09:07:57 ID:???
質問させていただきます。
変数名を変数で扱うことができますでしょうか?
分かりにくいので例を示しますと、

$TEST = "test";
$OUTPUT = "[[[TEST]]]";
$OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g;
print "$OUTPUT";

↑これで、”test”という出力がほしいのですが… 
3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。)

よろしくお願いします。
317309:2005/06/11(土) 10:20:03 ID:???
>>310-315
できました。ありがとうございました。
318nobodyさん:2005/06/11(土) 10:58:39 ID:???
>>316
それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。

というかエラーになるというのならエラーメッセージぐらい
示せよ...
319nobodyさん:2005/06/11(土) 12:06:49 ID:???
以前サーバのルートディレクトリじゃないディレクトリに大きなファイルをアップロードしたのですが、
そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。
しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、
CGI からそのファイルにリンクしようと思っています。

しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。
どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。

#!/usr/bin/perl

&output;

sub output {
   open(IN,"(ここにファイルパス)");
   print "Content-type: application/x-zip-compressed\n\n";
   binmode(IN);
   binmode(STDOUT);
   print <IN>;
   close(IN);

   exit;
}
320nobodyさん:2005/06/11(土) 12:11:42 ID:???
なんでCGIで出力しなきゃならんの?w
迷惑だからやめれ。
そのファイルへのリンク貼るか教えるだけでいいじゃん。
321nobodyさん:2005/06/11(土) 12:16:11 ID:???
シンボリックリンクしろ。
322329:2005/06/11(土) 12:16:57 ID:???
>>320
ご指摘ありがとうございます。
素直にルートディレクトリにアップロードします。

ご迷惑をおかけしました。
323319:2005/06/11(土) 12:18:04 ID:???
>>321

あ、その方法がありました。
ありがとうございます。
324質問:2005/06/11(土) 22:30:32 ID:95WOJCIX
AというCGIでBというCGIファイルを作ろうとしています。
具体的には、Aのなかで、

open(HANDORU,">B.cgi");

print HANDORU << "END";
#!c:\perl\bin\perl
print $data;
END

close(HANDORU);

とした場合、B.cgiはつくられるのですが、
その内容で、\(円マーク)が消えており、、また$dataがなくなってしまいます。
¥を¥にしたらそのまま「¥」にされて書き込まれたりします。
どうしたら、うまく¥や変数が記述されるのでしょうか?
325質問:2005/06/11(土) 22:36:20 ID:95WOJCIX
訂正です。。
¥を&yen;にしたらそのまま「&yen;」にされて書き込まれたりします。


326nobodyさん:2005/06/11(土) 23:01:48 ID:???
327質問>解決:2005/06/11(土) 23:12:39 ID:???
>>326
ありがとうございました!
328nobodyさん:2005/06/12(日) 00:07:30 ID:???
CGI.pm の中に

if -d $_ && -w _;

って式があるんだけど、これは

if -d $_ && -w $_;

の略、ってことでよいの? つーか 略せるんだったの・・? 見たことなかったんだけど
329nobodyさん:2005/06/12(日) 01:09:06 ID:???
>>328
perlfunc - Perl builtin functions
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE

>どのファイルテスト (あるいは、stat や lstat) 演算子にも、下線だけから成る特別なファイルハンドルを与えると、
>前回のファイルテスト (や stat) の stat 構造体が使われ、システムコールを省きます
330nobodyさん:2005/06/12(日) 01:21:50 ID:Eqf0BMjV
今オブジェクト指向でモジュールを組んでいるのですが質問いいでしょうか?
プライベートメソッド内で俗に言うthisを使い処理をする場合、
thisはプライベートメソッドを使用しているメソッドからそのメソッドに引数として渡して処理しなければならないのでしょうか?
どなたかご教授して頂けると嬉しいです。
331nobodyさん:2005/06/12(日) 01:45:45 ID:???
>>329 そこにあったか!
あーサンクス!! いいこと知ったー
332nobodyさん:2005/06/12(日) 03:55:40 ID:???
333330:2005/06/12(日) 20:39:01 ID:Eqf0BMjV
>>332
すみません、一通り見てみたのですが何処に答えがあるか分かりませんでしたorz
見落としていたらごめんなさい。
プライベートメソッドがオブジェクトのリファレンスを取得するには、
やはり実際に呼び出されたメソッドから引数でリファレンスを渡してやらないと行けないのでしょうか?
334nobodyさん:2005/06/12(日) 20:51:17 ID:???
そもそもperlにプライベートメソッドなどないわけだが...
なにをさしているかわからない以上はマニュアル嫁的な
一般論以上の回答のしようもないんじゃないかと。

perlの場合オブジェクト指向といっても$foo->f(...)の
形で呼べばfが$fooをblessしたときのパッケージから
探されるのと、自動的に$fooがサブルーチンfの最初の
引数になるぐらいの単純な仕掛けだから難しく考えても
しょうがないと思われる。

335330:2005/06/12(日) 21:18:28 ID:Eqf0BMjV
>>334
説明下手ですみません。。たぶん、用語等ちゃんと理解できてないんだと思いますorz
プログラムからあるクラスのメソッドを呼び出すとき第一引数にオブジェクトのリファレンスが渡されますよね、

#sub new { $this = shift; ←これ

そのリファレンスをそのクラス内でしか使えない(使わない)メソッド

#sub _cool { ←慣例的に_で始まるサブルーチン名を付けられ、そのクラス内のメソッドから呼び出すので、
#第一引数にはオブジェクトのリファレンスが渡されないメソッド

で使いたいのですが、

#$this->{hoge} ←こんな風に

引数としてリファレンスを渡すしか方法はないのでしょうか(もっと綺麗な方法はないのでしょうか)?
336330:2005/06/12(日) 21:19:41 ID:???
"#$this->{hoge} ←こんな風に" → "#$this->{hoge} ←こんな風に使いたい。"です。すみません。
337nobodyさん:2005/06/12(日) 21:25:29 ID:???
>>335
頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
338nobodyさん:2005/06/12(日) 21:33:38 ID:???
もうちょっと読んでやれよ
339nobodyさん:2005/06/12(日) 21:59:12 ID:???
マニュアル嫁
340nobodyさん:2005/06/12(日) 22:46:08 ID:???
>>330
$this->_cool();
これではいやだと言っているのか?
341330:2005/06/12(日) 23:15:22 ID:???
>>340
仕組みを理解してませんでした。orzありがとうございます〜。
342nobodyさん:2005/06/12(日) 23:59:58 ID:???
$you->houkei
343nobodyさん:2005/06/13(月) 03:11:14 ID:???
$i->muketruyo->kaseidakedona;
344nobodyさん:2005/06/13(月) 17:16:05 ID:???
encodingモジュールはどういうときに使いますか?
Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
345nobodyさん:2005/06/13(月) 19:18:16 ID:???
JIS漢字が含まれている文字列のタグを取り除こうと
$str =~ s/>/>/g;
$str =~ s/</</g;
とやったら、「小」とか「松」って文字が文字化け
するようになったのだけど、どうやったら対処できそう?
346nobodyさん:2005/06/13(月) 19:20:38 ID:???
あ、元に戻された。全角で書くと
$str =~ s/>/&gt;/g;
$str =~ s/</&lt;/g;
な感じ。
347nobodyさん:2005/06/13(月) 19:44:01 ID:???
348nobodyさん:2005/06/13(月) 20:04:41 ID:???
つまり、 jcode なんとかを
突っ込んで EUC に変換して、
タグを変換して JIS に変換し直すって
ことかな?だりぃな。
349nobodyさん:2005/06/13(月) 20:17:48 ID:???
つーかソースをeucで書けよ。

それにブラウザによっては違う文字コード送ってくる場合もあるから、
どちらにしろ文字コードのチェックは必要だ。
350nobodyさん:2005/06/13(月) 20:24:45 ID:???
ソースはEUCにしたところで、何も変わらない。
ファイルと出力がJISなんだよ。
頭の柔らかい奴は、JISのタグ変換ぐらい、
もっとスマートな方法でやると思ったんだがな。
351nobodyさん:2005/06/13(月) 20:27:26 ID:???
352nobodyさん:2005/06/13(月) 21:10:29 ID:???
>>350
アホだな
353nobodyさん:2005/06/13(月) 22:42:36 ID:???
>>350
いまどきSJISじゃなくてJISだなんて・・・。 メール以外に使うときあったのか。
354nobodyさん:2005/06/13(月) 23:29:19 ID:???
大手企業のサイトをいくつか見ればわかるが
意外と JIS 指定のところが多い
依存性の関係もあるのだろうが
SJIS とか EUC に拘っている奴は
場数が少ない人だと思う

といっても、 JIS に未来はないけどな
355nobodyさん:2005/06/13(月) 23:37:35 ID:???
例えば何処か教えて頂けると嬉しい。
知ってる企業をいくつか検索してもJISで構築されているサイトが見つからない。。。
356nobodyさん:2005/06/13(月) 23:57:27 ID:???
>>354
おまいが一番拘ってるように見えるがw

つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
357nobodyさん:2005/06/14(火) 00:26:50 ID:???
aho
358nobodyさん:2005/06/14(火) 00:31:27 ID:???
Web ページだと、文字コード自動判別するとき、
EUC-JP と Shift_JIS は誤判定されることが多いけど、
ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
359nobodyさん:2005/06/14(火) 00:38:52 ID:???
>>356
結構ある。 > http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
その点ユニコならこういう問題は起きない。 でもサイズが増えるのがデメリット。
360nobodyさん:2005/06/14(火) 00:40:32 ID:???
>>358 自動判別とかw 黙って Content-Type くらい書こうぜー
361nobodyさん:2005/06/14(火) 01:06:25 ID:???
>>360
ローカルの HTML ファイルを開こうとしたら Content-Type なんてないわけですが
362nobodyさん:2005/06/14(火) 01:24:46 ID:???
ローカルファイルを直接開くときはさすがに無理だが
Apache なら AddCharset しておくのが正しい姿だろうな
363nobodyさん:2005/06/14(火) 01:34:09 ID:???
>>345
たぶんこれでできるから

foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
if($str=~/^[^\x1B]/){
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
}
$out .= $str;
}
364nobodyさん:2005/06/14(火) 01:34:48 ID:???
>>361
metaでいい
365nobodyさん:2005/06/14(火) 01:36:56 ID:???
>>363
すまん、間違い。

foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){



foreach my $str($in =~ /(\x1B.*?\x1B..)|([^\x1B]+)/g){

ね。
366nobodyさん:2005/06/14(火) 12:33:58 ID:TLKadJIJ
初歩的な質問かもしれませんが、

$text[$ii] = "<tr><td>上の段</td></tr>\n";
$text[$ii] =. "<tr><td>下の段</td></tr>\n";

と書き
$text[$ii]に"<tr><td>上の段</td></tr>\n<tr><td>下の段</td></tr>\n"が格納されるように、
コーディングしたつもりなのですが、エラーが発生してしまいます。
$text[$ii]に"<tr><td>上の段</td></tr>\n"に後から追加で"<tr><td>下の段</td></tr>\n"が、
格納されるようにするにはどのように変えたらよいですか?
367nobodyさん:2005/06/14(火) 12:38:42 ID:???
×=.
○.=
368nobodyさん:2005/06/14(火) 12:48:08 ID:TLKadJIJ
ありがd!
369 ◆sMFKtEQF46 :2005/06/14(火) 17:39:32 ID:???
$text の中には下のような配列になっています。
成田 船橋 , 八王子 町田 立川 国分寺 , 所沢 川越 秩父


これを最終的に下のような二次元配列にするために
kanto[0][0] = "成田"
kanto[0][1] = "船橋"
kanto[1][0] = "八王子"
・・・
kanto[1][3] = "秩父"


下のようなプログラム文を書いたのですが、

for $ii (0..$#text) {
 @kanto1 = split /,/,$text[$ii];# ←ここはうまくいく
 foreach $kk (@kanto1) {
  @kanto[$kk][] = split / /,$kanto1[$kk];# ←ここでエラー
 }
}

@kanto[$kk][]のところでエラーになってしまいます。
どのようにしたら、うまく@kantoに二次元配列を作成することが出来るでしょうか
370nobodyさん:2005/06/14(火) 18:03:21 ID:???
とりあえず
foreach $kk (@kanto1) じゃなくて foreach $kk (0 . $#kanto1) だろ。
371nobodyさん:2005/06/14(火) 18:10:58 ID:???
>>369
@kanto = map { [split / /] } split /,/, $text;
372nobodyさん:2005/06/14(火) 18:28:00 ID:???
369の書き方でなら
@{$kanto[$kk]} = split / /,$kanto1[$kk];
373 ◆sMFKtEQF46 :2005/06/14(火) 18:44:58 ID:???
>>370-371
ありがとうございました!
374nobodyさん:2005/06/14(火) 19:17:35 ID:yq1owU75
UDPSocketを使って、

「Clientから何らかのパケットが届く"たび"に何らかの処理」
を行いたいのですが、recvイベントのようなものはキャッチできないでしょうか。
375nobodyさん:2005/06/14(火) 19:50:50 ID:???
単純な質問で申し訳ないのですが

@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";

この時の$lenに格納されているものは何でしょうか?

$len = scalar(@hogehoge[1]);

最初の[]の要素数を調べるにはどのようにしたら良いのでしょうか?
376nobodyさん:2005/06/14(火) 20:00:55 ID:???
すいません、投稿しなおしです。

単純な質問で申し訳ないのですが

@hogehoge[][];
$len = scalar(@hogehoge);
print "要素数= $len ";

この時の$lenに格納されているものは何でしょうか?


@hogehogeの最初の[]の要素数を調べるには、どのような関数を使ったら良いのでしょうか?


377nobodyさん:2005/06/14(火) 20:33:05 ID:???
>最初の[]の要素数
意味不明
378nobodyさん:2005/06/14(火) 21:20:23 ID:???
もちょっと "リファレンス" というのを勉強したらいいと思うぞ。
高次元配列っていうのも、単にリファレンスのネスト、と解釈すれば結構容易に理解できる。
379nobodyさん:2005/06/15(水) 01:53:31 ID:???
open (TEST, 'hoge.txt');
my $fg = \*TEST;

こんなことをしたとき、

close ($fg); でも

my $fh = *{$fg}{IO};
close ($fh); でも

どっちでもできるんだけど、どっちがいい、とか、どっちかが支障がでる、とかあるのかな?
とりあえず stat (〜) は上で言えば $fg でしかできなかったんだけども。
380nobodyさん:2005/06/15(水) 03:40:50 ID:???
>>379
引数にグロブ(グロブのリファレンス)を受け取るPerlのネイティブ関数には
ファイルハンドルのリファレンスを渡しても無理だから上の方がいいかと。

ただ、下のは、ブロック内でグロブをローカル化すればシンボルに依存しない
ファイルハンドルのリファレンスが得られる。

でも、シンボルに依存しないファイルハンドルが欲しければ

open ($fh, 'hoge.txt');

てやれば 、無名のグロブリファレンスが得られるから、こっちがいいかもよ。
381nobodyさん:2005/06/15(水) 09:23:19 ID:???
>>379
それ@niftyだとできないんだよね。。
なので全部eval使ってる。

my $id = "FILE";
eval 'open(' . $id . ', "+>>$path$file")'

eval "seek($id, 0, 2)";
eval "truncate($id, 0);seek($id, 0, 0)";

eval 'print ' . $id . ' $tmp';

eval '@tmp = <' . $id . '>';

eval "close($id)";
382nobodyさん:2005/06/15(水) 10:05:30 ID:???
>>381
単にstrict refsなだけなんじゃ?

Can't use string ("FILE") as a symbol ref while "strict refs" in use at 〜

ってなエラーじゃない?

わざわざ$idに"FILE"なんて入れないで380の言うように空のまま(=undef)に
しとけば、openするときに無名のリファレンスを入れてもらえるので問題ない
と思うが。
383nobodyさん:2005/06/15(水) 10:24:44 ID:???
えと、一応ファイル扱う為の汎用パッケージのつもりで作った中身です<<381
pfile::open(FILE, writemode)
read(FILE)
write(FILE)
close(FILE)
見たいな感じで、同時に複数開けるように作りました。


あと、@niftyはエラーlogは見れないようになってるらしくて、
内容は分からないんです。。
どっかで配布してた、エラー内容返すcgiも走らないので…

use strict(綴り適当)も、宣言しただけでエラーが出ます。
@niftyは特殊らしい。。でも鯖を選ばず動くscript書きたいので。。

@niftyでエラーメッセージを見る方法ってあるんでしょうか?
誰か使ってる方いましたらご教授お願いします。
384nobodyさん:2005/06/15(水) 10:41:24 ID:???
>>383
特定環境の話をここで続けていいものかわからんが、@nifty は
プラグマも含めて全てのモジュールが故意に削除されている。
use strict; すると strict.pm が見つからないのでコケる。

別にモジュール「が」使えないわけではないので、必要な
モジュール一式を任意のディレクトリに入れて、スクリプトの
頭で BEGIN { push @INC, '/your/lib/dir' } すれば動く。
385nobodyさん:2005/06/15(水) 11:03:08 ID:???
>>384
全部消すとは…CGI利用可能にしてるくせに、珍しいですよね。。

@niftyは負荷に対するチェック基準?も厳しいらしく、
自分で作ったfilelockのテストも(n回読み込み→書き込みを繰り返すスクリプトを2つ同時に走らせる)、
nを100回で指定して走らせたら鯖でタイムアウトになりました。
isWebだと300でも軽快に動いたんですが。(それ以上は迷惑になるっぽいので試してません)

確かにちとスレ違いっぽいので以後控えますね。
色々情報ありがとうございました!
386nobodyさん:2005/06/15(水) 11:21:53 ID:pMiUaalZ
とあるPerlの参考書にこういうコードがありました。

$file_name = "./text.txt"
open(HANDLE, "$file_name");

ファイルオープンの行の第二引数にダブルクォーテーションがついてるんですが、これは何故なんでしょうか?
これがなくても大丈夫みたいですが。。
387nobodyさん:2005/06/15(水) 11:31:50 ID:???
「"」 = 変数を解釈し、展開する。文字列は文字列として解釈する。
「'」 = 全て文字列として解釈する。

my $a = 10;

print "ねむいよー$a";
 →ねむいよー10

print 'かたがいたい$a';
 →かたがいたい$a
388nobodyさん:2005/06/15(水) 11:38:55 ID:???
>>387
引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
my $a = 10;

print "$a";

print $a;
389nobodyさん:2005/06/15(水) 11:44:11 ID:EGr0DnSI
# パスワード
$pass = '○○○○';

# パスワード確認
if ($in{'pass'} eq "$pass") {
print"パスワードが合ってます";
}
else {
print"パスワードが違います";
}

パスワード認証なら上記でも良いのではないでしょうか?
複雑にする必要性ありそうなのだけど教えてください。
390nobodyさん:2005/06/15(水) 12:13:11 ID:???
>>389
KENTとかそうやってるね
ソース見られたときにパスワードがモロばれだけどね
普通はDESとかMD5で暗号化する
391386:2005/06/15(水) 12:38:11 ID:???
>>388
そうなんです。
そっちがわからないんですが・・・。
まあどっちでも動くみたいなんで今のところ気にしないことにしますね^^
失礼しました。
392nobodyさん:2005/06/15(水) 12:47:04 ID:???
>>391
明示的に宣言したり、デフォルトの読み書き方法で無いときは"がいるから使い回してるだけじゃない?
393nobodyさん:2005/06/15(水) 12:59:31 ID:???
>>392
どゆいみ?
394389:2005/06/15(水) 13:32:19 ID:EGr0DnSI
>>390
早々有難うございます。
暗号化するというのは、こんな事をするのでしょうか?

my @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');

$in{pwd} = crypt($in{pass}, $SALT[int(rand(64))] . $SALT[int(rand(64))]);
395nobodyさん:2005/06/15(水) 13:56:02 ID:???
なんでキーを rand するんだろ?
そのままじゃ暗号化されたパスの先頭にキーがついたままだから、substrとかしないと意味ないし、
取ったら取ったで、キーがわからないとどうやってパスワードチェックしたらいいのかわかんねくね?
396nobodyさん:2005/06/15(水) 14:18:53 ID:???
>>380
>>379だけど、サンクス!参考になった。
今回はシンボルの文字列自体に意味があるので、グロブにさせてもらうよ。

そういや nifty も知らんけど、まだ perl-5.005 以前を使ってる鯖ってあるのかな?
AAA! が 5.005 だったが。 ってスレ違いか。
とにかくなるべく新しいのにして欲しいな。 いろいろ動かなくて困るw
397nobodyさん:2005/06/15(水) 14:29:05 ID:???
>>395
パスワードの暗号化ってのはパスワードをプレーンテキストで
保管せず、暗号化したデータを保管するってこと。

登録時には下記$pwdをサーバに保存。
$pwd = crypt($input_pwd, $salt);

認証時には保存された$pwdでチェック。
if (crypt($input_pwd, $pwd) eq $pwd) { # 認証OK
398nobodyさん:2005/06/15(水) 15:20:04 ID:???
>>397
それはわかるけど、 >>395 でさ、>>397で言う $salt を rand させる意味はなくね? って話。

暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
rand させようがさせまいが、 $pwd を見られたら $salt わかるわけじゃん?

だったら $salt は rand させても、最初から"xy"とかに固定してても、そんなに変わらない気がするのだよ。
399nobodyさん:2005/06/15(水) 15:24:17 ID:???
>>397
横レスだけど、それってチェック時はなにやってるの?

登録時には下記@indb_pwd($pwd及び$salt)をサーバに保存。
@indb_pwd = (crypt($input_pwd, $salt), $salt);

認証時には保存された$saltを使用して、$pwdでチェック。
if ($indb_pwd[0] eq crypt($in{pwd}, $indbpwd[1])) { # 認証OK

これだったら意味分かるけど…。
400nobodyさん:2005/06/15(水) 15:25:45 ID:???
ああああ

>>397-398
>暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、

知らなかった…
失礼しましたorz
401nobodyさん:2005/06/15(水) 15:57:46 ID:???
でもどっかの誰かさんのスクリプトはrandしてるね。
402nobodyさん:2005/06/15(水) 16:01:20 ID:???
誰誰?
403nobodyさん:2005/06/15(水) 16:08:10 ID:???
>>382
遅レスですが、なんか勘違いしてたかも。
@niftyだと>>379のような、「ファイルハンドルを変数に入れる」ということ自体が出来ないんです。
多分perlのバージョンのせいだと思うんですが。

んでしょうがないので、ハンドルをあらわす文字列自体を動的に扱う為にevalを使ってるという感じです。
$id = "FILE"というのはファイルハンドルを変数に入れようとしているわけではなく、展開してevalに渡すためです。
404nobodyさん:2005/06/15(水) 16:10:54 ID:???
>>402
とほほの人じゃね?
405nobodyさん:2005/06/15(水) 16:11:19 ID:???
>>403 @nifty のPerlのバージョンっていくつ? print $]; ってやってみてくれ。
406nobodyさん:2005/06/15(水) 16:14:42 ID:???
>>405
5.00502でした。
407nobodyさん:2005/06/15(水) 16:28:32 ID:???
>>398
例えば複数のパスがあるとして、クラックするときsaltが全部同じだったら探索効率が良い希ガス。
408nobodyさん:2005/06/15(水) 17:22:07 ID:???
>>407
そゆこと。 rand しとけば 4096 倍掛かる。
409389:2005/06/15(水) 17:31:01 ID:EGr0DnSI
>>399
有難うございます。
意味わかりました。
>>401
randがついてるので、rand関数により暗号化してるのかと思ったのです。
410nobodyさん:2005/06/15(水) 17:43:51 ID:???
「パスワードの暗号化」と言うけど、
crypt() のやってることは厳密には「暗号化」ではないからね。

などと言って混乱させてみるテスト。
411nobodyさん:2005/06/15(水) 17:44:40 ID:???
万が一同じパスワードが複数与えられた場合に、暗号化後 (厳密には暗号化じゃないんだが) の
文字列がかぶらないようにするため
412411:2005/06/15(水) 17:49:12 ID:???
部分的にカブタ
413nobodyさん:2005/06/15(水) 17:59:40 ID:???
>>411
それはちょっと無理があるようなw
aaaaaaってパスワードがたくさん登録されれば 1/4096でかぶるわけだし、
そもそもパスワードがかぶっても普通は問題ないし。
414nobodyさん:2005/06/15(水) 18:05:59 ID:???
>>408
それは 4096個 salt があった場合の話だがな。
違う salt の pwd が2個なら2倍かかる、ってだけ。
415nobodyさん:2005/06/15(水) 18:17:02 ID:???
>>414
あぁ、すまん。 >>394 の DES crypt() の場合のことしか考えてなかった。
416nobodyさん:2005/06/15(水) 18:24:04 ID:???
saltをに日本語を使おうぜ。

$p = 'password';
($s) = ('∀');
$c = crypt $p, $s;

とかやればコード中に顔文字が出てきて和めるぞ。
417nobodyさん:2005/06/15(水) 18:25:58 ID:???
∀は別に日本語というわけではなかった罠。
418nobodyさん:2005/06/15(水) 18:28:26 ID:???
なにこの流れ('∀')
419nobodyさん:2005/06/15(水) 18:41:12 ID:???
>>406
v 5.00503 の AAA!cafe だと

× my $fh = undef; open ($fh, '>test.txt');
○ my $fh = \*FILE; open ($fh, '>test.txt');

試しに↓のコードで動かしてみ

#!/usr/bin/perl -w
use strict;
local *FILE;
my $fh = \*FILE;
if ($fh) {
    open ($fh, '>test.txt'); print {$fh} 'hogehoge'; close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
420nobodyさん:2005/06/15(水) 18:42:52 ID:???
>>416
split('-');
とかもアリ?
421nobodyさん:2005/06/15(水) 18:59:46 ID:???
>>416
ちなみに、最近のモダンな crypt() は、 salt の文字種によって、
暗号化の方式 (ていうかハッシュ関数) を切り替えてくれちゃったりするので、
あんまりへんてこりんな文字列を salt に許すと portable じゃなくなったりする罠。
422考えて半年:2005/06/15(水) 19:50:20 ID:biXgIpFa
Perlコーディング初心者から抜け出す方法ないの。
ていうか、Perlでチャットとか掲示板とか、画像をうpするとか機能を追加した
ゼロからプログラミング作れるようになるには、どうすればよいのでしょう?
10日で覚える、とほほ、独習、リャマ本、らくだ本、リファレンスなど
よんでも、いまだに初心者です。漏れがbakaなの?
423nobodyさん:2005/06/15(水) 20:04:08 ID:???
一冊読めばだいたいある程度のものは作れるようになるから、結論としてはb・・(ry

つーか、このスレのタイトルを変える相談かと思ったw

半年もかじれば、シンプルなカウンターや掲示板くらいならできない?
本を閉じて、試しに作ってみればいい。 分からないときに本を見る。
参考書が一冊もなくても、ネットのあちこちで転がってるし、
生半可な本より充分な内容の perl.doc もある。

とにかく、芸術分野みたいなもんで 「自分で造る」 「自分で調べる」 のが大切。
・・・なんてな。
424nobodyさん:2005/06/15(水) 20:12:28 ID:???
読むだけでは上達するのは頭の良いひとだけだと思う。
凡人プログラマなら、とにかくいっぱい作りまくって練習するしかないかと。
425nobodyさん:2005/06/15(水) 20:25:54 ID:???
なにこの釣りスレ
426考えて半年:2005/06/15(水) 20:26:41 ID:biXgIpFa
>422です。例えば
foreach $lines (@lines) {
($tm,$cnt,$scnt,$ip) = split(/<>/, $lines);
if($ipc==2){&get_;if($cook){ $flag=2; last;}}
if($date eq "$tm") {
if($ipc==1){if ($addr eq "$ip") { $flag=2; last; }}
$flag=1;
$cnt++;
$scnt++;
$lines = "$tm<>$cnt<>$scnt<>$addr<>\n";
}

foreach { から } までを繰り返すコードであることは理解できる。
しかし、{ } の中身が理解できない。
だから、どうしてよいのかわからない。
427nobodyさん:2005/06/15(水) 20:30:07 ID:???
>>426
よくそれでラクダとか読めたなw
読んだって文字を目で追っただけだろ
428考えて半年:2005/06/15(水) 20:32:45 ID:biXgIpFa
「ちゃんと本読めばすべて書いてある」ってことですか?
429nobodyさん:2005/06/15(水) 20:33:03 ID:???
ああ釣りスレだな
430nobodyさん:2005/06/15(水) 20:37:40 ID:???
きっぱりあきらめるのも手かと。
混乱しちゃって、今は何を言われてもポカーンじゃないかな。こんな感じ。
@ @
  △
431nobodyさん:2005/06/15(水) 20:38:07 ID:qXBtGg7k
↓下のようなデータを「,」区切りで分け、空の時はテーブルを二列連結させるプログラムを作りたいと思いますが、
 空のデータがある時のやり方がどうしても出来ません。

埼玉,東京,群馬
大阪,,奈良


空のデータがある場合はcolspanを使い↓のように連結させる


<table>
<tr><td>埼玉</td><td>東京</td><td>群馬</td></tr>
<tr><td colspan=2>大阪</td><td>奈良</td></tr>
</table>


このようにするにはどうしたらよろしいすか?
サンプル等をご存知でしたら教えていただければ助かります。
432nobodyさん:2005/06/15(水) 20:40:19 ID:???
>>431
先に普通にテーブル作ってから
<td>([^<]+)</td><td></td>を
<td colspan=2>$1</td>に置き換えるとか
433nobodyさん:2005/06/15(水) 21:43:22 ID:???
>>431
最初がカンマの場合は全部一番後ろに押し付けてみた。

while (<DATA>) {
 chomp;
 my $data = $_;
 $data =~ s/^(,+)//;
 $data .= ',' x (1+length $1);

 my @pref = split /,+/, $data;
 my @count;
 while ($data =~ s/(,+)//) {
  push @count, length $1;
 }

 print qq{<tr>};
 my $n = 0;
 foreach my $span (@count) {
  print $span > 1 ?
   qq{<td colspan="$span">$pref[$n]</td>}:
   qq{<td>$pref[$n]</td>};
  $n++;
 }
 print qq{</tr>\n};
}
434nobodyさん:2005/06/15(水) 23:46:03 ID:???
>>419
以下で問題なく動きました…orz
ありがとうございます。
>>9のページではハンドルのリファレンスじゃなくてグロブそのものを入れようとしてるんですが、
そちらだと出来ませんでした。。

#!/usr/local/bin/perl -w
local *FILE;
my $fh = \*FILE;
if ($fh) {
#? エラー
#? エラー
 open ($fh, '>./data/test.txt');
 print {$fh} 'hogehoge';
 close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
435nobodyさん:2005/06/15(水) 23:51:02 ID:???
>>428
ランダきちんと読めばこの世にある殆どのPerlコードは理解できる。
436nobodyさん:2005/06/16(木) 00:15:51 ID:???
個々の部分が何をやってるかはわかるようになるとは思うが
全体として何をやってるか理解するのは難しいのもあると
思うよ。

このコード結局なにがやりたいんだよみたいな(笑)
437nobodyさん:2005/06/16(木) 00:43:45 ID:???
perl の文法を学ぶ前にアルゴリズムというものが理解できてないと
いろいろと難しいかもしれんですな
438nobodyさん:2005/06/16(木) 01:07:20 ID:???
>>434
SMART はわかりやすいんだけど、ちょっとね。

まあ 5.005のファイルハンドルなら、↓読めば結構理解いいかも。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
439nobodyさん:2005/06/16(木) 21:22:02 ID:???
>>438
ありがとうございます!
週末にでもゆっくり読みながら、>>381>>383の改造でもしてみます。
440nobodyさん:2005/06/17(金) 00:42:38 ID:FGf+BXAB
>437様へ。
アルゴリズムって何ですか?perlの文法わかるのに、掲示板とかチャット
とかプログラム作成しようと思うとイマイチ、わかりません。
どうすればよいの?アルゴリズムがわからないから、プログラム作成でき
ないのでしょうか?
441nobodyさん:2005/06/17(金) 00:48:21 ID:???
以下のものを自分で一から作ってみては?
既にあるものを参考にしない事(詰まったときにヒントとしてみるのはあり)ってルール作って。

hallo world表示

フォームの入力内容表示

ファイルの内容を読み込んで表示

フォームの内容をファイルに書き込み

カウンタの作成

一行掲示板の作成

eコマースサイトの作成
442nobodyさん:2005/06/17(金) 00:55:30 ID:FGf+BXAB
hello world表示
#! c:\perl\bin\perl
print "Hello Perl\n";
443nobodyさん:2005/06/17(金) 00:56:02 ID:???
それってコーディングの問題じゃないんじゃないだろか。設計じゃない?
444nobodyさん:2005/06/17(金) 01:00:22 ID:FGf+BXAB
フォームの入力内容表示、内容読み込み表示
#! c:\perl\bin\perl
print "Enter Word : ";
$word = <STDIN>;
chomp($word);
print "$word\n";
445nobodyさん:2005/06/17(金) 01:00:53 ID:???
Σ(゜Д゜)ハッ!! 数ヶ月いるのに、ずっと "コーティング(coating)初心者質問スレ" って読んでた・・・。 orz
446nobodyさん:2005/06/17(金) 01:14:19 ID:???
>>444
それフォームじゃなくてシェル。
447nobodyさん:2005/06/17(金) 01:15:33 ID:???
最近
#!perl
でも動くことを知った(ActivePerl)
448nobodyさん:2005/06/17(金) 01:21:15 ID:???
ああ…なるほど
449nobodyさん:2005/06/17(金) 01:25:54 ID:FGf+BXAB
フォームの表示わかんないんです。
450nobodyさん:2005/06/17(金) 01:31:45 ID:???
winでパス通ってりゃ、何もつけなくても動く罠
451nobodyさん:2005/06/17(金) 01:37:28 ID:???
>>449
わからないポイントが明確になって良かったじゃないか。
html周りって事なら
ttp://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_kj01.htm
とか見てみれば?
452nobodyさん:2005/06/17(金) 01:41:58 ID:???
はは、よく釣れてるw
453nobodyさん:2005/06/17(金) 01:44:09 ID:???
暇だしねー
454nobodyさん:2005/06/17(金) 02:08:23 ID:???
これは、なにするCGIですか?

%in=map{s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;$_}map{split/=/,$_,2}split/&/,$ENV{QUERY_STRING};
print<<HTML;
Content-Type: text/html

<form action=$ENV{SCRIPT_NAME}><textarea name=text rows=20 cols=40>$in{text}</textarea>
<input type=submit></form><hr>
HTML
eval$in{text},$@&&print"<pre>$@</pre>";
455nobodyさん:2005/06/17(金) 02:48:58 ID:???
GET 受取処理
456nobodyさん:2005/06/17(金) 02:53:14 ID:???
まともに答えられとるw
457nobodyさん:2005/06/17(金) 07:32:45 ID:???
ハッシュ同士を合体させてくれるような、格好いいモジュールってありますか?

もし自分でコードを書くとしたら、テンポラリなハッシュにforeachでキーと値をいちいちぶち込むことになるんでしょうか。
458nobodyさん:2005/06/17(金) 07:56:09 ID:???
モジュール使わんでも・・・
%y = (%x , %y);
↑の書き方じゃ不満?


my %x = qw(a 1 b 2 c 3 d 4 e 5 f 6 g 7);
my %y = qw(e 01 f 02 g 03 h 04 i 05 j 06 k 07);

print join (', ', map { $_ .'=>'. $x{$_} } sort keys %x), "\n";
print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n";

%y = (%x , %y);

print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n";
459nobodyさん:2005/06/17(金) 08:30:05 ID:???
@y{ keys %x } = values %x;
460nobodyさん:2005/06/17(金) 08:46:08 ID:???
あれ? keys と values の値の出てくる順番って、両方同じ順番で確からしいんだ?
461nobodyさん:2005/06/17(金) 11:14:38 ID:???
>>460
keys, values, eachはハッシュを変更しない間は同じ順番になることが
保証されている。keysのマニュアルなど参照。

あと、ハッシュをリストコンテキストで評価したときに返るリストも
同じ順番になりそうなもんだが、そういう記述は見つけられなかった。
これはどうなんすかね?

462nobodyさん:2005/06/17(金) 11:57:39 ID:???
試してみないの?
463nobodyさん:2005/06/17(金) 12:14:45 ID:???
経験則じゃなくて、仕様的情報があればって感じなんでは
464nobodyさん:2005/06/17(金) 12:17:27 ID:???
つーか、そもそも考えが質問がおかしいというか、
重複するキーの値をどうするか?という問題の希ガス。

%xに%y入れるか、%yに%x入れるか。
465nobodyさん:2005/06/17(金) 14:45:47 ID:???
y と x 逆にすればいいだけぢゃん。
それとも重複したら Array にしたい、とかかねえ。
466質問:2005/06/18(土) 16:37:14 ID:DZNl0XpA
フォームをつかったCGIを作ろうと思っているのですが、セキュリティが心配です.
自分が作ろうと思っているのは、
ラジオボタンを使ったクイズ、チェックボックスを使ったクイズ、テキストボックスを使ったクイズ
なんですが、
気をつけることなどんなことでしょうか?
自分の考え(素人レベルですが・・)では、ラジオボタンとチェックボックスのほうは問題ないと思うのですが、
テキスト形式は不正な文字や引数を使われるとやばいとおもうので、正規表現でチェックするぐらいしか思いつきません.
467nobodyさん:2005/06/18(土) 16:51:24 ID:???
>>466
>>1
468nobodyさん:2005/06/18(土) 17:21:44 ID:???
>>466
とりあえず、文字列のチェックつか文字コードのチェック話は
さんざこのスレでも出てるので読み返しる。
469nobodyさん:2005/06/19(日) 10:05:28 ID:a/QQeV38
質問なんですが
$/ = "a";
chomp($data);
とすると$dataの行末のaを取り除くことができるみたいですが
aとbというような他の文字であっても取り除くようにすることはできませんかね?
PHPでいう$data = rtrim($data, "ab");みたいなことをやりたいんですが。

$/ = "ab";
chomp($data);
ではできませんでした。
470nobodyさん:2005/06/19(日) 10:16:41 ID:???
471nobodyさん:2005/06/19(日) 14:29:18 ID:???
$data =~ s/[ab]$//mg;
472nobodyさん:2005/06/19(日) 23:01:48 ID:???
自鯖にpingを送って生死判定をしたいのですが、
pingの結果はどうやって得るのですか?
473nobodyさん:2005/06/20(月) 00:43:18 ID:9D61R1Ak
入力に、「全角ひらがな」と「全角カタカナ」のみ許容するように
したいのですが、うまくいきません。

if ($str =~ /[\xA1-\xFE][\xA1-\xFE]/) {
}

これですと全角全てを許容してしまいますので、何か良い方法が
ございましたらご教示いただきたい次第です。

何卒、宜しくお願いいたします。
474nobodyさん:2005/06/20(月) 01:08:33 ID:???
全角ひらがなとカタカナの文字コードの範囲を指定すれば?
文字コード表は検索すれば出てくるよん。
475nobodyさん:2005/06/20(月) 01:27:43 ID:???
その正規表現だと「[\xA1-\xFE][\xA1-\xFE]を含むもの」全てにマッチしちゃうよ。
476nobodyさん:2005/06/20(月) 01:30:53 ID:???
うにこーどにして一文字ずつ弾け
477nobodyさん:2005/06/20(月) 01:45:43 ID:???
$name !~ m/^[ぁ-ヶ]+$/
で何とかなるかと思いましたが。うまく動いてくれませんでした。

皆様、色々とご教示有難うございました。
478nobodyさん:2005/06/20(月) 01:52:50 ID:???
479nobodyさん:2005/06/20(月) 03:11:32 ID:???
>>477
use encoding 〜 使えばそれでもできそうだがね。
480nobodyさん:2005/06/20(月) 04:43:55 ID:???
>>479
アドバイス有難うございます。

EUCで全て書いて最後にSJISにしてページを出力しているため、
化けてしまうようです。この方法は諦めました。。

文字コードの範囲と言うものが少しわかってきたのですが、まだ
まだ勉強不足なので調べまくっているところです。

貴重なアドバイス有難うございました。
481nobodyさん:2005/06/20(月) 13:21:42 ID:???
>>473
アバウトだけど叩き台くらいにはなるかしら。
/\A([\xA4\xA5][\xA0-\xFF]|\xA1\xBC)+\z/
482nobodyさん:2005/06/20(月) 16:36:58 ID:???
おお、ちょうど473と同じような状態なんですが、私は
+漢字も含む文字以外を許容しないというものなん
ですね。

この場合は
if ($str !~ /^([\xA1-\xFE][\xA1-\xFE])+$/) {
}

これで問題ないのでしょうか?
483nobodyさん:2005/06/20(月) 17:47:52 ID:/wReIU3I
お世話になっております。

perlでcgiを作成しているのですが
URLでhoge.cgi?day=20050620
と指定しているのに
--------------------------------
use CGI;
my $cgi = new CGI;
my $gDay = $cgi->param('day');
--------------------------------
というように取得できません、、、
Ctrl+F5で更新すると取れるのですが
なんでなのでしょう?

何か情報をお持ちな方はお教え頂けますとありがたいです。
484nobodyさん:2005/06/20(月) 18:47:08 ID:???
url_param じゃね?
485nobodyさん:2005/06/20(月) 19:04:03 ID:???
>484さん
ありがとうございますっ

url_paramというのがあったのですね、、
不勉強でした。

どうもですっ
486nobodyさん:2005/06/20(月) 19:56:55 ID:???
>>478
ありがとうございました
487482:2005/06/20(月) 21:33:18 ID:???
うおおおお。
ぐぐりまくってなんとかここまでたどりつきました。
先生方、見てくださると大変助かります。


$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;

$hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん
$katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ
$kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない)
$nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜

if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
488nobodyさん:2005/06/20(月) 22:07:25 ID:???
え、何? ひらがな + カタカナ + 漢字 + [ー〜] だけを許容したい、ってこと?
・・・にしては最後のアスキーは何なのかわからんか・・・。
全角記号とかはどうなるのかな。

まあ、やりたいことをもちょっと詳しく。 例とかだしてくれるとわかりやすいかも。
489nobodyさん:2005/06/20(月) 22:58:52 ID:???
はじめまして。
すいません。ファイルオープンについて教えてください。

ファイルを読み書きオープンで開いて、
前の書き込みのデータを参照して処理をしたあとに追加でデータを書き込みたいのですが、
なかなかうまくいってくれません。
どなたかご教授願えませんでしょうか。

【ファイルについての仕様】
・データの追加書き込みがある
・ある程度データがたまったら削除される。

open(DOUT, "+<$log_file");
これだと、ファイルが削除されている場合エラーが出てしまいます。

open(DOUT, "+>$log_file");
open(DOUT, "+>>$log_file");
上2つだとデータが読み込めないんですけど、これは自分の書き方は悪いんでしょうか。

乱文ですけどよろしくお願いします。
490nobodyさん:2005/06/20(月) 23:01:55 ID:???
491nobodyさん:2005/06/20(月) 23:59:48 ID:???
if (-e $log) {
読み書きopen
} else {
新規でopen
492nobodyさん:2005/06/21(火) 00:03:52 ID:???
open(DOUT, "+>>$log_file");
seek (DOUT, 0,0);

が安定じゃね?
493489:2005/06/21(火) 00:23:19 ID:???
お返事ありがとうございます。

>>490
私の目的だと
sysopen(FH, $path, O_RDWR|O_CREAT) || die $!;
sysopen(FH, $path, O_RDWR|O_CREAT, 0666) || die $!;
を選択するのが妥当・・・ですよね。

>>491
なるほど、そういう書き方がありますね。

>>492
open(DOUT, "+>>$log_file");

@log = <DOUT>
とすると、@logで値が入ってこないんですけど、
@log = <DOUT>をする前に
seek (DOUT, 0,0);
が必要でしょうか??



また、明朝来ます。

494nobodyさん:2005/06/21(火) 01:02:18 ID:???
>>493 そのための seek だろ。 何言ってんだw
495482:2005/06/21(火) 02:15:58 ID:???
>>488
説明不足ですみません。
ひらがな + カタカナ + 漢字 + [ー〜] だけを許容したい
ずばり、そのとおりでございます。

「最後のアスキー」とは、何か漏れがあったりしますでしょうか?
496nobodyさん:2005/06/21(火) 02:28:41 ID:???
use encode しつつ [\wー〜] ってやるのが一番楽そうなんだがw

最後の $eucpost の後方参照が必要なのかどうかわからないのだった。
まあいるんならいいんじゃない? それで動けば。
497nobodyさん:2005/06/21(火) 08:45:48 ID:???
utf8使えるんなら使わない手はない
498493:2005/06/21(火) 09:46:03 ID:???
>>494
ありがとうございます!なりました。

今までseekを使うことがなく、(<と>>だけ)
いまいち感覚がつかめませんでした。
たすかりました。

ところで、+>>でオープンした場合の書き込みは追記になるので
書き込む前に
seek(OUT, 0, 2);
をする必要はないと考えてよいでしょうか。
今のところ問題ないんですけど、やっておかないとマズイことはありますか?
499nobodyさん:2005/06/21(火) 10:51:42 ID:???
以下のようにスクリプトをutf8で書いてやるとうまくいくんですが、
use utf8;
$str='日本語';
print length $str, "\n"; # 3
foreach (split //, $str) {
print sprintf("%04X\x20", ord); # 65E5 672C 8A9E
}
utf8で書いたファイルを読み込んで同じことをやろうとするとだめです。
use utf8;
while(<>){
print length $_, "\n";
foreach (split //, $_) {
print sprintf("%04X\x20", ord);
}
}
ちなみにファイルは、以下のもので、

これはutfであります。

結果は、

~$ perl utf_test.pl utf_test.txt
32
0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0075 0074 0066 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 000D 000A

cygwinのperl5.8.5でやってます。どうしたら、日本語マルチバイト認識して
くれるんでしょう。
500nobodyさん:2005/06/21(火) 10:57:18 ID:???
さっきの結果は、use Encode;の場合でした。use utf8;だと、
~$ perl utf_test1.pl utf_test.txt
32
00E3 0081 0093 00E3 0082 008C 00E3 0081 00AF 0075 0074 0066 00E3 0081 00A7 00E3 0081 0082 00E3 0082 008A 00E3 0081 00BE 00E3 0081 0099 00E3 0080 0082 000D 000A
です。よろしくお願いします。
501nobodyさん:2005/06/21(火) 11:02:53 ID:???
すみません。結構ググったんですが、グルり足りなかったようで。
ttp://sakaguch.com/utf2.html#noteで見つけますた
use open ":utf8";にすれば、問題なくなりますた。
502nobodyさん:2005/06/21(火) 11:18:14 ID:???
連カキコすまソ。
use open ":utf8";
use utf8;
while(<>){
# while(/\p{Hiragana}/g){
while(/[ぁ-ヶ]/g){
print "$&\n";
}
}
みたいにすると、結果はOKなんですが、
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
Wide character in print at utf_test.pl line 6, <> line 1.
これは抑止できないんですかね。
503nobodyさん:2005/06/21(火) 11:44:02 ID:???
>>502
binmode STDOUT, ":utf8";

perldiag(1)のそのメッセージの説明に書いてあったわけだが。
504nobodyさん:2005/06/21(火) 13:44:01 ID:???
エラーメッセージでぐぐるとかしなさいよ
505nobodyさん:2005/06/21(火) 14:21:11 ID:???
>>483-484
なんでparamじゃ駄目なのかわからん。
教えてエロイ人!
506nobodyさん:2005/06/21(火) 16:01:03 ID:???
>>498
ファイルロックするなら問題ないんじゃない?
507nobodyさん:2005/06/21(火) 16:19:13 ID:???
>>505
POSTしてるからだろ。

ttp://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
「POSTとURLパラメータの混合」より:

問い合わせ文字列(引数が後ろについた"?"マーク)が入ったURLへ
POSTするフォームを作成することにより、スクリプトはフォームと
同じように CGIパラメータをURLで受け取ることは可能です。param()
メソッドは、 URLの問い合わせ文字列を無視し、常にPOSTされた
フォームの内容を返します。 URLパラメータを取り出すためには
url_param()メソッドを呼び出してください。
508nobodyさん:2005/06/21(火) 16:51:26 ID:???
PHP の $_GET $_POST みたいに両方取れるといいのにね。
509505:2005/06/21(火) 17:02:14 ID:???
>>507
クエリ付きURLにPOSTすると
paramはPOSTされた値だけ持ってくるってこと?
勉強になった超エロイ人ありがとう!
510502:2005/06/21(火) 21:53:39 ID:???
>>503-504
ども、ご教示ありがトン。
511nobodyさん:2005/06/21(火) 23:12:56 ID:???
Apache2.0.52+Perl5.8.3という環境で、CGIとおなじサーバにある
RSSをHTMLとして出力するCGIを作成中なのですが、

my $rssfile = $cgi->url_param('rssfile');
open(my $fhin, $rssfile) or die $!;

と書くとDOCUMENT_ROOTにあるrss.xmlを出力しようとして
rssfileに/rss.xmlと指定しても出力できません。
仮想パスを物理パスに変換する必要があるのは分かるのですが、
IISのMapPathメソッドのようなものはないのでしょうか?
よろしくお願いします。
512nobodyさん:2005/06/21(火) 23:18:28 ID:???
>>511
$ENV{'DOCUMENT_ROOT'}
513nobodyさん:2005/06/21(火) 23:31:31 ID:???
>>512
質問の仕方がまずかったですね。
それも考えましたがrssfileが//etc/passwdとかだった場合は
セキュリティ的に問題があると思ったもので。
DOCUMENT_ROOTの中か外かの判断ができればよいのですが。
514nobodyさん:2005/06/22(水) 01:31:35 ID:???
>>513
だからこういう事だろ?

my $rssfile = $cgi->url_param('rssfile');

$rssfile =~ s|^[./]*|$ENV{'DOCUMENT_ROOT'}/|;
-f $rssfile || die 'No such file';

open my $fhin, '<' . $rssfile or die $!;

外から渡される文字列は全部危ないんだから、危なくないよう加工・確認
してから使うのがセオリー。問答無用で DOCUMENT_ROOT を基点にして
しまえば中か外か判断する必要はないし、DOCUMENT_ROOT の外の
階層構造をわざわざ外部に教えてあげる必要もない。DOCUMENT_ROOT の
外のファイルを読ませたいのなら、ハッシュを一個用意してそのキーを指定
させる等、パスを直接的に指定させない方法を採ればいい。

%rssfile = (index => '...', news => '...', ... );
if (defined $rssfile{$rssfile}) { ... }
515nobodyさん:2005/06/22(水) 01:34:47 ID:???
何で ./rss.xml とかの指定じゃだめなん。

chdir ($ENV{'DOCUMENT_ROOT'});
とかにして、最初の スラッシュ を削除するとか。

つーかそーゆーモジュールすでにありそうだし、それくらいのメソッドくらい自分で造れそうだがw
516nobodyさん:2005/06/22(水) 01:37:48 ID:???
>>514 おまい頭いいな。
517511:2005/06/22(水) 02:15:15 ID:???
なるほど。参考になりました。
ありがとうございました。
518nobodyさん:2005/06/22(水) 11:32:07 ID:???
質問です。

ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
以下抜粋

>上の例では、ファイルハンドルを使う前にそれをスカラー変数に代入していました。
>これは式でもなく、ハッシュや配列の添え字でもなく単純なスカラー変数だけがprintやC<printf>、
>ダイヤモンド 演算子と一緒に使えるのです。コンパイル時にエラーになってしまうような間違いの例を挙げてみましょう:
> @fd = (*STDIN, *STDOUT, *STDERR);
> $got = <$fd[0]>  # 間違い

これって、ハンドルのリファレンスをハッシュに入れることは出来ないってことなんでしょうか。
以下のソースでエラーは出ないのですが、書き込みも読み込みも動きません。

package p_file;
my %ref_handle;        #クラスで使うファイルハンドルのハッシュ(複数のファイルを同時に開けるようにしたい)

sub open {
 my ($id, $path, $file) = @_;
 local *FILE;
 $ref_handle{$id} = \*FILE;              #←ここが問題?
 open($ref_handle{$id} , "+>>$path$file");
}
sub read {
 my ($id, $row, $begin) = @_;
 my @tmp = <{$ref_handle{$id}}>;
〜以下略
sub close {
 my ($id) = @_;
 close($ref_handle{$id});
}
519nobodyさん:2005/06/22(水) 11:51:25 ID:???
>>518
君が引用しているのは一つ下の問答のようだが、当の URL の問答に

> 複数のハンドルや無名ハンドルを作りたいのであれば、
> Symbol, FileHandle, IO::Handle といったモジュールを参照してください。

とあり、その例も書いてある。また君が引用している問答の中に、

> このアプローチは print や printf をオブジェクトメソッドの呼び出しの
> ように扱うものですが、これはダイヤモンド演算子には使えません。
> なぜなら、ダイヤモンド演算子はカンマなしの引数を取る関数ではなくて
> 本当の演算子だからです。

と書いてある。
520nobodyさん:2005/06/22(水) 12:03:52 ID:???
>>519
ありがとうございます。
確認不足でした。。
521nobodyさん:2005/06/22(水) 13:06:21 ID:???
sprintf、printfの書式指定文字列について質問です。


my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]);
return sprintf("%04d%02d%02d", $year+1900, $mon+1, $day);


なら "%04d%02d%02d" → 20050622 のようになることは理解できるのですが、


($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($new);
$day = sprintf("%.4d/%.2d/%.2d", $year+1900, $mon+1,$day);


で "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか。
この『.』の意味が、調べてみても手元の本には載っていなくてわからず、すっきりしません。
桁数の指定(例えば『5.2』とかの)の . ではないようですし・・・

そして、"%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわないでしょうか?
522nobodyさん:2005/06/22(水) 13:33:30 ID:???
>>521
手元の本に載ってなければマニュアルを読めばいいじゃない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod#sprintf

英語が苦手なら駱駝本を買えばいいじゃない。
>>7

> "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか
$year + 1900 を 4 桁の精度に丸めると 2005 、$mon + 1 を 2 桁の精度に
丸めて ( d は整数型指定子なので) 0 パディングすると 06 、$day を 2 桁
の精度に丸めると 22 、それぞれ当てはめて 2005/06/22

> "%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわない
> でしょうか?

スラッシュが無くなっても構わないならご自由に。
523nobodyさん:2005/06/22(水) 15:55:25 ID:pDQou/2T
cgiファイルのパーミッション設定をWS_ftpで755に変えようとすると。
Permission denied on server. (chmod)とでます。
その上のフォルダは変えられたのですが・・・
上記のエラーはどういう意味なんでしょうか?
524521:2005/06/22(水) 16:18:22 ID:???
>522
ありがとうございます。
URL先読んでだいぶ分かりました。

そして手元の本を見直したら、
「.」の後の数値の意味に「文字列の最大幅」というのがちゃんと載ってました。orz
「5.2」のように「.」には必ず前後に数値がないといけないと思い込んでしまってました。

>スラッシュが無くなっても構わないならご自由に。

そうですね、下はスラッシュを入れてますね。気がつかなかった・・・
これは
$day = sprintf("%04d%02d%02d", $year+1900, $mon+1,$day);
$day =~ s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/;
とやっておこうと思います。

どうもありがとうございました。
525nobodyさん:2005/06/22(水) 16:51:26 ID:???
>>523
初心者質問スレが無くなって不便だな…。代わりはここでいいんだろうか。

CGIとかPerlとか超初心者なんだけど、
http://pc8.2ch.net/test/read.cgi/php/995618200/

Perl に関係無い話は上記スレへ。

>>524
"%04d/%02d/%02d"
526nobodyさん:2005/06/22(水) 17:23:55 ID:???
>>522 おまいおもしろいな。
527nobodyさん:2005/06/22(水) 17:53:22 ID:???
>>524
hint:

sprintf("%04d%02d%02d", $year, $mon, $day); #20050622

sprintf("%04d/%02d/%02d", $year, $mon, $day); #2005/06/22

sprintf("%04d年%02d月%02d日", $year, $mon, $day); #2005年06月22日
528nobodyさん:2005/06/22(水) 18:12:51 ID:???
>>524
hint:

$hoge = "ほげ〜ほげ〜ほげ〜<br>お〜れ〜は%s\<br>ガ〜キだいしょ〜うっとくらあ";
$hoge = sprintf($hoge, 'ジャイアン');
529nobodyさん:2005/06/22(水) 18:46:41 ID:VvFC8JSF
my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id});
my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id});
print br (), br (),
"$row->{t} $row->{status}",
" [", a ({-href => $edit_url}, "Edit"), "]",
" [", a ({-href => $delete_url}, "Delete"), "]",
br (), "\n",
"$row->{content}\n";


1行目のsprintfで文字列を指定して、出力しているのはわかります。
しかし、括弧内の意味がわかりません。変数"id"について、URLを指定しているらしい
ですが、よくわかりません。
どっかに詳しく解説している、サイトとかありませんかね?
530nobodyさん:2005/06/22(水) 18:51:23 ID:???
ネタか?
531524,521:2005/06/22(水) 19:10:41 ID:???
ありゃ、みなさんありがとうございます。

ええと、わざわざ後からスラッシュを入れる方式(>524)にした理由は、

配布されてるあるCGIをカスタマイズしていたら、
そのCGIには日付を取得するサブルーチン(>521の上)があって
ほとんどの部分でそのサブルーチンを利用しているのに、
一カ所だけ利用していない(>521の下)部分があって、
どうしてこの部分では利用して無いのか?他と違うデータなのか?
というのが始まりだったんです。

ちなみにそのCGIの他の箇所で「2005/06/22」形式のデータが必要な時は、
サブルーチンで「20050622」形式のデータを取得した後
s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/;
をやってましたので、それに揃えようかと。
532nobodyさん:2005/06/22(水) 21:23:12 ID:SO7tDheg
突然すいません、CGI.pmって普通はどこに置くものなんですか?
OSはRedhatなんですけど
533nobodyさん:2005/06/22(水) 21:57:46 ID:???
perl/lib
534nobodyさん:2005/06/23(木) 00:40:06 ID:???
こんなプログラムを考えています。

・ID(10バイト程)を入力してもらう
・IDを受け取ったプログラムはIDを一行ごとに入力してある
 ファイルを順次読み込み(読みオンリーでオープン)
 該当するIDがあるかどうかチェックする。
 (対象のIDは5千件程度)

というWebを作りたいんですが、読み込みオンリーで
オープンしておけば一度に10人とか同じチェック側の
プログラムを動かしてもロックかかったりしてパフォーマンス
が落ちることはない?それともプログラム中で条件式(if?)
の中で固定でチェックした方がいいのでしょうか?
535nobodyさん:2005/06/23(木) 00:54:13 ID:???
読みオンリーならロックかける必要なくない?
536nobodyさん:2005/06/23(木) 00:57:09 ID:???
意味が良くわからないんだけど
537nobodyさん:2005/06/23(木) 01:09:28 ID:???
>>534
読み出しだけならロック不要だが5000件あるなら
dbmとか使ったほうがいいんでない?
538nobodyさん:2005/06/23(木) 01:40:39 ID:???
5000 * 10 約 50kb くらいか。 微妙だ。
539nobodyさん:2005/06/23(木) 01:58:38 ID:dskomwuH
>>525
スレを教えてくれてありがとうございました
540nobodyさん:2005/06/23(木) 02:32:10 ID:???
5000行程度のデータなら別に気にしなくてもよいのでは?
処理を速攻で終わらせてメモリを開放してあげるほうが重要かと。sleepとか使っちゃダメ。
・・・10人同時って、ほんとにそんな状況発生するのかな?
541nobodyさん:2005/06/23(木) 15:11:47 ID:???
宜しくお願いします。
CGIを改造中なのですが、知恵を貸してください。

ログの情報を「○番目の要素でソートして表示する」と言うのをしたいのですが、うまくできません。
他のCGIからソート部分だろうと思われるものをコピッて手を加えたのですが、ダメです。

open(IN,"$logfile") || &error("Open Error : $logfile");
@data = <IN>;
close(IN);
@tmp = map {(split /<>/)[3]} @data;
@slist = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp];
 $i=0;
 $flag=0;
 while (@slist) {
  ($no,$date,$name,$genre,$com,$kousi,$day,$w1,$w2,$w3,$w4,$w5,$w6,$w7,$time,$mony,$tail,$w,$h) = split(/<>/);

---------
$genreにソートしたいもの(g_1,g_2,g_3〜)が入っていて、それを元に並べ替えしたいんです。
この状態で動作させると、変数が入っていない表が無限に続いてしまいます。

どこが間違っているのでしょうか? お願いします。

542nobodyさん:2005/06/23(木) 16:03:51 ID:???
>>541
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_sort_an_array_by_anyth

★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/

【 スクリプト改造依頼スレ 】(丸投げ) part3
http://pc8.2ch.net/test/read.cgi/php/1105046286/
543nobodyさん:2005/06/23(木) 16:06:01 ID:AbvQdhd4
cgi.pmを使用して以下のようにクッキーを取得しました。

use CGI;

$cookie = $cgi->cookie(-name => 'hoge',
            -value => 'fuga',
            -expires => '+1h',
);
print $cgi->header(-cookie=>$cookie);

この結果は
Set-Cookie: hoge=fuga; path=/; expires=Thu, 23-Jun-2005 07:21:10 GMT Date: Thu, 23 Jun 2005 06:21:10 GMT Content-Type: text/html; charset=ISO-8859-1
のようになりうまくクッキーを取得したようです。


しかし、上のクッキーを取得するために
print $cookie = $cgi->cookie(-name=>'hoge');
と記述しましたが、何も値が入ってませんでした。


cgi.pmを使用してクッキーを取得するにはどのようにしたらよいのでしょうか
544nobodyさん:2005/06/23(木) 17:34:51 ID:???
>>543
<q cite="http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod">
クッキーを取り出すには、cookie()メソッドを-valueパラメータなしで
呼び出すことによって名前で要求します:

  use CGI;
  $query = new CGI;
  $riddle = $query->cookie('riddle_name');
     %answers = $query->cookie('answers');
</q>
545nobodyさん:2005/06/23(木) 18:34:57 ID:???
>>544
どうでもいいけど、 q じゃなくて blockquote のような。
546nobodyさん:2005/06/23(木) 20:57:35 ID:???
q でも間違いじゃないよ。インラインだし。
原文が段落あるんだろうから、blockquote のがいいけど。
blockquote だと p とか pre とかも入れないといけないけど。
547nobodyさん:2005/06/23(木) 22:19:04 ID:???
>>534
まぁ5000件くらいじゃ大丈夫だと思う。
もっと多い場合の対処法としては

データファイルをソートしておく→IDが存在しない時早く終れる。
IDの頭文字別にデータファイルを用意する→個々のデータファイルが小さくなるから早く処理が終わる。
548nobodyさん:2005/06/24(金) 05:19:50 ID:kge0P1YB
こんにちは。
他の方が製作したCGIに次のような記述がありました。

$\ = "\n";
print "<html>";
print "<body>";
print "<p>test</p>";
print "</body>";
print "</html>";
$\ = "";

これの最初の $\ = "\n"; についての質問です。
これは、恐らくHTMLソースの改行が目的であることは分かりますが、
$\ とはどういった変数なのでしょうか?
また、同じように使える特殊な変数はあるのでしょうか?

検索エンジンで必死に調べたのですが、「$\」で絞り込むのは厳しいようで…。

ご教示お願いします。
549nobodyさん:2005/06/24(金) 05:36:55 ID:???
>>548
perlvar
550nobodyさん:2005/06/24(金) 09:01:17 ID:???
551nobodyさん:2005/06/24(金) 09:04:39 ID:???
>>548
printで末尾に出力するものを指定できる
552nobodyさん:2005/06/24(金) 12:27:48 ID:QTITokL2
動的なhtmlページをダウンロードしたいので教えて下さい。

掲示板などのようにcgiやphpなどで動的に表示が変わるページを
ページが表示されてからソースの表示をした時に見られるような
htmlソースでダウンロードしたいのですが、やり方がわかりません。
また、niftyのサーバで動かしたいので特殊なモジュールも使用できないので
それでも可能な方法があれば教えて下さい。

本当にやりたい事はその先で、そのソースをまたperlで解析して
テキストを表示するというものです。
ダウンロードしたファイルからそのテキストをただ表示する部分は出来ているので
ダウンロードの部分を教えて下さい。

宜しくお願いします。
553nobodyさん:2005/06/24(金) 12:41:15 ID:???
http://pc.2ch.net/php/kako/1034/10345/1034583844.html>>991
>WEBページを読み込みたいのですが可能でしょうか?

http://pc.2ch.net/php/kako/1037/10377/1037797479.html>>5
>前すれ>>991
>Socketを使わないとむりぽ。
>がむばってネ。


がむばってネ。


おとなしくLWPとか使うのがいいんだけど。niftyなんぞ無視して。
http://pc.2ch.net/php/kako/1037/10377/1037797479.html>>9
>LWP::Simpleモジュールが入っているなら
>perldoc lwpcookして出てくる文書読んでみるとやり方出てるよ。
>
>use LWP::Simple;
>getstore "http//:www.yahoo.co.jp", "yahoo.html";
>みたいな感じ。


がむばってネ。
554nobodyさん:2005/06/24(金) 13:17:47 ID:???
説明が分かりにくすぎ。
まじめな話、もう少し日本語を勉強せよ
555nobodyさん:2005/06/24(金) 15:58:04 ID:/NGYg1v6
>>553
LWP::Simpleモジュールも入っていないようです。

自PCでActiveperlを実行した時は
HTTP::Lite;モジュールを使ったのですが
これもNiftyでは使えないようです。
556nobodyさん:2005/06/24(金) 16:01:15 ID:???
Niftyは何の標準モジュールも故意に消されているので、使いたい場合は自分で用意する必要がある、って誰かが言ってたじゃあないか。
ということで使いたきゃ自分で必要なもの全部揃えてアップして使いなさい。
557548:2005/06/24(金) 17:18:12 ID:???
>>549-551
ご回答ありがとうございました。
Perlの特殊変数のページ非常に参考になりました。
難しくて全てを理解するまでは時間がかかりそうですが、
とりあえず気になったことが分かって嬉しいです。
558:2005/06/24(金) 17:24:31 ID:L251Ppfj
超基本ですいません。
パッケージ内でグローバルな宣言をされた変数って、それぞれ別にNewで生成されたオブジェクト変数ごとで固有に持たせる方法はありますか?
$a = new foo;
$b = new foo;
fooは内部のmyグローバル変数 s をもってて、set メソッドで代入しgetメソッドで取り出せるとします。
$a->set(100);
$b->set(200);
とすると、
print $a->get;
で 200 と返ってきてしまいます…
javaそのほかのようにインスタンスごとの固有値は持たせられないのでしょうか?基本的で申し訳ありませんがよろしくご教授ください。
559nobodyさん:2005/06/24(金) 17:25:44 ID:???
すいません。
初歩的な質問宜しいでしょうか?

perlで文字列の長さを取得する関数って
ないのでしょうか?

my $len = strlen('auaua');
       ^^^^^こんなの、、、
560nobodyさん:2005/06/24(金) 17:31:04 ID:???
length
561nobodyさん:2005/06/24(金) 17:42:52 ID:???
>>558
> myグローバル変数
そりゃグローバル変数だからだ。
562559:2005/06/24(金) 17:46:00 ID:???
>560さん
わーい
本当にありがとーございますっ
563:2005/06/24(金) 18:01:45 ID:L251Ppfj
>>561
言い方が変でした。すいません。
ようは、パッケージのインスタンスごとに、変数値を持たせられる方法が知りたいのです。同一のパッケージから生成したインスタンスごとでも
$a->get ⇒ 100
$b->get ⇒ 200
のようにできるコーディングがどうすればいいかわかりません…
Perlではこのような動作の要求は無理なんでしょうか?
564nobodyさん:2005/06/24(金) 18:13:32 ID:???
>>563
perl クラス インスタンス
でググって、三つ目くらいにある「Perlでオブジェクト指向」みてみそ。
565nobodyさん:2005/06/24(金) 18:16:40 ID:???
>>548ってヒアドキュメントとか使ったほうがよくないか?そうでもない?
566nobodyさん:2005/06/24(金) 18:20:36 ID:???
sub new {
 my $class = shift;
 my $self = {};
 bless ($self, $class);
}
sub set {
 my $self = shift;
 $self->{s} = shift;
}
sub get {
 my $self = shift;
 return $self->{s};
}
567563:2005/06/24(金) 18:26:07 ID:???
皆様ありがとうございます!糸口つかめました!
ケータイからのカキコで必死だったためろくにsageませんでした;;
なるほどです。感謝!
568nobodyさん:2005/06/24(金) 18:26:58 ID:???
>>565
ヒアドキュメントの見た目が嫌いな人だったりして
569nobodyさん:2005/06/24(金) 18:32:24 ID:???
なんでそんなどうでもいい話を発展させるんだ?
570nobodyさん:2005/06/24(金) 18:32:49 ID:???
すいません質問があります。

始めの一文字が同じならtrueとしたいのですが
そのような関数もしくはやり方等ないのでしょうか?


if( ($abc cmp $def) >1 ){:
このようなコード書いたような記憶はあるのですが、、、
571nobodyさん:2005/06/24(金) 18:39:48 ID:???
今日は初心者以前の質問が多いような・・・。

if (substr ($abc, 0 , 1) eq substr ($def, 0 , 1)) { 〜 }
572nobodyさん:2005/06/24(金) 21:10:46 ID:???
どっかでperlクイズのような宿題でも出たか?
573nobodyさん:2005/06/25(土) 00:44:36 ID:???
println "aaa";って欲しいな。
574nobodyさん:2005/06/25(土) 01:22:00 ID:???
それ自分で作ってやってるw

でもそれでファイルには書けないんだけどさ。
575nobodyさん:2005/06/25(土) 01:29:56 ID:???
何言ってんだこのバカ
576nobodyさん:2005/06/25(土) 02:58:57 ID:???
お世話になります。

cgi-lib.plのReadParseで読み込んだデータ
$in{'hoge'} (中身はチェックボックスで選択された複数のデータが入っています)があります。

print $in{'hoge'};とすると

あああ いいい ううう えええ おおお かかか ききき くくく・・・のように半角スペース区切りのデータが出ますが、

これを

あああ・いいい・ううう(改行)
えええ・おおお・かかか(改行)
ききき・くくく

のように、3の倍数個目のデータには改行を、それ以外には中黒「・」で区切るようにして表示したいのです。
単純に区切り文字を他の文字に全て置き換えすることなら出来るのですが、ちょっと複雑になるとお手上げです。

ご教示よろしくお願いします。
577nobodyさん:2005/06/25(土) 03:06:46 ID:VyiiD8SR
0x00で区切られない?
半角スペース区切りだっけ?

普通に split して for文使うとかはどうよ
578nobodyさん:2005/06/25(土) 03:57:59 ID:???
>>576
例えば、区切りとしてじゃなく、各データのケツに改行とか中黒が着いてると考える。
つまり「3の倍数個目か」「最後のデータか」「それ以外」かで後ろに何をprintするか分岐したらいい。
ループの中にif文2個書いてもいいし、最後だけが例外的なのを利用してループが最後のデータ直前で終わるようにしてもいい。
579nobodyさん:2005/06/25(土) 04:46:44 ID:???
あとは、
$_ = "あああ\0いいい\0ううう\0えええ\0おおお\0かかか\0ききき\0くくく";
while (/([^\0]*)\0([^\0]*)\0?([^\0]*)\0?/g) {
    print $1, ($2 ne '' && '・'. $2), ($3 ne '' && '・'. $3), "\n";
}
とかな。
580nobodyさん:2005/06/25(土) 05:24:23 ID:???
print join("・", split /\0/), "\n" for m/(?:[^\0]+\0?){3}/g;
581nobodyさん:2005/06/25(土) 14:43:44 ID:???
すみません、Net:CIDR:Liteモジュールはどこで落とせばいいですか?
582nobodyさん:2005/06/25(土) 15:04:05 ID:???
失礼しました、CPANから落とせました。
連続で申し訳ありませんが、これを実行すると
Can't use string ("") as a subroutine ref while "strict refs" at 〜
となってしまいます。find()をするとこうなるのですが、どこがおかしいのですか?

use Net::CIDR::Lite;
my $net = Net::CIDR::Lite->new;
my @airedgecidr = (
'221.119.8.0/24', '221.119.9.0/24'
);
foreach (@airedgcidr) {
$net->add($_);
}
$result = $net->find('221.119.8.1');
583nobodyさん:2005/06/25(土) 15:09:40 ID:???
584nobodyさん:2005/06/25(土) 15:20:19 ID:???
>>583

use strictしたところ、配列の変数名が間違っていることに気づきましたorz
ありがとうございました。
# rootさんのソースなのに…
585nobodyさん:2005/06/25(土) 15:29:33 ID:???
んなもん誰にでもミスはあるさ
586576:2005/06/25(土) 20:03:10 ID:???
ありがとうございました。

>>579のソースが私的にわかりやすかったので、使わせていただきます。
587nobodyさん:2005/06/26(日) 03:21:28 ID:???
教えて下さい
レンタルの日記を借りて、スキンを使ったのですが画像を投稿出来ないので
自分でスキンのタグを変更可能してもおkと書いてあったので
画像を無理やり出すイレギュラーってのをやりたいのですが
何を挿入していいか分かりません・・。
画像投稿可版・不可版(同スキン)を両方DLしてソースを見比べたのですが
どうしても分らず、ぐぐっても分りませんでした・・。
どんなタグ?をどの辺りに挿入すればいいのか教えてもらえませんか・・?
よろしくお願いします。
(どこで聞いていいか分からなかったのでスレ違いだったらすみません・・)
588587:2005/06/26(日) 03:24:35 ID:???
すみません、初心者で検索かけたのでスレ違いに今気づきました・・。
他で聞いて来ます。
申し訳ありませんでした・・。
589nobodyさん:2005/06/26(日) 23:02:23 ID:3dNr93yG
下記のSOCKET通信プログラムにて画像を取得しているのですが、サーバによって
print SOCKET "User-Agent: " . $browser . "\n";
で止まってしまうものがあるようです。

モジュールが入っていることは確認できているのですが、もしも
なにかお気付きの点等ございましたらご教示いただきたく思って
おります。どうか宜しくお願いいたします。


use Socket;
use FileHandle;
my $ip = inet_aton($host) || die "host($host) not found.\n";
my $sockaddr = pack_sockaddr_in($port, $ip);
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n";
connect(SOCKET, $sockaddr) || die "connect $host error.\n";
autoflush SOCKET (1);
binmode(STDOUT);
print SOCKET "GET $directory$filename HTTP/1.1\n";
print SOCKET "User-Agent: " . $browser . "\n";
print SOCKET "Host: " . $host . "\n";
print SOCKET "Connection: close\n\n";
while(<SOCKET>){
m/^Content-Type: ([^\r\n]+)/i && print "Content-Type: $1\r\n";
m/^Content-Length: ([^\r\n]+)/i && print "Content-Length: $1\r\n";
m/^\r\n$/ && last;
}
print "\r\n";
while(<SOCKET>){
print $_;
}
close(SOCKET);
590nobodyさん:2005/06/26(日) 23:41:10 ID:???
>>589
なんで
> print SOCKET "User-Agent: " . $browser . "\n";
で止まってるって思ったの?
591nobodyさん:2005/06/27(月) 01:10:18 ID:???
俺もそれ聞こうと思ってた
592nobodyさん:2005/06/27(月) 01:29:08 ID:???
perlのコーディングを楽にするために、
HTMLの記述をprint "〜"に変換する作業を一括で行うソフトウェアを探しているのですが、そのようなソフトはありますか?

例えば、
<a href="abc.html">ABC</a>

print "<a href=\"abc.html\">ABC</a>"
と変換できるものです。
593nobodyさん:2005/06/27(月) 01:37:26 ID:???
なんていうか、ヒアドキュメントとかqqとか知ってる?
594nobodyさん:2005/06/27(月) 01:44:19 ID:???
ガーン・・・

そんな方法があったんですか・・・・。今日はじめた初心者だったのでごめんなさい。
>>593さんありがとう('A`)
595nobodyさん:2005/06/27(月) 01:46:16 ID:???
>>592
perl
596nobodyさん:2005/06/27(月) 02:14:33 ID:???
大正解
597nobodyさん:2005/06/27(月) 02:18:26 ID:???
ちょっとウケタw
598nobodyさん:2005/06/27(月) 02:28:57 ID:???
>>590
ご返答有難うございます。
止まっていると思ったのは、
print SOCKET "User-Agent: " . $browser . "\n";
print SOCKET "Host: " . $host . "\n";
を外したら進んだためです。

具体的には、KeitaiPicutureという画像変換サービスで変換された
画像をSOCKETでとってくる仕組みを作っているのですが、
GET $directory$filename?User-Agent=UA
だと成功するんですよね。

とにかくご教示有難うございました。
599nobodyさん:2005/06/27(月) 03:10:20 ID:???
>>598
そのサービスが$ENV{HTTP_USER_AGENT}じゃなくてクエリーのUser-Agentを見てるからだろ。
600nobodyさん:2005/06/27(月) 03:12:15 ID:???
>>598
それから、telnetで直接やってみ。そこで止まってるわけじゃないから。
601nobodyさん:2005/06/27(月) 08:08:58 ID:7ZY2M4BI
HERE。字あってるか忘れたけど、たぶんこれでできるはず。
602nobodyさん:2005/06/28(火) 16:25:00 ID:l0OJ7VtD
#!/usr/local/bin/perl

use HTTP::Request;
use LWP::UserAgent;

my $url = 'http://www.yahoo.co.jp';
my $request = HTTP::Request->new(GET => $url);

my $ua = LWP::UserAgent->new;
my $response = $ua->request($request);

if($response->is_success) {
print $response->content;
} else {
print $response->status_line;
}

という LWP::UserAgent をテストするためのCGIを、サンプルを元に組んだのですが、
[Tue Jun 28 15:42:43 2005] [error] Premature end of script headers:
ということで 500 Internal Server Error になってしまいます。
Premeture〜ってぐぐってみたけどよくわかりません。
原因として何が考えられますか?
603nobodyさん:2005/06/28(火) 16:52:11 ID:???
ようわからんが、print "Content-type: text/html\n\n"; が抜けてるとか。
604602:2005/06/28(火) 17:06:17 ID:???
>>603
ああああああああ〜〜
それでした〜〜
ありがとうございました〜〜
トホホ
605nobodyさん:2005/06/28(火) 17:37:14 ID:???
>>604
あるあるww
606nobodyさん:2005/06/28(火) 17:58:49 ID:???
すいません 質問があります。

--------------------------------
my %dir_name=();
readDir(\@dir_name);

sub readDir{
my $dirname_ref = shift;
$dirname_ref->{'aaa'}="BBB";
}
--------------------------------
を実行しても
Can't coerce array into hash at cron_day_table.cgi line 50.
とエラーになってしまいます。

何がいけないのでしょうか?
ご助力を頂けますと助かります。
607nobodyさん:2005/06/28(火) 18:11:08 ID:???
>>606
エラーメッセージの通りじゃん。 readDir(\%dir_name); じゃないの。
608606:2005/06/28(火) 18:17:44 ID:???
あ、、、
本当だー
ありがとーございますっ

スレ汚し失礼いたしました。
609606:2005/06/28(火) 19:37:41 ID:???
たびたび本当にすいません 質問があります。

my %dir_name=();
my $dirname_ref = \%dir_name;

$dirname_ref->{'bbb'}='hoge';
$dirname_ref->{'ccc'}='hoge';
$dirname_ref->{'aaa'}='hoge';

my $key;
foreach $key(keys %dir_name){
print "$key -> $dir_name{$key}\n";
}
--------------------------------
として出力すると↓
--------------------------------
bbb -> hoge
aaa -> hoge
ccc -> hoge
--------------------------------
のようになってしまいます。

下記のように入れた順番通りに出力したいのですが
bbb -> hoge
ccc -> hoge
aaa -> hoge
そういった場合はどうすればよろしいのでしょうか?

ご助力を頂けますと助かります。
610nobodyさん:2005/06/28(火) 19:44:18 ID:???
611nobodyさん:2005/06/28(火) 19:46:11 ID:???
そういや、 pseudo hash ってなかったっけ?
もしかして、無かったことになった?
612nobodyさん:2005/06/28(火) 19:52:27 ID:???
613nobodyさん:2005/06/28(火) 19:59:09 ID:???
>>612
なるほどねぇ
614nobodyさん:2005/06/28(火) 21:58:10 ID:???
use strictしとけ。そういう単純ミスが防げるぞ。
615nobodyさん:2005/06/29(水) 20:47:26 ID:???
>>609
スマートじゃないけど。

my %dir_name=();
my $dirname_ref = \%dir_name;

$dirname_ref->{'bbb'} = ['hoge', 1];
$dirname_ref->{'ccc'} = ['hoge', 2];
$dirname_ref->{'aaa'} = ['hoge', 3];

foreach my $dir (sort{$a->[1]->[1] <=> $b->[1]->[1]} map{ [$_, $dir_name{$_}] } keys %dir_name){
print "$dir->[0] -> $dir->[1]->[0]\n";
}
616nobodyさん:2005/06/29(水) 21:39:04 ID:???
>>609
use Tie::IxHash
617nobodyさん:2005/06/29(水) 23:40:40 ID:4HgpqCXd
変な質問ですみません。
どうしてこれで "0_" と表示できないのか教えて下さい。

$i = 0;
print "$i_\n";
618nobodyさん:2005/06/29(水) 23:46:24 ID:???
>>617
偽として扱われてるから。
619617:2005/06/30(木) 00:06:48 ID:nq4lXHpH
すみません、自分なりに調べても分からなかったのですが、
ここでのアンダースコアはどのように効いているのでしょうか?
否定の演算子でもなさそうなのですが・・・
620nobodyさん:2005/06/30(木) 00:20:33 ID:???
>>619
識別子には_も使えるから。($i_という変数も有り得る)
621617:2005/06/30(木) 00:29:51 ID:???
>>620
なるほど、よくわかりました。
どうもありがとうございます。
622nobodyさん:2005/06/30(木) 01:13:28 ID:8FYD6O0q
掲示板みたいな簡単なCGIでも、フォームデコードとか細かくモジュール使うべきなんでしょうか?
簡単なの持っててもえーかな思ったんだけど、チェックボックスとかの複数選択がどーにもできんのです。。
複数のバリュあるときは配列にするのなら、
if (defined $form{$key}){
 if(ref $form{$key}){ push @$key,$value; }
 else{ @$key=($form{$key},$value); $form{$key}=\@$key; }
}
うろ覚えで書いたんで変かも・・・っていうか、@$keyがおかしいケド。こんな感じで良いのでしょうか?
プログラムそのものもperlが初めてなんで要領得なくて
サブルーチン内外で変数共有しない方がいいのかと思ったんだけど、リファレンスする配列が局所化できません。
623nobodyさん:2005/06/30(木) 01:17:33 ID:???
#複数のバリューあるときは「リファレンス」?にするのなら
参考にしたスクリプトで使われてたcgi-liteだかではそうなってたような気が。
そして、sageってシステムがよくわからない・・・申し訳ないです。
624nobodyさん:2005/06/30(木) 02:47:40 ID:???
ハッシュに配列つっこむならこんな感じ。
push @{$form{$key}},$value;

リファレンスするならこんな感じかの。
push @{$$form{$key}},$value;

でも、別に配列にこだわらなくてもいい気がする。
625606:2005/06/30(木) 11:45:29 ID:???
にゅおーー
本当にみなさんRESありがとうございます。

順番を保持する配列とその配列の要素をキーとするハッシュで
やる方法で自作し強引に解決(?)いたしました。

本当にRESどうもですっ
そのうちこちらで解決案を書ける人になれますようがんばりますですっ
626nobodyさん:2005/06/30(木) 12:21:53 ID:???
>>621
後ろの文字を識別子の文字と区別したいときは { } を使う。

print "${i}_\n";
627nobodyさん:2005/06/30(木) 13:17:05 ID:wTRNDiAZ
すいません、質問お願いします。

&decrypt(入力されたパスワード、登録されてるパスワード)
sub decrypt {
local($in, $dec) = @_;

local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) {
return (1);
} else {
return (0);
}
}

パスワード認証のサンプルなんですけど、
入力されたパスワードが認証されれば1を間違っていれば0を返すサブルーチンなんですが、

local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) {

↑の部分がどうしてもわからないのですが御教授お願いします。
628nobodyさん:2005/06/30(木) 13:22:47 ID:???
多分、 Perl のコードがわからないというより crypt() がわからないんだと思う。
crypt() の仕組みが理解できてないとキツいと思うので、
「crypt パスワード」あたりでぐぐって調べてみるのが良いと思う。
629nobodyさん:2005/06/30(木) 14:05:04 ID:wTRNDiAZ
>>628
ありがとうございます。crypt()は勘違いして覚えてました。
変換キーに2文字じゃなきゃいけないんですね。
それで

substr($dec, 0, 2);

の意味はわかったんですが

$dec =~ /^\$1\$(.*)\$/ && $1



crypt($in, '$1$' . $salt) eq $dec

の部分がまだわからないのですが
お願いします。

630nobodyさん:2005/06/30(木) 15:18:51 ID:???
substr が分かるなら、こう書けば理解できる?
# - - - - - - - - - - - -
$salt = $dec =~ /^\$1\$(.*)\$/ && $1
 ||
if (
 length $dec >= 3 &&
 substr($dec, 0, 2) eq '$1$' &&
 substr($dec, -1, 1) eq '$'
) {
 $salt =
substr($dec, 2);
 chop $salt
;

}
# - - - - - - - - - - - -
if (crypt($in, '$1$' . $salt) eq $dec)
 ||
my $tmp = '$1$' . $salt;
if (crypt($in, $tmp) eq $dec)
# - - - - - - - - - - - -

とりあえず正規表現学んで来い、といいたい。
作者が $1$ *** $ とつけてるのはよくわからない。
631nobodyさん:2005/06/30(木) 15:19:50 ID:???
ところどころ何故か無駄な改行が入ったw スマン
632nobodyさん:2005/06/30(木) 16:24:04 ID:???
MD5とDESの違いだね。
633nobodyさん:2005/06/30(木) 16:30:42 ID:wTRNDiAZ
>>630
ありがとうございます。
一行づつなら理解できるのですが、

$dec =~ /^\$1\$(.*)\$/

↑この表現は変数$decの頭が $1$ で任意の文字がいくつか入って
その後 $ の文字列にマッチするか否かと理解していいんでしょうか?
$1$ これって特別な意味あるんですか?

local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);

あと上の処理の順番がよくわらないんですが
A && B Aが真ならBを実行
A || B Aが偽ならBを実行
と言うのならわかるのですが
その辺もご教授願えないでしょうか
一応本を見ながらやっているのですがイマイチ理解できません。
634nobodyさん:2005/06/30(木) 16:41:02 ID:???
ちゅーか、これで十分な気がするのだが。

sub decrypt {
crypt($_[0], $_[1]) eq $_[1];
}
635nobodyさん:2005/06/30(木) 16:59:34 ID:???
質問です宜しくお願いします

$in{race}="aa";
$raceindex="bb";

if($in{race} == $raceindex){print "ok";}

exit;

これを実行すると$in{race}の内容と$raceindexの内容は同じではないはずなのに
if分は真となってokと表示されます
これはif分の書き方がおかしいのでしょうか
636nobodyさん:2005/06/30(木) 17:07:01 ID:???
>>635
== は数値で評価する演算子。
この場合はどっちも 0 と評価されるので真になってしまう。
文字列を比較したい場合は eq 演算子を使う。

perlop - Perl operators and precedence (Perl の演算子と優先順位)
ttp://perldoc.jp/docs/perl/5.6.1/perlop.pod
637nobodyさん:2005/06/30(木) 17:13:09 ID:???
>>636
有難う御座います
perlのスクリプト書くの1年ぶりですっかり忘れてました

無事解決しました
有難う御座いました
638nobodyさん:2005/06/30(木) 17:39:09 ID:???
karame.comみたいな、特定のアドレスにメールが来たらその送信元アドレスに"Hello world!"とでも書いたメールを送信できるスクリプトを作りたいのですが、具体的にどうやればよいのかわかりません。
サーバからsendmailの使用は許可されているのですが、どうやったらメールが来たことが検出できるのかまるでわからないのです。
申し訳ありませんが一手ご教授下さいくださいですよ
639nobodyさん:2005/06/30(木) 17:42:21 ID:???
>>633
$1$で始まるのはMD5でハッシュ化された文字列です
$1$から次の$までの文字列がハッシュ化のsaltになります
そのサブルーチンはDESとMD5の両方使えるようにしているようだけど意味無いと思われます
DES,MD5どっちを使うかはcrypt関数が知っておりsaltも自動的に判断されるので>>634で十分です。
640わから〜ん:2005/06/30(木) 19:18:36 ID:UYjObKP/
1行目 my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id});
2行目 my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id});
3行目 print br (), br (),
4行目 "$row->{t} $row->{status}",
5行目 " [", a ({-href => $edit_url}, "Edit"), "]",
6行目 " [", a ({-href => $delete_url}, "Delete"), "]",
7行目 br (), "\n",
8行目 "$row->{content}\n";

1行目の sprinfで整形された文字列 my $edit_url変数に代入される。
2行目も同じ要領で、my $delet_url変数に代入される。
3行目は HTML表示

4行目 意味不明

5行目 1行目の変数が"edit"としてURL表示される。
6行目 2行目の変数が"delete"としてURL表示される。
7行目 HTML表示

8行目 意味不明

ご質問いたします。
(1)4行目の意味がわからない
(2)5行目と6行目がなぜ、editとdeleteのURL表示となるのか?
(3)8行目の意味がわからない

特に、(2)の質問を詳しく解説してください。(2)の用法について
ラクダ本に記述がありますか?

よろしくお願いいたします。
641nobodyさん:2005/06/30(木) 19:24:59 ID:???
もう夏休みなのか?
642nobodyさん:2005/06/30(木) 19:27:29 ID:???
643nobodyさん:2005/06/30(木) 19:59:14 ID:???
「リファレンス」 を知らないのもあるような。 ぐぐれー。
644わから〜ん:2005/06/30(木) 20:11:02 ID:UYjObKP/
PerlのCGIモジュールを使っているのですね。
必死にいろんな本読んでも、記述が無いわけですね。
URLのところを読んで、勉強します。

大変ありがとうございました。
645>>627:2005/07/01(金) 18:26:12 ID:???
ありがとうございました。
$1$が謎だったので助かりました。
MD5とDESというのはレベルが高くてよくわかりませんが、
とりあえずそういうものだと思って頭の片隅においておきます。
今の段階では>>634のやり方で問題ないとわかっただけ十分です。
646nobodyさん:2005/07/01(金) 20:20:31 ID:???
CGI.pmを使う利点は何ですか?
普通に$ENV{'QUERY_STRING'}などと変わらないような気がするのですが…
647nobodyさん:2005/07/01(金) 20:31:30 ID:???
そう思うのなら使わなければいい
今時つかうやつも少ないだろうしな
648nobodyさん:2005/07/01(金) 20:55:17 ID:???
あ、少ないんだ?
649nobodyさん:2005/07/02(土) 00:14:53 ID:???
まじすか、今から使っていこうと思ってたのだがorz
650nobodyさん:2005/07/02(土) 01:12:37 ID:???
フォームデコード程度なら必要ないっしょ
CGI::Liteだってあるし
651nobodyさん:2005/07/02(土) 07:05:02 ID:???
CGI.pmの利点が分からないなら、使ってみればいいのに。
分からないかも知れないけど。
652nobodyさん:2005/07/02(土) 13:53:31 ID:???
なんかPHPっぽいねw>CGI.pm
653622:2005/07/02(土) 14:20:11 ID:???
>>624
ありがとうございます。どうも、リファレンスで混乱してたようです^^;
「.=」して分割を考えるとかでも十分なのかな。。

モジュールは勉強したいとは思うけれど、種類の多さ機能の多さに・・・
そもそも、なんかもっと根本的な部分で知識と理解が足りてなさすぎる。。
654nobodyさん:2005/07/02(土) 23:30:34 ID:???
>>653
そうそう、そんな感じ。
複数データはタブとか改行で区切るだけでも十分。
どうせ汚染チェックは必要なんだから、タブや改行はそこで取り除けばいいだけだし。

モジュールはセキュリティに気を配って書かれているのは良いけど無駄が多いからなぁ。
655nobodyさん:2005/07/03(日) 01:29:15 ID:???
データの区切りと言えば、前、レコードの区切りは改行、フィールドの
区切りはタブでデータを記録してた時、フィールド内をさらに区切りたくて、
そのときタブも改行も使えないから何を使えばよいか迷って、結局^fだか^gを
使ったんだけど、こういうときにどういう制御文字を使う(または使う順序)の
約束事みたいなのあるかなと思って調べてわからなかったんだけど、
なにかあります?
656nobodyさん:2005/07/03(日) 01:33:17 ID:???
データに含まれない文字
657nobodyさん:2005/07/03(日) 01:59:23 ID:???
\x00-\x07\x0E-\x1A\x1C-\x1F\x7F\xFF あたりとか。
658nobodyさん:2005/07/03(日) 02:49:19 ID:???
自分なりに調べてみても分からなかったので質問です。
ファイルオープンのとき、読み取りモードで開こうとしてファイルがなかった場合に、新しく生成させるために
&file_open(*FILEHANDLE,path)を定義してやってるんですが、

&file_open(FILE,$filepath);
flock(FILE,1);

とすると500Internal(以下略 が出てプロセスのタイムアウトとか言われます。
ファイルロックしているファイルにアクセスしようとしてるのかと思って調べてみましたがそうでもないみたいです。
なにか心当たりがあれば教えていただけませんか?
659nobodyさん:2005/07/03(日) 02:50:33 ID:???
訂正
5行目 ×&file_open(FILE,$filepath);
      ○&file_open(*FILE,$filepath);
660nobodyさん:2005/07/03(日) 03:51:27 ID:???
>>658
ここ参考
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/2
661658:2005/07/03(日) 04:39:10 ID:???
>>660
大変失礼しました。
もちろんローカルサーバでテストを行っていますが、「プロセス中にタイムアウトしました」としか
メッセージが出なかったもので、そのまま書いてしまいました。

3行ほどのテストプログラムを組んでコマンドプロンプトで実行させてみたところ、
いつまで待っても処理が終わらず、さらに問題と思われる行の前後で文字列を出力させてみたところ、
前ではうまく出力しますが後では出力しないため、問題がこの行にあるのは明白だと思われます。
&file_openのソースは以下のとおりです。

sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp");
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
662nobodyさん:2005/07/03(日) 07:52:34 ID:???
663658:2005/07/03(日) 14:25:42 ID:???
>>662
読ませて頂きましたが、使い方は私ので合っていると思います。
ただ、ファイルオープン後にflock関数が使えないという点について何か教えていただけませんでしょうか。
664nobodyさん:2005/07/03(日) 14:52:54 ID:???
>>663
>>662を読めバカ
665nobodyさん:2005/07/03(日) 15:55:28 ID:???
わざわざへんてこなサブルーチン作ってバグ呼び込むようなことしなくても
sysopenでO_CREAT使えば一発なわけだが。
666658:2005/07/03(日) 16:00:37 ID:???
ぜんぜんわかんないです・・・。。。
ファイルハンドルを局所化して使うと、サブルーチンの外ではflockは使えないのですか?
667nobodyさん:2005/07/03(日) 16:26:41 ID:???
>>666
試してみたがお前のプログラムは限定された状況でなら動くので、
問題は別のところにあると思われる。
% cat foo.pl
my $filepath = "foo";
&file_open(FILE,$filepath);
flock(FILE,1) or die "flock: $!";
sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp") or die "open NEW: $!";
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
(続く)
668nobodyさん:2005/07/03(日) 16:26:56 ID:???
(続き)
% strace perl foo.pl
(中略)
stat64("foo", 0x814d0c8) = -1 ENOENT (No such file or directory)
open("foo", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
close(3) = 0
open("foo", O_RDONLY|O_LARGEFILE) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
flock(3, LOCK_SH) = 0
close(3) = 0
exit_group(0) = ?

ファイルは開かれているしflockも正常終了している。
669nobodyさん:2005/07/03(日) 16:39:25 ID:???
ただし以下のような問題があるのできちんと勉強して書き直した方がいい。

file_openに渡している'FILE'はただの文字列なので、呼び元と
file_openが別パッケージのときにおかしくなるだろう。

open(NEW,..)の戻り値を見ていない。せめてdieぐらいしとけ。

-eで調べてなければファイルを作っているが、ここがアトミック
に実行されていないのでそのうちメチャクチャになるだろう。

最後の問題のおかしくなるシナリオの例はこんな感じだ。
(プロセスA) -eでファイル調べたらなかった
(プロセスB) -eでファイル調べたらなかった
(プロセスA) ファイル作ってflockしていろいろ書き込む
(プロセスB) open(NEW ">$fntemp")いきなりやるのでAが書き込んだファイルが空っぽに
670nobodyさん:2005/07/03(日) 16:41:33 ID:???
671658:2005/07/03(日) 17:01:45 ID:???
>>667-669
ありがとうございます!
視点を変えてもうすこしバグフィックスしてみますね。
最後の問題は、もう少し煮詰める必要がありそうですね。
open(NEW,"+>$fntemp");truncate・・・のほうがいいんでしょうか。

ともあれ、本件は本当にありでした。
まだ問題の解決になっていませんが、とりあえず問題がこのルーチン以外にあるということが分かったのでもう少し考えて見ます。
672nobodyさん:2005/07/04(月) 01:53:07 ID:???
>>655
データファイルとして保存する際、特殊な制御文字を使うのはあまりおすすめしない。
テキストエディタでメンテナンスする時のことを考えるとね。

スペースとかカンマとかで区切っちゃっていいんじゃないの?
checkboxやselectでスペースやカンマを使用しなければ済む話なんだから。
673nobodyさん:2005/07/04(月) 10:25:04 ID:???
他のシステムで読み書きする必要がなければ
Storableが楽だと思う。
674nobodyさん:2005/07/04(月) 10:44:04 ID:???
>>673
Data::Dumper の Dump()なら単なるテキストファイル
675nobodyさん:2005/07/04(月) 22:46:13 ID:???
script内に、ある package が取り込まれている、ってことをどう調べたらいいのかな?

# Hoge->new() があるかどうか、ってことは ↓ みたいにすればできるみたいなんだけど

use strict;
print defined Hoge; # これは error
print defined &Hoge::new ? 1 : 0; # 1
print defined Moge; # これも error
print defined &Moge::new ? 1 : 0; # 0

package Hoge;
sub new {}
676nobodyさん:2005/07/04(月) 23:59:48 ID:???
>>675
print exists $main::{"Hoge::"};
677nobodyさん:2005/07/05(火) 00:25:37 ID:???
うわ、できてる! すごっ
>>676 ありがとうー。

でも何で? どういう理屈?
リソースとかあったら教えてほしいわ。
678nobodyさん:2005/07/05(火) 01:00:15 ID:???
679nobodyさん:2005/07/05(火) 01:31:57 ID:???
・・・あ、あった(笑)
ありーー
680nobodyさん:2005/07/05(火) 04:53:09 ID:???
@arr = ([0, 1, 2], [3, 4, 5]); の状態で
@{ $arr[0] } とすると
$arr[0]にある無名配列の参照をデリファレンスしてリストとして見ている
という意味でしょうか?
681nobodyさん:2005/07/05(火) 05:01:50 ID:???
頼むから訊く前に試してくれ
682680:2005/07/05(火) 05:46:53 ID:???
試した後でした。失礼しました。
683nobodyさん:2005/07/06(水) 02:17:46 ID:???
はあ?
684nobodyさん:2005/07/06(水) 10:39:36 ID:???
なあ、そろそろageない?
685nobodyさん:2005/07/06(水) 11:33:27 ID:FWp4IWEU
質問です。よろしくお願いします。
aaaaのデータベースのレコードの情報6行分をハッシュbbbbに入れて、
その後ハッシュの配列?ccccに入れるプログラムを作りたいのですが、
期待する結果が出てくれず困っています。

test01の結果は、普通に6行分表示されるのでOKなのですが、
test02の結果は、6行目のレコードの情報が6回表示されてしまいます。
なぜ最後の6行目の情報だけが6回入ってしまうのでしょうか?よろしくお願いします。
686プログラム:2005/07/06(水) 11:34:05 ID:FWp4IWEU
※@$aaaaにはデータベースのレコード6行分が間違いなく入っています。
my @cccc;
my %bbbb;
foreach(@$aaaa){
$bbbb{'1111'} = $_->{'1111'};
$bbbb{'2222'} = $_->{'2222'};
$bbbb{'3333'} = $_->{'3333'};

#%bbbbのテスト表示(test01)
my $key;
foreach $key(keys(%bbbb)){
print "キー:".$key."\n<BR>";
print "値:".$bbbb{$key}."<BR><BR>\n";
}
push(@cccc,\%bbbb);
}
#$@ccccのテスト表示(test02)
my $key;
my $value;
my $j;
for($j=0;$j<@cccc;$j++){
while(($key,$value) = each(%{$cccc[$j]})){
print "キー = ".$key."<BR>\n";
print "値 = ".$value."<BR><BR>\n";
}
}
687nobodyさん:2005/07/06(水) 12:05:28 ID:???
%bbbbはループの度に上書きされてるよね。
pushしたリファレンスは全部同じ一つの%bbbbを参照してる。
中身は最後に上書きされた六行目。
688nobodyさん:2005/07/06(水) 17:26:34 ID:???
拡張子からサーバーに登録済みの MIME タイプを引きたいのですが
どうすればいいのか見当もつきません。
例えば '.jpg' から 'image/jpeg' を得たいということです。
インターネットサービスマネージャのコンピュータのプロパティの
コンピュータ MIME マップをクリックして出てくるリストです。

サーバーは Windows 2000 Server SP4 上の IIS 5.0 (.NET なし) で
Active Perl 5.8.4 Build 810 のようです。
何かいい方法があればご教授ください。どうぞよろしくお願いします。
689nobodyさん:2005/07/06(水) 20:03:07 ID:???
>>688
A. Win32::Registry で
HKEY_LOCAL_MACHINE\Software\CLASSES
に設定されている俺様 MIME type を読む。

B. Apache のソースを拾ってきて、
http://sunsite.tus.ac.jp/pub/apache/httpd/httpd-2.0.54-win32-src.zip
docs/conf/mime.types を使う。

C. http://www.iana.org/assignments/media-types/ から
適当にリストを自作する。

お好きな方法を。
690nobodyさん:2005/07/07(木) 16:59:03 ID:???
>>689
ありがとうございます。
しかしながら、いずれも私が欲しいリストとは異なるようです。

A は非常に近いものが得られますが、OS の MIME タイプと
IIS のマスタプロパティに設定された MIME タイプは違います。
IIS ではルート (仮想サーバー) 以下のフォルダにも追加できますが、
それはないようでした。

IIS の MIME タイプは %SystemRoot%\system32\inetsrv\MetaBase.bin
に保存されることはわかったんですが、中身の形式がわからないので
直接設定を読むことはあきらめ、ListBox から抜いたものを手作業で
ファイルにして使うことにします。
滅多に変更する人はいないので、実用上の問題はないと思います。
691nobodyさん:2005/07/07(木) 17:24:02 ID:???
ADSIオブジェクトのIIsMimeMapとかいうのがそれっぽいので

ttp://opensource.activestate.com/authors/tobyeverett/index.html

あたり参考にしてアクセスできないだろうか。
692nobodyさん:2005/07/07(木) 18:54:34 ID:???
>>691
興味深いですが、私のスキルではすぐに理解できません。
実はかなり初心者で、COM とか ActiveX 関係はさっぱりです。

とりあえず専用プログラムで ListBox のウィンドウから取り出してもらうと
いうことで落ち着きましたので、もう少し勉強してから考えてみます。
693nobodyさん:2005/07/08(金) 15:51:55 ID:8f5N4Odz
えーと、下記のようなプログラムを作ったとき、

$namae = "100";
$test = "test3.txt";

open(TEST,"<$test");

print "Content-type: text/html\n\n";

while(<TEST>) {

print;

}

test3.txtの中身

$namae

プログラムを動かしてみると、ブラウザに表示されるのは $namae っていう文字になってしまいます。
これを、 100 と表示させたいのですが、どうすればいいのでしょうか・・・
694nobodyさん:2005/07/08(金) 17:51:10 ID:???
>>693
eval

と言いたいところだが、 test3.txt の中身をいたずらされると怖いので、こんな感じで。

$namae = "100";
%data = ('namae' => $namae);
$test = "test3.txt";

open(TEST,"<$test");
print "Content-type: text/html\n\n";
while(<TEST>) {
s/\$(\w+)/$data{$1}/g;
print;
}
695693:2005/07/08(金) 21:16:45 ID:nSk2Gtk0
>>694
ありがとうございます。さっそく帰ったら試して見ます。
text3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
696693:2005/07/08(金) 21:16:59 ID:nSk2Gtk0
>>694
ありがとうございます。さっそく帰ったら試して見ます。
test3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
697nobodyさん:2005/07/09(土) 00:00:25 ID:???
>>695
そうそう、こんな感じで。
$omae = "200";
%data = ('namae' => $namae, 'omae' => $omae);
# あとは同じ
698693:2005/07/09(土) 02:20:01 ID:Kb/ss4Wf
>>697
ありがとうございます!
無事に動きました。
あとは、これを理解して、自分の物にします。

どうもありがとうございました。
699nobodyさん:2005/07/09(土) 02:24:20 ID:???
<どうでもいいこと>左辺値のクォート要らない</どうでもいいこと>
700nobodyさん:2005/07/09(土) 08:01:17 ID:???
>>699
<どうでもいこと>クォートがいらないのは"=>演算子の"左辺値が"英数字のみで構成されているとき"のみ</どうでもいいこと>
701nobodyさん:2005/07/09(土) 09:26:13 ID:???
# s/(英数字のみ)/アンダーバーと$1かハイフンから始まるアンダーバーと$1/;
702nobodyさん:2005/07/09(土) 09:28:58 ID:???
use encoding
703nobodyさん:2005/07/09(土) 12:41:54 ID:???
まじレスすると=>の左辺値を文字列として解釈してくれるパターンこうなんだけどね。

/^-?[a-zA-Z_]+\w*$/

数字で始まったり、先頭のマイナスの直後が数字だったりすると数値として解釈される。
さらにその後がアルファベットだったりすると構文エラーになる。

ハッシュの要素参照の{}も同じだね。

構文エラーになる分には気が付くからいいけど、01=>'a'とか、0_2=>'b'とか、-03=>'c'とかするとはまるよ。
704nobodyさん:2005/07/09(土) 12:47:09 ID:???
>>703
正規表現の+はいらなかったね。
705502:2005/07/10(日) 09:22:13 ID:???
ハッシュのキー、変数から取り込むときは、日本語でもクオートで
囲まないでもできますけど、自動でクオートしてくれてるってこと?
while(<>){
$hash{(split[0])} = (split)[1];
...
なんて。
706nobodyさん:2005/07/10(日) 10:40:24 ID:???
>>502
クォートされてないから変数の値がつかわれるんだRO。
707502:2005/07/10(日) 17:54:56 ID:???
>>706
そうですね。よく考えてみると疑問に思うほどのことはなかったか。
708nobodyさん:2005/07/10(日) 20:48:08 ID:???
ん・・・
709nobodyさん:2005/07/12(火) 03:23:02 ID:???
>>699
よくこのツッコミ見かけるのだが、クォートすると何か不具合でも起こるの?
710nobodyさん:2005/07/12(火) 06:26:14 ID:???
まったく問題ない。
711nobodyさん:2005/07/12(火) 06:56:22 ID:???
むしろクォートして欲しい
712nobodyさん:2005/07/12(火) 07:31:37 ID:???
だが拒否する
713nobodyさん:2005/07/12(火) 10:05:30 ID:???
宗教論にしかならないから(Perlゆえことさら)もうやめとけ。
714nobodyさん:2005/07/12(火) 12:04:24 ID:???
なんでだよ。コーディングスタイル上の重要なポイントにかんする議論だろ。
715nobodyさん:2005/07/12(火) 12:59:07 ID:???
TMTOWTDI
716nobodyさん:2005/07/12(火) 13:30:25 ID:???
荒らしたいだけの奴がいますな。
スルーが吉。

一人二役以上で自演して荒れてるように見せるかもしれないけど、
全部スルーするのが吉。
717nobodyさん:2005/07/14(木) 11:35:37 ID:0L4aMOkE
ttp://sound.jp/orgasm_panic/download.html

↑のMobileMiniBlog Ver1.0というのを使いたいんですが、
必要最低限の設定をしてからローカルでテストしてみても、表示結果が

</TR>
</TR>
</TR>
</TR>
</TR>

というものになってしまいます。
初期設定のままでも同じです。
サンプルでは
ttp://moritomo.k2.xrea.com/cgi/diary.cgi
のようなものになるらしいんですが…。

どこをいじればいいのか教えていただけないでしょうか?
よろしくお願いいたします。

※分からないことがあったら問い合わせるようにとスクリプトの中にメールアドレスが
書いてありますが、この作者はなんかエロいので怖くて問い合わせできません…。
718nobodyさん:2005/07/14(木) 12:24:32 ID:???
>>717
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
719717:2005/07/14(木) 12:35:19 ID:???
>>718
すいません行ってきます。
720nobodyさん:2005/07/15(金) 08:49:12 ID:cv7TvBaQ
歴史上一度も質問されたことのないコーディングについての普通のレベルの質問って何かありますか?
721nobodyさん:2005/07/15(金) 10:38:50 ID:???
perl勉強中のものです。
簡単なシュミレータを作ってCGIとして公開したいと思っているのですが
一時間に一回程度のペースでクライアントのアクセスのあるなしにかかわらず
perlで更新させるにはどう書けばよいでしょうか
どなたか詳しい方ご教授お願いします。
722nobodyさん:2005/07/15(金) 10:44:22 ID:???
>>721
とりあえずクローンタブとか調べた方が良いと思われ
723nobodyさん:2005/07/15(金) 13:24:06 ID:???
配列に収められたハッシュリファレンスの特定キーの値で重複を削除したいのですが、
どーすりゃいいですか。
724nobodyさん:2005/07/15(金) 13:45:26 ID:???
>>723
詳しく!
725723:2005/07/15(金) 14:25:42 ID:???
$hoge={ url=>'http〜', title=>'うんたら', time=>11212161, };
みたいなのが詰まっている配列mogeがありまして、
urlの値でいくつか重複がある(のを区別できる)ようなので、
それ含む$moge[m]を削除したいのです。
(つまり $moge[n]{url} と $moge[m]{url} が同じときに $moge[m]を削除したい)
grepを使うんでしょうが、右辺をどうやればいいのかわからないのです。
726nobodyさん:2005/07/15(金) 14:50:58 ID:???
>>725
@in_array = (
{url=>'http://hoge.hoge1/',title=>'うんたら1',time=>1111111}, #<--重複
{url=>'http://hoge.hoge2/',title=>'うんたら2',time=>1111122},
{url=>'http://hoge.hoge1/',title=>'うんたら4',time=>1112222}, #<--重複
{url=>'http://hoge.hoge3/',title=>'うんたら3',time=>1112332},
);

#順番が入れ代わってもいい場合かつ後入優先
$tmp_hash{$_->{url}} = $_ for @in_array;
@out_array = values %tmp_hash;

#順番が入れ代わってもいい場合かつ先入優先
$tmp_hash{$_->{url}} = $_ for reverse @in_array;
@out_array = values %tmp_hash;

#順番を入れかえない場合後入優先
$tmp_hash{$_->{url}} = [$_,$i++] for @in_array;
@out_array = map{$_->[0]} sort {$a->[1] cmp $b->[1]} values %tmp_hash;

#順番を入れかえない場合先入優先
$tmp_hash{$_->{url}} = [$_,$i++] for reverse @in_array;
@out_array = map{$_->[0]} sort {$b->[1] cmp $a->[1]} values %tmp_hash;
727nobodyさん:2005/07/15(金) 14:52:11 ID:???
728nobodyさん:2005/07/15(金) 15:02:43 ID:???
自分>>726だけど、>>727がクールだね。
729723:2005/07/15(金) 15:24:57 ID:???
>>725-726
おおお、ありがとう!
つまりurlの値をキー名にしたハッシュを作って、値のリストを得るのか!
726のほうは725のをコンパクトにしたものと見ていいのかな。
++のところで何が起きているのかよくわかりませんが。
730nobodyさん:2005/07/15(金) 18:16:16 ID:???
>>729
1回でも出てきたら値が1以上なので真になる。
!がついてるので2回目以降は偽。
731nobodyさん:2005/07/15(金) 22:00:00 ID:???
クールっつーか、イディオムだろ。
>>7のPerlメモくらい読めよ。
732nobodyさん:2005/07/17(日) 09:29:37 ID:???
次のような場合、本当は、100を表示させたいのですが10が表示されてしまいます。
testサブルーチンでmyを付け忘れているのですがエラーも警告もでません。
これを回避するためにはどうのような記述をしたらいいのでしょう?

use warnings;
use strict;

my $x = 100;

test();

print "Content-Type: text/html\n\n";
print $x;

sub test{
$x = 10;
}
733nobodyさん:2005/07/17(日) 11:00:09 ID:???
>>732
レキシカルスコープの有効範囲についてよく勉強することを
薦めるが、この場合最初のmy $xの有効範囲はファイルの終わり
までになるので、testサブルーチンの中からも見えてしまう。

回避するための記述の仕方はいろいろあるんじゃないかと思う
が、オレはmainサブルーチンを作ることにしてるな。これなら
testサブルーチンでエラーになるはず。

use warnings;
use strict;

main();
exit;

sub main {
my $x = 100;

test();

print "Content-Type: text/html\n\n";
print $x;
}

sub test{
$x = 10;
}
734nobodyさん:2005/07/17(日) 11:05:17 ID:???
自分は一番上に my 書くと、サブルーチン内ではクロージャみたいに扱われる、って解釈してる。

>>733
わざわざサブルーチン作らんでも。

use warnings;
use strict;
{
    my $x = 100;
    test();
    print "Content-Type: text/html\n\n";
    print $x;
}
sub test{
    $x = 10;
}

で逝ける。
735nobodyさん:2005/07/17(日) 12:07:38 ID:???
>>733 >>734
なるほど、サブルーチンにしろブロックにしろ
メインルーチンをブロックに押し込めて
メインルーチンとサブルーチンのスコープを外すわけですね。

一瞬、ブロックを外れたmyは、use strictの場合
警告だしてもいいんじゃないのかなとか思ったんですが
>>733-734のような書き方をすれば
1つのソースファイル内のみで定義されているサブルーチン間で
共通の変数を使いたいときにブロックの外でmyを使えば
ourみたいに他のソースファイルに影響を与えないわけですね。
てかPerl、奥深すぎ。

わかりました、ありがとうございました。
736nobodyさん:2005/07/17(日) 13:33:31 ID:???
簡単なデータベースをperlで書こうと思っているのですが
生産地、商品、価格のカテゴリーがあるとして
○生産地フォルダ→商品ファイル→価格
という方式と
○生産地ファイル→商品リスト→価格
という方式と
○生産地リスト→商品+タグ+価格でデータ取得時にタグを取るプログラムを書く方式
の3つの方法があるとしてどれくらい負荷が違うものなのですか?
私がやりたいのはもう少しだけ複雑なデータなので大差が無いならわかりやすい一番上の方式をとりたいです。
ご教授よろしくお願いします。
737nobodyさん:2005/07/17(日) 14:51:25 ID:???
>>735
> ourみたいに他のソースファイルに影響を
our は影響与えちゃうよw
738nobodyさん:2005/07/17(日) 17:43:20 ID:???
Warning: Use of "our みたいに" is ambiguous at >>735 line 10.
739nobodyさん:2005/07/17(日) 22:31:36 ID:???
ourは他のファイルには影響しないよ。
varsと違って、チェック機構そのものはレキシカルスコープをもつから。
740nobodyさん:2005/07/18(月) 14:44:31 ID:???
そういや、ハッシュのキーでさ、お作法として、
アンダースコアから始まるのはプライベート、とかあるけど、
ハイフンから始まるのは何か意味ってあるの?
741nobodyさん:2005/07/18(月) 21:50:58 ID:???
>740
名前付きパラメータの場合によく見かけるな。↓なんかそうだ。
ttp://search.cpan.org/~snowhare/Class-NamedParms-1.04/lib/Class/NamedParms.pm
慣習としてどっかに書いてあるのかは知らない。
742nobodyさん:2005/07/20(水) 09:58:16 ID:???
HTMLへ記述した次のリンクがうまく動作しないのです。
<a href="$script?mode=help&no=$no>ほげ</a>
$scriptはスクリプトURLが入ります。→OK
mode=helpはhelpモードへ入ります。→OK
しかし&以下、no=$noがうまく動作しません。
$noは任意の数字が入ります。そして、それを・・・
print "<form method='$method' action='$script' name=help_form>";
print "<input type=hidden name=no value='$in{'no'}'>";
この$in{'no'}'へ入れたいのですが、動かしてみるとvalue=''になってしまい
数値が入力されません。
どうすれば動作するようになるでしょうか・
#リンクの書き方??
743nobodyさん:2005/07/20(水) 10:13:24 ID:???
シングルクォート
ダブルクォート
744nobodyさん:2005/07/20(水) 11:00:01 ID:???
>>742
2行目をコピペして以下のように$in{'no'}に
値を入れて実行すると

$in{'no'} = 100;
print "<input type=hidden name=no value='$in{'no'}'>";

結果は

<input type=hidden name=no value='100'>

となって正常に見えるので、間違ってるのはここではないな。
$in{'no'}に値はちゃんと入ってるか?
745nobodyさん:2005/07/20(水) 11:05:58 ID:???
value=''ってことは$in{'no'}が空ってことだろ
なぜ空なのかはエスパーじゃないからわからない
746nobodyさん:2005/07/20(水) 21:03:22 ID:???
>>742
<a href="$script?mode=help\&no=$no">ほげ</a>
にしてみては?

下の文は no=$no が機能してないから空なんじゃないの?
747746:2005/07/20(水) 21:04:09 ID:???
失礼、実態参照されてしまった。
<a href="$script?mode=help\&amp;no=$no">ほげ</a>
748742:2005/07/20(水) 22:26:23 ID:???
>>743
シングルクオートをダブルクオートにしても、クオートなしにしても、
リンクのno=$noが入ってこない。valueが空なのです。
>>746
試してみます。
749nobodyさん:2005/07/20(水) 22:30:25 ID:8r7NrGN/
CGIのBBSを作っています。
print で <img> を書くと Internal Server Errorになる気がします。
何か対処方法はありますか?
750nobodyさん:2005/07/20(水) 22:31:43 ID:???
あきらめる
751742:2005/07/20(水) 22:31:58 ID:???
>>746
アンカータグの中の$noは、スクリプトの中から取得した数字で
そこはちゃんと数字が入っています。
だから本当は、このスクリプトを動かすと、
<a href="〜cgi?mode=help&1">クリックすべし</a>
という形になります。で、&以下の1の部分が、リンクタグをクリックした
先のフォームの中の
print "<input type=hidden name=no value='$in{'no'}'>";
ここに入る・・・予定だったのに入らない。
フォームボタンなんかだったら$FORM{'no'}とするところですが
752742:2005/07/20(水) 22:33:10 ID:???
>>749
それは気のせいです。別のどこかを間違ってます。
753742:2005/07/20(水) 22:36:12 ID:???
連続投稿で申し訳ない。
>>746
ダメでした・・・
もう一回スクリプト眺めてみます。
754nobodyさん:2005/07/20(水) 22:52:11 ID:???
おまいの言ってる%inと%FORMの違いは何よ
755742:2005/07/20(水) 22:54:20 ID:???
>>754
正直、よくわかりません(^^;
<form〜>を使ってれば$FORM〜になるという理解。
#それでも$inになってることもあるので自信は0%。
756742:2005/07/20(水) 22:58:28 ID:???
$FORM{'no'}にしたところ動作しました。
・・・なんでだろう。
ぐぐりの旅へイッテキマス。
さんきゅーでした>ALL
757749:2005/07/20(水) 23:07:02 ID:???
気のせいでした。全角スペースとか@とかでした。
758nobodyさん:2005/07/20(水) 23:07:39 ID:???
君は get と post の違いから勉強するべきだ。
759758:2005/07/20(水) 23:08:25 ID:???
>>756
760nobodyさん:2005/07/20(水) 23:45:25 ID:???
>>742 てーか perl は PHPみたいに勝手に %FORM とか %in とかに値が設定されたりしないから。
761nobodyさん:2005/07/21(木) 06:13:37 ID:???
すげぇがっくりきた…。
762nobodyさん:2005/07/21(木) 10:15:20 ID:???
ほぼ丸一日かけてそんなオチか・・・。
763nobodyさん:2005/07/21(木) 19:16:23 ID:00deyUp9
perlを覚えたくてこのスレに来ました。
初心者向けのperlの本を買って、カウンタや掲示板が作れる事は分かったのですが、そういう類のものは別に作りたくありません。
というか、perlを覚えるとどんな便利な事があるのか
本を読んでもいまいちピンときません。でも覚えたいです。
皆さんは「あぁ、perlを覚えてよかったな〜」と思ったのはどんな時ですか?
また、最も簡単にその気分を味わう方法があったら教えてください。
764nobodyさん:2005/07/21(木) 20:05:00 ID:???
昔っから夏になると掲示板でアンケート取りたがるのが出るんだよな。
765nobodyさん:2005/07/21(木) 20:10:56 ID:???
⊂二二二( ^ω^)二⊃ブーン
766nobodyさん:2005/07/21(木) 20:11:24 ID:???
>>763
質問には答えないが、「初めてのPerl」を勧める。
767nobodyさん:2005/07/22(金) 09:52:47 ID:???
>>763
Perl は手段の一つであり、目的がないのに覚えても無駄。
768nobodyさん:2005/07/22(金) 12:55:10 ID:Nv8MLct4
指定時間に起動するCGIを作成したいのですが、
どのように作れば良いかご存知でしょうか

『1時間に一度データを集計し、その結果によってデータベースを作成。
 その結果をあらかじめ登録してあったメールアドレスに転送する』
というものを作成したいのです。

メールアドレスへの転送や、集計などは出来ているので
『1時間に1度CGIを起動する方法』を教えてください。
よろしくお願いします
769nobodyさん:2005/07/22(金) 13:29:40 ID:???
1時間ごとにそのCGIにアクセスするスクリプトを書いて、
タスクスケジューラなりcronなりに登録する。以上。
770nobodyさん:2005/07/22(金) 15:09:15 ID:???
寝ろ!どっとしーじーあい

#パールのパス
無限ループ{
&ここで集計してメール;
寝る(参千六百秒);
}

テストするには
ぱーる 寝ろ!どっとしーじーあい & で起動。
771nobodyさん:2005/07/22(金) 15:40:28 ID:???
なんで CGI でやらなあかんのやろ?
772nobodyさん:2005/07/22(金) 21:21:31 ID:zirnRNb/
超アホな質問でごめんなさい。
BBSを晒しまくるアホがいるので、ダミーのCGIを置きたいのです。
で、その内容なのですが、

#!/usr/bin/perl

print <<"_HTML_";

   HTMLの案内文章

_HTML_

と、たったこれだけです。
サーバーにアップするとエラーになります。
パーミッションは755にしました。
ちゃんとアスキーモードで転送しています。

コードがおかしいのでしょうか?すみませんが助力お願いします。
773nobodyさん:2005/07/22(金) 21:28:52 ID:???
>>772
>>1
> 3: こんなエラーが出て上手く行かなかった。

http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
774nobodyさん:2005/07/22(金) 21:32:38 ID:???
現在、下記のように全角ひらがな、カタカナを許容しているのですが(このソース自体
怪しいかもしれませんが)、これに「全角、半角スペース」を追加する場合、「|$nobashi」
のあとに「|$space」といったものを追加すれば問題ございませんでしょうか。
また、スペースのコードを教えていただけますと幸いです。


$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;

$hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん
$katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ
$kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない)
$nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜

if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
775nobodyさん:2005/07/22(金) 21:33:22 ID:???
>772
ヒント。
えーとね、ブラウザに表示する内容はそれだけなんだけど、
その前にまずその内容が「どういったものか」をブラウザに伝える必要があるのだよ。
776nobodyさん:2005/07/22(金) 21:41:20 ID:zirnRNb/
>>773
指摘ありがとうございます。
URL、よく読んでみます。

>>775さん
ヒントありがとうございます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
とかじゃ……ないですよね?
他のスクリプトがどうやっているかよく見てみます。
777nobodyさん:2005/07/22(金) 21:42:19 ID:???
パールなんかやめとけ、
pHPがずっといいぞ。
二日で理解できた。
778775:2005/07/22(金) 21:53:12 ID:???
>776
><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
>とかじゃ……ないですよね?
じゃないっす。

> 他のスクリプトがどうやっているかよく見てみます。
うむ、これは非常にいい心がけだ。
いくつかのスクリプトでhtml出力(とくに最初のヘッダあたり)をしてる部分を
眺めてみれば、すぐ見当がつくと思うぞ。ガンバレ。
779nobodyさん:2005/07/22(金) 21:55:12 ID:???
PHPならヘッダも自動で出してくれるから>>772みたいに悩まずにすむ
780772:2005/07/22(金) 22:02:16 ID:???
判明しました!
print "Content-type: text/html\n";
これですね!

>>778
さらなるアドバイスありがとうございました。
本当に助かりました。
781nobodyさん:2005/07/22(金) 23:57:16 ID:???
>>780
\nが一個足らん。
782nobodyさん:2005/07/23(土) 00:06:44 ID:???
772がちょっとかわいい。
783nobodyさん:2005/07/23(土) 00:08:31 ID:???
にげr(ry
784nobodyさん:2005/07/23(土) 11:31:34 ID:???
テキストファイルの任意の行を取り出すのはどうすればよいですか?
785nobodyさん:2005/07/23(土) 12:54:43 ID:???
>>784
#!/usr/local/bin/perl -w
# usage: perl script file line_num
use strict;
my($file, $target) = @ARGV;
-f $file || die "No such file: $file";
open FILE, '<' . $file or die $!;
my $line;
do { $line = <FILE> } until $. == $target;
close FILE;
print $line;
__END__
786nobodyさん:2005/07/23(土) 18:26:12 ID:???
HTML文書を書くプログラムを作っていてサブルーチンで表を書かせようとしたのですが、
$table = '<table>'を読み込んでくれず、空白になっています。
$table = '< table>'なら読み込んでくれるしまた別の箇所なら$table='<table>'を読み込んでくれます。
print "Content-type: text/html\n\n";も最初に記述しています。
タグを消すようなサブルーチンも入れておらず頭を抱えています。
原因が分かず、変な質問文ですが考えられる原因はどういったものがあるでしょうか?
787nobodyさん:2005/07/23(土) 18:27:32 ID:???
$table = '<table>';
$table = ''<tr><td>めいーん</td></tr></table>';
↑上書きしている
788nobodyさん:2005/07/23(土) 18:36:08 ID:???
>>787さん
sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
の結果が< table>のみなんです。
789nobodyさん:2005/07/23(土) 18:42:54 ID:???
>>788
そうか?うちでは、
$ perl
sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
&table();
<table>< table>
だけどな。
790nobodyさん:2005/07/23(土) 18:48:31 ID:???
>>789さん
上のサブルーチンだけを別のファイルに移して書くと結果はそうなるのですが
そのファイルを今書いてるやつで書くとそうなるので訳が分からないのです・・・
タグを消すプログラムなんて入れてないし別のファイルを参照もしてないのですが・・・
791nobodyさん:2005/07/23(土) 18:57:01 ID:???
<table>はブラウザ表記されない、ということでperlとしては出力してます。
説明足らなくてすみません。
792nobodyさん:2005/07/23(土) 19:11:32 ID:???
>>791
何かとんでもない勘違いをしている希ガス。
思ったとおりに動かないように、最低限までコード削って晒せ。
793nobodyさん:2005/07/23(土) 19:47:25 ID:???
>>792
自己解決しました。原因は#の消し忘れです。
つまらないミスでお騒がせして済みませんでした。
794nobodyさん:2005/07/23(土) 20:12:58 ID:???
頭の悪い人が大量発生するスレでつね。
795nobodyさん:2005/07/23(土) 20:21:46 ID:???
でもまあ、グローバル変数を多様すると、ポインタが衝突するのか知らないけど、変なことが起きた経験はあるよ。
とりあえず use strict; と perl -w しておけ、って感じ。
796nobodyさん:2005/07/23(土) 23:11:05 ID:???
>>795
おいこれ大問題じゃねーか perl は糞だな
よくこんな糞実装使ってられるなバカじゃねーのか
797nobodyさん:2005/07/23(土) 23:17:28 ID:???
はい、バカです。だから、使う。
798nobodyさん:2005/07/24(日) 00:37:08 ID:???
変数の名前の付け方をちゃんと考えてやっておけばいいだけのこと
799nobodyさん:2005/07/24(日) 06:19:52 ID:???
RSSをHTMLで出力したくて とりあえずこのサンプルをcgiにして実行してみた。

ttp://allabout.co.jp/career/cgiperl/closeup/CU20050131A/index4.htm

500エラーがでますた。
鯖はxrea パ−ミッションは755

どのへんが問題でしょうか?
800nobodyさん:2005/07/24(日) 07:27:11 ID:???
何も検証できないスキルのくせに、でしゃばって rss なんか使おうとしている点が問題。
801nobodyさん:2005/07/24(日) 07:51:29 ID:???
>>799
xreaのパーミッション・・・
802801:2005/07/24(日) 08:48:27 ID:???
スマソ いまやってみたらxrea755でも動くな。
モジュールも入ってるし。
恐らくdataディレクトリとか作ってないんだろ。
803nobodyさん:2005/07/24(日) 08:51:23 ID:???
馬鹿は放っておけって。
804nobodyさん:2005/07/24(日) 12:28:38 ID:???
ログみれよ
805nobodyさん:2005/07/24(日) 18:07:55 ID:???
.htaccessで
AddType cgi-script-debug .cgi
これでデバッグモード
スペルは違う鴨
806799:2005/07/24(日) 19:04:15 ID:???
チェックしたところこのような文がでました

Can't locate XML/RSS.pm in @INC (@INC contains: ./mylib /usr/lib/perl5/5.00503/i686-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i686-linux /usr/lib/perl5/site_perl/5.005 .) at tmp.pl line 6.
BEGIN failed--compilation aborted at tmp.pl line 6.

dataディレクトリは作ってあります

モジュールがないってことなんでしょうか?
でもxreaではインストールしてあるみたいですが。

807nobodyさん:2005/07/24(日) 20:16:20 ID:???
うんこ
808nobodyさん:2005/07/24(日) 21:14:47 ID:???
>xreaではインストールしてあるみたいですが。
この根拠は?
809nobodyさん:2005/07/24(日) 21:24:43 ID:???
810nobodyさん:2005/07/24(日) 21:42:23 ID:???
>>809
799 の使っているサーバは s151 なのか? s151 には Perl 5.8.7 が
入っている筈だが、何故 @INC には 5.005 のディレクトリしか無いんだ?
http://www.s151.xrea.com/server_info.cgi

XML::RSS は Pure Perl な一ファイルのモジュールなんだから、
無ければ自分のスペースに置いて use lib すればよかろうに。
http://search.cpan.org/~kellan/XML-RSS-1.05/

スレ違いな話題なんでこれ以上続けたいなら下のスレへでも行ってくれ。

CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
811nobodyさん:2005/07/24(日) 21:56:39 ID:???
わかりましたやってみます。サンクスコ
812nobodyさん:2005/07/24(日) 22:08:41 ID:???
おまえらやさしいな
813nobodyさん:2005/07/25(月) 03:20:51 ID:???
>>800 書いたオレは勝ち組。
814nobodyさん:2005/07/25(月) 03:28:32 ID:???
http://pc8.2ch.net/test/read.cgi/php/1078216600/317-
ここの 318 書いた俺の方が勝ち組
815nobodyさん:2005/07/25(月) 15:03:30 ID:???
use strictで書いています。

local ($hogehoge , %hoge2);
というふうに、local宣言をしても、有効範囲の宣言がされていないぞ
(゚Д゚)ゴルァと言われてしまうのですが、localを使うにはstrictをあきらめ
なければいけないのでしょうか?

尚、my ($hogehoge ,%hoge2);だとうまくいきます。
816nobodyさん:2005/07/25(月) 15:22:26 ID:???
localとmyの違いはわかってんのか?
817nobodyさん:2005/07/25(月) 15:28:18 ID:???
818nobodyさん:2005/07/26(火) 01:51:12 ID:???
ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが
持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする
デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを
組み合わせるような方法がベターなのでしょうか。
mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは
限らないので無理そうです。
listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり
する事は出来ますか?
819nobodyさん:2005/07/26(火) 01:54:16 ID:???
ヒント:セッション管理
820nobodyさん:2005/07/26(火) 03:48:28 ID:???
J-PHONE時代の端末等、Basic認証に対応していないものを
なんとか通過させたく、用意したフォームからフォームから
Basic認証情報を入力させて、環境変数のAUTH_USER、
AUTH_PASSWORDを強制的にセットさせるようなスクリプトを
考えております。

環境変数をCGI側で設定してBasic認証領域内にアクセスさせる
ような仕組みは可能でしょうか。
もしも可能であれば、ご教示いただきたく思っております。

まとまりのない文章ですみません。
821nobodyさん:2005/07/26(火) 16:42:49 ID:EJMHsz5R
@array = (0..9);
$hara =1;
while ( 1 ){
for ( $i = 1; $i <= 3; $i++ ) {
$index0= rand @array;
$index1= rand @array;
$index2= rand @array;
my $tmp0=$array[$index0];
my $tmp1=$array[$index1];
my $tmp2=$array[$index2];
$shibi0 = $tmp0;
$shibi1 = $tmp1;
$shibi2 = $tmp2;
}
if( $shibi0 != $shibi1 && $shibi0 != $shibi2 && $shibi1 != $shibi2 &&
$hara != $shibi0 && $hara != $shibi1 && $hara != $shibi2
){last;}
}

0〜9の中から3つの数字をランダムで選びだし、
重複せず、かつ$haraに代入されている数字とは異なる物が3つ揃った時に
ループを抜けるというスクリプトです。
これで動作はするのですが、あまりにも原始的というか
もう少しスマートなやり方だと、どういう風に組めるでしょうか?
自分の頭だとこれでいっぱいいっぱいでした。
822nobodyさん:2005/07/26(火) 17:06:05 ID:???
>>821
過去ログで似たのでてきた気がする。 どこだかは知らないけど。

まあ、取得した値の要素を、一度配列から抜くとか、ハッシュでフラグたてたりしたら、絶対重複しないと思うけど?
>>821 の $shibi0-2 を出したいだけじゃなかったら意味ないけど、例えば

my @array = (0 .. 9);
my @shibi = ();
my %flag = ( 1 => 1 ); # >>821 の $hara の "1"
for (my $i = 0; $i < 3; $i++) {
    my $tmp = $array[ rand @array ];
    redo if (exists $flag{$tmp});
    $flag{$tmp} = 1;
    push (@shibi, $tmp);
}
print @shibi;
823nobodyさん:2005/07/26(火) 17:17:17 ID:???
>821
標準モジュールのList::Util使ってこういうのも。

use List::Util 'shuffle';
@array = (0..9);
$hara = 1;
($shibi1, $shibi2, $shibi3) = splice @{[shuffle grep { $_ != $hara } @array]}, 0, 3;
824821:2005/07/26(火) 17:18:07 ID:???
補足なんですが、上のスクリプト、このセットを×5繰り返します
@array( 0..50 )とあるとしたら
0〜10、11〜20、21〜40、41〜45、46〜50それぞれ5セットで上のスクリプトを繰り返して
セット1からは$shibi0〜$shibi2、セット2は$shibi3〜$shibi5のそれぞれ3コ
セット3から$shibi6〜$shibi9の4コ、セット4と5は$shibi10、$shibi11の1つずつ
セットごとに、合計12コの変数を・・・これもforで繰り返させる方法があるんでしょうか?
825nobodyさん:2005/07/26(火) 18:20:53 ID:???
あるよ。
つーか何が"補足"だよ。"付け足し"じゃねーか。

>>822>>823 使って、考えればできるだろ。
付け足すなら考えて試してから書けよな。

まあ、答えるなら、そのセットと繰り返しを関連付ければいいだけ。

>>822 で言えば、
@hoge = (
{ array=>[0..10], times=>3 },
・・・
[ array=>[46..50], times=>1 ],
);
とかやって、
for (my $h = 0; $h < @hoge; $h++) {
    my $set = $hoge[$h];
    # ここから >>822 のソースを参考
    my @array = @{ $set->{array} };
    # 中略
    for (my $i = 0; $i < $set->{times}; $i++) {
    # 以下略
って置き換えたりするだけだべ。
細かいところはもう知らん。
826nobodyさん:2005/07/26(火) 19:07:57 ID:???
まさか宿題じゃないだろうな・・
827nobodyさん:2005/07/26(火) 20:37:18 ID:W0GVg4kD
掲示板の本文中のURL表記の処理について質問です

$value とした本文中のURL表記を正規表現で拾って自動リンクさせているのですが

1.この中に自分のサーバ(プロバイダ)内のURLはそのままHTMLタグでリンク、
2.外部のURLは一旦別のcgiに「別のcgi?x=URL」として送るHTMLタグにしたい
3.さらに、「=」がある場合は別変換してから「別のcgi?x=URL」とする必要があると気づきました

これまで、1.2.まではifで分けてやっていたのですが、複数のURLがあると
当然ですが一緒の条件内に組み込まれてしまいます

$value~s//g ; を複数並べることで正規表現でできるでしょうか?

本文$valueを分割して一度配列に入れ、1行ずつ処理させる方法しかないとすれば、
URLがあるごとにsplitするにはどうしたらよいでしょうか?
828nobodyさん:2005/07/26(火) 22:24:08 ID:???
>>827
言いたいことがよくわからんのだが。
具体例を挙げれ。
829nobodyさん:2005/07/27(水) 01:21:21 ID:???
よくあるこういうのです
投稿記事中にURLがあった場合にhtmlのリンクタグを書きます

$value =~ s/(http\:[\w\.\~\-\/\?\+\=\:\@\%\;\#;\&\d]+)/<a href=$1 target=_blank>$1<\/a\>/g;
$value =~ s/(http\:[\w\.\~\-\/\?\+\=\:\@\%\;\#;\&\d]+)/<a href=..\/tx.cgi\?tx=$1 target=_blank>$1<\/a>/g;

2行目の転送でURL中に「=」があると、tx.cgiで誤動作がでるので
さらに「=」→「hidarimigi」などに変換して転送しなければならなかったのです

今回は改行の<br>で区切り、配列に入れ、
@NewValue = split(/<br>/,$value);
一行ずつ取り出して、If分岐して3つ以上の分類作業しました
しかし、一行に2つ違うURLがあると同じタグ表記をしてしまいます

なんとか自己解決はしましたが、
今後のため、もしか、もう少しクールな方法があったらお知らせください
830nobodyさん:2005/07/27(水) 01:24:03 ID:???
言い忘れました、分ける理由はreferer対策です
831nobodyさん:2005/07/27(水) 01:38:24 ID:???
どういう入力があって、
それをどういう形で出力したいのか
がイマイチわからない
832nobodyさん:2005/07/27(水) 01:52:15 ID:???
urlエスケープしろよ
833nobodyさん:2005/07/27(水) 02:29:27 ID:???
hidarimigi...
834821:2005/07/27(水) 08:41:51 ID:???
>824はリロードせずに書き込んでしまいました
鯖重くて昨日は見れなかったので、これから試してみます
レスありがとうございました。

>826
違いますよ
835nobodyさん:2005/07/27(水) 13:04:59 ID:???
まさか href="$1" とすればいいだけなんじゃ…。

だとしたらアホすぎる…。
836nobodyさん:2005/07/27(水) 13:16:24 ID:???
>>829
エスケープしすぎマロスwww

> 一行に2つ違うURLがあると同じタグ表記をしてしまいます
これの意味がよくわからんが、最短一致が抜けてるとかそういう問題かな?
837nobodyさん:2005/07/27(水) 16:31:30 ID:???
>>829
$value = "http://pc8.2ch.net/test/read.cgi?bbs=php&key=1116970588&st=829&to=829&nofirst=true";
$value =~ s!(s?https?://[-_.\!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)!'<a href="'.($1=~m|^http://mydomain.+$|?'':'../tx.cgi?').$&.'" target="_blank">'!eg;
print $value;

・要するに eg オプションつけて s/(略)/make_anchor_tag($1)/eg; のようにサブルーチン呼び出してその中でif文使えばURL1個ごとの振り分けができる。
・tx.cgi?http://... のようにすれば $ENV{'QUERY_STRING'} から読み出すだけなので楽。
838837:2005/07/27(水) 16:39:37 ID:???
$と@修正と[_a-zA-Z0-9]省略
[-_.\!~*'()a-zA-Z0-9;/?:@&=+$,%#]
 ↓
[-.\!~*'()\w;/?:\@&=+\$,%#]
839nobodyさん:2005/07/27(水) 17:55:59 ID:???
てーか、
http://hoge.com/hoge.cgi?
  key=123&url=http://foo.com/foo.cgi?key=456&value=789

とかあった場合に、スクリプト内で

url=http://foo.com/foo.cgi?key=456&value=789

が & と = のせいで、正しくとれないのでどうすれば、って話だったんじゃねーの?

だから、>>832 の言ったように、

http://foo.com/foo.cgi?key=456&value=789

の部分を URLエンコード (英数字以外を %** 形式に) すればいい、ってゆー。
840nobodyさん:2005/07/27(水) 18:08:50 ID:5H9/gz8d
>>836
一行ごとに作業させたので、自ドメインと違うのが同じ行にあると
同じ分類として処理されてしまうということです

>>837 >>838
有り難うございます
正規表現からサブルーチンを呼び出すことができるとは
ちょっと頑張って理解してみます
841nobodyさん:2005/07/27(水) 18:11:03 ID:5H9/gz8d
>>839
それも参考にします、有り難うございました
842nobodyさん:2005/07/28(木) 12:09:05 ID:nWZS31ut
配列「@HAIRETSU」の全ての要素「1 2 3 4 5 6 7 8」の前後に
それぞれ特定の文字列「mae」「ato」付けて「mae1ato mae2ato mae3ato ...」
としたいんですが、

$A = '',1,2,3,4,5,6,7,8,;
$A =~s/,/ato,mae/g;
@HAIRETSU = split(/,/,$A);
pop(@HAIRETSU);
shift(@HAIRETSU);

こんな感じでやるのがベスト・・・なわけないと思いつつもどうすべきか分かりません。
何か助言あればお願いします。
843nobodyさん:2005/07/28(木) 12:12:25 ID:???
???よく分からんがこういう事か?
foreach (@HAIRETU) { $_ = 'mae' . $_ . 'ato'; }
844nobodyさん:2005/07/28(木) 12:29:08 ID:???
>>843
おぉ・・・ずばりそういうことです。
稚拙な落書きを読んでもらった上にスマートな回答
本当にありがとうございました。もっとベンキョしてきます。
845nobodyさん:2005/07/28(木) 14:18:32 ID:???
@HAIRETSU = map { 'mae' . $_ . 'ato' } @HAIRETSU
ってのもある。
846nobodyさん:2005/07/28(木) 15:24:11 ID:???
>>845
といっても効率の面では>>843に軍配が上がるがな。

新しい配列を作りたいなら問答無用でmapだが。
847842:2005/07/28(木) 16:08:55 ID:???
>>845
>>846
なるほどなるほど、勉強になります。
言われてみたり、本読んだりしたら「あぁ、そっか」と分かるんですけど
白紙の状態から組むとなると、なかなかひらめかず妙な文字列が…という感じです。
それだけまだ理解が足りていないということだと思うので精進精進です。
ありがとうございました。
848nobodyさん:2005/07/29(金) 17:12:28 ID:DFTdnFF9
初歩的な質問で恐縮ですが、サブルーチンに2つの配列を渡しすには
どのようにしたら良いでしょうか?

連想配列 UserParam{hoge}と通常の配列@Paraparaを同時に渡そうと
しております。

以下のように1つだけのときはうまくいきました。

&xxx(%Param);

sub xxx
local (%Param) = @_

で1とつめはうまくいきました。

が、2つ渡すと、1つ目の配列に入ってしまうようでうまくいきません。
&xxx(%Param,*Parapara);

sub xxx
local (%Param) = @_
local (*Parapara) = @_

宣言方法がいまいちわかりませんので、教えていただければ幸いです。
参考になるサイトもありましたらお教えください。
849nobodyさん:2005/07/29(金) 17:15:16 ID:???
普通に入門書買って読むか、CPAN にあるコードを読むか、
どちらかしか選択できないでしょうね。
850nobodyさん:2005/07/29(金) 17:17:25 ID:???
リファレンス
851848:2005/07/29(金) 17:24:38 ID:???
困ってるんだから教えてください!
あなたたちだって最初からわかってたわけではないんでしょ?
852nobodyさん:2005/07/29(金) 17:31:06 ID:???
>848
sub xxx(\@\@) {
my ($array_ref_1, $array_ref_2) = @_;
}

これでわからないなら駱駝本でも読んどけ。つーかこんな基本的なことで質問するな
853nobodyさん:2005/07/29(金) 17:43:50 ID:DFTdnFF9
>>852
わかりました。
もう少し勉強して出直します。
854nobodyさん:2005/07/29(金) 18:18:51 ID:???
出直さなくていいよ。
855nobodyさん:2005/07/29(金) 20:10:25 ID:???
>>852
基本的なことって、ここ初心者スレだしw
まあ>>850で十分だとは思うが。

>>848
おまいは最低でもググッてから質問しろ。
「Perl サブルーチン 2つの配列」とかいくらでも調べようはあるだろ。
856nobodyさん:2005/07/29(金) 20:33:41 ID:???
便乗質問です。
下記のようにサブルーチンに1個以上の配列のリファレンスを配列の形式で受け渡したいのですが
プロトタイプをどのように記述したらよいのですか。

hoge(); #引き数エラーにしたい。
hoge(@fuga1); #@fuga1のリファレンスを渡したい。
hoge(@fuga1,@fuga2); #@fuga1,@fuga2のリファレンスを渡したい。
hoge(@fuga1,@fuga2,...); #引き数として渡した配列のリファレンスを渡したい。


sub hoge(\@;\@\@); みたいなプロトタイプをサブルーチンを実行させる以前に宣言しておけば
いいのはわかるのですが、渡す配列変数の個数が決まっていない場合
どのように記述すればいいのかがわかりません。どうぞよろしくお願いします。

なお、プロトタイプ宣言せずに直接配列に参照演算子 "\" を使って代入すればいいのは分かっていますが
あえてプロトタイプでお願いいたします。
857nobodyさん:2005/07/29(金) 21:00:11 ID:???
>>858
あえてそうする理由は?
858nobodyさん:2005/07/29(金) 21:08:26 ID:???
>>856
任意の個数をすっきり書く方法は用意されてないと思うが、
実用上は
sub hoge(\@;\@;\@;....)
の;\@を十分たくさん書いておけばいいんじゃないのかね。
美しくはないが。

859nobodyさん:2005/07/29(金) 21:37:08 ID:???
>>857
できる方法があるのなら知っておきたいというだけです。
たとえば、各配列の要素の平均を求めてその総和を求める関数が欲しいとき

$sum = avr_sum @a1,@a2,@a3,@4;

とか書けたらいいなと思っただけです。
まあ、こう書けば代用できますけどね。

$sum = avr_sum \(@a1,@a2,@a3,@a4);


>>858
やっぱりそれしか方法がないですかねぇ。
860nobodyさん:2005/07/29(金) 22:55:56 ID:???
>>859
それなら
sub hoge (@)
で十分だろ。
861nobodyさん:2005/07/29(金) 23:29:26 ID:???
>>860
>各配列の要素の平均を求めてその総和を求める

@a1 = (3,4,5);
@a2 = (5,6);
@a3 = (3,5,6,7);
@a4 = (3,2,3);

$sum = (3+4+5)/3+(5+6)/2+(3+5+6+7)/4+(3+2+3)/3

こういうことだから、十分じゃないよ。
862860:2005/07/29(金) 23:44:40 ID:???
>>861
スマン。平均ってのを読み飛ばしてた。

まあでもプロトタイプにこだわらなくてもいくらでも方法があるからいいじゃないかと逃げ。
863nobodyさん:2005/07/30(土) 00:24:25 ID:???
与えられたURLのソースを取り込むにはどうすればよいですか?
864nobodyさん:2005/07/30(土) 00:30:00 ID:???
シンプルなの

use LWP::Simple;

$content = get($url);
865nobodyさん:2005/07/30(土) 00:58:41 ID:???
汎用的なの

use LWP;

$content = LWP::UserAgent->new()->request(HTTP::Request->new(GET=>$url,HTTP::Headers->new()))->content();
866nobodyさん:2005/07/30(土) 21:06:51 ID:???
何故技術書は肝心の所を書かないのか
http://pc8.2ch.net/test/read.cgi/php/1060009605/345-

にて 2ch 発の技術書企画が進行中です。
主に Web 開発・運営に付いてのノウハウが集められる予定です。
興味のある方・我こそはと思う方は一度覗いてみてください。
867nobodyさん:2005/07/30(土) 21:20:13 ID:???
(;・∀・)また、騙されたの?
868nobodyさん:2005/08/02(火) 12:03:21 ID:???
CGI.pmを用いてcgiを作っています。
end_formはformの閉じタグを生成するはずですが、空のdivも同時に生成してしまいます。
これを生成しないようにするにはどう書いたらよいでしょうか?
869nobodyさん:2005/08/02(火) 12:41:54 ID:???
870nobodyさん:2005/08/02(火) 19:16:16 ID:+vXBtmax
すいません、バカなことを聞くかもしれないですが、
CGIのデバッグをWinのローカルで行う方法というのはありますか?
871nobodyさん:2005/08/02(火) 19:17:21 ID:???
Apache 入れるなりすればいいんです
872nobodyさん:2005/08/02(火) 19:23:44 ID:???
ActivePerl も
873nobodyさん:2005/08/02(火) 19:24:40 ID:???
>>871
ありがとうございます。
Apache for Win32というのを入れればいいんでしょうか?
これは入れると自宅のPCがWebサーバーになってしまったりするんでしょうか?
世界に公開されてしまうのですか?
874nobodyさん:2005/08/02(火) 19:47:01 ID:???
>>873
ケーブル抜けば無問題
875nobodyさん:2005/08/02(火) 20:25:41 ID:???
>>874
確かにそうですね。ありがとうございました。
876nobodyさん:2005/08/02(火) 20:32:29 ID:???
ワロスw
877nobodyさん:2005/08/03(水) 09:27:29 ID:2+TF3q2O
おっおいっ!
878nobodyさん:2005/08/03(水) 09:32:04 ID:???
>>877
何か?
879nobodyさん:2005/08/03(水) 11:20:50 ID:???
CGI.pmを使ってCGIを作っているのですが、
use warnings,use strictしてるときパラメータを受け取った変数を条件式に使うとき
わざわざdefinedしないといけないのが面倒です。。何か良い方法があったら教えて頂けないでしょうか?
880nobodyさん:2005/08/03(水) 12:52:24 ID:???
use warningsをコメントアウトする。
881nobodyさん:2005/08/03(水) 13:15:56 ID:???
未定義なものはロジックへ流さない。基本だ。
手抜きしちゃいかんよ。
882nobodyさん:2005/08/03(水) 14:13:16 ID:???
ま、俺はそれが嫌だから、CGIパラメータ処理モジュールを自作して使ってるわけだが。

CGI.pmより軽いし、超快適。
883nobodyさん:2005/08/03(水) 15:25:05 ID:???
はいはい。
884nobodyさん:2005/08/03(水) 15:30:17 ID:???
CGI::Lite
885nobodyさん:2005/08/03(水) 17:04:37 ID:???
CGI.pmの質問ばっかだな
886nobodyさん:2005/08/03(水) 19:50:20 ID:???
>>879の意味が分からないのは私だけか。
use strict,warnings下でCGI.pmを使っているけど、問題が起きたことはない。
887nobodyさん:2005/08/03(水) 20:04:55 ID:???
>>886
お前だけ。
888nobodyさん:2005/08/03(水) 20:17:15 ID:???
>>886
たとえばチェックボックスがチェックされなかった
ときのように、あるパラメタがそもそも送られてこないと
スカラーコンテキストのparamはundef返すので、

my $hoge = $query->param('hoge');
if ($hoge == 1) { ... }

とか書くと、use warnings下では Use of uninitialized value in 〜
が出るとかそういう話。もちろんundef返る可能性があるのに
手を抜いてるのがいけない。



889886:2005/08/03(水) 20:24:57 ID:???
my $hoge = $query->param('hoge') || '';
って書かないか?
890nobodyさん:2005/08/03(水) 20:46:12 ID:???
それがめんどいって話なんじゃ?

891nobodyさん:2005/08/03(水) 23:09:39 ID:???
手抜き(・A・)イクナイ!!
892nobodyさん:2005/08/04(木) 00:47:52 ID:???
どーしても解決できないエラーがあるので教えていただけないでしょうか。
CGI::Session を使用していて perl -w で実行すると
(in cleanup) Can't connect to data source , no database driver specified and DBI_DSN env var not set at /usr/lib/perl5/site_perl/5.8.3/CGI/Session/MySQL.pm line 131
というエラーが出てしまいます。
どのような原因なのでしょうか・・・
893nobodyさん:2005/08/04(木) 01:44:38 ID:???
>>892
Can't connect to data source

no database driver specified
DBI_DSN env var not set
894nobodyさん:2005/08/04(木) 06:15:02 ID:???
>>890いやdefined云々いってるから知らないんじゃないか?
895nobodyさん:2005/08/04(木) 15:30:09 ID:???
今までphp使いでこんどperlでもと思ったんですが、
正規表現と文字列変換で鼻血でそうです。
PHP+mysqlでWEBフォームくらい作れるんですが、
今まで両方とも初見の情報です。
とりあえず基本だから、ということでガリガリ覚えようとしてるんですが、
これ、どんくらいの頻度で使う知識なんですか?
もしすげぇ複雑だけど、ぜんぜん使わないよそこ、みたいなあれだったら悲しい・・・
896nobodyさん:2005/08/04(木) 15:32:53 ID:???
>>892
DBIがインストールされてないというエラーと思われ
windows環境という前提でいうと、
1.activeperlインスト
2.windowsのコマンドライン(cmd)からinstall DBI
3.windowsのコマンドライン(cmd)からinstall DBD-mysql
でDBIが入る。
897nobodyさん:2005/08/04(木) 15:37:38 ID:???
>>870
xammpもオススメ
898nobodyさん:2005/08/04(木) 15:42:39 ID:???
>>895
俺はよく使うけど、使うときに調べればそれで十分だと思う。
けど、正規表現は面白くて好き。オライリーの詳細正規表現お薦め。
899nobodyさん:2005/08/04(木) 15:54:47 ID:Ako7Yv7q
>>898
なるほど!
ちょっと安心しました。

オライリーってあの表紙が動物園みたいなやつですよね。
自分もネズミが表紙のperl本持ってます。
4000(これ、書式は%4dですかw)円は高かった・・
正規表現で一冊できちゃうとは・・・
今度探してゲットします。
ありがとうございます。
900892:2005/08/04(木) 20:46:43 ID:???
>>896
レスサンクス。
DBI入ってるみたいです。SSHで確認しました。
phpMyAdminから見るとセッションのデータをちゃんとMySQLに入れてて
取得も出来ています。
-wオプションをつけなければなにも問題なくうごいてるので
どうしてこんなエラーになるのかまったくわからなくって・・・
↓こんな感じのモジュール組んでます
901892:2005/08/04(木) 20:48:26 ID:???
package Lib::Auth;

use strict;
use CGI::Session qw/-ip-match/;
use DBI;
use CGI qw/:standard/;
use vars qw($dbh $session);

sub new {
my $pkg = shift;
bless{
userid => undef
},$pkg;
}

sub GetID {
my $self = shift;
my $sid = shift;
$dbh = DBI->connect('DBI:mysql:+++:localhost', '+++', '********') or die "DBI connect不可\n";
$session = new CGI::Session("driver:MySQL", $sid, {Handle=>$dbh});
if($session->param("userid")) {
$self->{userid} = $session->param("userid");
} else {
$session->delete();
$self->{userid} = "guest";
}
return $self->{userid};
}
902nobodyさん:2005/08/05(金) 10:16:46 ID:???
cgiでクエリを$form{$key}=$valueの形式でハッシュに格納する部分って
%form = $query =~ /([^=&]+)=([^=&]+)/g;
この1行でも問題ありませんか?
903nobodyさん:2005/08/05(金) 10:38:43 ID:???
>>902
デコードとかはあとでやればいいとしても、一般には
keyが重複することがあるからだめだろうな。
904nobodyさん:2005/08/05(金) 11:12:57 ID:???
>>902
hoge=aaa&hage=bbb=ccc のときとか bbb=ccc が取れない
905nobodyさん:2005/08/06(土) 08:08:56 ID:???
世の中で配布されているCGIのソースを読んでみても
use strictしているソースを見たことがないのですが
use strictするメリットって何なんでしょうか
906nobodyさん:2005/08/06(土) 10:35:31 ID:???
作っているときはuse strictするけど、配布時には外すよ。
907nobodyさん:2005/08/06(土) 10:38:17 ID:???
ないよ
全部perl信者の妄想だから
908nobodyさん:2005/08/06(土) 11:50:04 ID:???
>>905
意図しない変数の使用をチェックしてくれる
意図しない裸のワードの使用をチェックしてくれる
意図しないシンボリックリファレンスの使用をチェックしてくれる

特に変数チェックは超重要。今やuse strictしないとコードがかけません。
909nobodyさん:2005/08/06(土) 17:13:48 ID:???
> 世の中で配布されているCGIのソースを読んでみても

頭の悪い人たちが書いたコードでつか?
910nobodyさん:2005/08/06(土) 19:40:45 ID:???
公開する時には大概削除してるでしょ。
911nobodyさん:2005/08/06(土) 19:43:21 ID:???
ttp://www.kent-web.com/
たとえばここなんか有名ですが
ここのスクリプトはuse strictが無いので
勝手に記述して実行すると完全に就職されていないグローバル変数エラーが
山ほど出てきます

他にもアップローダで一番よく使われているなずるぼんアップローダや
あっぷっぷも勝手にusestrict記述して実行すると
山ほどエラーが出てきます
912nobodyさん:2005/08/06(土) 19:55:08 ID:???
そこが諸悪の根源
913nobodyさん:2005/08/06(土) 20:22:06 ID:???
>>911
漏れもKヨNTでperlを習った口だ。
だが、そのせいで社会復帰がままならない。

KヨNTのスクリプトは今すぐ捨てろ!
全部捨てろ!
そして、奴の事はもう思い出すな。
914nobodyさん:2005/08/06(土) 20:25:07 ID:???
普通にセキュリティホールがあるぞ、KENTのしじあい。パス系とか。。
915nobodyさん:2005/08/06(土) 21:16:56 ID:???
>>911
一般人にはuse strictなんて関係ないし、
少しぐらいバグがあっても、文句言いつつ使い続けたりするだろうし。
世の中ってそんなもん。
916nobodyさん:2005/08/06(土) 21:55:53 ID:???
>>915
己の成長を望まないのならそれでも良いかも知れん。
917nobodyさん:2005/08/06(土) 23:18:50 ID:???
use strict; を使うことが付加価値を持つということになる時代でつか?
918nobodyさん:2005/08/07(日) 00:26:07 ID:???
そこでRubyですよ
919nobodyさん:2005/08/07(日) 01:09:48 ID:???
とりあえずスコープに注意して全部myしたら動きましたがこれで良いですか?
localはダメですよね?
920nobodyさん:2005/08/07(日) 02:34:49 ID:???
>>906
それはチェックコストを抑えるため?
CPANで配布されている多くのコードはuse strictしたままだよね。
私も仕事ではつけたままにしてます。
先頭に#が付加されてしまう事が多いですが。
921906:2005/08/07(日) 14:54:03 ID:???
エラー&警告を報告してくれる酔狂なユーザーはいないから外す。
仕事なら付けたままのほうが良いかと。
922nobodyさん:2005/08/07(日) 15:07:05 ID:???
で、use strict; って、何の意味があるの?
923nobodyさん:2005/08/07(日) 15:37:39 ID:???
使うよ、厳密に
924nobodyさん:2005/08/07(日) 17:18:25 ID:???
一種の「保証」だと考えればいい。
925nobodyさん:2005/08/07(日) 18:37:02 ID:IqAoEAkr

ブログからRSSを取得してPerlで解析して、jsを出力し、
エントリー概要をhtmlに表示するスクリプトなのですが

open OUTPUT, ">./data/rss.js";

foreach my $item ( @{$rss->{'items'}} ) {
print OUTPUT<<TEXT;
document.write('<a href="$item->{'link'}" target="blank">$item->{'title'}</a>');
TEXT
}

そのブログのエントリー名にシングルクォートが使われると
document.write('  ');でかこんでる部分が、シングルクォートの中に
シングルクォートが入ってhtmlに出力されなくなります。

その問題を解決するにはどういったスクリプトを書けばよいでしょうか?

どうぞヨロシクお願いいたしますm(_ _)m
926nobodyさん:2005/08/07(日) 19:12:33 ID:???
\
927nobodyさん:2005/08/07(日) 20:41:08 ID:???
>>925
s/\\/\\\\/g;
s/'/\\'/g;
928nobodyさん:2005/08/07(日) 20:47:44 ID:???
print q||; とかで囲むとだめ?

つーか、そういうウンコなの同居させるなら TT とか使えよ。
929nobodyさん:2005/08/07(日) 21:48:36 ID:???
XSSバリバリになりそうだね。
930nobodyさん:2005/08/07(日) 21:54:39 ID:???
どこらへんが XSS?
931nobodyさん:2005/08/07(日) 22:40:40 ID:lD997J78
strict下でも$item->{title}とかって書けるよ〜。

と、本題と全く関係ないレスを誇らしげにしてみる。
932nobodyさん:2005/08/08(月) 01:19:14 ID:t9fLm/wi
教えて下さい。
初めてサブルーチンを使ったプログラムを作ったのですが、以下のエラーがでます。
syntax error at C:/Apache2/htdocs/login.cgi line 225, at EOF
225行目には_END_しかないのですが、何がいけないのでしょうか?
933nobodyさん:2005/08/08(月) 01:24:36 ID:???
>932
おそらく225行目より前で何か間違えてる。それより前の部分よくチェックしてみるといいかも知れない
934nobodyさん:2005/08/08(月) 02:05:42 ID:???
まさか
_END_
__END__
935nobodyさん:2005/08/08(月) 02:22:26 ID:???
>>932 の書いてる 「 _END_ 」 の 「 _ 」 が全角記号のアンダーバーな件について。
936nobodyさん:2005/08/08(月) 02:43:01 ID:???
ifとかforの括弧の閉じ忘れだとおもふ
937nobodyさん:2005/08/08(月) 02:50:55 ID:???
こういうときこそ use strict;
938nobodyさん:2005/08/08(月) 02:54:30 ID:???
こういうのにuse stirict;は有効じゃないんだよパパ
939nobodyさん:2005/08/08(月) 02:56:27 ID:???
その辺は趣味ってことで
940nobodyさん:2005/08/08(月) 03:23:25 ID:???
パパ、意味が分からないよ
941nobodyさん:2005/08/08(月) 04:08:49 ID:???
Template-Toolkitをコンパイルする時にAppConfigが必要になりますが
AppConfigは@INCの中にないディレクトリ[/home/hoge/module]にインストールされているとします。
perl Makefile.PL --libs="/home/hoge/module"
のような感じで指定出来れば問題なくコンパイル出来るのですが
そのようなオプションはありますでしょうか?
942nobodyさん:2005/08/08(月) 12:55:58 ID:???
perl 5.8.6 なんですが

require './cgi-lib.pl';
require './jcode.pl';

って動かないんですか?
モジュール使わないとダメ?
943nobodyさん:2005/08/08(月) 12:58:28 ID:???
(゚Д゚ )ハァ?
944nobodyさん:2005/08/08(月) 15:11:51 ID:???
ダウンロード数を計測するスクリプトを書いているのですが、計測後、ファイルをダウンロードのダイアログを出したいのですが、
IEやFirefoxのポップアップ抑制機能にじゃまされないで出すようにするにはどのようにすればよいのでしょうか?
vectorなどのサイトではちゃんとダウンロードできるので、何かやり方がありそうなのですが・・・。
945nobodyさん:2005/08/08(月) 16:00:00 ID:???
>>941
だまって @INC 増やせ。

>>942
動くよ。 スクリプトと同じフォルダに設置しれば?

>>944
zip とかならポップアップしなくても普通にページ移動 (location) すればページ切り替わらずにダウンロード画面になることを知らないのか?
そゆことで、Content-Type がしっかり (ダウンロードされるように) してれば、そのように動く。
946nobodyさん:2005/08/08(月) 16:13:29 ID:???
> 〜になることを知らないのか?

まともな会話の仕方を知らないのか?
947nobodyさん:2005/08/08(月) 17:02:15 ID:???
>>944
ダウンロードダイアログとポップアップ抑制は関係ないから。
ヘッダとしてContent-Dispositionを出力してみるよろし。
Content-TypeとContent-Lengthも合わせて出力することをおすすめする。
948nobodyさん:2005/08/08(月) 22:07:27 ID:???
>>944
CGI でしこしこデータを吐いてもいいんだけど、サイズが大きいと色々問題が
出てくるので Location で飛ばす方がいいと思うぞ。

警告なしに飛ばすには色々条件がある。
・Location は必ず HTTP ヘッダで吐く。HTML の <meta> は駄目。
・Location よりも前に Status: 303 See Other を吐く。
 メソッドが POST でなければ 302 Found も可。302 の方が対応ブラウザが多い。
 これは現在のメソッドに関係なく Location を GET で回収しろという意味。
・Location には絶対 URI を指定する。
 さらにこの URI のホスト部分と $ENV{'HTTP_HOST'} は一致させる。
 IP アドレスでのリクエストとかもあり得るので必ずチェックすること。
・メソッドが HEAD ならボディは吐かない。
 それ以外なら Location へのリンク (<a>) を含む HTML を吐く。

これらが満たせない場合は <form> でのリクエストはあきらめるしかない。
<a> で CGI にリンクすれば回避できるけど、検索エンジンに侵されるのでそのつもりで。
949942:2005/08/08(月) 23:45:57 ID:???
>>945
回答thx


落としたつもりになってただけで、
ライブラリの中身が空だった・・・orz
950nobodyさん:2005/08/09(火) 00:23:13 ID:pZHbukIk
CGIの本に載ってたやつだけど

#! c:/perl/bin/perl

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

これって普通ならブラウザー画面に文字が表示されるはずなのに
何故か実行するとファイルダウンロードになるのですが
何故でしょうか
951nobodyさん:2005/08/09(火) 00:28:33 ID:???
http://localhost/
でアクセスしてる?
952nobodyさん:2005/08/09(火) 00:30:11 ID:pZHbukIk
>>951
まあローカルホストに違いないが
http://127.0.0.1/です
953nobodyさん:2005/08/09(火) 00:31:06 ID:???
apache
conf
954nobodyさん:2005/08/09(火) 00:33:03 ID:pZHbukIk
あと借りたサーバーにもあげてみたのですが
やはりファイルダウンロードになりました

レンタルサーバーのほうは何故か不安定で、ローカルだと表示できるものが、
表示できたり出来なかったりします
パーミッションやパス、その他設定はちゃんとしてるはずなのに
955nobodyさん:2005/08/09(火) 00:39:46 ID:pZHbukIk
>>953
コンフファイルもソースも付属CDのを使ってるから
間違ってるとは考えにくい
956nobodyさん:2005/08/09(火) 01:15:37 ID:???
>>950
IE は text/plain をダウンロードしたりしなかったりするよな。
text/html のが確実よ。
957nobodyさん:2005/08/09(火) 01:32:37 ID:???
パスが通ってないだけなんじゃね?
958nobodyさん:2005/08/09(火) 02:02:31 ID:???
他のブラウザで試せ。
959nobodyさん:2005/08/09(火) 18:08:04 ID:???
Perlで入力にa[1],a[2],. . . という風な入力を受け取ることってできますか?
$i=1;
while($in{'a[$i]'}){
 print OUT "$in{'a[$i]'}\n";
 $i++;
}
print $in{'a[1]'};
という風にやってみたんですけど中に何もはいってませんでした
960nobodyさん:2005/08/09(火) 18:30:00 ID:???
>>959
シングルクォートで囲ってるからじゃね?
$in{"a$i"}
961960:2005/08/09(火) 18:31:23 ID:???
いや、違うわ。
$in{'a[1]'}ってハッシュの中の配列?リファレンス使う方がいいかもよ。
962nobodyさん:2005/08/09(火) 19:40:12 ID:???
>>959
PHPとかで <input name="a[1]"> とされてる a[1]?
なんで流用してるのか知らないけど、クエリを%inに格納してないんじゃないの?
963nobodyさん:2005/08/09(火) 19:49:58 ID:???
いつもplainテキストでも
print "Content-type: text/html\n\n<pre>\n";
てやってるよ
サーバ云々よりもブラウザの問題
964nobodyさん:2005/08/09(火) 20:49:47 ID:???
<pre> より <xmp> がよろしくなくって?
965nobodyさん:2005/08/09(火) 21:06:24 ID:???
そんなIE独自仕様なタグは。
966nobodyさん:2005/08/09(火) 21:36:56 ID:???
xmpはHTML4.0以降の仕様にはないがIEの独自仕様ではないぞ。
現在もほとんどのブラウザが対応してる。
967nobodyさん:2005/08/10(水) 00:24:25 ID:???
<plaintext> <textplain>とかもあるよ
968nobodyさん:2005/08/10(水) 01:06:06 ID:???
なんだまだやってたのか。
>>950
それをダウンロードしてエディタで開いて中身を貼れ
969nobodyさん:2005/08/10(水) 20:44:59 ID:yT5SVbbL
>>968
Hello Perl !

こんな感じ
970nobodyさん:2005/08/10(水) 21:45:46 ID:oTWuci57
質問させて下さい。

ログイン画面(ID、パスワード入力フォーム)があって、一度ログインしたら
その後どのページに行ってもログイン済みという認識をさせたいのですが、各ペ
ージでフォームデータ(標準入力)を取得し、ID、パスワードがあるかという
判断をするやり方で良いのでしょうか?
また、フォームデータ(標準入力)はいつまで保存されているのでしょうか?ど
んどん次のページに行っても残っているものなのでしょうか?
971nobodyさん:2005/08/10(水) 22:17:10 ID:???
>>970
保存するようにしてれば保存される。
それにコーディングに関係ないぞなもし。
cookieとかセッション管理とか調べてください。
972nobodyさん:2005/08/10(水) 22:18:56 ID:???
BASIC認証がお望みのモノに近いけど、なんか勘違いしてるっぽいな。

CGIだとセッションIDを仕込んで、毎回チェックするだけなんだけどね。
仕込み先はCookie、URL、フォーム。なんだっていい。
セッション管理でぐぐるに一票。
973nobodyさん:2005/08/10(水) 23:06:05 ID:???
ある複数のperlモジュールを必要とするCGIを動かそうとするとき、
必要とするモジュールの一部が使用中のレンタルサーバーに用意されていない場合、

CGI内に、
use lib = "/home/hogehoge/lib"
と記述してやると、 /home/hogehoge/lib 内に、サーバーにすでにある
モジュールもないモジュールもすべて用意しなければならなくなるのでしょうか?
974nobodyさん:2005/08/10(水) 23:16:31 ID:???
実験してみればわかるのでは?
975nobodyさん:2005/08/11(木) 00:28:25 ID:???
>>969
ちゃんと実行されてんじゃん。
たまたま君の使ってるブラウザ(環境)がtext/plainなデータをダウンロードするようにしているだけ。
text/plainを表示するようなブラウザだったら表示される。
976nobodyさん:2005/08/11(木) 07:59:40 ID:emP9NQBR
>>973
サーチパスに追加するだけ
977nobodyさん:2005/08/11(木) 09:50:51 ID:???
質問があります。

配布スクリクトでPerl::Authを使うのでインストールしたら
Fatal error: Cannot redeclare class auth in /web/....../lib/pear/Auth/Auth.php on line ○○
というエラーが出ました。
過去ログとか読むと、authが二重宣言しているためにエラーが出ているところまで分かったのですが、
これの回避方法とかあるのでしょうか?

該当部分(auth)を別な名前に書き換えるのも、色々な場所で使われていて大変そうですし、
他の何と重複しているのか分からないのですが…。
978nobodyさん:2005/08/11(木) 10:01:10 ID:???
何をおっしゃりたいのか、情報が少なすぎて、さっぱりわからない点について。
979nobodyさん:2005/08/11(木) 10:11:12 ID:???
>>977
えー
redeclare再宣言する必要がどこにあるか
わからんと、答えようがないんですが
980nobodyさん:2005/08/11(木) 11:52:28 ID:???
> pear/Auth/Auth.php
ここはperlスレなんだが。
981nobodyさん:2005/08/11(木) 11:58:15 ID:???
いや突っ込むところはそこじゃなくて
977の質問はPHPのPEAR::Authについて
のものだというところかと...

質問者の脳内でPEARがPerlに置き換わっ
てるようだが激しくスレ違い。

982977:2005/08/11(木) 13:21:03 ID:???
>981
勝手に脳内変換してました…。PEAR→Perl
スレ違いorz...
983nobodyさん:2005/08/11(木) 19:28:28 ID:OSKViUMD
フォームのhiddenで渡した情報はいつクリアされるのですか?
(ブラウザのウィンドを閉じるまでは残っているのでしょうか?)
各ページでhiddenの受け渡しによるログインのセッション管理を行おう
としていますが、途中にHTMLページがある場合、

a.cgi → b.html → c.cgi

a.cgiで渡したhiddenの情報を、c.cgiで受け取ることはできるのでしょう
か?それとももう消えてしまっているのでしょうか?
もしくは、HTMLでもhidden情報を渡すことはできるのでしょうか?

素人なのでアホな質問をしていたらすいません。
984nobodyさん:2005/08/11(木) 19:39:00 ID:???
アホな質問だから多分よくわかってないんだろうけど、Cookie でも使えば?
985nobodyさん:2005/08/11(木) 20:29:04 ID:???

----------------------------
#!/usr/local/bin/perl

$view = "画像フルパス.jpg";
print "Content-type: image/jpeg\n\n";
open IMG,"$view";
binmode (IMG);
print <IMG>;
close (IMG);
exit;


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

アクセスカウンタみたいに<img src="xx.cgi">
って感じで画像を呼びたいんだけど、
この後処理を付け足して条件分岐で表示される画像が変わるという感じのを作りたいんですが
最初のとりあえず決まった画像を表示させる段階でつまづいています
なにか分かれば教えて頂けますか?
986nobodyさん:2005/08/11(木) 20:29:11 ID:???
>>983
a.cgiでb.htmlを出力する際にhidden情報も書き込ねば、c.cgiが受け取れる。
でも、セッションならcookieでやる方がいいよ。
GETメソッドで変遷すると、hidden情報がアドレス部分に含まれちゃうから。
987nobodyさん:2005/08/11(木) 21:10:44 ID:???
>>985
Windowsなら
binmode(STDOUT);
が要るけど。

# print <IMG>は勘弁してほしい。
988nobodyさん:2005/08/11(木) 21:12:57 ID:???
勘弁して欲しいとはどういう意味なんですか?
構文的にマズイのであれば
よくわかってないので是非教えてください
989973:2005/08/11(木) 21:29:11 ID:???
>976

そこのところを具体的にご教示ねがえないでしょうか?
ちなみに、telnetもshhも使えないサーバーをつかってます。
なにとぞよろしくお願いします。
990nobodyさん:2005/08/11(木) 21:34:23 ID:???
>>988
山形括弧は行ごとに処理を行うので、
バイナリモードで使うのは気持ちが悪いということ。
# 巨大ファイルを使わない限り気分的な問題だけど、どこかに落とし穴があるかも知れず。

>>985のコード動いたよ。(FreeBSD+Perl5.8.7)
991nobodyさん:2005/08/11(木) 21:38:14 ID:X0+Sv8OM
初心者のソースって動けばいいってオーラがぷんぷんだよな
処理が重くなるとかメモリの節約とか全然考えてない
992995:2005/08/11(木) 22:11:22 ID:???
>>990
動きますか・・・・
うーん他のCGIは動くのに
何か簡単なミスな気がしてきたけどわからない

993nobodyさん:2005/08/11(木) 23:29:59 ID:???
$view = "画像フルパス.jpg";
ってのが http:// からのアドレスで書いてることに 3000点。

ってか >>995 も大変だな。
↓↓
994995:2005/08/12(金) 00:55:40 ID:???
>993
まさにその通りでした^^;
しかも995…orz
993には3000点が加算されます。

なんでこんなミスすんだろ
思いこむとこんなミスにも気づかないものねぇ
995nobodyさん:2005/08/12(金) 00:57:19 ID:???
と995を私が取ればつじつまは合うかな。
>>987
>>993
ありがとう
996nobodyさん:2005/08/12(金) 01:11:40 ID:???
うはwww当たったwwwww


次スレまだー?(・∀・ )っ/i_i⌒☆チンチン
997nobodyさん:2005/08/12(金) 01:27:47 ID:???
Perlコーディング初心者質問スレ Part 43
http://pc8.2ch.net/test/read.cgi/php/1123777607/
998nobodyさん:2005/08/12(金) 03:29:26 ID:???
埋め
999nobodyさん:2005/08/12(金) 03:50:33 ID:???
1000nobodyさん:2005/08/12(金) 04:02:20 ID:???
にはは。久しぶりにせん!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。