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

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

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

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

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

お勧めサイトは >2 以降

前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
2nobodyさん:2007/09/16(日) 19:51:29 ID:???
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル] (追加)
最新のドキュメント: ttp://search.cpan.org/dist/perl-5.8.8/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.com: ttp://www.perldoc.com/
3nobodyさん:2007/09/16(日) 19:52:04 ID:???
41:2007/09/16(日) 19:56:03 ID:???
独断でPBPとPerl Hacksを追加してます。
5nobodyさん:2007/09/16(日) 20:04:09 ID:???
>>1
お疲れ様です。
前スレ最後に質問してしまいました。
こちらに再投稿させていただきますm(__)m


use Math::BigFloat;
my $tr = Math::BigFloat->new((@array * (1-0.68)/2));

と書くの大変なので

my $a = use Math::BigFloat;
my $tr = $a->new((@array * (1-0.68)/2));

と書いてみましたがエラーでした。
こういう意図を実現するのは無理ですか?
小数の計算をさせた上で配列のインデックスにする場合はBigfloatしておかないと危ないです。
やってない$trに
$array[-($tr +1)];
とすると実質インデックスが2個変わってしまいます。
15.999だったのが、+で16になり、さらに1が足されて17になる。
そんな現象を確認しました。

簡単な記述方法はないでしょうか。

6nobodyさん:2007/09/16(日) 20:22:00 ID:???
>5
use bignum
7nobodyさん:2007/09/16(日) 20:40:18 ID:???
>>6
???
どういうことですか?
英語読めませんが、http://perldoc.perl.org/bignum.html を見てやったところ
全くMath::BigFloatが不要になってしまいました。

冒頭でuse bignumをしておけば小数点の変な誤差が発生することは皆無になるんですか?
代償として重くなるとかがあるので、軽くしたいなら面倒でもMath::BigFloatを使えばいい。
簡単にしたいならbignumを使えばいい?
8nobodyさん:2007/09/16(日) 20:56:51 ID:???
use bignum;
my $tr = (@array * (1-0.68)/2);

メチャクチャな計算になりました。
@arrayは100なので16になるべき計算なのに50が入ってました。
もちろんbignumをつかわなければ16が入ります。

bignumを使うと他にも多大な影響があるようですね。
どういう基準で影響を与えてくるんでしょうか。
9nobodyさん:2007/09/16(日) 21:58:06 ID:???
>>前996
$#test
で最後の添え字をゲット。
10nobodyさん:2007/09/16(日) 23:09:56 ID:???
>8
再現しない。再現する最小コードは?

use strict;
use warnings;
use bignum;
my @array;
$array[99] = 0;
print scalar(@array), "\n"; # 100
my $tr = (@array * (1-0.68)/2);
print "$tr\n"; # 16
11nobodyさん:2007/09/16(日) 23:24:10 ID:???
>>10
#!/usr/bin/perl
#京
#use bignum;
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = (@array * (1-0.68)/2);
print $tr;

これでできると思います。EUCコードで記述されています。
use bignum;をコメントアウトするかしないかで表示が変わります。
本来とは違う挙動をしているのでしょうか?
12nobodyさん:2007/09/16(日) 23:35:36 ID:???
普通にprintしていたものを、突如ファイルに納めたくなりました。

print 1;
というのが何千行もあった場合
print FH 1;
とやりなおすのは間に色々な式が挟まってる為一括ではできません。

標準出力先をファイルハンドルに変える設定などが冒頭でできるなら一発でできると思うのですが。
13nobodyさん:2007/09/16(日) 23:36:59 ID:???
select関数でおk
1412:2007/09/16(日) 23:53:18 ID:???
>>13
うわ!
感謝感激恐悦至極にございますm(__)m
15nobodyさん:2007/09/17(月) 00:17:12 ID:???
>11
俺のとこだと再現しないわ。環境は
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
This is perl, v5.8.8 built for cygwin-thread-multi-64int
16nobodyさん:2007/09/17(月) 00:32:28 ID:???
>>11
どっちも16になるぜよ
17nobodyさん:2007/09/17(月) 00:44:08 ID:???
>>15-16
This is perl, v5.8.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)

5.8.1のみの問題ですかね?
そんなに違いがあるのでしょうか。
一体何なのでしょうか?

ちなみにbignumって何に使うためのものなのですか?
浮動小数の誤差関係に使えるというのは一つですよね。
本筋はそれですか?

だとしたらこんな影響が出てしまう理由がわかりませんし。
EUCコードでやっておられますよね?
それかもしかしたらbignumの方がバージョン変わってるとか?
18nobodyさん:2007/09/17(月) 06:36:57 ID:???
>>17
1. 再現せず。きちんと計算される。
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level

2. bignum は BigFloat と Math::BigInt, Math::BigInt::Lite のラッパー
それぞれググレ。でかい方に関しては
perl -le 'print 2**2**2**2**2' # => inf
perl -Mbignum -le 'print 2**2**2**2**2' # => やってみ?
とか
perl -le 'print 10**16' # => 1e+16
perl -Mbignum -le 'print 10**16' => 10000000000000000
効能が分るだろ。


19nobodyさん:2007/09/17(月) 07:36:15 ID:???
前スレ993へ
% cat Hoge.pm
package Hoge ;
use 5.005_02 ;
use vars qw( @ISA @EXPORT ) ;
use vars qw( $hoge ) ;
use subs qw( hoge ) ;
use Exporter ;
use Cwd ;
@ISA = qw( Exporter ) ;
@EXPORT = qw($hoge hoge ) ;
$hoge = 42 ;
sub hoge{ return 42 ;}
1;

% perl -Mstrict -Mwarnings -MHoge -le 'print $hoge; print hoge'

ってか朝っぱらから何やってんだろ俺。
20nobodyさん:2007/09/17(月) 07:37:27 ID:???
ああ、いらんモジュール use しとるし orz...
21nobodyさん:2007/09/17(月) 11:15:49 ID:???
-wスイッチを使うと警告を出すというんですが、これは一体どういう意味の警告なんですか?
-cは確か構文チェックをしてくれるわけですよね。
22nobodyさん:2007/09/17(月) 11:37:55 ID:???
print scalar(grep{$_>15}(1..99));
>84
print scalar(1..99);
>何も表示なし
print scalar(0,1,2);
>2

リストをscalarに渡すとどうなるかというのが知りたかったのです。
要素数を出してくるのか末尾要素だけ評価するのか。
真ん中のやつは何も評価しなかったようですが。何故なんでしょうか。

それとgrepでリストが作られるのかと思っていたら配列が作られているのですよね?これは。
scalar(配列)  とすると要素数が出てきて
scalar(リスト) とすると末尾要素が評価される
scalar(n..m)  とすると何も起こらない

grepの返り値は配列だということでokですか?
23nobodyさん:2007/09/17(月) 11:46:15 ID:???
1/0
これをやらせるとIllegal division by zero at hogehogeと警告されます。
0/1
こっちは警告なしなので大丈夫なんだと思いますが。

あまり気にしてないと、無自覚のうちに0による除算が発生してしまうことってありますよね。
意識的に0による除算が行われないよう、例えば
my ($r,$p) = (rand,rand);
print $r/$p;
こういう場合は
my ($r,$p) = (rand,rand);
if ($p>0){ print $r/$p }
と保険?を掛けておくのが推奨されるコーディングなのでしょうか?
24nobodyさん:2007/09/17(月) 11:56:26 ID:???
>>22
perl -w -le 'print scalar (1..99)'
Use of uninitialized value in range (or flip) at -e line 1.

range 演算子は、君の希望の挙動の他に
while( <> ){
 print if ( /^\s+/ .. /^$/ ) ;
}
つう風にも使う。で、上述ではperlの中の人がどっちの機能
を求めているのか判断出来ない。=> エラー出して保留
∴まともに機能してないよ
2522:2007/09/17(月) 12:16:00 ID:???
>>24
while( <> ){
 print if ( /^\s+/ .. /^$/ ) ;
}

読めないorz
正規表現の部分は「先頭から空白文字が1個以上あるか」「中身が空であるか」の二つですね。
で、..この範囲演算子はどういう意味でしょう?
ついでにwhileの評価式自体が皆目検討がつきません。
26nobodyさん:2007/09/17(月) 12:24:45 ID:???
>>25
例だからあまり意味のないものを書いたんで。。。
 「先頭から空白文字が1個以上ある行」から
 「中身が空であるか」まで
 を出力せよ。
と言う意味になります。ホントは/^\S+/ のつもりだったのよw
後は、、、ぐぐれ。
2721:2007/09/17(月) 12:26:13 ID:???
すいません。試してるんですが。

Use of uninitialized value in addition (+) at 行数

こういうのやsubtractionとかがちょくちょく出てくるんです。
「初期化されてない値を使ってる」みたいな意味だと思いますが、
具体的にどういうエラーなのかわからず再現ができないでいます。
2822:2007/09/17(月) 12:32:34 ID:???
>>26
う〜んどうしてそうやって動くのでしょうか?
一旦中身が空である行を迎えたら自動でループはlastされるのですか?
ifに掛けられるのは1行ずつですよね。
う〜ん・・・
29nobodyさん:2007/09/17(月) 12:37:27 ID:???
>>28
左の正規表現が真 => スイッチオン
右の正規表現が真 => スイッチオフ
for( 1..1000){
 print $_ if $_ == 10 .. $_ == 100 ;
}
つかまじでググってくれ。
21氏は質問の意味自体が理解不能だ。

俺は消えるので、相手してくれる人はいなくなるかもしらんが
頑張れ
3021:2007/09/17(月) 12:38:16 ID:???
my $pl = undef;
my $ze = $pl + 1;
my $we = $pl - 1;

レスこないのでガンばてたら、これでadditionとsubtractionエラーが再現できました。
この二つのエラーが出たら未定義値が格納されてる変数が計算に使われてるって思っておけばいいですよね。
でも一応スクリプト自体は動くんですが、-wはuse strict程度の感覚なのですか?
31nobodyさん:2007/09/17(月) 14:45:52 ID:???
>>26
それ範囲演算子じゃないから。普通は使いません、ていうか使うな。
明らかに不適切な例を唐突に持ち出して何がしたいんだか。
32nobodyさん:2007/09/17(月) 15:07:46 ID:???
>>31
ぐぐっても分らなかったのかw
3322:2007/09/17(月) 16:17:24 ID:???
>>32
確かにまだ理解できていませんが、>>31は僕ではないです。
回答してくれる方にそんな不遜な態度は取りません。
34nobodyさん:2007/09/17(月) 16:27:17 ID:???
仕事押しつけられて、戻って来たらなんかオレ煽られてんなあ。
31=21 か?
Programming Perl の P135 の範囲演算子の項を読んだ後に
まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。
35nobodyさん:2007/09/17(月) 18:09:34 ID:???
> Programming Perl の P135 の範囲演算子の項を読んだ後に
> まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。

とりあえず、該当箇所をスキャンしてうp汁。
36nobodyさん:2007/09/17(月) 18:24:44 ID:???
>>35
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
の範囲演算子の項はほぼ上述書物と同じだ。
3722:2007/09/17(月) 19:13:34 ID:???
とにかく仲良くして下さい。
38nobodyさん:2007/09/17(月) 19:21:59 ID:???
scalar って書いてあるから、スカラコンテキストで評価するか。

> スカラの ".." の被演算子が定数表現であるときは、
> その被演算子は暗黙に、変数 $. と比較されることになります。

ちょっくら$.と比較するか。

$.にundef入ってるし。

Use of uninitialized value
39nobodyさん:2007/09/17(月) 20:57:51 ID:???
やっぱりどうもプログラム系のスレの住人って人とのコミニュケーションが下手っぽいよね。
変な皮肉を言ったり、あえて言葉足らずにしてみたり。
そういう悪い癖に自分で気付いてるんだろうか。

こういうところが、「キモイ」イメージが付いてしまう原因なんだろうな。
40nobodyさん:2007/09/17(月) 21:44:30 ID:???
変な分析したがりが一番キモい
41nobodyさん:2007/09/17(月) 23:15:28 ID:???
つまりここにいる奴は全員キモイってことだな。
42nobodyさん:2007/09/18(火) 01:53:41 ID:???
ま、いくら挑発しても答えてやらないけどな
43nobodyさん:2007/09/19(水) 19:41:21 ID:uZuxrlKv
Perl の CGI::Application モジュールを使ってアプリを作成しているのですが、
デバッグの仕方でつまづいています。

というのも CGI::Application の場合 ランモードのそれぞれのメソッドからブラウザに表示させたい
htmlを return しますよね?

で、その途中で 勝手に「 print $hensu; 」みたいにやっても画面上には表示されません。。。
もちろん「 return $hensu; 」とやればその変数の内容は表示されるのですが、複数の変数の値を
一度に表示させたいのですーー。

こんな時みなさんどうしてるのでしょう???
44nobodyさん:2007/09/19(水) 19:47:18 ID:???
V に TT とか使えばいいんじゃね?
45nobodyさん:2007/09/19(水) 20:52:24 ID:???
ヘッダを出力する前にprintしてもブラウザには表示されないよ

CGI::App::Plugin::DebugScreenとかLogDispatchとか使ってたっけかな
手っ取り早いのはData::DumperとかYAML使ってwarnでダンプとか
httpdのエラーログにね
46nobodyさん:2007/09/19(水) 23:34:44 ID:???
CGI::Application ってテストサーバないのか。ダサいな。
47nobodyさん:2007/09/19(水) 23:44:49 ID:??? BE:914760566-PLT(15017)
48nobodyさん:2007/09/20(木) 00:36:25 ID:FmGzC+A0
DBIを使用してDB処理をした場合、sqlのログってどうしてます?

プリペアードステートメント使っていますが、肝心の値の部分が「?」なので、実際に流れるクエリが分かりません。
49nobodyさん:2007/09/20(木) 09:16:22 ID:???
モジュールの質問ならpodくらい見てからしろよ

http://search.cpan.org/~timb/DBI-1.59/DBI.pm#trace
>DBI->trace($trace_setting)
>DBI->trace($trace_setting, $trace_filename)
>DBI->trace($trace_setting, $trace_filehandle)
>$trace_setting = DBI->trace;
50nobodyさん:2007/09/20(木) 12:35:47 ID:yNzQPcIL
>>44
>>45

43です。レスありがとうございます。
なるほど、簡単にはいかないんですね。。CGI::Applicationしょぼ!

結局グローバルな変数(ハッシュ)に変数の値を保存していって

cgiapp_prerun (メソッド名間違ってたらスマソ)でその変数に
値が入っていればブラウザに表示するという方法でいきます。

ていうかこれぐらいのこともできないのかよ。CGI::Application

51nobodyさん:2007/09/20(木) 13:40:05 ID:???
ヘッダの送る前にprintしてもブラウザに出力されないのは当たり前だろ・・・
自分の無知を認識しろよ
52nobodyさん:2007/09/20(木) 13:45:10 ID:???
だからwebprogは揶揄される
53nobodyさん:2007/09/20(木) 14:21:55 ID:???
今時 CGI::Application なんか使うなよ…
54nobodyさん:2007/09/20(木) 19:18:46 ID:???
じゃあ何使えって言うんだよ。
どこのレンタルサーバでも使えるような方法で頼む。
55nobodyさん:2007/09/20(木) 21:46:49 ID:???
if文ダラダラ使えってことじゃね
56nobodyさん:2007/09/20(木) 21:49:39 ID:???
あるいはR信者が言語批判したかっただけとか
57nobodyさん:2007/09/20(木) 21:50:20 ID:???
yukiwiki 的にサブルーチン呼べば?
値は PATH_INFO とかでとればよい。
58nobodyさん:2007/09/21(金) 04:57:02 ID:9/Wk3rtw
質問です。

ネットに落ちてるサンプルを見ながら、アクセス解析や掲示板などを書いて
練習しているのですが、データを書き込んでいく空ファイルは
どこのサンプルでも自前で事前に用意しています。

これを、日時ごとに070921.dat、070922.dat…のように自動生成させたいのですが、そのようなことは出来ないのでしょうか?

よろしくお願いします。
59nobodyさん:2007/09/21(金) 05:11:32 ID:???
問題なく出来ると思う。
60nobodyさん:2007/09/21(金) 05:15:49 ID:???
テキスト表示のアクセスカウンタを作っているのですが、<img>タグで呼び出すとテキストを返せません。

SSIが使えないならば、直接CGIにアクセスさせるしかないんでしょうか??
61nobodyさん:2007/09/21(金) 09:28:25 ID:???
質問させてください。

GDでファイルを生成→表示というスクリプトを組んでいますが
どうやら生成されるまえに表示する処理が実行されてしまい。うまくいきません。
リロードすれば表示されるようにはなるのですが・・・

生成されるまで待つ→表示処理実行

という事を考えて生成→slepp 2とか10;→次を実行

と、してみましたがうまくいきません。
生成完了するまでウェイトをかける方法を教えていただければありがたいです。
よろしくお願いします。
6261:2007/09/21(金) 09:35:31 ID:EZVVl+6I
自己解決しました。

sleepでOKでした。

よくみると

コメントアウトしてましたw
63nobodyさん:2007/09/21(金) 14:07:32 ID:???
>>60
scriptタグのsrcでアクセスさせる。JavaScript。
64nobodyさん:2007/09/21(金) 20:24:02 ID:yGE03KVM
winXPsp2とactive perlでローカルテストをする時の質問なのですが、
例えば print 1; という命令のあるplファイルをダブルクリックしても1が表示されません。
いや正確には一瞬何かが出てきてるっぽいんですが、閉じるの早すぎです。

コマンドプロンプトから実効命令をするとprint先がコマンドプロンプトに来るので、
勝手に閉じることはないようですが。
いちいちコマンドプロンプトやらずに簡単なコードテストの時はダブルクリックで済ませたいのですが
方法ありましたら教えてください。
65nobodyさん:2007/09/21(金) 20:46:57 ID:???
>>64
END{<STDIN>}
とか書いとけば。
6664:2007/09/21(金) 21:00:38 ID:yGE03KVM
>>65
ありがとうございます。
うまく出ました^^
endって一体なんなのですか?

perlの説明サイトとかで関数調べてendありませんし。
最後にやるってことですか?
となると<STDIN>が閉じさせない命令の本体になるんでしょうか?
どういう理屈なんでしょうjか。
67nobodyさん:2007/09/21(金) 22:37:24 ID:???
>>66
http://perldoc.jp/docs/perl/5.8.8/perlmod.pod
perlmodのBEGIN, CHECK, INIT and END BEGIN CHECK INIT ENDのところ。

プログラムの終了するところで、
<STDIN>で、コンソールの入力待ちをしてる。
6864:2007/09/21(金) 23:02:02 ID:yGE03KVM
>>67
コンソール???あの黒い画面のことかな。
で、試しに適当に打ち込んだら本当に入力できました。
最後にenterを押したら画面が消えました。
perlの方にはしっかりとその内容が送られてるんですかね?

試しに
my @array = <STDIN>;
print $array[0];

としてみましたが、今度はenterを何度押しても画面が閉じません。
配列に入れてるから無限に取るっぽいですね。
my $scalar = <STDIN>;
print $scalar;
END{<STDIN>}
としたらうまくいきました。

任意の内容を入力してenterした瞬間に制御が一瞬コードに行ってprint $scalar;が実行されました。
ローカルでやるときはこうやって引数を取るというのも面白いですね。
物凄い面白いことを教えていただいて感謝です。
69nobodyさん:2007/09/22(土) 13:27:49 ID:???
質問です。
Class::DBI使ってDB操作する場合、二つのレコード間で主キー以外のデータを交換するには
どのように書いたらいいですか?
70nobodyさん:2007/09/22(土) 15:58:05 ID:???
#! /usr/local/bin/perl

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

print "<html>\n";
print "<head><title>タイトル</title></head>\n";
print "<body>\n";
print "<h2>テスト</h2>\n";
print "</body>\n";
print "</html>\n";


↑これでInternal server error 500になる。
ただしレンタルサーバー上ではエラーだが、
自分のパソコンでやったらちゃんと表示される。

ソースにもし間違いがあったら
場所と対処法を具体的に指摘しろ。
71nobodyさん:2007/09/22(土) 17:15:55 ID:???
>>70
態度でかいぞ。
そんなやつには教えてやらん。



#! と /usr の間に半角スペースが入ってるのが問題とか言わん。
72nobodyさん:2007/09/22(土) 17:44:10 ID:???
>>68
和んだ、俺も10年くらい前Cやった時そんなだった。
7369:2007/09/22(土) 19:54:58 ID:???
すみません。解決しました。
74nobodyさん:2007/09/22(土) 21:34:17 ID:???
>>70
パーミッションはちゃんとやってあるのか?
とりあえず雑魚が粋がるのはやめておけ。
75nobodyさん:2007/09/22(土) 22:09:17 ID:VEv2R0s3
http://pc11.2ch.net/test/read.cgi/php/1158647441/369-372 から来ました。

http://ws.strikeiron.com/SwanandMokashi/StockQuotes2?WSDL
このサービスを SOAP::Lite から使いたいんですが、ドキュメントのWSDL関連部分を読んでも
  use SOAP::Lite;
  print SOAP::Lite
    -> service('http://www.xmethods.net/sd/StockQuoteService.wsdl')
    -> getQuote('MSFT');
としか書いてません。
WSDLを見てみると、GetStockQuotesメソッド(オペレーション?)のパラメタとして
QuoteTicker(MSFTとかの文字列)だけでなく、オブジェクト構造みたいなのを組んで
メアドなども渡さないといけないようなんですが、どう書けばいいんでしょうか。
7675:2007/09/22(土) 22:43:31 ID:???
http://guide.soaplite.com/#access%20with%20service%20description%20(wsdl)
> SOAP::Liteでは今のところWSDL 1.1のサポートは限定されているが〔中略〕、
> 複雑な型(types)を記述に含まないサービスにはアクセス可能だ。

と書いてあるので、無理なのかもしれませんね・・・
7775:2007/09/23(日) 03:01:09 ID:???
やっと自己解決・・・
http://wsparam.strikeiron.com/BasicRealTimeQuotes?WSDL
という、もっと単純なWSDLを使用。
http://www.strikeiron.com/authentication/
ここの下のほうにPerlのサンプルが(も)置いてあるので、それを改造。
わかりやすいのでSOAP初心者にはおすすめかも。
78nobodyさん:2007/09/23(日) 03:53:09 ID:???
>>74
なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!

それでパーミッションが500でも
動くのはなんでだ?
79nobodyさん:2007/09/23(日) 05:27:46 ID:???
それくらいググれカス
80nobodyさん:2007/09/23(日) 06:45:28 ID:???
やはりWebProg板はレベルが低いな。最高。
81nobodyさん:2007/09/23(日) 06:53:38 ID:???
だって初心者スレだもん。いいじゃない。

なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw
Webprogなんだから、動けばいいじゃない的な考えがイクナイ?
82nobodyさん:2007/09/23(日) 07:50:40 ID:???
if ( $hoge =~ /$moge/ ){ print "もげら" }
って感じで書いて$mogeが展開されてくれないみたいなんだけど、
特別な書き方があるのかな。
ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、
こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。

教えてちゃぶだい。
83nobodyさん:2007/09/23(日) 08:00:28 ID:???
>>82
$mogeの中には何が入ってるの?
2バイト文字関係とか、文字コードでこけてる可能性もありそう。
84nobodyさん:2007/09/23(日) 11:07:04 ID:???
>>82
変数使うときはquotemeta()くらいはかましときなはれ。
85nobodyさん:2007/09/23(日) 14:57:13 ID:???
サンクス!
quotemetaでいけたよ。

1)index($hoge, $moge) でもやったけどダメ
2)auotemeta() してみた
3)$hoge =~ /$moge/ で成功!
4)でもなぜかそれ+ index($hoge, $moge) じゃダメ

って感じだった。
中に入ってるのはどちらもEUCの2バイト文字列なんだけど、
なぜか$mogeが空の文字列として扱われてしまってるっぽい動作だった。
print $hoge.$moge;とかで出力するとちゃんと出力されるんだけどね。
良く分からないけどとりあえず解決はしてよかった。
ありがとう。
86nobodyさん:2007/09/25(火) 00:47:19 ID:XOfpdsF8
はじめまして。

use strict;
use diagnostics;

という宣言をした状態で、

Name "html::copyright" used only once: possible typo at bbs.cgi line 554 (#1)

というwarningが出ました。

html::copyrightは、htmlモジュール で、
$copyright = 'hogehoge ';
などというように、宣言されています。
warnings は、他のモジュールの変数は見てくれないのでしょうか?

実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
(他のwarningにも混じってしまい、識別が困難です)
このwarningをつぶしたいのですが、何とかする方法はないでしょうか?
87nobodyさん:2007/09/25(火) 00:49:11 ID:XOfpdsF8
x 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。
o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。

used only once: possible typo・・・
は、意味は、わかっておりまして、
一度しか使ってないので、ミスじゃない?ってことなのですが、
実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。
88nobodyさん:2007/09/25(火) 03:43:51 ID:???
>>87
Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?
8986:2007/09/25(火) 17:25:00 ID:XOfpdsF8
試しに、最小限のコードを書いてみたら、
-----test_pm.pm-------
package test_pm;
use strict;
use warnings;

our $hoge = "test foo bar";
1;
-----main.pl---------
use strict;
use warnings;

use test_pm;
print $test_pm::test;
-------------------

> perl main.pl
Name "test_pm::test" used only once: possible typo at main.pl line 5.
Use of uninitialized value in print at main.pl line 5.

ちゃんと、Use of uninitialized value でて、実行不能でした orz
ourでも、myでも同じでした

>>86は、CGIなんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。
9086:2007/09/25(火) 17:28:00 ID:XOfpdsF8
x print $test_pm::test;
o print $test_pm::hoge;

スペルミス。
これでも同じ結果です。
91nobodyさん:2007/09/25(火) 21:26:37 ID:o7XeBw4v
先日このスレで
END{<STDIN>}
を教えてもらったものです。その節はありがとうございました。

ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、
エラーが出てるときに一瞬で画面が閉じてしまうのです。

ちなみにその時のエラーはuse strictによるmy使え先刻でした。
途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、
エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか?

エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを
代わりにそのままSTDINに出力してもらえばいいわけなのですが。
92nobodyさん:2007/09/25(火) 21:28:39 ID:???
>>89
CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。
93nobodyさん:2007/09/25(火) 21:36:47 ID:???
>>91
コンソールを開いておけない余程の事情でもあるの?
9491:2007/09/25(火) 22:20:58 ID:o7XeBw4v
>>93
いえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter

という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。

意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。
95nobodyさん:2007/09/25(火) 22:46:42 ID:???
>>94
同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる

エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT
9691:2007/09/26(水) 00:17:27 ID:zmZEFb0X
>>95
2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。

STDERRの取得方法があるのでしょうか?
97nobodyさん:2007/09/26(水) 00:27:31 ID:???
>>89
これ、ActivePerl 5.8.8.822で普通にtest foo barと表示された
ダメ出しも無し
98nobodyさん:2007/09/26(水) 00:37:06 ID:???
>>96
ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。

…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。
99nobodyさん:2007/09/26(水) 00:41:02 ID:???
>>91
echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause

みたいなバッチファイル作って、,plに関連付けして置くぐらいかなぁ。

統合型開発環境(みたいなエディタ)を使うと、その場で実行して、
その場で結果表示できたりするので、そういうの使うと便利だよ。
100nobodyさん:2007/09/26(水) 00:56:23 ID:???
しまった。
> perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9

> perl %1 %2 %3 %4 %5 %6 %7 %8 %9
だた。
101101:2007/09/26(水) 02:22:27 ID:???
型グロブというものについて
教科書を今日読んで理解したので
型グロブについて誰か質問してください。
説明します。
102nobodyさん:2007/09/26(水) 05:15:12 ID:???
型グロブをうまいこと使っているモジュールを列挙してください。
103nobodyさん:2007/09/26(水) 13:38:32 ID:???
>>99-100 perl %*
104nobodyさん:2007/09/26(水) 17:01:12 ID:???
>>101
ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど

上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。
105nobodyさん:2007/09/26(水) 18:35:06 ID:???
ビウログってなんですか?
106nobodyさん:2007/09/27(木) 02:15:46 ID:rW8f5K4d
質問です。

if($Fm{'form'}){  処理  } #フォームに何か入力されていれば処理

上記の場合
フォームに0と入力した場合もスルーされてしまいます。
認識させるにはどのような書き方になるのでしょうか。

if分の前に
$Fm{''form'}=sprintf( "%c", $Fm{''form'} );
のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。
よろしくおねがいします。
107nobodyさん:2007/09/27(木) 02:23:35 ID:???
if($Fm{'form'} ne ""){  処理  }
108nobodyさん:2007/09/27(木) 02:35:47 ID:???
>>107
素早い回答ありがとうございます。
その手がありましたか。目からうろこでした。
ありがとうございます!
109nobodyさん:2007/09/27(木) 03:41:52 ID:???
length とかも
110nobodyさん:2007/09/27(木) 06:29:35 ID:???
1000:1234:abcd:2000::/120のような省略されたIPv6のアドレスを展開して
リストに格納したいのですが、プレフィックス長(=120)に応じて
展開する部分が一部不完全なので教えてください。
下のコードだと、下4桁の連番生成しかできない上に、プレフィックス長が4の倍数でない場合にうまくいきません。
これを4の倍数でなくても&下4桁以上もちゃんと展開できるようにしたいのですが…。
たとえば、1000:1234:abcd:2000::/127であれば、
1000:1234:abcd:2000:0000:0000:0000:0000
1000:1234:abcd:2000:0000:0000:0000:0001
の二つが出来てほしいのです。
できれば10進数で連番作ったものを16進数変換してる部分もなんとかしたいんですけど…。

sub _Gen{
  my ($addr, $pref) = split(m|/|, $_[0]);
  $addr = &_Format($addr); # ここで省略のない32桁の英数字を4桁ごとに:で区切ったものになる
  $addr =~ s/://g;
  if($pref % 4 != 0 || $pref < 112 || $pref > 128){
    return;
  }elsif($pref == 128){
    1 while $addr =~ s/(\w+)(\w\w\w\w)/$1:$2/;
    return $addr;
  }
  my $fixed = substr($addr, 0, $pref / 4);
  my $keta = (128 - $pref) / 4;
  my (@addrs, $tmp);
  for(my $i=0; $i<16**$keta; $i++){
    $tmp = sprintf("$fixed%0${keta}x", $i);
    1 while $tmp =~ s/(\w+)(\w\w\w\w)/$1:$2/;
    push(@addrs, $tmp);
  }
  return @addrs;
}
111nobodyさん:2007/09/27(木) 06:34:39 ID:???
defined 常考
112101:2007/09/27(木) 09:02:14 ID:???
型グロブについて。

スカラー変数
アレイ
ハッシュ(連想配列)

この3つを同時に
扱うために、型グロブは
生まれてきたのです。
113101:2007/09/27(木) 09:04:34 ID:???
例えば

$a ←これはスカラー変数
@a ←これはアレイ(配列)
%a ← これはハッシュ(連想配列)

aの左側についてる記号は
$だったり
@だったり
%だったりとそれぞれ違うが
記号の右側はaで全部統一されている。

このとき

「aの型グロブ!」
と宣言すれば、

$a @a %a

この3つを全部同時に扱うことができる。
これが型グロブ。
114nobodyさん:2007/09/27(木) 09:14:21 ID:???
こいつはOmotiとかタクトくせぇ
115101:2007/09/27(木) 09:59:46 ID:???
つまり
4年1組と
4年2組と
4年3組が
いたとして、

「4年生全員集合!」
と言うと、4年生が全員集まってくるのです
これが型グロブです。
116nobodyさん:2007/09/27(木) 11:04:43 ID:???
全員集まってくることがどういうことか(メリットなど)
を語らないと通じないでしょ
肝心な部分が抜けてるポ^^
117nobodyさん:2007/09/27(木) 13:26:43 ID:???
どっちも4年生なら配列かハッシュ使えば済むでしょ
どっちかというと「全学年の1組集合」の方が近いのではないかと。
118nobodyさん:2007/09/27(木) 13:32:25 ID:???
その例なら多重配列使いたいからそれもちょっと…
119118:2007/09/27(木) 13:33:29 ID:???
ごめん勘違いしてた
120nobodyさん:2007/09/27(木) 13:34:07 ID:???
この聞いてjも居ないのに延々と騙ろうとするのはタクトに違いない。
121nobodyさん:2007/09/27(木) 13:58:24 ID:???
ねぇねぇ
なんでおじちゃんたち
DBが全部やってくれることを一生懸命書いてるの?
122nobodyさん:2007/09/27(木) 14:53:03 ID:???
DB使ってないしぃ
123nobodyさん:2007/09/27(木) 15:13:12 ID:???
DB使わない理由って やっぱサーバーにないから?
それとも手をつけたことがない?
後者なら絶対覚えたほうがいいよ。
生産効率が全然ちがうよ
124nobodyさん:2007/09/27(木) 16:59:17 ID:???
>>110
これじゃだめなん?

use Net::CIDR;

print join("\n", Net::CIDR::cidr2octets("1000:1234:abcd:2000::/127"));
125nobodyさん:2007/09/27(木) 17:11:50 ID:???
わざわざDB使うほどの事してないしぃ
ゴミ箱にごみを捨てるのは、わざわざ執事雇って呼んで捨てさせる程の事じゃないしぃ
126nobodyさん:2007/09/27(木) 19:38:27 ID:???
>>124
うああああ、助かった
こんな便利なものがあるなんて!
ありがとう〜!
127nobodyさん:2007/09/27(木) 20:05:25 ID:fs1IYXrA
色々なPerlがあるようですが、
rand ≠ rand(1)
となるものはあるのでしょうか?ちなみに自分のactiveperl fow win32 5.8は
rand == rand(1)
になっていると思います。
サバによって違うなら面倒でもrand(1)としといたほうが無難なのでしょうか?

それと演算子の優先順位をわかりやすい表にしてるところ知っていたら教えてくださいませm(__)m

last if 1-rand(1) <= 0.3;
こういうの書く時
last if ( (1-rand(1)) <= 0.3);
とすれば確実ですが、地味に面倒で意外と見づらいです。
128nobodyさん:2007/09/27(木) 20:36:42 ID:???
同じだよ
その手の仕様をプラットフォームによって違うようにする必要性がないし
129 ◆TWARamEjuA :2007/09/27(木) 20:40:25 ID:??? BE:2178645-2BP(6825)
130127:2007/09/27(木) 20:54:10 ID:fs1IYXrA
>>128
そうですよね。まあでも括弧を外すなら結局rand(1)としないとしつこく引数にとられてしまいますね。
>>129
英語のページですか・・・
僕の学力の低さを見透かしたような皮肉orz

バカにでもわかる一覧表的なページはないということでFA?
131nobodyさん:2007/09/27(木) 21:18:44 ID:???
unless (0 and 1){
print 1;
}

1と表示されます。unlessは条件式が偽を出してくる時にブロックを実行するのですよね?
0 and 1なら片方が真を出すのでブロック実行されないと思ったのですが。
複数の条件式が全て偽を出した時にだけブロック実行をさせたいのです。

回答宜しくお願いいたします。
132131:2007/09/27(木) 21:22:38 ID:???
ちなみにこれをifでやるとさらにおかしなことになります。

if (1 and 0){
print 1;
}

これです。何も表示されません。先ほどのunlessとの整合性がつきません。
ifによる条件式部分ではちゃんと二つ共が真の時だけ実行されるのに、
unlessの場合は片方が偽を出せば実行されます。

もしかして
真 and 偽
は最終的に偽扱いされるのですか?
133nobodyさん:2007/09/27(木) 21:28:31 ID:???
>>132
>もしかして
>真 and 偽
>は最終的に偽扱いされるのですか?
そう。当たり前。
134nobodyさん:2007/09/27(木) 21:28:52 ID:???
(0 and 1) は(「偽」かつ「真」)だからそんなの成り立たない
(「真」かつ「真」)なら結果「真」と評価できる
つまり、(0 and 1)は常に「偽」と評価される
だから unless (偽) は常にそのブロック内が実行される
135131:2007/09/27(木) 21:46:53 ID:???
なるほどです。
やはりちょっと違いますねunlessは。
ifのfalse版みたいに思うと微妙にやられますね。

全然関係ない話ですが、Perlには資格ってあるのですか?
書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。
頑張って勉強してそのうちバイトでプログラムの仕事取ってみたいですが、
その時にそういう資格的なものがあるなら売り込みやすいなと思いまして。

本当に関係ない話ですいません。
136nobodyさん:2007/09/27(木) 21:59:00 ID:???
137127:2007/09/27(木) 22:08:14 ID:fs1IYXrA
>>136
日本語のページありがとうございます。
見てきますm(__)m
138nobodyさん:2007/09/27(木) 22:39:59 ID:???
perlの仕事なんか無いよ
139nobodyさん:2007/09/27(木) 22:51:34 ID:???
>>135
記号論理をやれば当然のことで、それを理解していればifの否定版と考えて問題は起きない
140nobodyさん:2007/09/28(金) 00:24:10 ID:???
スカラー変数と配列変数をいっぺんに作りたいです。
my ($s1,$s2............$s20);
my (@r1,@r2............$r20);

全部書くのが面倒な時は簡単な方法はありますか?
141nobodyさん:2007/09/28(金) 00:37:13 ID:???
コードの先頭でまとめて宣言するってこと?
そんなことすんならuse strict使わない、宣言しないほうがよっぽどいい
142140:2007/09/28(金) 00:42:26 ID:???
>>141
# 初期化

というところでいっぺんに使う変数を宣言しています。
何故というより癖みたいなものですかね。
それで分析プログラムを作ってたら、やたらと記録や集計用の変数が必要になったんです。
一つ一つまともに名前を考えるのが非効率なのでそこだけ適当な名前にしています。

strcit使いながら賢く宣言できませんか?
無理ならあきらめます。
143nobodyさん:2007/09/28(金) 01:00:34 ID:???
変数をたくさん使いたいなら代わりにハッシュ使えば一つで済むじゃん
144nobodyさん:2007/09/28(金) 01:01:15 ID:???
なんだか意味が良くわからないけどハッシュにいれればいいじゃない
キー名を考えるのは同じだけど
145nobodyさん:2007/09/28(金) 03:02:00 ID:???
>>140
なんか、その変数名だと単に配列と二次元配列の初期化だけですむ気がすんだけど?
my ( @s, @r ) ;
# @s は、オマエさんの ( $s1, $s2, ..... ) を入れる配列
# @r は、オマエさんの ( [@r1], [@r2], .... ) を入れる配列

本当に別々の変数名が必要なのか?
本当に必要ならば上の人たちが言ってる通りハッシュorハッシュリファレンス
使え。
146nobodyさん:2007/09/28(金) 03:04:18 ID:???
for (1..20) { eval "my(\$s$_ , \@r$_)" }
147140:2007/09/28(金) 06:42:10 ID:???
>>143-145
ごもっともなんですけど、リファレンスにするとコードが汚くなるんですよね。
いちいちデリファレンスしながらのコードは読みにくいし。
ハッシュも同じです。単なるスカラーと配列変数以上に読みやすいものはないかと。

>>146
それってforブロックの中でローカル化されてませんか?
evalするとローカル化されないとか?
148nobodyさん:2007/09/28(金) 06:53:34 ID:???
>>147
そのevalに突っ込み入れられる実力があれば、
キミの望んだことは実現出来るよな?

まあ、自分の考えに固執しないで、他の人が普通に「hash使え」って
言ってる意味を考えた方が良いと思うけど。
=> perlでは143-145が普通の感覚だし、たかだか変数の
 宣誓にevalなんぞ使ってたら「変態さんがいるわ&hearts」
 と言われること受けあいだ。
そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
149nobodyさん:2007/09/28(金) 08:03:45 ID:???
> 書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。

書道の段位なんて流派ごとに異なるので、客観性があることにできないんと思うよ。
日商簿記2級くらいまでなら試験対策する時間さえあれば能力関係なしにとれるから
持ってたからといってだから何?レベルだよね。
150nobodyさん:2007/09/28(金) 08:31:35 ID:???
ttp://d.hatena.ne.jp/naoya/20050809/1123563794
脳内では、コレが参考になるかもしらんが、
○自己判断のレベルが客観的判断のレベルと一致しない。
○レベル7と8との間にとても深くて暗い河がある。

プログラミングの技量の判断として有名なのはFizzBuzz問題
だが、有名になりすぎて知ってて当たり前。
151nobodyさん:2007/09/28(金) 12:19:13 ID:???
Lv8かなぁ?Lv9にはなってない気がする。
152nobodyさん:2007/09/28(金) 14:28:43 ID:???
>>150
ほんと、7と8の間の河が深すぎる。7.5がほしい。
俺はたぶん6か7だけど。
153nobodyさん:2007/09/28(金) 15:13:33 ID:???
use strictってどういう効果有るの?ググってもよく分からないや

とか思ってる他人のソース弄って何とかしている人がここに一人。
154nobodyさん:2007/09/28(金) 15:43:49 ID:???
strictやwarningsは融通が利かなくなるので嫌いでちゅわ
155nobodyさん:2007/09/28(金) 15:58:21 ID:???
いいね、初心者スレらしい。
156nobodyさん:2007/09/28(金) 16:22:17 ID:???
strictや-wを使って粋がってる自称玄人は笑えるww
157nobodyさん:2007/09/28(金) 16:32:49 ID:???
無理にstrictやwarings使って本末転倒になってる馬鹿はよく見る
158nobodyさん:2007/09/28(金) 17:27:09 ID:???
普段から常に使ってるがどういう場面で本末転倒になるんだろう
159nobodyさん:2007/09/28(金) 17:36:03 ID:???
その昔はグローバル変数をサブルーチンでいじり倒すようなコードがあったけど
スコープ区切って引数と戻り値のやりとりするほうが100万倍読みやすいよ
160140:2007/09/28(金) 18:12:42 ID:???
>>148
>そのevalに突っ込み入れられる実力があれば、
>キミの望んだことは実現出来るよな?

すいません。もう少し普通の会話がしたいです。

>そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?

このよくある「答は一つ、綺麗でスマート」っていうのはどうにも好かない。
161nobodyさん:2007/09/28(金) 20:40:06 ID:???
>>160
じゃおまえの好きなようにすれば?
162nobodyさん:2007/09/28(金) 21:25:32 ID:???
>>140
「Perlはあなたが自分の首を締めるのに十分なロープを
提供しているのだ」てな忠告がラクダ本に載ってたな。

#--- Filter/Range.pm ---
package Filter::Range;
use strict;
use Filter::Simple sub {
  s{
    my \s* \( \s*
    ([\$\@%][A-Z_a-z][0-9A-Z_a-z]*?) ([0-9]+) \.\. ([0-9]+)
    \s* \)
  } {
    'my(' . join(',', map "$1$_", $2 .. $3) . ')'
  }egx;
}; 1;
__END__

#!/usr/local/bin/perl -w
use strict;
use Filter::Range;
my($s1..20) = (1..20);
print $s10;
__END__
163nobodyさん:2007/09/28(金) 21:41:10 ID:???
Damian Conway ぷろだくとか。
164nobodyさん:2007/09/28(金) 22:27:42 ID:3wKaaJqT
サブルーチンを10個くらい作ってあります。
同じディレクトリに5個くらい違うCGIファイルがあります。
5個のCGIファイル全てに、冒頭の10個のサブルーチンをコピペしてあります。

print routin(1,2);
5個のCGIふぁいるではこういう記述でサブルーチンが使えます。
どうもこれを外部ライブラリ化とかいうのすると
print パッケージ名::routin(1,2);
で使えるようになるとか。

でもパッケージ名を入れるとなると5個のCGIファイル全てを書き直すのが嫌です。
またパッケージ名が入って見た目がウザくなるのも嫌です。

外部ライブラリにしながらも、メインパッケージにあるのと同じごとくサブルーチンを使うにはどうすればいいでしょうか?
メインパッケージに初めに全部もらえばいけるんじゃないかとか妄想していますが。
165nobodyさん:2007/09/28(金) 22:30:18 ID:???
>>164

>>19読んで応用しろ。キーワードはexporter
166nobodyさん:2007/09/28(金) 22:45:38 ID:3wKaaJqT
orz
167nobodyさん:2007/09/28(金) 23:42:41 ID:???
べつにExporterなんかいらないだろ
全部plファイルにしてrequireでつなげろ
168nobodyさん:2007/09/28(金) 23:57:57 ID:???
おれだったらOOPが楽かな
169nobodyさん:2007/09/29(土) 00:02:00 ID:???
>>167
すげえまじで感動したw
つか、require '....pl' ってperl4時代のモンだと思って使ってもなかったよ。
これからも使わんけどw
もちろんstorableとか使用するときには必須>require
170nobodyさん:2007/09/29(土) 00:04:52 ID:???
があ、Data::Dumper の読み込み時だ。require 使うのorz...
171nobodyさん:2007/09/29(土) 00:51:07 ID:2KPMiuug
>>167
え?
明日試してみます。
172nobodyさん:2007/09/29(土) 02:58:11 ID:???
みんなrequire つかわないのかw
おらぁ使いまくりだ
メインCGI一個に 汎用サブルーチンplに処理ブロックごとにpl分割
これが楽でいい。
173164:2007/09/29(土) 06:51:46 ID:2KPMiuug
>>167
できないんですけど・・・・
s.plのpackage s;にサブルーチンを移しました。
で、

print check(1,2,3,4,5);
でエラーでました。メインパッケージにそんな関数ないと。
もちろん
print s::check(1,2,3,4,5);
なら動作します。

どういうことですか?
ウソ付きましたか?
174nobodyさん:2007/09/29(土) 07:14:33 ID:???
3時間の出来事をシミュレーションするプログラムを書いています。
一応完成したのですが、時間の捉え方が「残り時間」というものになっています。
これを例えば、9時〜12時の間とかで捉えたいのです。

今は内部の処理が進むにつれて「残り時間」の変数を減算して、「残り時間」変数が0になったら処理おしまいというものです。
これを開始時刻と終了時刻を初めに決めて、+10秒とか命令出しながら実際に時間が進んでるかのような感じに
「今何時?」と聞けるくらいの感じに変えてみたいのです。

使えそうなモジュールがあったら教えてください。
175nobodyさん:2007/09/29(土) 07:57:19 ID:???
>>173
>package s; に移しました。
何故移す?
176nobodyさん:2007/09/29(土) 12:27:00 ID:???
変数名を参照することって出来ますか?

$test = 'abc';

という変数があるとして、$testの'test'の部分を知りたいのです。
例えば、@a = ($test, $boo, $hoge);
という配列があるとして、
これを それぞれ変数名 => 値 というハッシュに変換したいのです。
$h{'test'} => 'abc'
のように。
177nobodyさん:2007/09/29(土) 13:07:39 ID:???
>>176
> @a = ($test, $boo, $hoge);
この時点で $a[0] には $test が持つ値 'abc' そのものがコピーされて入る。
よって代入後に @a 内の各値からコピー元の変数名を辿る事はできない。
178nobodyさん:2007/09/29(土) 21:46:18 ID:m5gmrcyE
文字コードをUTF-8に変換したいのですが

use Jcode;
$str = "あああ";
print Jcode->new($str)->utf8;

とすると
Undefined subroutine &Jcode::_Classic::euc_utf8 called at パス/Jcode/_Classic.pm line 255.
というエラーが発生してしまいます。

ちょっと調べたらJcodeのバージョンを下げれとありましたがそれは無理なので何か他に方法はないでしょうか。
179nobodyさん:2007/09/30(日) 02:32:26 ID:???
未だにJcodeが使われるのは子飼弾がちゃんとEncodeの使い方を解説しないからなのか・・・
180nobodyさん:2007/09/30(日) 04:35:03 ID:???
>>178

使っているPerlのバージョンは?
Jcodeはどのようにインストールしたもの?

>>179
Web関連のムックで書いてなかったか? >Enocdeの使い方

181164:2007/09/30(日) 08:09:20 ID:9pVP3h63
>>175
そりゃ中身なにもないものをrequireしてもしょうがないからですよ。
一体何が間違ってるというんですか?

メインパッケージにないものをrequireを使えば
routin(1,2,3);
で呼べるというのは本当なんですか?ウソなんですか?
182nobodyさん:2007/09/30(日) 08:18:04 ID:???
ほらね、strictとwarningsを無理に使うと本末転倒になるでしょ。
183nobodyさん:2007/09/30(日) 08:34:17 ID:???
>>181
誰もウソなんかついちゃいない。
お前が全然理解できてないだけ。
184164:2007/09/30(日) 08:40:27 ID:9pVP3h63
>>183
だから何をどうしろというんですか?
最小コードを教えてください。
185nobodyさん:2007/09/30(日) 08:49:27 ID:???
>>182
181の事を示して言ってるならwarningsもstrictも無関係にエラー出るぞ。
176はそう言う次元のお話しではないし、
178は、my宣言してないからwarningsとか宣言してないと見るが?

別にstrict,warningsを嫌うのは勝手だけど、事象は切り分けてくれ。
ここは初心者スレで勝手に脳内変換して>>182を信じてしまう人が
いる可能性もあるんだから。


186nobodyさん:2007/09/30(日) 08:59:25 ID:???
>>184
うざいなあ、ここで文句垂れてる間にググればとっくに exporter の使い方も
習得出来てるだろうに

% cat foo.pl
sub foo{ 1 ; }
1;
% perl -le 'require q{foo.pl} ; print foo()'
1
187nobodyさん:2007/09/30(日) 09:40:39 ID:???
>>185
ああごめん。mod_perlと混同して勘違いしてた。
Perlが初めての方なら尚更strict/warningsは
ややこしくなるから不必要だと思うけど。
188164:2007/09/30(日) 10:10:19 ID:9pVP3h63
>>186
突っ込みが下手すぎ。
package使うなって言って欲しかった。
189nobodyさん:2007/09/30(日) 10:12:50 ID:???
>>188
くだらない質問でもど偉そうに聞いていいスレ
http://pc11.2ch.net/test/read.cgi/php/1158647441/
190164:2007/09/30(日) 11:09:19 ID:9pVP3h63
もしもお前に部下がいるなら可哀想だ。
まだ使う側でないというなら、今のうちに間違いを指摘してきた相手が目下だと反省のできない上司にならないよう気をつけておけ。
191nobodyさん:2007/09/30(日) 12:11:48 ID:???
>>188
「最小コードを書け」
って言われたから書いたまでだが?
>>175で package に関する点は指摘されてるだろ

>>187
mod_perl の mod の字も出てないのに…
192nobodyさん:2007/09/30(日) 12:51:11 ID:???
自分の読解力、理解力の無さを棚に
上げて回答者を批判する男の人って…
193164:2007/09/30(日) 14:35:18 ID:9pVP3h63
>>191
>>175のどこがpackageに関する点の指摘なのよ。
あれじゃサブルーチンを別ファイルに移した事の指摘だろ。

>>192
女ならいいのか?クソフェミニストめ。
194nobodyさん:2007/09/30(日) 15:37:17 ID:???
質問してもよろしいでしょうか?
すみませんが宜しくお願いいたします。

特定の契機を迎えたとき?
@_や$_には値が自動でセットされるようになっていますよね?
その契機の一覧みたいなものが知りたいのですが、膨大ですか?
うまくまとめてるサイトあれば教えてください。
195nobodyさん:2007/09/30(日) 15:38:11 ID:???
やはり読解力の欠片も無いな
196nobodyさん:2007/09/30(日) 15:44:41 ID:???
197nobodyさん:2007/09/30(日) 16:14:26 ID:???
>>179
5.005とか5.6と互換を取るのに便利だったりする。
(5.005は古いバージョン使ってたり、変換規則が違ったりするけど。)

それはともかく、チュートリアルをpodで欲しいとか思うよね。
unicodeのチュートリアルとか、あっちこっちにドキュメントが散らばってて、
しかも、翻訳も無かったりして、初心者にはきついと思う。
198nobodyさん:2007/09/30(日) 23:01:50 ID:???
コーディングではないけれどPerl関連(Windows関連?)ということでお願いします。
PerlのパスをUNIX風に設定しておくことってできますか?(usr/bin/perl)
今は5.8なんですが、前に5.6の頃、実際のパスがc:\perlだとしても
この書き方(パス)で動いてた気がするんだけど・・・
199nobodyさん:2007/10/01(月) 00:24:00 ID:???
5.8でも動く件
200198:2007/10/01(月) 01:04:55 ID:???
>>199
すんません、ブラウザでCGIとして起動した場合はどうですか?
関連に気づかなくて書かなかったんですが、
こちらでもプロンプトでは動くんだけど、ブラウザではアウトです。
201nobodyさん:2007/10/01(月) 01:27:53 ID:???
普通にpath通せばいいんじゃね?
202nobodyさん:2007/10/01(月) 02:12:06 ID:???
それはPerlじゃなく各々のhttpdの管轄
なので他の適切なスレを当たって下さい
203198:2007/10/01(月) 02:14:31 ID:???
>>201
ありトゥース!・・・が、しかし。。
恥をしのんでお尋ねしますが、パス通すって・・?
Windowsの環境変数にusr/bin/perlを追記するってことではないですよね。
い、いかように・・・
204nobodyさん:2007/10/01(月) 07:19:52 ID:???
関連付けでおk。
205nobodyさん:2007/10/01(月) 09:49:39 ID:4GodVsb7
>>180
レス遅くなってすみません。
JcodeやめてEnocdeで対応させました。

perlのバージョンは5.8、Jcodeは最初サーバーには入っていなかったので
自前で自分のディレクトリにインストールして使ってました。
それで問題なかったのですが最近サーバの方が用意してくれたらしく
そっちを読み込むようになってました。
そのサーバにインストールされた新しいJcodeで問題が発生していたと言う次第でした。
しかし新しいJcodeはなんであんなとんでもないバグを持ってるんだろうか。
UTF-8変換できなきゃJCodeの存在意義が無くなるのに。
206nobodyさん:2007/10/01(月) 10:32:27 ID:???
>>203
環境変数にperl.exeのパスを通せばいい。
もしくは出来るならhttpdの方で指定するとか。
207nobodyさん:2007/10/02(火) 00:21:38 ID:???
>>203
かなり無理やりな解決方法。

C:\直下にusrを作って、そこへC:\Perl\bin\(Enter連打でinstした場合)をフォルダごとコピー。
でC:\Perl\lib\とC:\Perl\site\もフォルダごとコピー。
これでC:\usr\直下に、binとlibとsiteができる。
それでcgiファイルの頭に
#!/usr/bin/perlでOK。

でも、ppmや、自前でモジュールインストールする度に、本来のC:\Perl\以下よりlibやsiteをコピー
しなければならないし、UpgradeやUninstallの時も当然ながら消してはくれません。
普通の人にはお勧めできない。

実を言うと、C:\直下にusrやtmpやvarなんかを作ってると、perlスクリプトの中からフルパスで
/var/tmp/〜とかやってファイル操作したりするのに、Unix環境といちいち書き換えなくて済むっちゅう
横着ができたりします。
208nobodyさん:2007/10/02(火) 00:40:37 ID:???
activeperlで>207の方法をやるなら、perldoc reloc_perlを見ると幸せになれるかもしれない。
209nobodyさん:2007/10/02(火) 01:54:23 ID:???
質問です。
LWP::UserAgentとCrypt::SSLeayを利用して、SSLでサーバと通信を行っています。
相手先の証明書が、期限切れなど信頼できない場合は、以降の処理を打ち切りたいのですが、
それを判別するにはどうすればよいですか?
210nobodyさん:2007/10/02(火) 02:05:01 ID:???
LWP::Protocol::httpsにヒントがあるかもね
211180:2007/10/02(火) 02:34:16 ID:???
>>205
ん、別に少し間が開いたくらいは気にせんからいいよ。

ただ、サーバー管理者が入れたのがおかしいってのは変だね。
症状からすると、(わざわざ)pure perl のコードを選択したときのバグっぽいけど
これって fix されたんじゃなかったっけか?

それにPerl本体が 5.8なら Encodeを利用する形でJcodeは入るはずだしなあ。
212nobodyさん:2007/10/02(火) 06:25:36 ID:SbhRpQr+
レン鯖に特定のモジュールがインスコされてるかどうか
テストするのに良い方法はないでしょうか?
213nobodyさん:2007/10/02(火) 07:23:13 ID:???
@INCを総当たり
214nobodyさん:2007/10/02(火) 08:34:43 ID:???
>>211
原因を特定できないのなら黙っておけ。
215nobodyさん:2007/10/02(火) 09:25:29 ID:???
>>212
実際に use して調べるのが一番確実。

#!/usr/bin/perl -w
use strict qw(subs vars);
my $token = qr/[A-Z_a-z][0-9A-Z_a-z]*/;
my $module = ($ARGV[0] || '') =~ /^($token(?:::$token)*)\z/ ? $1 : '';
my $result = $module ? eval "use $module" : 'usage: http://.../this.cgi?Module::Name';
$result ||= $@ || qq/$module ${"${module}::VERSION"}/;
print "Content-Type: text/plain\n\n$result";
__END__
216nobodyさん:2007/10/02(火) 09:39:01 ID:???
もう少し可読性を高める努力をしろよ。
217nobodyさん:2007/10/02(火) 10:20:20 ID:???
>>207
インストールしなおしでその構成になるようにしたほうがいいんじゃ・・・
218nobodyさん:2007/10/02(火) 17:33:08 ID:???
$^Oが取り得る値のリストってどこかにない?
219nobodyさん:2007/10/02(火) 19:19:35 ID:???
220nobodyさん:2007/10/02(火) 20:12:26 ID:???
>>215
コードまで書いていただいてありがとうございました。
use <モジュール名> をevalして戻り値を確かめるわけですね。
どうもevalは使うのに躊躇してしまうんですが、こういうときは便利ですね。

>>213
@INCの中を覗くという発想も考えたことがなかったので
やってみたいと思います。
221nobodyさん:2007/10/02(火) 21:03:46 ID:2QBdgnfp
日本語変換の問題について質問です。
コードをEUCで書いて、出力をShift_JISで行うのが目的です。

今はjcode.pl使っています。
activeperlのwinxp用でローカルチェックをしています。

JCODEというモジュールもあるそうですが、activeperlには初期状態でなかったりしますよね。
確か自分は入れた覚えもあるのですが。

オススメは何ですか?
確か他にも変換用のモジュール?はあったと思いますが。
euc,shift_jis,jisの3つだけでのオススメが知りたいです。
222nobodyさん:2007/10/02(火) 21:47:16 ID:???
>>221
万能解は無いので、Encode / Jcode / jcode.pl / Unicode::Japanese を
一通り使い込んでから、好みと用途に合ったものをお選びなさいな。
223nobodyさん:2007/10/02(火) 23:24:50 ID:???
いまさらjcode.pl薦めるなよ。
224221:2007/10/02(火) 23:41:50 ID:2QBdgnfp
jcode.plを除いて一番汎用的に使えるのはどれですか?
汎用的って言っても、サーバーやローカル環境で一番広く使えるものです。
一番広まってるモジュールといえばいいのですかね。
225nobodyさん:2007/10/03(水) 00:23:34 ID:???
リストをリストのままリストの個数を得るにはどうすればいいですか?

(1,2,3,4,5)
これを配列にいれずにってことです。
grepとかでもリストが作られますよね。
そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。

scalar(@{[grep{$_>0}]})
っていうのも同じくなんかなぁと思います。
普通にないなら関数作ろうと思うのですが。
226nobodyさん:2007/10/03(水) 00:41:53 ID:???
scalar(@{[1,2,3,4,5]})
227nobodyさん:2007/10/03(水) 00:41:53 ID:???
はあ
228nobodyさん:2007/10/03(水) 01:16:44 ID:???
システムに依存する組み込み関数が使用できるかどうか
手っ取り早く調べる方法ってなにかな?
229nobodyさん:2007/10/03(水) 01:49:55 ID:???
>>224
インスコしてなかったら自分で読み込むようにすればいいよ。
use libつかうなり同階層に置いてuseするなり。
230nobodyさん:2007/10/03(水) 01:58:30 ID:???
>>224
Perl 5.8.x なら標準モジュールの Encode が一番広まっていると言えば
広まっている。

>>225
リストコンストラクタが幾つの要素を吐くかは、吐かせてみないと
分からない。吐かせた結果を保存しないのなら、目の前を流れていく
個数を数えるしかない。

sub count { scalar @_ } $num = count((1) x rand 10);
$num = scalar @{[ (1) x rand 10 ]};
$num = 0; ++$num for (1) x rand 10;

>>228
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlport.pod#FUNCTION_IMPLEMENTATIONS
に目を通した上で eval 内で実際に使用して確認。
231225:2007/10/04(木) 00:46:59 ID:kUiVRXqk
>>230
黒魔術みたいなコードはいけないってこのスレで教えてもらいました。
素人ながら納得しました。
ですからあなたもそういうコード書いていてはいけないと思います。
それも教える側でそれを使うと黒魔術が流行ってしまいます。

僕にはあなたのコードが何をしてるのかわかりません。
232nobodyさん:2007/10/04(木) 00:52:08 ID:???
++$num for (1) x rand 10;
こんな書き方はじめてみたw
7行プログラミングとかに出てきそうだな。
だれか解説というか一般的な形にしてクレクレ
233nobodyさん:2007/10/04(木) 00:57:28 ID:???
foreach((1) x rand(10)){
++$num;
}
234nobodyさん:2007/10/04(木) 02:06:39 ID:???
こんなの全然黒魔術じゃないと思うが・・・
235nobodyさん:2007/10/04(木) 03:26:46 ID:???
中身が1行のfor(もしくはforeach)なんて普通こう書かんか?

↑もう何年もforeachなんて書かずにforで済ませてるからスペル調べちまったw
236nobodyさん:2007/10/04(木) 03:33:49 ID:???
それは分かりづらい。括弧でくくった方がいいな。
++$num for ((1) x rand 10);
237nobodyさん:2007/10/04(木) 06:44:51 ID:???
これだからPerlのコードは気持ち悪いんだよな
238225:2007/10/04(木) 07:08:27 ID:kUiVRXqk
((1) x rand(10))
これの意味がわかりません。
1*10とどう違うんですか。
それとforに10とか与える意味も。
0..10ならわかるけど。
239nobodyさん:2007/10/04(木) 08:10:41 ID:???
このスレは精神障害者ばかりですね。
240nobodyさん:2007/10/04(木) 08:14:34 ID:???
>>231
その程度の実力で関数を自作するってかw
241nobodyさん:2007/10/04(木) 09:03:58 ID:???
>>238
ひょっとして

>吐かせた結果を保存しないのなら、目の前を流れていく
>個数を数えるしかない。

の意味がわかってないのか?
お前が一定の個数で決め打ちしたいなら最初からそうすればいいだけ。
242nobodyさん:2007/10/04(木) 09:42:16 ID:???
>> grepとかでもリストが作られますよね。
>> そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。

grepに限って言えばスカラーコンテキストでは条件が真になる要素数を返すわけだが。

% perl -e 'print scalar(grep { $_ > 0 } 0,1,1,0,1)'
3
243nobodyさん:2007/10/04(木) 09:43:48 ID:???
x 10ならわかるけどなんでrand(10)なん?
それがいまいちわからんぽ
244nobodyさん:2007/10/04(木) 10:10:16 ID:???
いつも10だと面白くないと思って乱数にしただけで特に意味はないだろう。
そんなこと気にしてるとハゲるぞ。
245nobodyさん:2007/10/04(木) 10:20:27 ID:???
>>238
http://perldoc.jp/docs/perl/5.8.8/perlop.pod
「Multiplicative Operators operator, multiplicative」の項

rand EXPR は 0 以上 EXPR 未満の値を返すので、整数値が欲しい際は
通常 int() を通す。但し perl が整数値を欲しがっている箇所に小数値が
与えられた場合は、自動で整数値に丸められる。

$str = substr('abcd', 0, rand 5); # '', 'a', 'ab', 'abc', 'abcd'
$var = $array[ rand @array ]; # @array 中の要素からランダム選出

x 演算子の右辺は「個数」という整数値を要求しているので、(1) x rand 5
という式は (), (1), (1,1), (1,1,1), (1,1,1,1) のいずれかになる。

>>243
>>241 が指摘してくれているように、最初から個数が分かっているなら
「リストをリストのままリストの個数を得る」必要はなく、$num = 10;
等と書いておけば済む。(1) x rand 10 という式には「要素数が不定で」
「コピペですぐ動作確認できる」リストのサンプルという以上の意味は無い。
246nobodyさん:2007/10/04(木) 17:45:56 ID:???
これ何?
$|++;
247nobodyさん:2007/10/04(木) 18:42:58 ID:???
出力バッファの自動フラッシュを抑制
248nobodyさん:2007/10/04(木) 18:43:28 ID:???
ハニーフラッシュ!
249nobodyさん:2007/10/04(木) 18:44:27 ID:???
抑制じゃねえ間違えた まあいいや
250nobodyさん:2007/10/04(木) 19:48:49 ID:???
プログラミングPerlのパッケージ、オブジェクトの章を読んでも意味が
さっぱりわからなかったのですがどうすればいいですか?
みなさんはあそこに書いてあること、あっさりわかりました?
251nobodyさん:2007/10/04(木) 20:48:51 ID:???
>>250
ラクダ本だけでは実感が掴みにくいような。
http://www.rfs.jp/sb/perl/
でも解説されてる。
同じ説明でもいろんな説明を見ると分かってくるような。
252nobodyさん:2007/10/04(木) 21:37:38 ID:???
253nobodyさん:2007/10/05(金) 09:42:06 ID:???
OOP 勉強したいなら Plagger に入門すればいいよ!
254nobodyさん:2007/10/05(金) 12:41:48 ID:???
>>251
これは本当に超初心者向けといった感じですね。
>>252
これはわかりやすい!
>>253
こんな面白いものがあったんだ
255nobodyさん:2007/10/06(土) 12:48:34 ID:PfM+S4yJ
foreach(){}

↑フォーイーチみたいな発音でいいですよね・・・?
256255:2007/10/06(土) 13:03:13 ID:PfM+S4yJ
追加お願いします。

use strict;
my %hash = qw/2 5 s 2 d 3/;
print map{"$_ " , 1}keys %hash;

>Execution of C:\test.pl aborted due to compilation errors.
これ何がいけないんですか?

print map{$_ ," ", 1}keys %hash;
こう書き換えるとエラーになりません。
activeperl5.8.1のwinxp稼動です。
257255:2007/10/06(土) 13:23:18 ID:PfM+S4yJ
ぐるせいや。ぐるせいや。
258nobodyさん:2007/10/06(土) 13:30:22 ID:???
>>256
perldoc map見れば分かる
259255:2007/10/06(土) 15:01:35 ID:PfM+S4yJ
>>258
すいません。わからないです。
教えてください。
260nobodyさん:2007/10/06(土) 15:40:28 ID:???
> perldoc map見れば分かる

> map - An utility to map texts from and to unicode

ねーよwww
261255:2007/10/06(土) 17:19:29 ID:PfM+S4yJ
どなたか>>255-256の回答お願いできませんでしょうかm(__)m
262nobodyさん:2007/10/06(土) 17:33:12 ID:???
print map{("$_ ", 1)} keys %hash;
263nobodyさん:2007/10/06(土) 17:33:28 ID:???
読み方なんてどーでもいいじゃん
スクールでも始める気か?
264nobodyさん:2007/10/06(土) 17:44:55 ID:???
>>255
http://dictionary.goo.ne.jp/search.php?MT=for&kind=ej&mode=0&base=1&row=1
http://dictionary.goo.ne.jp/search.php?MT=each&kind=ej&mode=0&kwassist=0

これぐらいは辞書引いたらどうよ。

>>256
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
> { はハッシュリファレンスとブロックの両方の開始文字なので、
> map { ... は map BLOCK LIST の場合と map EXPR, LIST の場合があります。
> perl は終了文字の } を先読みしないので、{ の直後の文字を見て
> どちらとして扱うかを推測します。通常この推測は正しいですが、
> もし間違った場合は、} まで読み込んでカンマが足りない(または多い)ことが
> わかるまで、何かがおかしいことに気付きません。 } の近くで文法エラーが出ますが、
> perl を助けるために単項の + を使うというように、{ の近くの何かを変更する必要が
> あります。

perlの構文解析までは知らん。
265nobodyさん:2007/10/06(土) 17:49:40 ID:???
>>260
-fを入れることも自分で分からないようではいかんだろって意味であえて書かなかった
266255:2007/10/06(土) 19:25:29 ID:PfM+S4yJ
>>264
ありがとうございます。
それでフォーイーチでいいのですか?
用語なんで普通の読み方で本当にいいのかという意味の質問だったのですが。

mapの方ですが、
my $hash = {"A "=>"5" , "s"=>"2" , "d"=>"3"};
これでエラーが出ないんです。"A "でエラーが出ないのに、どうして

print map{"$_ " , 1}keys %hash;
でエラーが出て
print map{$_ ," ", 1}keys %hash;
でエラーが出ないのか。

よくわからないのですが、ハッシュリファレンスとしてエラーが出そうなのは後者だと思うんです。
カンマが足りないってことで。
そして前者はブロックとしても式としても何も問題がないと思うのです。
my $test = 1;
if("$test " , 1){
print "ok";
}
これを走らせてもエラーでないですし。
そこらへんどういうことなのかわかりますでしょうか?
267255:2007/10/06(土) 19:28:03 ID:PfM+S4yJ
>>265
-fってなんですか?
http://perl.misty.ne.jp/switch.html
ここには載ってないですが。
268nobodyさん:2007/10/06(土) 19:31:23 ID:???
>>266
>それでフォーイーチでいいのですか?

関数名の読み方に正解なんてないから好きに呼べよ。
余程狂ってなきゃ誰も笑ったりしないよ。

で、結局何が問題なんだ?
結論は既に出てるし、perlの仕様について文句言われても困る。
269nobodyさん:2007/10/06(土) 19:32:40 ID:???
釣りなのか読解力がないのか単なる馬鹿なのか
270nobodyさん:2007/10/06(土) 20:11:35 ID:???
>>267
perldocを嫁
271nobodyさん:2007/10/06(土) 20:42:22 ID:???
>>267
それはperlのオプション。

あんたが必要なのはperldocのオプションだから、
コマンドラインからperldoc perldocで確認すべし。
272255:2007/10/06(土) 20:43:43 ID:PfM+S4yJ
>>268
何故エラーが出るのかわからないのです。>>266にあるとおりです。
>>264さんのところの話ではつじつまが合わないのです。

>map { ... は map BLOCK LIST の場合と map EXPR, LIST の場合があります。

どちらとして評価しても
print map{"$_ " , 1}keys %hash;
これでエラーが出る説明になりません。

273255:2007/10/06(土) 20:47:23 ID:PfM+S4yJ
>>271
なるほどつまり-fの意味は
perldoc -f map
で、mapの仕様を確認しろって事なんですね。
274nobodyさん:2007/10/06(土) 20:59:58 ID:???
>>272
{"$_ " , 1}をEXPRとして、keys %hashをLISTと解釈すると、コンマが足らない。
275255:2007/10/06(土) 22:39:59 ID:PfM+S4yJ
>>274
ん・・・

map EXPR, LIST
    ↑これかーー!

納得です。ずっと{}の中のコンマばかりに注目してました。{}とLISTの間のコンマのあるなしが問題だたのですね。

276nobodyさん:2007/10/06(土) 23:23:20 ID:???
フォーイーチでいいんじゃないの?
277nobodyさん:2007/10/06(土) 23:29:56 ID:???
perldoc に -f をつけるだけで上場できるインターネッツはここですか?
278nobodyさん:2007/10/07(日) 13:10:36 ID:???
むしろ英単語の for と each をくっつけただけのものを
他になんて読めるのか知りたい
279nobodyさん:2007/10/07(日) 15:12:27 ID:???
>>278
仏単語の fo と 英単語の reach をくっつけたものという可能性も検討すべきでは?
280nobodyさん:2007/10/07(日) 18:18:02 ID:LZD6O2BK
フォーチだろ。
281nobodyさん:2007/10/07(日) 21:49:16 ID:lRWvT8wN
ソケット使ってホームページを取得するプログラムを書いてます。
HTTP/1.1 200 OKが返ってきて、Content-lengthもある程度あるのに、
フッタが何もないことがあるのですがどうしてでしょうか。
正常に見れるサイトもあります。

use Socket;
use FileHandle;

$host = "www.ftnet.or.jp";
$path = "/FTtuusin/index.html";
$port = 80;

$ip = inet_aton($host) || &error("host($host) not found.\n");
$SOCKADDR = pack_sockaddr_in($port, $ip);
$res = &connect($host,$path,$port);
print $res;

exit;
282nobodyさん:2007/10/07(日) 21:51:37 ID:lRWvT8wN
sub connect {
my ($res, $host, $path, $port);
$res = "";
$host = $_[0];
$path = $_[1];
$port = $_[2];

# ソケットの生成
socket(SOCKET, PF_INET, SOCK_STREAM, 0) || return -1;
# ソケットの接続
connect(SOCKET, $SOCKADDR) || return -2;
autoflush SOCKET (1);

print SOCKET "GET $path HTTP/1.1\n";
print SOCKET "Referer: $url\n";
print SOCKET "Host: $host:$port\n";
print SOCKET "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\n";
print SOCKET "Connection: close\n";
print SOCKET "\n";


foreach (<SOCKET>) {
$res .= $_;
}
close SOCKET;
return $res;
}
283nobodyさん:2007/10/07(日) 21:53:04 ID:lRWvT8wN
レスポンスは

HTTP/1.1 200 OK
Date: Sun, 07 Oct 2007 11:31:44 GMT
Server: Apache/2.0.52 (CentOS)
Last-Modified: Fri, 16 Jun 2006 05:41:38 GMT
ETag: "4474a-daf-deccc880"
Accept-Ranges: bytes
Content-Length: 3503
Connection: close
Content-Type: text/html
284nobodyさん:2007/10/07(日) 23:54:11 ID:???
フッタって何の事言ってる?
285281:2007/10/08(月) 00:21:06 ID:???
すまん、確かにフッタって言葉は違う気がしてきた。

本文の部分です。htmlが書かれてる部分。
286nobodyさん:2007/10/08(月) 02:57:53 ID:???
>>281
「何もない」状態を確実に再現できる例を
用意してくれないと、デバッグの手伝いはできないよ。
少なくとも手元の環境だと>>281-282のコードとサイトは
一応動くし全部取得できている。
287nobodyさん:2007/10/08(月) 03:06:09 ID:???
HTTPは正確には\nではなく\r\nでそ
288nobodyさん:2007/10/08(月) 03:32:19 ID:???
HTTP/1.0にしたら解決しましたって答えは無しな。
わざわざ作るなら1.1を使う物を作ろうよ。
289nobodyさん:2007/10/08(月) 03:33:54 ID:???
答えじゃないな。解決法だなorz
290nobodyさん:2007/10/08(月) 06:54:42 ID:???
ちょっとここでいいのかどうかわかりませんが、質問です。
HTML-Parser-3.56を、cpan2rpmで.rpmにリビルドしようとしてたんですが、
make testの段でエラーになります。

(略・・・
t/unbroken-text......ok
t/unicode-bom........
# Failed test in t/unicode-bom.t at line 43.
# got: 'Parsing of undecoded UTF-8 will give garbage when decoding entities at t/unicode-bom.t line 24.
# Parsing of undecoded UTF-8 will give garbage when decoding entities at t/unicode-bom.t line 28.
# Parsing of undecoded UTF-16 at t/unicode-bom.t line 31.
# Parsing of undecoded UTF-16 at t/unicode-bom.t line 34.
# Parsing of undecoded UTF-32 at t/unicode-bom.t line 37.
# Parsing of undecoded UTF-32 at t/unicode-bom.t line 40.
・・・・(略)
t/unicode............ok
t/xml-mode...........ok
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------------
t/unicode-bom.t 1 256 2 1 50.00% 1
1 test and 1 subtest skipped.
Failed 1/48 test scripts, 97.92% okay. 1/430 subtests failed, 99.77% okay.
291つづき:2007/10/08(月) 06:55:12 ID:???
で自前で、tar xzf HTML-Pasrer-3.56
perl Makefile.PL
make
make test
したときは、ビルドエラーにならず、
(略...
t/xml-mode...........ok
All tests successful, 1 test and 1 subtest skipped.
Files=48, Tests=430, 5 wallclock secs ( 3.03 cusr + 1.62 csys = 4.65 CPU)
と、ちゃんと通ります。

そこで、途中経過のspecファイルと、自前make時の出力を見比べてみると、
1:cd HTML-Parser-3.56
2:grep -rsl '^#!.*perl' . |
3:grep -v '.bak$' |
4:xargs --no-run-if-empty /usr/bin/perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)'
5:/usr/bin/perl -MExtUtils::MakeMaker -e ' print qq|PREFIX=/var/tmp/perl-HTML-Parser-3.56-root/usr| if $ExtUtils::MakeMaker::VERSION =~ /5\.9[1-6]|6\.0[0-5]/ ' |
6:/usr/bin/perl Makefile.PL
と、cd HTML-Parser-3.56 から /usr/bin/perl Makefile.PLまでの間になにか挟まってます。(↑のはcpan2rpmで出来たspec)

多分、5行目は、仮インストールPREFIXを指定してるとこなので必要だとは思いますが、2,3,4行目でやってることの
意味がわかりません。
292つづき2:2007/10/08(月) 06:56:35 ID:???
ためしに自分で展開したHTML-Parserに、上の部分だけ(5行目以外)shスクリプトにコピペして実行してみると、
make testでエラーになりました。

さらに、2,3部分のみ実行すると、
./t/document.t ./t/marked-sect.t ./t/dtext.t ./t/msie-compat.t ./t/stack-realloc.t ./t/headparser.t ./t/crashme.t ./t/script.t
./t/filter-methods.t ./t/entities2.t ./t/unicode.t ./t/unicode-bom.t ./eg/hlc ./eg/hform ./eg/hstrip ./eg/htitle ./eg/htextsub
./eg/htext ./eg/hanchors ./eg/hdump ./eg/hrefsub ./mkpfunc ./mkhctype
と、こんな結果になるんですが、これをlist(@ARGV)として
perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)'に渡してるんだと思うんですが、
この'MY->fixin(@ARGV)'がなにをやってるのかがわかりません。
MakeMaker.pmやそこからuse,requireしてるモジュールから'fixin'関数を探しましたが見つからず、
また、ggってみても、cpan2rpmの途中経過を報告してるページにHITするだけで、これが何を意味してるかがわかりません。

specから、この2,3,4の部分を消してrpmbuildするとちゃんとビルドが通ることは通るんですが、
なにか重大な落とし穴があるような気がして、気持ち悪いです。
293290:2007/10/08(月) 07:22:51 ID:???
おっと、MM_Unixのマニュアルに’fixin’を発見。今までWin機にインストールされたマニュアルみても出てこんわけだ。

でも、説明の Inserts the sharpbang or equivalent magic number to a set of @files. で??
sharpbangってなんですか。
さらにUnix版のMakeMaker.pm内で検索かけても’fixin’で出てこない。
なおさら???です。
294290:2007/10/08(月) 07:37:52 ID:???
なんべんも連投すいません。
sharpbangってのはどうやらファイルの頭の
#!/usr/bin/perl ってのらしいですが、ますます訳がわかりません。
一晩寝てないんでもう頭がバグってきました。
もう寝ます。
295nobodyさん:2007/10/08(月) 11:25:25 ID:???
> 一晩寝てないんでもう頭がバグってきました。

徹夜なんかする奴はばかです。
296281:2007/10/08(月) 12:47:24 ID:???
>>286

>>281は余計と思われる部分を省いて、通信に関わる部分だけを書いたんですが
それを実際に自分で動かしてみたら正常に動きました。
htmlを取得したあとの文字列処理が原因だったようです。
ご迷惑おかけしました。サンクスです。
297nobodyさん:2007/10/08(月) 15:03:02 ID:???
>>290-294
そこまで辿れてるのならソース見れば?
http://search.cpan.org/src/MSCHWERN/ExtUtils-MakeMaker-6.36/lib/ExtUtils/MM_Unix.pm
ザラっと読んだ限りでは shebang (sharpbang) 行を自分の環境に
合うものへ修正しているみたいだけど。
298290:2007/10/08(月) 21:22:47 ID:???
昼間寝てリフレッシュしたんで、追跡再開。

>>297のおっしゃる通り、’MY->fixin(@ARGV)’で、292のテストスクリプト一式の先頭行が、
#!perl -w から #!/usr/bin/perl -w に書き換えられてる模様。
でその下に3行ほど、
eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell

ってゆうコードが追加されてます。
それ以下、use strict・・・からの実行部分は両者(自前makeとcpan2rpm)で一字一句違いなし。
(ここからはmake testでエラーの出る t/unicode-bom.tに絞って追っています)

なんで上の追加された3行が原因か?と調べてみると、ここの部分は、どうやら一部の/bin/shが頭の
#!/usr/bin/perl(sharpbang)を認識しない時用に直接shから起動させるためのコードの模様。
これが原因ではないっぽい。
う〜んと思ってスクリプトを上から順になぞっていくと、
!!!!!っ! わかったーーー!!

このスクリプトの後半部分で、is(join("",@warn), <<EOT)以下で、warningのトラップをしてるんだけど、
うえの3行が追加されたことによって、当然実行部分の行数が3行づつ下がってるんだけど、
warningトラップの各対応行がもともとのまま(つまり実際の行数-3の)部分と比較しようとして
is()がこけてmake testがエラってたんです。

>>295
いや〜〜、やっとエラーの原因つかめてすっきりしました。これで今晩はゆっくり寝れます。
299sage:2007/10/09(火) 19:35:34 ID:oM/XiNAd
Net::Telnetモジュールについての質問です。
ルーターにログインし、$telnet->cmd("show running-config")にて現在のルーターの設定を取得したいのですが、
取得した設定の中に、現在のプロンプトを示す文字列(例えば'#'など)があった場合、そこの行でデータの取得が終わりになってしまいます。
$telnet->promptコマンドにてユーザープロンプトを設定したのですが、その文字列もルーターの設定の中にあった場合、そこで設定の取得が止まってしまいます。
以下に例を書きます。

use Net::Telnet;
use strict;

my $telnet = new Net::Telnet( Timeout => 10);
#ログイン、特権モードへ
$telnet->open(host_name);
$telnet->login(user_name,password);
$telnet->print("enable");#特権モードに
$telnet->waitfor("/Pass/i");
$telnet->print(priv_password);#特権パスワード
$telnet->waitfor('/#/'); #特権プロンプトで待つ

my @show_run = $telnet->print('show running-config');
$telnet->waitfor("hogehoge");

ここのhogehogeに設定した文字列がrunning-config内にある場合、
そこでrunning-configの取得が終了してしまいます。
なにかうまい回避方法があればご教授願います。
300nobodyさん:2007/10/09(火) 20:11:15 ID:???
>>299
http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Telnet.pm

@show_run = $telnet->getlines; とか
push @show_run, $line while $line = $telnet->getline(Timeout => 1); で
なんとかならんか。Net::Telnet 使ったことないし試してないけど。
301nobodyさん:2007/10/09(火) 22:13:34 ID:???
正規表現でもっと詳細に指定してみるとか。
302nobodyさん:2007/10/09(火) 22:14:34 ID:gGNoM/Xe
Can't locate object method "new" via package "XML::RSS" (perhaps you forgot to load "XML::RSS"?) at XML/RSS.pm line 3.
って出たんですがこのエラーはなんですか?
303nobodyさん:2007/10/10(水) 00:01:33 ID:???
XML/RSS.pmの
ソースコードの3行目で
XML::RSSのロードを忘れたので
オブジェクトメソッドであるnewを
配置できなかった。
304nobodyさん:2007/10/10(水) 01:09:25 ID:???
>>299
$telnet->prompt('/user prompt $/');
305nobodyさん:2007/10/10(水) 15:24:05 ID:???
類似した関数を各ファイルにまとめて、それをuseして使っています。
しかし、それぞれのモジュールで、use CGI としているのですが、
これにより余計な負担がかかっているということはありますか?
306nobodyさん:2007/10/10(水) 18:20:17 ID:???
構造を見直すべきだと思うが、
%INCがちゃんとしてくれるから
重複されてロードされるとかはないはず
307nobodyさん:2007/10/11(木) 16:13:57 ID:???
キャッシュを貯めているフォルダが大きくなりすぎてFTPクライアントではアクセスできません
フォルダごと削除したいのですがスクリプトでどうにかできますか?
308nobodyさん:2007/10/11(木) 17:28:34 ID:???
system "rm -rf /";
309307:2007/10/11(木) 17:56:32 ID:???
>>308
消すことができました
ありがとうございます
310nobodyさん:2007/10/11(木) 18:07:02 ID:???
ちょwww
311nobodyさん:2007/10/11(木) 18:38:41 ID:???
ヤフーで検索した検索の秒数や検索されたURLの一覧を出すような事は
Perlで実現可能でしょうか?

例えば「リンゴ」で検索すると自身のサイトで
---------------------------------------
・約27,900,000件
・0.01秒
 ・ja.wikipedia.org/wiki/リンゴ
 ・www.kcsnet.ne.jp/kyoei
 ・www.kodomo-iin.com/HL/HL220.html
 ・www.hasp.tv
 ・www.yumeringo.com
   (続く
---------------------------------------
このように表示させたいのです。

もし実現可能であれば、どのような仕組みを学べば良いでしょうか。
312nobodyさん:2007/10/11(木) 19:19:28 ID:???
ヤフーがAPI用意してればできるんじゃない?
313nobodyさん:2007/10/11(木) 19:30:54 ID:???
ヤフーAPIならとっくに公開してるぞ
314nobodyさん:2007/10/12(金) 04:05:22 ID:i4CjOo+I
XML::RSSについて質問です。
rssのバージョンが1.0の場合、以下のソースの#エラーが出るの部分で
Use of uninitialized value in concatenation (.) or string at rss line 21.
というエラーが出てしまいます。
他の<link>タグなどの場合は表示できるので
<dc:date>などの名前空間を使っているタグの場合に
上記のエラーが出てしまうみたいです。
どうすれば、名前空間のタグデータも表示できますか?

my $rss = new XML::RSS;
my $url = "http://hoge.con/rss.xml";
my $dat = get($url);
my $result = $rss->parse($dat);

foreach my $item ( @{$rss->{'items'}} ){
if($result =~ /1.0/){
print "@{$item_list}[0]->{'dc:date'}\n"; #エラーが出る
}elsif($result =~ /2.0/){
print "@{$item_list}[0]->{'pubDate'}\n";
}
}
315nobodyさん:2007/10/12(金) 04:09:29 ID:???
print @{$item_list}[0]->{'dc:date'} || '', "\n";
とか。
316314:2007/10/12(金) 04:37:32 ID:???
すいません。
ソースがおかしかったんで張りなおします。

my $rss = new XML::RSS;
my $url = 'http://hoge.com/rss20.xml';
my $dat = get($url);
my $result = $rss->parse($dat);

foreach my $item ( @{$rss->{'items'}} ){
if($result =~ /1.0/){
print "$item->{'dc:date'}\n"; #エラーが出る
}elsif($result =~ /2.0/){
print "$item->{'pubDate'}\n";
}
}
317314:2007/10/12(金) 04:50:59 ID:???
自己解決しました。
print "$item->{'dc'}->{'date'}\n";
という記述でうまくいきました。
お騒がせしました。
318nobodyさん:2007/10/12(金) 22:46:03 ID:w18ekEW+
ここにいる人は仕事でもPerlに問わずプログラミングをしてるのですか?
そういう仕事に就くにはやはり学校などを出てる必要があるのでしょうか?
いわゆる大卒みたいな最低条件というか。

前から一度経験してみたいなと思っていましたが、そういうアルバイトはないんでしょうか。
建設現場の日雇いみたいに気軽にやってみたいです。
本業はありますが、結構時間はあるほうなので。

この世界はどうなってるのでしょうか?
319nobodyさん:2007/10/12(金) 22:50:35 ID:???
仕事に関する大事なことを自分で調べず2chで聞いてる時点で・・・
320nobodyさん:2007/10/12(金) 22:59:11 ID:???
セックスアパートって会社で働くといいよ。
321nobodyさん:2007/10/12(金) 23:23:59 ID:w18ekEW+
2ちゃんをバカにしてる利用者ほどその利用方法はひどいって法則誰かが言ってましたね。
322nobodyさん:2007/10/13(土) 00:20:58 ID:???
プログラマーなんて趣味の延長だろ
24時間PCの前でカタカタやるのが楽しくなきゃやってられない
323nobodyさん:2007/10/13(土) 00:22:01 ID:???
「CGI Perl 実務経験なし 初心者OK」で求人サイト検索すりゃいいべ。
324nobodyさん:2007/10/13(土) 00:26:24 ID:???
>>321
その手の切り返しパターンもう飽きた
325nobodyさん:2007/10/13(土) 00:41:31 ID:???
多分しっかりやらないとプログラムは楽しくない。
326nobodyさん:2007/10/13(土) 02:59:15 ID:???
プログラマーは3桁残業にも耐えられる精神力+体力が必要。

年取ったら高確率で禿げそう。
327nobodyさん:2007/10/13(土) 15:06:53 ID:iKtPwiMH
$a = 0000010
この文字列を数字に変える($ = 10)
簡単な表記はありますでしょうか?
sprintf使ってみたのですが上手くいきません
328nobodyさん:2007/10/13(土) 15:10:02 ID:???
それは文字列じゃなくて8進数じゃ?
もし$a= "0000010"; なら 関数int使えばいい
329327:2007/10/13(土) 15:13:51 ID:???
すみません
自己解決しました
%dで
330318:2007/10/13(土) 16:40:37 ID:5Vuk1MtC
この雰囲気からすると日雇いなんかなさそうですね。
しかしこういう雰囲気からすると日雇いなんかありませんよね。
ちょっと待って日雇いなんかありませんよ。

実際いきなりそれを本職とするのは厳しい。
どういう雰囲気なのか味わいたいだけと考えるとそういう会社で働いてる人脈を作るのがよさそうですね。

ここの本職の方は会社と自宅以外にどこに行きますか?
明日とかきっと休日だと思いますけど、街へ行ったりするんですか?
家族持ちだとどうしても接点を取っても仲良くはなれなさそうだから。
独身がいい。女を紹介とかすればそれなりに仲良くなれる気がするんですが。
どうですかね。女は嫌いですか?
331nobodyさん:2007/10/13(土) 18:43:45 ID:???
コーディング初心者質問スレであって、IT 土方向けの仕事斡旋スレではないんだよなぁ。
332318:2007/10/13(土) 19:19:29 ID:5Vuk1MtC
なるほど。
やはり頭は固いと。
333nobodyさん:2007/10/13(土) 21:12:30 ID:???
釣りにしては程度が低すぎるんだが、これは素で言ってるのか?w
だとしたらやばすぎる。
334nobodyさん:2007/10/13(土) 21:40:38 ID:???
スルーしとけよ
335nobodyさん:2007/10/13(土) 21:48:34 ID:???
スレ違いという自分のミスを指摘され
馬鹿にされ悔しさのあまり慢心で書き
出した文章がこれ
336nobodyさん:2007/10/13(土) 21:53:08 ID:fl6REYk4
IPアドレスから携帯かPCかを判断したいんですがどうやればいいんですか?
337 ◆TWARamEjuA :2007/10/13(土) 22:06:27 ID:???
ここで宣う前に「調べる」ことをお勧めいたします。
338336:2007/10/13(土) 22:23:53 ID:???
ググっても分からなかったので教えてもらえませんか
339nobodyさん:2007/10/13(土) 22:31:44 ID:???
どうググったのですか
340 ◆TWARamEjuA :2007/10/13(土) 22:35:33 ID:???
(´-`).。oO(ググる≠調べる ググる=さがす ・・・と思うけれども。。。)
341336:2007/10/13(土) 22:58:35 ID:???
perl  IPアドレス 携帯か 判断
とかで検索したけど出てきませんでした
342nobodyさん:2007/10/13(土) 23:16:28 ID:???
俺なら
perl 携帯 判定
でぐぐるな。
343nobodyさん:2007/10/13(土) 23:43:01 ID:???
cpanでmobile ipとかで調べたらいいんじゃね?
344nobodyさん:2007/10/13(土) 23:50:32 ID:???
>>342
それだとUA判定が多いんじゃ?

携帯 IPアドレス wiki で検索かけたらあったぞ
345336:2007/10/13(土) 23:56:59 ID:???
UAで判定できるなんて知らなかった。
IPアドレスより楽みたいですね。
346342:2007/10/14(日) 00:01:08 ID:???
>>344
そうだった。IPで判定したいんだったな。これは失礼。
347336:2007/10/14(日) 00:06:15 ID:???
UAで判定したら携帯ブラウザエミュだと携帯で判定されるのか。
IPアドレスの方が確実ってことかな?
348336:2007/10/14(日) 00:16:57 ID:???
携帯ってIPアドレスの種類どんどん増えてってたのか・・・
諦めてUAで判定します。
349nobodyさん:2007/10/14(日) 03:31:42 ID:???
CPANにモジュールあるよ。
350nobodyさん:2007/10/14(日) 06:50:16 ID:???
フォームって別ドメインのCGIスクリプトにも送信できたっけ?
351nobodyさん:2007/10/14(日) 07:54:33 ID:???
>>349
それって DIS るのが生きがいの人のだっけ?
352nobodyさん:2007/10/14(日) 07:54:34 ID:???
open関数で開けるファイルって同じサーバーにある必要がありますよね?

別サーバーにあるファイルの情報を参照する方法はあるのでしょうか?
あるのでしたら方法をお教え下さいますようお願いします。
353318:2007/10/14(日) 08:50:07 ID:a8OZDemC
>>333-335
別にバカにしてるわけでもないのに、どうしてすぐそうムキになるかね。
逆に聞きたいが、自分は頭が固くないとでも思ってるのかい?
354nobodyさん:2007/10/14(日) 09:23:55 ID:???
おまい自分が雇う側の立場になって考えてみな
日雇いで次の日に来るかどうか解らない奴を雇う?
スキルレベルも解らずに雇う?
つか、銭もらえるだけのスキルはあるのか?
355318:2007/10/14(日) 12:02:37 ID:a8OZDemC
>>354
>日雇いで次の日に来るかどうか解らない奴を雇う?
もしかして日雇い知らない?
プログラミングに関わらずどんな仕事でも適当なやつはいらないし雇わないよ。

>スキルレベルも解らずに雇う?
どんな職業でも同じ。

君は雇う側になったことがなさそうだ。
356nobodyさん:2007/10/14(日) 12:10:23 ID:???
もう頭のおかしいヤツ相手にすんなよ

ま、いちばん悪いのは病院に連れて行かない親なわけだが
357nobodyさん:2007/10/14(日) 13:05:35 ID:9kSbwdFL
画像付きのBBSに、アクセスログ記録を付けて使っています
ところが、特定の人だけ同時に3回記録されています
WindowsNT5.1 ブラウザが「Sleipnir」

たぶんブラウザのせいだと思いますが、
1回のアクセスでサーバに3回の動作をさせている事になります

一体どういう事なのでしょう? perlの書き方のせいでしょうか?
358nobodyさん:2007/10/14(日) 13:19:59 ID:???
実際一番ムキになってるのは君じゃん(w
359nobodyさん:2007/10/14(日) 17:32:02 ID:???
>>357
とだけ言われてもなぁ、多重コネクションで画像DLなんてよくある話だし。

で、どうしたいのさ?
360nobodyさん:2007/10/14(日) 18:22:36 ID:9kSbwdFL
>>359
画像付きといってもファイルをたまにアップするだけで
ほとんどの利用はテキストの書き込みと、BBSの読み込みです
会員制サイトなのでアクセスの数は少ないです
サイトの関連ログが飛ぶトラブルがあって原因の一つと思います

まず、なぜこの環境の人がアクセスすると、同時刻に3回CGIが動作して
しまうのか、その原因を知りたいです
BBSのスクリプトでは、@の配列に入れたものをforeachで展開しながら
html表示します、アクセスログはこのプロセスに入れ込んでます
361nobodyさん:2007/10/14(日) 19:25:16 ID:???
当人じゃないからわからんが、Javascriptで読み込みなおしするような
なんかをしてるんじゃね?
本人に聞いたらいいよ。
362nobodyさん:2007/10/14(日) 19:59:35 ID:RGItsPbe
質問です。
CPANモジュールまとめサイトってないですかね?
いろいろググったけどそれらしきものがなかったので。
363nobodyさん:2007/10/14(日) 20:01:11 ID:RGItsPbe
>>362
追記
日本語モジュール解説 まとめサイトです
364nobodyさん:2007/10/14(日) 20:37:02 ID:???
perldoc.jp
365nobodyさん:2007/10/14(日) 20:42:54 ID:???
basic認証が必要な自サイトのアクセスログからある部分だけ抽出して表示させたい
のですがまずcgiでアクセスするにはどうすればいいでしょうか?
366nobodyさん:2007/10/14(日) 20:49:09 ID:RGItsPbe
>>364
そこで全部見れるんだ。
ありがとー
結構数すくないっすね

ありがっつ
367nobodyさん:2007/10/14(日) 22:03:04 ID:5YQaKvWD
ブログのページからソースを取ってきてテキスト部分だけを取り出したいんですが

use LWP::Simple;
$buff = get("http://www.....");
print $buff; 
 
これでとりあえずソースだけは取ってこれたのですが、テキスト(記事)の部分だけ取り出す方法がわかりません。
よろしくお願いします
368nobodyさん:2007/10/14(日) 22:05:45 ID:RGItsPbe
>>367
正規表現でちょちょいのどんじゃないですかね?
一度調べてみることをおすすめします。
369nobodyさん:2007/10/14(日) 22:15:05 ID:9kSbwdFL
>>361
なるほど
当方MacなのでParallelsのWinに「Sleipnir」入れてみましたが、
プラグインかなにかなんでしょうね
有り難うございました
370nobodyさん:2007/10/15(月) 00:22:13 ID:???
>>367
最近はこういうのが流行みたいです

Web::Scraper
http://search.cpan.org/~miyagawa/Web-Scraper/
371nobodyさん:2007/10/15(月) 00:43:20 ID:???
>>369
ぐぐればトップに出てくるだろうに
372nobodyさん:2007/10/15(月) 00:44:21 ID:???
ごめん、371は勘違い
373nobodyさん:2007/10/15(月) 01:06:24 ID:???
nikonikoにもScraperネタある。
http://www.nicovideo.jp/watch/sm1237738
374nobodyさん:2007/10/15(月) 03:46:48 ID:???
Web::Scraper が重いんだけど、どうにかならないの?
375nobodyさん:2007/10/15(月) 05:35:56 ID:???
不満は作者に直接言う
改善案を出す
パッチ送る
376nobodyさん:2007/10/15(月) 12:15:17 ID:???
男は黙って正規表現一択
scrAPIは女の様な軟弱者が使う物
377nobodyさん:2007/10/15(月) 14:20:07 ID:???
youtubeに上げなおしてくれ。
ニコニコ垢なんかもってないし使いたくも無い。
378nobodyさん:2007/10/15(月) 21:15:14 ID:???
カレンダーを作りたいと思っているんですが、ライブラリはありませんか?
379nobodyさん:2007/10/15(月) 22:05:51 ID:???
380nobodyさん:2007/10/15(月) 23:41:31 ID:???
処理の進捗状況を表示する一番よい方法は何ですか?
一定期間ごとにファイルに書き込むことしか思い付きません。

381nobodyさん:2007/10/15(月) 23:43:46 ID:???
>>380
それでいいんじゃねーの
一番簡単だし
382nobodyさん:2007/10/16(火) 06:05:03 ID:???
$| = 1;
って何かいいことあるの?
383nobodyさん:2007/10/16(火) 08:47:04 ID:???
意味をわかった上で言ってるのか?
それとも意味を聞いてるのか?
とりあえず「perl コマンドバッファリング」あたりでググれ。
384nobodyさん:2007/10/16(火) 10:56:39 ID:???
自分が使ってるサーバーがLWPが使えないようなので、socketで別サーバーのファイル内容を拾って展開させようとしたんですが、
ローカルではちゃんと動くのにサーバーにアップすると凍ってしまいます。

リストにある複数のブログのrss取得して最新のブログ3件の記事表示、みたいなのがやりたいんですが、
サーバーがLWPの許可してないと難しいですか?
なにかいいやり方あったらお教えください。
385nobodyさん:2007/10/16(火) 11:11:22 ID:???
fpingの出力値の数字だけを抜き出すプログラムを作りたいのですが、うまくできません。

input.txtという名前に下のようなfpingの出力を入れ
www.yahoo.co.jp:[0], 84 bytes, 18.1 ms (18.1 avg, 0% loss)
www.yahoo.co.jp:[1], 84 bytes, 23.2 ms (20.7 avg, 0% loss)


18.1
23.2と出力したいです。


bytes,より前を切り取り、ms ( も切り取ろうとして

$fping = "./input.txt";
open(A,"$fping")|| die "Can not open file";
@b = <A>;
close (A);

foreach $c(@b){
$c = grep(/(.*?)bytes, (\d{1,4}\.\d{1,2} ms) \(/,$c);
}

foreach $c(@b){

print "$c\n";

}

というプログラムを作ったんですが、うまくいきません。
どこを直せばいいでしょうか?
386nobodyさん:2007/10/16(火) 11:26:03 ID:???
>>385
$c =~ /bytes, (.*?) ms/;
$c = $1;

じゃだめなん?
387385:2007/10/16(火) 12:33:21 ID:???
>>386
レス遅れてすいません。
できました!
ありがとうございます!!
助かりました、ホントありがとうございます!!!
388nobodyさん:2007/10/16(火) 12:40:52 ID:???
>>385
出遅れた…。
perl -lne "print /(?<=bytes, )(.+?)(?= ms)/" input.txt
389nobodyさん:2007/10/16(火) 13:22:24 ID:???
>>384
どこの鯖使ってるか知らんが、LWP使えないようにしてるってことは
FWでoutboundが遮断されてる可能性が高く、だとすればどうしようもない
390nobodyさん:2007/10/17(水) 00:29:17 ID:7VxwUF8E
SNSサイトにperlを使って接続って無理?
391nobodyさん:2007/10/17(水) 00:37:06 ID:???
日本語でOK
392nobodyさん:2007/10/17(水) 01:05:09 ID:???
>>390
WWW::Mixi
WWW::Myspace
393nobodyさん:2007/10/17(水) 08:03:38 ID:BedUMdjt
おはようございます。

下のような流れのcgiで
複数のクライアントから接続された場合
変数$gHogeはクライアント毎に保たれますか?
それとも上書きされちゃいますか?

my $gHoge = ""; #クライアントからポストされた値が入る。
〜$gHogeを扱う長めの処理が続く。

394nobodyさん:2007/10/17(水) 08:36:36 ID:???
>>393
実行される度にプロセスが作られるから上書きなんてされない
395393:2007/10/17(水) 09:01:24 ID:???
>>394
そうですか。期待通りの結果でよかったです。
朝早くからありがとうございました。
396nobodyさん:2007/10/17(水) 23:05:49 ID:7VxwUF8E
>>392???
わからないので要望スレに逝ってきますorz
397nobodyさん:2007/10/18(木) 00:34:50 ID:???
>>396
ググることもできないのか
398nobodyさん:2007/10/18(木) 01:48:20 ID:???
モジュールがわからなくてSNSに接続しようとは・・・
399バターズ:2007/10/18(木) 22:40:14 ID:???
コロンが二つならんでいるのは
ダブルコロンって言うんだよ
400nobodyさん:2007/10/20(土) 00:37:33 ID:Ja84SJeF
Location ではtargetが指定できませんが、呼び出したときの
属性は生きるってどこかに書いてありました
どういうことでしょう

ssiのhtmlファイルの中に書いた、iframeのCGIまたは#exec cgiで
クッキー認証できなかったら全画面を再認証画面に飛ばしたいのですが、
やはり無理でしょうか?
401nobodyさん:2007/10/20(土) 05:18:19 ID:VLTga6QI
print <<EOM;
<a href="hoge.html">hoge</a>
EOM

と、

print "<a href=\"hoge.html\">hoge</a>\n";

ではどちらの方が実行速度が速いですか?
402nobodyさん:2007/10/20(土) 06:50:46 ID:???
403nobodyさん:2007/10/20(土) 07:40:43 ID:VLTga6QI
>>402さん、ありがとうございます。
大変参考になりました。
404nobodyさん:2007/10/20(土) 07:47:37 ID:x+Q9ulv4
おはようございます。
以下のスクリプトについて質問です。
outフォルダ内の.txtファイル全てに対して
ある作業をするというスクリプトなんですが、
ファイルオープンのところでそんなファイルはないから
開けないというエラーが出力されます。

例:hoge.txtがある場合
OPEN ./out/hoge.txt file: No such file or directory at check line 22.

どこが間違ってるか教えてください。お願いします。
OSはWindowsXPです。

my @directories_to_search = ('./out/'); #対象のフォルダ
find(\&wanted, @directories_to_search);
sub wanted{
my $filePath = $File::Find::name;
my $find = index( $filePath, ".txt" ); #.txtを対象
unless ($find >= 0) {
return 1;
}
open FH_READ, "<$filePath"
or die "OPEN $filePath file: $!";
#ある作業をする。
close FH_READ;
}
405nobodyさん:2007/10/20(土) 08:21:11 ID:???
>>404
22行目ってホントにopen文の所か?
406404:2007/10/20(土) 08:33:09 ID:???
>>405
え?open文のor dieのエラーメッセージが出力されているから
open文でエラーが発生していると思うんですが・・・
407nobodyさん:2007/10/20(土) 10:42:05 ID:???
読んで字の如しとしか。
まさかmod_perlじゃないよな?
408nobodyさん:2007/10/20(土) 10:55:56 ID:???
>>404
openに渡すのは「$filePath」じゃなくて「$_」
File::Findの解説ちゃんと読め
409半角全角が混在する行が一定の文字数を超えたら折り返すようにしたい:2007/10/20(土) 14:21:49 ID:g/E6yd0f
メールフォームを作っています。同マシン上のsendmailを使って送るものです。

送信するメールの本文において、半角全角が混在する行の文字数を数え、
一定の文字数(例えば半角72文字、全角36文字)を超えた行だけを
強制的に折り返したいと考えています。

どのようにするのがよいでしょうか?

lengthはバイト数を返す関数なので、
全角文字の真ん中で折り返されると困ることになると考えてます。

もしかすると、長い行はsendmail側が自動で折り返してくれたりするのでしょうか?
それとも、何かほかの関数で簡単に数えたりできるのでしょうか?

なお、カスタマイズの自由度を考えて自作しているので、
「どこそこのメールフォームを使え」というのは勘弁してください。

以上、よろしくお願いします。
410nobodyさん:2007/10/20(土) 14:28:07 ID:o1wAy6B9
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?

$@ だと、evalでのエラーの値が入る
でも、実行値は...?

お願いします。

411nobodyさん:2007/10/20(土) 14:37:23 ID:???
>>410
$result = eval($hoge);

じゃダメなん?($resultに実行結果、$@にエラーメッセージ)

参考
ttp://www.tohoho-web.com/wwwperl2.htm#eval
412nobodyさん:2007/10/20(土) 14:55:48 ID:o1wAy6B9
>>411 その通り!ありがとう。
短い$hogeだと関数が成功した1しか返さないことがあるようでアレ違うわと思っていました。

>>409
ちょっと離れるので投げっぱなしになってしまいそうだけど
解答してくれる人が現れる間に考えていました


use utf8;
use Encode;

$str = '
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?
$@ だと、evalでのエラーの値が入る
でも、実行値は...?

お願いします。
';

@stream = split(/\n/,$str); #最初に渡された文字列を 改行 を区切りとして @stream に配列として読み込んだ
map{ s{(.......)}{$1\n}g } @stream; #”8文字”単位で改行を入れてる
map{print encode(sjis,$_)}@stream; #各行を出力するときにsjisに変換してる

とか、なかんじでどうよ?
ただし1バイト文字の扱いがなんか変。

*たぶんutf8でけつまずいてるかんじ。
413nobodyさん:2007/10/20(土) 16:08:12 ID:???
>>409
jcode.plかJcode.pmにjfoldってなかったっけ?
414409:2007/10/20(土) 17:45:16 ID:???
>>413
これです。こういう機能がほしかったんです。

jcode.plにはありませんでしたが、Jcode.pmにはありました。

これまで使っていたのがjcode.plだったのでが、
MIMEヘッダの機能も強化されているようなので、Jcode.pmに乗り換えようと思います。

どうもありがとうございました。
415nobodyさん:2007/10/20(土) 18:24:36 ID:???
いいかげんにEncode使い方覚えろよ
416nobodyさん:2007/10/20(土) 19:12:39 ID:???
>>415
じゃ、Encode.pmを使って折り返す方法を書いてあげれば?
417nobodyさん:2007/10/20(土) 19:44:36 ID:???
Encode::decodeしてlengthでカウントしてみろよ
418nobodyさん:2007/10/20(土) 20:12:44 ID:???
文字コードわかってんなら正規表現で簡単にできることだろ
419nobodyさん:2007/10/23(火) 05:26:38 ID:???
全部正規表現でやるのは重そうだな。
420nobodyさん:2007/10/23(火) 14:21:34 ID:???
正規表現で解決するならEncode要らんがな。
421nobodyさん:2007/10/23(火) 15:27:18 ID:???
Perlのテキスト処理で質問させてください。
UTF8な日本語テキストの半角カナを全角にしたいと思ってEncode::JP::H2Zを使おうと思いました。
しかし、一部の文字(〜など)がEUCに変換する段階で?に変換されてしまい、困ってしまいました。
とりあえず、コードポイントにフォールバックできることがわかったので、
以下のように書いてその場をしのぎましたが、コードポイントを検索して文字に置換するという
作業が入ってしまい(しかも無駄に複雑)、どうもしっくりきません。
もっと簡単にする方法はありますか?

$text = encode("eucjp", $text, Encode::FB_PERLQQ); # EUCに変換
Encode::JP::H2Z::h2z(\$text); # 全角変換
$text = decode("eucjp", $text);
$text =~ s/\\x\{([0-9A-Fa-f]+)\}/pack("U*", hex($1))/eg; # コードポイントを文字に
422nobodyさん:2007/10/23(火) 17:42:25 ID:???
>>421
#!/usr/local/bin/perl -w
use strict;
use Encode qw(from_to);
use Encode::JP::H2Z;

my $text = 'このファイルはUTF-8で〜半角カナ混じりの文字列';

from_to($text, utf8 => 'cp932');
from_to($text, shiftjis => 'euc-jp');
Encode::JP::H2Z::h2z(\$text);
print $text;
__END__

別解。
use Unicode::Japanese qw(unijp);
print unijp($text)->h2zKana->euc;
423421:2007/10/23(火) 20:32:44 ID:???
>>422
ありがとうございます。その変換法で化けなくなりました。
後学のためお聞きしますが、Encodeではutf8を直接EUCにマップできないのでしょうか。
SJISを経由するのはわかるのですが、cp932をshiftjisに読み替えるなど、
トリッキーなことをやっていますね。
機種依存文字(@など)がある場合もそうですが、utf8とEUCの変換法は
どうもよくわからないです。
機種依存文字とか、どうやってEUCに変換するんでしょうか
424nobodyさん:2007/10/23(火) 22:43:56 ID:???
「よくわからない」のは、EUC-JPとCP51932の関係じゃないのかな。

ttp://search.cpan.org/dist/Encode-EUCJPMS/
425nobodyさん:2007/10/24(水) 01:04:04 ID:???
暗号化関連の質問です

メールフォームを使っててブラウザとサーバの間はSSLで暗号化してます
でもサーバからsendmailで送信するメールも暗号化してないと意味ないですよね?

Perlでどうやってやってます?S/MIMEかPGPが使えるの?(´・ω・`)
426nobodyさん:2007/10/24(水) 01:05:27 ID:???
そもそもメールを飛ばさないという選択肢を検討すべきではないか
427421:2007/10/24(水) 02:01:47 ID:???
>>424
なるほど、ぐぐってみてわかりました。
EncodeーEUCJPMSでcp51932も使えるようになるんですね。
標準のEncodeになんで実装しないんだろ、これ。
428nobodyさん:2007/10/24(水) 06:10:09 ID:???
>>425
http://search.cpan.org/search?m=all&q=PGP&n=100
http://search.cpan.org/search?m=all&q=S%2FMIME&n=100

求められる安全度、対象ユーザのITリテラシ、かけられるコスト
等を検討すると、暗号化メールの使えるシチュエーションは
かなり限られてそうだ。金融機関やNSPだと大抵郵送だな。
429nobodyさん:2007/10/25(木) 16:41:10 ID:???
スペースは or に変換するが、クォートにかこまれたスペースは変換しない。
これの実装がうまくいきません。
例えば
tenis ball は tenis or ball に変換するけど
'tenis ball' はそのままっていうのはなんとか出来たんですが、
'tenis ball' 'base ball' のときは
'tenis ball' or 'base ball' にするのがどうしても出来ません。
orを入れたい場所もクォートに囲まれてると判断されてしまうのです。
どなたか助けてください。
430nobodyさん:2007/10/25(木) 17:03:22 ID:???
>>429
my @list = (
  q{tenis ball},
  q{'tenis ball'},
  q{'tenis ball' 'base ball'},
) ;

for my $line ( @list ){
  print join ' or ',
     map{ /'/ ? $_ : split /\s+/, $_ }
     split /\s+(?=')/, $line ;
  print qq{\n} ;
}
431nobodyさん:2007/10/26(金) 05:03:54 ID:???
foreach(@list){
my @token = m/('[\w\s]*'|\w+)(?:\s+|$)/g;
print join (' or ', @token), "\n";
}
432429:2007/10/26(金) 15:02:18 ID:???
>>430
すみません、できるだけワードは固定してない方がいいのですが・・・うまく動きませんでした。

>>431
おぉ、なんかうまく動きそうです。
でも、クォートの部分を除外して配列に納めたいのですが、どうしたらいいのでしょうか?
433nobodyさん:2007/10/26(金) 23:17:20 ID:???
>>432
430は全角文字(スペースも含め)を半角に変換してもダメか?
それと「クォートの部分を除外」って意味が分らん。単に
クォートを削除したいだけなら、そのぐらいは自力で考えてみたら?
434nobodyさん:2007/10/27(土) 10:01:02 ID:???
Encode::JP::H2Z
ってなんでeucjpの糞使用なの?
ユニコードのまま渡せて処理出来ればいいのに。
435nobodyさん:2007/10/27(土) 11:34:06 ID:???
>434
そういうことはdankogaiに直接文句つけて来い
436nobodyさん:2007/10/27(土) 13:36:03 ID:???
>434
じゃあお前さんがそういうの作れば?
437nobodyさん:2007/10/27(土) 16:43:19 ID:???
>>434
Jcode::H2Z (Jcode.pm のサブモジュール) そのままだから。
438nobodyさん:2007/10/27(土) 18:53:28 ID:???
utf8もページからフォームを入力して送信させると、
「〜」の文字だけがなぜか正常に送信されないのですが、なぜでしょうか?
439nobodyさん:2007/10/27(土) 22:19:08 ID:jIrqvOa/
return +{};
という記述の意味を教えて下さい
空ハッシュを返すという事でしょうか?
440nobodyさん:2007/10/27(土) 22:50:14 ID:???
>>438
何を以て「正常に送信されない」と判断したのか。
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
http://euc.jp/i18n/ucsnote.ja.html
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/

>>439
http://perldoc.jp/docs/perl/5.8.8/perlop.pod
> 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、
> 何もしません。関数名に続けて括弧付きの式を書く場合に、関数の
> 引数リストと解釈されないようにするために用いることができます。
441nobodyさん:2007/10/27(土) 23:21:31 ID:jIrqvOa/
>>440
ありがとうございます、単項演算子についてはわかったのですが
とあるCPANモジュールのコードで
return +{} unless $data;
というコードがあったのですがこれを
return {} unless $data;
と書かずに単項演算子の+をつけるのは
何か意図があるのでしょうか
戻り値自体はどちらでも同じような気がするのですが、、
442nobodyさん:2007/10/28(日) 00:49:00 ID:???
ブロックとして解釈される場合があるんじゃね
443nobodyさん:2007/10/28(日) 04:52:46 ID:???
+{ } :無名ハッシュでコンパイル
{; } :コードブロックでコンパイル
444nobodyさん:2007/10/28(日) 08:38:20 ID:???
http://www.nicovideo.jp/watch/sm1024453
Perlで予約語プログラミング
445nobodyさん:2007/10/28(日) 08:48:47 ID:???
http://www.nicovideo.jp/watch/sm1237738
Perl Programming: Web::Scraperモジュールの利用

↑これ何やってるの?
446nobodyさん:2007/10/28(日) 08:54:29 ID:???
http://www.nicovideo.jp/watch/sm1233406
Perl Catalyst Programming (入門編)

↑これも何をやっているのか、
さっぱりわからんよ
447nobodyさん:2007/10/28(日) 09:22:22 ID:???
まぁプログラミングを動画で見てもわからんよなw
448nobodyさん:2007/10/28(日) 09:30:40 ID:???
そうか?

この動画だけは「何をやろうとしてるか」だけは伝わるぞ
ttp://www.youtube.com/watch?v=KyLqUf4cdwc
449nobodyさん:2007/10/28(日) 11:24:36 ID:???
>>448
Aho da...orz
450nobodyさん:2007/10/29(月) 02:42:49 ID:???
>>446 にある動画はなんかおかしいと思う。
451nobodyさん:2007/10/29(月) 11:17:19 ID:???
質問させてください。
指定した文字が何回続いたかを取得したいのですがどうしたらいいですか?

例)この場合指定した文字は1です。
$a = '1111222';
$b = '1111136';

$aは4
$bは5

よろしくお願いします。
452nobodyさん:2007/10/29(月) 11:56:14 ID:???
$a='1111222';$i='1';($r)=($a=~m/($i{2,})/);print length $r
全角はシラネ
453nobodyさん:2007/10/29(月) 11:59:30 ID:???
$a = '1111222';
$c= 1;
$n= length(($a=~/((?:\Q$c\E)+)/)[0])/length($c);
454nobodyさん:2007/10/29(月) 12:31:05 ID:???
perlは色んなやり方があって面白いね

$a = '111111222';
$n = '1';

$count = length(($a =~ /($n+)/)[0]);
455nobodyさん:2007/10/29(月) 13:04:18 ID:???
>>451
$test_str = '111234111111';
$char = '1';

こういう場合は後半気にせず、まず見つけた連続の 3 でいいの?それとも、より長い連続の 6?
「はい、6 が得られるようにしたいんです」だと上に回答を書いた皆さんが優しくキレるかも。

あと、例なんだろうけど $a や $b は地雷踏むことがあるから気をつけてね。
456nobodyさん:2007/10/29(月) 13:25:31 ID:???
use strict;
use warnings;
test('1111222' => 1 );
test('1111222' => 2 );
test('111122211' => 1 );
test('111122211' => 1 , 1);
test('1111136' => 1 );
sub test {printf "%s:%s:%s\n",$_[0],$_[1],_test(@_)}
sub _test {
local($a,$b);
(sort {$b<=>$a} map {length($_)} ($_[0] =~ m{($_[1]+)}g) )[ $_[2] ? -1 : 0 ];
}
457nobodyさん:2007/10/29(月) 17:04:12 ID:???
my $i = '1' ;
print +( length ) . qq{\n} for split /[^$i]+/ ,$a ;
458456:2007/10/29(月) 19:24:03 ID:???
見直したらgdgdだったので修正しとく
sub _test { ( sort map length,$_[0] =~ /(${_[1]}{2,})/g )[$_[2] ? 0 : -1] }

459nobodyさん:2007/10/30(火) 23:38:44 ID:???
一つのファイルで処理がたくさん書いてあって分岐させる時に、
例えば
$mode = $cgi->param('mode');
というデータを受け取って、処理の場合わけをする場合どういう書き方がエレガントなんでしょうか?

現状は
if ($mode eq 'post') { &post}
elsif ($mode eq 'edit') { &edit;}
elsif ($mode eq 'delete') { &delete}
else { &error}

こんな感じなのですが、それは初心者の書き方だって馬鹿にされました。
悔しいのでもっと効率的な方法があったら教えてください。
460JAPU ◆lVJAPUTeX. :2007/10/30(火) 23:52:20 ID:???
>>459

エレガントかは分からないけど、分岐がある程度多い場合はこんな書き方だとすっきり書けるかと。

%actions = (post => \&post,
edit => \&edit,
delete => \&delete);

if(exists $actions{$mode}) {
$actions{$mode}->();
} else {
error();
}

数個程度なら if で分岐されちゃってもいいと思いますし、実際そうしています。
461nobodyさん:2007/10/30(火) 23:58:03 ID:???
>>459
それでいいんじゃね?
各サブルーチンに戻り値があるなら「三項演算子」って手もあるし、
以下の様なやり方もあるけど、普通に書いてメンテ出来るものならば
バカにされても放置しとけば?

my %hash = (
  post => sub { 1 } , # &post の内容を書く
  edit => sub { 2 }, # &edit の内容
  delete => sub { 3 }, # &delete の内容
) ;
print $hash{'edit'}->() || q{error} ; #q{error} には&error あたりを、、、

ソース全体を見たら綺麗な書き方があるかもしれんが、
それに関しては情報不足。
462nobodyさん:2007/10/30(火) 23:59:04 ID:???
ああ、丸かぶりだorz...
463nobodyさん:2007/10/31(水) 00:10:35 ID:???
せめて、CGI::Applicationくらい使っとけって話なんじゃ。
if文分岐も分かりやすいと思うが、へたに小細工するとますますへたっぴに見える。
464nobodyさん:2007/10/31(水) 12:11:23 ID:???
三項演算子ってタマに見かけるけど読みづらいんだよな。
使いたくない書き方No1かも。
465nobodyさん:2007/10/31(水) 13:29:29 ID:???
 $expr1 ? $expr2
: $expr3 ? $expr4
: $expr5 ? $expr6
:      $expr7
;

書き方か頭が悪いんだろ
466至急:2007/10/31(水) 15:17:23 ID:???
CGIを自宅出張でサポートしてくれる方募集します。
CGIに詳しく都内に来れる方であれば可能
一日日払い即金で払います。
詳細はメール下さい。
467nobodyさん:2007/10/31(水) 15:47:41 ID:???
>>459
エレガントかしらないけどこんなパッケージ作ってる。
(不要箇所削ったのでそのまま動くか不明)
package Local::Base;
use strict;
use warnings;
our $DEBUG = 0;
sub class {ref$_[0]||$_[0]||__PACKAGE__}
sub new {(bless {} => class( shift() ))->init(@_)}
sub mode :method {shift->param('mode',@_)}
sub method_name :method {shift->{method_name}->{ shift() }}
sub default_method :method {die('不正なmodeを受け取りました')}
sub init :method {
my $self = shift;
my %param = @_;
$self->{method_name} = $param{method_name} || {};
return $self->run_method( $self->mode , @_ );
}
sub run_method :method {
my $self = shift;
my $method = $self->method_name( shift );
$method = 'default_method' unless $method && $self->can( $method );
return $self->$method(@_);
}
1;
468nobodyさん:2007/10/31(水) 17:36:51 ID:???
>>467
外部からinitとか呼ばれちゃわない?
469nobodyさん:2007/10/31(水) 19:51:49 ID:???
>>467 method_nameチェックしてるから大丈夫

使い方も書いたつもりだったんだけど書けてなかった。
#!/usr/bin/perl
use strict;
use warnings;
use base qw(Local::Base);
my $r = eval{
__PACKAGE__->new(
method_name => {
edit => 'edit',
post => 'post'
}
)
} || $@;
print CGI->header,$r,"\n" unless ref $r;
######################################################################
# editの動作を定義
sub edit :method {
my $self = shift;
print $self->header;
print "EDITモード";
return $self;
}
1;
470nobodyさん:2007/10/31(水) 20:11:48 ID:???
sub edit :method {
この :method って何の意味だっけ
perlsub見ても載ってないや
変数にも付けれた気がしたが
471nobodyさん:2007/10/31(水) 21:09:19 ID:???
perlsub に載ってるし、perldoc attributesすれば詳細分る(perl5.8.1)。
perl attributes でググれば日本語のサイトも沢山出る。
変数に付けられるのは 5.8系
472nobodyさん:2007/11/01(木) 01:06:18 ID:???
実際、CGI::Applicationとか使うと効率的になるの?
自分でゴチャゴチャ作るよりも。使ってる人いる?
473nobodyさん:2007/11/01(木) 02:26:10 ID:???
CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える
474nobodyさん:2007/11/01(木) 10:48:57 ID:???
> CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える

CGI::Application もフレームワークじゃないの?
475nobodyさん:2007/11/01(木) 17:27:41 ID:???
>>470
:methodは組み込みのattribute
Attribute::Handlers使うと自作のattributeも作れる。
…がいつ仕様が定まってなくて変更があるかもってどっかで読んだ気がする。

>>474
・自分しかいじらない
・少人数で知識の共有が容易
・マニュアルが整っている
のどれかなら自作のフレームワークの方が慣れてるだろうし開発効率いいんじゃないかな?
フレームワーク自体のメンテナンスが(出来る|しなきゃいけない)のはデメリットか?

既製のフレームワーク使うのは
・他の人と知識の共有しやすい
・ドキュメントがある/(第3者も使ってるので)ノウハウが検索しやすい
・フレームワーク自身のメンテナンスを(あまり)しなくていい
ってとこかな?
476nobodyさん:2007/11/01(木) 18:07:59 ID:???
>>475
???
477nobodyさん:2007/11/02(金) 11:22:36 ID:???
/public_html/test/log.txt を、UTF8→SJISに変換して、
別名で保存するにはどうすればいいでしょうか

Perl 5.8.8なのでuse Encode;を利用する、読み取り専用で1行ずつ変換処理する
あたりまでは勉強しました。スマートな方法よろしく御教示おねがいします
478nobodyさん:2007/11/02(金) 13:22:56 ID:???
ログをShift_JISに変換ではなく、表示する時にsjisに返還して表示するようにして、
データはutf-8のままのほうがよくないかな。
479nobodyさん:2007/11/02(金) 13:29:46 ID:???
>>477
まずは自分で書いた糞コード晒すのが先じゃね?
480nobodyさん:2007/11/02(金) 14:01:12 ID:???
>>477
おまえさんの「スマート」の基準が判らんのだが、
Encodeで何か不足でもあったのか?
481nobodyさん:2007/11/02(金) 16:43:20 ID:???
nkf -s log.txt > log.sjis.txt
482nobodyさん:2007/11/02(金) 17:17:33 ID:???
>>481
すげー!、シェルスクリプトですよね?

sshができない場合はこんな感じで利用すればいいのかな
system("nkf -s log.txt > log.sjis.txt");

1つ気になるのがjcode.plなど元の文字コードを指定するのがあると思うのですが、
&jcode::convert(\$_, 'sjis' ,'utf8');
nkfでは気にしなくても自動判別完璧なのでしょうか?
483nobodyさん:2007/11/02(金) 17:34:58 ID:???
もはやPerlに何の関係もない
484nobodyさん:2007/11/02(金) 17:51:47 ID:???
>>477
use Perl6::Slurp;
use Jcode;
$c = slurp "log.txt";
Jcode::convert(\$c, "sjis", "utf8");
open($fh, ">", "log.sjis.txt");
print $fh $c;

>>482
jcode, Jcode, nkfは、判別できる場合は判別してくれる。
485nobodyさん:2007/11/02(金) 22:18:35 ID:???
>>484
頭足りてないのは理解した。
486nobodyさん:2007/11/05(月) 07:24:22 ID:???
gethostbynameについての質問です。
コマンドプロンプトだとnslookup -> set type=***
UNIXならhost -t ***
でクエリタイプを設定できるんですけど、PERLの場合はどうやるのでしょうか。
487nobodyさん:2007/11/05(月) 10:55:44 ID:???
488nobodyさん:2007/11/05(月) 11:20:15 ID:6nXAnQ+n
ファイルのオープンでエラーになります。
open(FILE,">".$workFname) or die "Cannot Output File: ";

あらかじめファイルを持たせておいて、書き込み権限を与えておけば
成功しますが、新規にファイルを作成できません。
どうすればいいのでしょうか。
489nobodyさん:2007/11/05(月) 12:21:09 ID:???
ディレクトリのパーミッションかな
490nobodyさん:2007/11/05(月) 13:05:21 ID:???
>>489
解決しました、ありがとうございます。
491nobodyさん:2007/11/05(月) 13:19:35 ID:???
die するときに $! も含めるべき。
492nobodyさん:2007/11/05(月) 13:22:45 ID:???
 自分の環境では、相対パスではエラーになるので、絶対パスに書き換えてます。
できれば相対パスのままで動くようにしたいです。どうすれば解決できるか分かる
方はおられませんか。まあ、あまり解決策が複雑なら、とりあえずあきらめてこの
ままにしておくつもりですが。
493nobodyさん:2007/11/05(月) 14:36:06 ID:???
>>492
まず「何を」相対パスにしようとしているのかくらい書こうぜ。
あと「自分の環境」は書かなきゃ誰にも伝わらない。
494nobodyさん:2007/11/07(水) 09:25:24 ID:R3XG8Srf
Perlで関数の引数に二次元配列を渡すのは無理ですか。
495nobodyさん:2007/11/07(水) 09:32:37 ID:???
>>494
ヒント:リファレンス
496nobodyさん:2007/11/07(水) 11:46:06 ID:R3XG8Srf
次のソースのsub kansuのforeachの行は何と書けば正しく動きますか
#!perl/bin/perl
use strict;

sub kansu{
my $ref1 = shift;
my $value1;

foreach $value1($$ref1) {
print $value1 . "\n";
}
}

sub main{
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
usort_kansu(@databox1);
}

main();
497nobodyさん:2007/11/07(水) 11:47:42 ID:???
誤: usort_kansu(@databox1);
正: kansu(@databox1);
498nobodyさん:2007/11/07(水) 12:36:16 ID:???
>>496
「言語的意味で」正しく挙動させるには
foreach $value1($ref1) {

(多分)あなたの望んだ挙動にするには
ソースの殆どに手を入れる必要がある。

∴ 本読んでからどうしても分らんかったら
 質問し直せ
499nobodyさん:2007/11/07(水) 14:24:36 ID:???
>>496-498
#!perl/bin/perl -w
use strict;

sub kansu {
  my $ref1 = shift;
  # my $value1;

  foreach my $value1 (@$ref1) {
    print $value1 . "\n";
  }
}

sub main {
  my @databox1 = (13,1,6,3,9,8);
  my $ref1 = \@databox1;
  kansu($ref1);
}

main();
500nobodyさん:2007/11/07(水) 15:22:14 ID:vLJSXT0R
コーディングじゃないのですが該当スレが見当たらず、新規スレにするような質問でもないと思いこちらに質問します。

.qmailからperlスクリプトを呼び出しているのですが、その場合エラーログを取るにはどうしたらよいのでしょうか?
不正終了しているようなのですが、原因がつかめません。

501nobodyさん:2007/11/07(水) 15:43:21 ID:???
eval { require スクリプト; };
if ($@) {
open(LOG, ">>/path/to/ログファイル名") or die;
print LOG "WARNING: $@";
close(LOG);
}

こういうスクリプトをqmailから呼び出せばどーよ

>499
forearch行を書き換える条件だからforearch my $value (@_){ って書いて欲しかったのかと・・
502501:2007/11/07(水) 15:59:10 ID:???
foreach $value1($ref1,@_) {

こうか
503500:2007/11/07(水) 16:13:30 ID:???
>>501
ありがとうございます。
試してみます
504nobodyさん:2007/11/07(水) 18:20:14 ID:???
STDERRに吐いた文字はqmailのログにのこるでしょ?
ログが見えないならプログラムを置くべきではないと思う。
505nobodyさん:2007/11/07(水) 18:46:18 ID:???
>>504に同意だけど、
とりあえず、STDERRをファイルにでもリダイレクトすればどうなん?
506500:2007/11/07(水) 19:59:45 ID:???
>>504
qmailのログとはmaillogでしょうか?
スクリプトからは何もログを吐いていないんです。

sudoでapache権限で実行してるからログ吐かないのかな。
507nobodyさん:2007/11/07(水) 20:05:11 ID:???
|/path/to/script.pl >> /path/to/error.log 2>&1
508500:2007/11/07(水) 20:13:46 ID:???
>>507
ありがとうございます。
.qmailでもログ指定しないといけないんですね。

509nobodyさん:2007/11/07(水) 21:32:38 ID:???
>>500
何かとんでもない設定でqmail動かして無いか?
510500:2007/11/07(水) 22:29:30 ID:???
>>509
いえ。
.qmail内でperlのみsudoしてapache権限で動かしてます。
qmailはvpopmail権限で動かしてますよ。

>>507さんでログ取れました。m(__)m
511nobodyさん:2007/11/09(金) 15:33:58 ID:???
UTF-8でperlを書きたいのですが、文字コードをperlにどのように知らせればよいのでしょうか?
512nobodyさん:2007/11/09(金) 15:47:46 ID:???
>>511
plagger のソース読むといいよ!
513nobodyさん:2007/11/09(金) 17:28:52 ID:???
>>512
それ無理に流行らそうとしなくていいよ
514nobodyさん:2007/11/09(金) 17:49:37 ID:???
tokuhirom自重
515nobodyさん:2007/11/09(金) 18:08:33 ID:???
Perl死んじゃうん?
516nobodyさん:2007/11/09(金) 18:57:53 ID:???
(・∀・)ニヤニヤ
517JAPU ◆lVJAPUTeX. :2007/11/09(金) 18:59:46 ID:???
>>511

use utf8;
518nobodyさん:2007/11/09(金) 19:09:09 ID:8S2oyKnm
>511
use dan;
で解決するよ。
519nobodyさん:2007/11/09(金) 19:26:50 ID:???
tokuhirom の直近の発言をコピペすることによりスレを荒らす tokuhacks.
520nobodyさん:2007/11/09(金) 21:31:54 ID:???
plaggerのソース読めって言ってるやつのほとんどはplaggerのソースが読めない
521nobodyさん:2007/11/09(金) 22:28:46 ID:???
コード解説読めってならともかくコード読ませたってしょうがないだろ。Perlなんだから
522nobodyさん:2007/11/09(金) 23:35:40 ID:8S2oyKnm
tokuhiromのソース読めって言ってるやつのほとんどはtokuhiromのソースが読めない
523nobodyさん:2007/11/09(金) 23:39:07 ID:???
プラガー(笑)
524nobodyさん:2007/11/10(土) 10:49:28 ID:Z9OcedPC
web上の圧縮ファイル(.lzh)をダウンロードして保存、
さらにその圧縮ファイルを解凍するスクリプトを作りたいです。

例えば、LWP::Simpleを使った場合
my $dat = get('http://hoge.com/071110.lzh');
の後はどう処理していけばいいでしょうか?
525nobodyさん:2007/11/10(土) 11:02:39 ID:???
> の後はどう処理していけばいいでしょうか?

lha 書庫を解凍する処理を行えばよい。
526nobodyさん:2007/11/10(土) 11:03:28 ID:???
527nobodyさん:2007/11/11(日) 02:16:45 ID:???
2chみたいに携帯から固有のIDを作りたいんですが
どうすればいいんでしょうか。
528nobodyさん:2007/11/11(日) 07:14:50 ID:???
>>527
i-mode:UTN
EZweb:HTTP_X_UP_SUBNO
Y!:UA
529nobodyさん:2007/11/11(日) 14:32:10 ID:4iiY3aOI
正規表現について質問です。
urlからファイル名だけを取り出したいです。
例えば、$urlという変数に下の3つのurlがあった場合は
hoge1.html, hoge2.html, hoge3.htmlを取り出したいです。

http://localhost/hoge1/hoge1.html
http://localhost/hoge1/hoge11/hoge111/hoge2.html
http://localhost/hoge2/hoge21/hoge3.html

下のように自分でやってみたのですが、localhostの前の/から取得してしまいます。
if( $url =~ /\/(.*\.html)$/ ){
print $1 . "\n";
}

どうすればやりたい事ができますか?
教えてください、お願いします。
530nobodyさん:2007/11/11(日) 14:35:11 ID:???
ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。

あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
531529:2007/11/11(日) 14:47:19 ID:???
>>530
レス有難うございます。

>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。

>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。
532529:2007/11/11(日) 14:58:10 ID:???
条件文を下のコーディングに変更したらできました。
if( $url =~ /\/([^\/]*\.lzh)$/ ){

正規表現すげー
>>530さんアドバイスありがとうございました。
533nobodyさん:2007/11/12(月) 08:03:25 ID:???
.*?も覚えたらいいとおも
534nobodyさん:2007/11/12(月) 16:33:29 ID:XNEEDQVz
そのファイルがバイナリなのかテキスト(shift-jis,euc,utf8)なのかを判断するにはどのようにしたら良いのでしょうか?

最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。
バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?
535nobodyさん:2007/11/12(月) 16:42:39 ID:???
ファイルテスト演算子
536nobodyさん:2007/11/12(月) 18:17:28 ID:XNEEDQVz
>>535
有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。
537nobodyさん:2007/11/12(月) 18:33:52 ID:???
\0が含まれてればバイナリでいいんでないの
それ以外だと各文字コードの仕様を調べて
全データがそれに矛盾してないか判断するしかないと思
538nobodyさん:2007/11/12(月) 18:39:12 ID:???
正規表現使えばいいじゃない
539nobody:2007/11/13(火) 03:52:36 ID:fKqfq45H
ttp://www.jpopfan.co.jp/uranai/uranai000.htm
上のサイトのようなゲームをperlで作りたいと思っています。
htmlのみでも十分なゲームだとは思いますが、あえてCGIゲームとして作りたいです。
(学校の授業の自由課題であるので・・・)

一応以下のようにhtmlは作ってみました。

<html>
 省略
<body>
<h1>オーケストラ楽器別診断</h1>
<p>次の質問にお答えください♪</p>
<form action="/nussknac/cgi-bin/kadai.cgi" method="post">
<dl><dt>お名前</dt>
<dd><input type="text" name="name" value=""></dd><br>
<dt>Q1. あなたはプライドが高いほうですか?</dt>
<dd><ul>
<li><input type="radio" name="answer1" value="Yes" checked>Yes</li>
<li><input type="radio" name="answer1" value="No">No</li>
</ul></dd></dl>
<p><input type="submit" name="send1" value="送信"><br></p>
</form></body></html>
540nobody:2007/11/13(火) 03:57:04 ID:fKqfq45H
539の続きです。
HTMLのフォームから情報をCGIに送り、最初の質問に対してYesならAの質問、NoならBの質問・・・というように
答えによって質問を分岐させるように作りたいです。
if文でひたすら分岐するというイメージはありますが、どうすれば、送信ボタンを押した時に次の質問ページにリンクさせる事ができるかが分かりません。
質問ページは一つ一つ作りたいです。
よろしくお願いします。
541nobodyさん:2007/11/13(火) 04:18:50 ID:???
そういうアルゴリズムも含めて課題になってるんじゃねーのか・・・まぁいいけどさ。
で、htmlはともかくどこまでperl書いたのよ。まさか1行も書かずに相談しにきてるわけじゃあるまい?
542nobodyさん:2007/11/13(火) 06:54:14 ID:???
何日か前に別のスレでも見たけど、ここで聞いてて課題間に合うの?
543nobodyさん:2007/11/13(火) 08:58:39 ID:???
あみだくじでいいのか、選択によってポイントがたまってその結果で振り分けられるのか。
色々ロジックはあると思うけど、そこら辺はどうするのかな
544nobodyさん:2007/11/13(火) 09:17:32 ID:???
>542
提出日まで1〜2週間とかなら大丈夫じゃない?

その昔、C言語の授業があって、その授業終了直後に提出したら怒られたことがあったなあ(笑)
ごめん、確かに授業聞いてませんでした。
545nobodyさん:2007/11/13(火) 09:19:51 ID:???
あみだくじでいいなら、
<li><input type="radio" name="answer" value="Aの質問のURL" checked>Yes</li>
<li><input type="radio" name="answer" value="Bの質問のURL">No</li>
ってして、
print "Location: answerの値\n\n";
でリダイレクトさせていけばいいだけでは?
546nobodyさん:2007/11/13(火) 10:36:02 ID:???
HTMLでおk
547nobodyさん:2007/11/13(火) 11:10:10 ID:???
リンク元のURLに%??%??〜が含まれてる場合に、その文字をデコードしてUTF-8として表示しようとしています。
元の文字コードがUTF-8のときは問題なく表示できるのですが、
文字コードの判別を含めてやる場合どうやったらいいのでしょうか?
Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。
いきなり変換が難しいならUTF-8か否かを判別できれば、
UTF-8の場合→直デコード
UTF-8でない場合→直デコード→jcode.plで変換
でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。
よろしくお願いします。
548nobodyさん:2007/11/13(火) 15:19:48 ID:lcS1D/Cp
539です。
一応perlでは以下のように作りました。
#!/usr/local/bin/perl

use CGI;
$query = new CGI;

$q1 = $query->param('answer1');
if ($q1 eq Yes) {
open(F, ">>q2.html");
} else {
open(F, ">>q3.html");
}

でもこれだとエラーが出てしまいます。
どのように直せばいいでしょうか。
リンクのさせ方など教えて下さい。
課題提出は12月までです。
違うスレには書いていないので私ではないです。
549nobodyさん:2007/11/13(火) 15:34:47 ID:???
use constant Yes => 'Yes';
550nobodyさん:2007/11/13(火) 15:56:31 ID:???
課題は自分でやれwww
551nobodyさん:2007/11/13(火) 16:29:42 ID:???
>>54
こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use FileHandle;
use File::Spec;

my $cgi = CGI->new;
my $fh = FileHandle->new;
my $html_dir = '/path/to/html/dir';
my $output = $cgi->header( -type => 'text/html' );
my $fn = q{};

if ( $cgi->param('answer1') eq 'Yes' ) {
    $fn = 'q2.html';
}
else {
    $fn = 'q3.html';
}

$fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
my $data = do { local $/; <$fh> };
$fh->close;
$output .= $data;

print $output;
552nobodyさん:2007/11/13(火) 16:30:23 ID:???
レス番ミスった。
>>54
>>548
553nobodyさん:2007/11/13(火) 16:31:27 ID:???
さらに訂正。
誤 $fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
正 $fh->open( File::Spec->catfile( $html_dir, $fn ) '<');
554nobodyさん:2007/11/17(土) 14:33:33 ID:GlJQ98hk
http://oshiete.new-akiba.com/archives/2007/01/webarchivedlwarrick.html
ここを見ながらコマンドプロンプトを操作しているのですが
ダウンロードされる段階まで行っても
Can't locate strict.pm in @INC (@INC contents: .) at C:\Program Files \warrick\warrick.pl line8.
BEGIN failed--compilairion aborted at C:\Program Files \warrick\warrick.pl line8.
と出ます。

意味もそもそも分からないのですが、解決方法教えてください
555nobodyさん:2007/11/17(土) 15:24:40 ID:???
>>554
エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?

あとここはコーディングスレだからスレ違いだと思わなくもない。
556nobodyさん:2007/11/17(土) 20:14:46 ID:???
>>555
最新版入れてみたけど同じでした
質問スレいってきます
557nobodyさん:2007/11/17(土) 20:58:37 ID:???
>>にアンカを3つだけつけたいんだけど、これだと同じとこにリンクをかけてしまいます。
どうすればいいんでしょうか。
for($i=0;$i<3;$i++)
{
$str=~s/>>[0-9]{0,10}[-]{0,1}[0-9]{0,10}/<a href="$_[1]p=$&">$&<\/a>/;
$str=~s/p=>>/p=/;
}
558nobodyさん:2007/11/17(土) 22:00:49 ID:???
$i = 0; $buf =~ s/(>>\d+)/$i++ < 3 ? "LINK:$+" : $+/egs;
559556:2007/11/17(土) 22:23:56 ID:???
>>558
ありがとうございます。
そんな書き方知りませんでした。
560557:2007/11/17(土) 22:26:54 ID:???
>>559
556じゃなくて557でした
561nobodyさん:2007/11/18(日) 19:50:49 ID:???
自作モジュールをロードするときに、BEGINブロックで@INCに追加してからBEGINの外でuseするのは外道
562561:2007/11/18(日) 19:51:25 ID:???

「ですか?」が抜けた。
すまぬ
563nobodyさん:2007/11/18(日) 20:25:36 ID:???
>>561-562
外道かどうか知らんが、普通は use lib でしょ。
564nobodyさん:2007/11/19(月) 06:13:08 ID:s0DcKkZM
これからプログラムをやりたいと思ってます。
いまからやるならperlは覚えたほうがいいですか?
565nobodyさん:2007/11/19(月) 06:19:02 ID:???
PHPでいいよ
566561:2007/11/19(月) 08:54:57 ID:???
>>563
ありがt
567nobodyさん:2007/11/20(火) 11:38:30 ID:PLctc9ni
多重起動の禁止はできたが、解放がうまくいかない。
どこが悪いか教えてください。

#登録&多重起動禁止
use Win32::API;
use Win32::Mutex;
my $mutex = Win32::API->new("kernel32","CreateMutex",["N", "N", "P"], "N");
die "二重起動" if(Win32::Mutex->open('TestProgram123'));
$mutex=Win32::Mutex->new(1, 'TestProgram123');


#解放
my $releacemutex = Win32::API->new("kernel32","ReleaseMutex",["N"], "N");
$releacemutex->call($mutex);
568576:2007/11/20(火) 14:43:38 ID:PLctc9ni
自己解決

Win32-API使わなくてもできるのねぇ
569nobodyさん:2007/11/21(水) 03:27:48 ID:???
むしろ何の為のラッパーだよ
570nobodyさん:2007/11/23(金) 21:52:32 ID:BH2PwYj+
質問失礼します。

AとBの文字があるとき、文字列の中のBAを全てABにしたいときはどのような置換をすればいいのでしょうか?

例えば、
$s = "AABABABBBA";
と文字列があったら、
$s = "AAAAABBBBB";
にしたいのです。

$s =~ s/BA/AB/g;とすると、置換後を判定してくれないので、困ってます……
571nobodyさん:2007/11/23(金) 21:58:25 ID:???
>>570
たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'
572nobodyさん:2007/11/23(金) 22:00:18 ID:???
>>570
その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}

whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。
573 ◆TWARamEjuA :2007/11/23(金) 22:31:04 ID:??? BE:6970188-2BP(6825)
sortって云う手もあるよなぁ♪
print join "", sort split "", "AABBABABBBABAABBAABABABABA";
574570:2007/11/23(金) 22:36:47 ID:???
>>571-573
返信ありがとうございます。
無事whileを使う方法で出来ました。
575nobodyさん:2007/11/24(土) 07:56:01 ID:???
>>574
遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
perl -le 'my $s = "atataaattttatatat" ; print "a" x ( $s =~ s/a/a/g ) . "t" x ( $s =~ s/t/t/g ) ;'
ま、他の文字が存在してても外側ループ一個つけるだけだけどね。

蛇足だと思ったんだが、、、、
576nobodyさん:2007/11/25(日) 15:53:28 ID:???
ちょっと分からないので質問させてもらいます。
手作りで掲示板みたいなのを作ってるんですけど
Location:で二重投稿を禁止したくて書いたんですが投稿したあとにLocation:って文字が表示されて飛ばないんですけど
なんでしょうか?
普通なら飛ぶのに飛びません・・・。

誰か分かる方が居れば教えてください。
577nobodyさん:2007/11/25(日) 16:07:12 ID:???
>>576
content-typeの前に書いてみ
578nobodyさん:2007/11/25(日) 16:35:27 ID:???
>>577
出来ました。
ですが書き込みがされなくなりました・・・。
579nobodyさん:2007/11/25(日) 17:55:01 ID:???
そもそもがどんな仕組み何だかわかんねーと答えようがねーよw
こっちはエスパーじゃないんだからさw
580nobodyさん:2007/11/25(日) 18:30:55 ID:???
>>579
http://www.uploda.org/uporg1129660.txt
これなんですが上手く動作しなくて・・・。
581nobodyさん:2007/11/25(日) 18:47:07 ID:???
一番最初に

print "Content-type: text/html\n\n"; # データ形式

を書いてるのが不味いような気がするのは気のせいかな。
582nobodyさん:2007/11/25(日) 18:47:57 ID:???
>>581
他のところに置いたりすると上手く動作しないんです・・・。
583nobodyさん:2007/11/25(日) 18:50:17 ID:???
あと、$locationって変数、どこで使ってるんだろ。
584nobodyさん:2007/11/25(日) 18:55:24 ID:???
勉強し直しておいで。
585nobodyさん:2007/11/25(日) 18:55:39 ID:???
あ、それは書き忘れましたがKENTWEBさんのところのをちょっと借りたやつです。
# リロード
if ($location) {
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\r\n";
print "Content-type: text/html\n";
}
print "Location: $location?\n\n";
exit;
}
これがサブルーチンのwriteの最後に置いてました。
586nobodyさん:2007/11/25(日) 18:56:09 ID:???
とりあえずヒントは、
・Location: はHTTPヘッダに出力する
・ヘッダとボディの区切りは空行で示す
587nobodyさん:2007/11/25(日) 19:08:15 ID:???
前も書いたけど、kentwebのってデリミタに<>使うの好きだねえ。データがでかくなってくると、
2バイトも勿体無いと思う。
588nobodyさん:2007/11/25(日) 19:10:08 ID:???
>586
難しそうですが頑張ってみます。
589nobodyさん:2007/11/25(日) 21:12:48 ID:???
2バイトさえ気になるような人はデミリタに何使うんだろ。
590nobodyさん:2007/11/25(日) 21:13:37 ID:???
デリミタねw
591nobodyさん:2007/11/25(日) 21:51:10 ID:???
タブ?
592nobodyさん:2007/11/25(日) 21:57:24 ID:???
俺はタブ。excelにも貼るだけで、データやりとりできるし。
593nobodyさん:2007/11/26(月) 01:21:50 ID:???
俺は適当に,にしてた
594nobodyさん:2007/11/26(月) 09:34:29 ID:???
>>593
CGIでHTMLを吐く前提なら、 , を入力されると面倒なことになるんだよな。
< > なら < > ってできてしまうからいいんだけど。
595nobodyさん:2007/11/26(月) 09:35:03 ID:???
↑失礼
< > なら &lt; &gt; ってできてしまうからいいんだけど。
596nobodyさん:2007/11/26(月) 17:00:07 ID:???
, は&#44;でいいんじゃね?俺もタブ使うけど
597nobodyさん:2007/11/26(月) 19:49:54 ID:???
ちょいと質問を。

今ソフトバンククリエイティブのCGI/perl ハンドブック第3版
のCGIサンプルで掲示板を作ったのですが掲示板にメッセージが書き込まれなかったらエラーを出そうと
思って四苦八苦しているんですがperl6はよく分からなく苦戦しています。
誰かこの本を持っていて、分かる方がいればご教授お願いします。
598nobodyさん:2007/11/26(月) 20:23:48 ID:???
>>597
その本持ってないから知らないけど、本当にperl6ですか?

#このスレはご教授ってOKなんだっけ?

599nobodyさん:2007/11/26(月) 21:19:36 ID:???
こんばんは。
LWPで、現在取得しているURLの情報を参照する方法ってあるでしょうか。

ttp://www.xxx.ne.jp

というURLを取得したときに、いくつかリダイレクトされて、

ttp://www.xxx.ne.jp/cgi-bin/test.cgi?id=aaaa&pass=bbbb

こんな感じのURLになってるのですが、この ? 以降の情報を取得したいのです。
$responoser->base
では、 ? より前のURLしか返してくれません。
教えてください。
600nobodyさん:2007/11/26(月) 23:26:29 ID:???
>>598
その使い方も間違ってない以上、突っ込む方が野暮or空気が読めないでおk
601nobodyさん:2007/11/27(火) 03:23:29 ID:???
質問します

他のサーバー上のテキストファイルを読み込ませたいのですがopen関数ではできないんでしょうか?
602nobodyさん:2007/11/27(火) 03:33:26 ID:???
できない
603nobodyさん:2007/11/27(火) 03:49:49 ID:???
>>601
あんたすげーな
604nobodyさん:2007/11/27(火) 06:16:45 ID:???
童貞で40歳まで行ったら妖精になれるよりすごい発想
605nobodyさん:2007/11/27(火) 07:36:33 ID:???
ただ、PHPでは同じような方法でできるこの不思議。
606nobodyさん:2007/11/27(火) 08:12:36 ID:???
だれか599についての回答を・・・
607nobodyさん:2007/11/27(火) 09:01:18 ID:???
>>599=606
リダイレクトされるためには適切なHTTPヘッダが返っているはずだからそれ調べる。
608nobodyさん:2007/11/27(火) 11:02:47 ID:???
>>599 >>606
うちの環境では、3回リダイレクトを経て、?&引数がもっさりついたurlに飛ばしても、
print $response->base();
で、引数(’?’以降%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aとか)がついた
URLを表示できたけど・・・。

ActivePerl 5.8.8-build822(XPsp2)
LWP/5.808
609nobodyさん:2007/11/28(水) 05:14:00 ID:???
ブログの自動投稿プログラムを作りたいと思ってるんですが、大まかな仕組みも分からず困っています。
どなたかご教授願えませんか?
ちなみに、用途はバーチャルな人間の日記を作りたいと思っています。

日記を出力するアルゴリズムは別に用意しますので、
それをブログの投稿画面に自動でログインして書き込むようにしたいのです。

ローカルからでも構わないのですが、
できれば安いレンタルサーバーから行えれば良いなと思ってます。

検索で『自動投稿』としたらたくさん見つかったのですが、どれもアフィリエイター用のもので、
結構値段も高いですし、記事を予め用意しないとダメなので私がしたいようには出来そうにありません。
610609:2007/11/28(水) 05:16:24 ID:onMmaiK+
よろしくお願い申し上げます。m(__)m
611nobodyさん:2007/11/28(水) 05:24:30 ID:???
ひょっとしたら、atom っていうのを勉強したら道が開けるんですか?
612nobodyさん:2007/11/28(水) 05:26:27 ID:???
日記を出力するアルゴリズム ←これがきになる
613nobodyさん:2007/11/28(水) 09:39:10 ID:???
日記を出力するアルゴリズム ←ってのはもしかして勝手に日記を書いてくれるプログラムだろうか
614nobodyさん:2007/11/28(水) 09:48:03 ID:???
>>609
△▲ WebProg 初心者の質問 Part16 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1187729623/
615nobodyさん:2007/11/28(水) 13:29:43 ID:???
日記を出力するアルゴリズムを書ける人ならそれぐらい自分でできそうだけど。
荒らしスクリプトにするつもりじゃないなら、その日記を出力するアルゴリズムの
元ネタの場所を公開すれば信用が得られるかも。
616nobodyさん:2007/11/29(木) 03:01:28 ID:???
そういうのは荒らしやスパムに使われる可能性が高いから、自分でやりな。
617609:2007/11/29(木) 18:18:55 ID:fn44RAXr
>>612-615
日記のアルゴリズムが完成したわけではありません
ただそっちは、大したものじゃないにしても何とかなりそうなんです。
一方、自動投稿の方は何から手を付けていいのかすら分からない状態でしたので質問させてもらいました

>>616
やっぱりそうですか

わかりました。何とか頑張ってみます

因みにスパム行為をするつもりは毛頭ありませんが、確かに見ようによってはそう映る可能性も否定できないですね。

あくまでも普通の人間っぽい挙動にしたいと思っているので、投稿の数も一日で多くて3通程度、少ないときは三日ぐらい更新しないような動きを考えてました。

とにかく自分で何とかしないとダメみたいですね

ご迷惑おかけ致しました
618nobodyさん:2007/11/29(木) 18:50:54 ID:???
619nobodyさん:2007/11/29(木) 18:56:46 ID:???
>>617
う〜む、どう考えてもやっぱりその
日記を出力するアルゴリズム
ってのが、自動投稿するスクリプトより遥かに高レベルのような気がするが・・・・。

まあいいや、ヒントだけ。
WWW::Mechanize オススメ。
内容や使い方は、自分で調べてちょ。
620609:2007/11/30(金) 00:45:15 ID:???
>>618,619
ありがとうございました。
参考にさせていただきます。

今いろいろ資料を調べたり、さっき図書館で借りてきた
Webクライアントプログラミングって言う本(めちゃふるいですがw)
を読んだりしてます。

HTTP通信などは一度もやったことがないので、
LWPあたりから勉強したほうがよさそうな、
そんな気がしてる今日この頃。

AtomとかXML-RPCとかの資料にまではたどり着けたのですが、
そこに平然と書かれている GETだのPOSTだのという表現についていけない状況です。
あれを全部 perl のコードに解釈するための知識がないのです。

というわけで、だいぶ時間掛かりそうですが、
こつこつやっていこうかなと。

もう少し進歩して、またわからないことがあったら、
ここか>>614さんが教えてくれたスレにでも出没いたします。

では、ごきげんよう皆様。
621609:2007/11/30(金) 03:34:24 ID:???
(´・ω・`) ノシ やっとこさ、livedoor から餌を頂戴できました

なんだか、嬉しくて涙が出てきた 。・+゜(つД`)゜+・。

みんなありがと
622609:2007/11/30(金) 03:51:57 ID:???
>>619 Mechanize というのを完全に誤解してたようです
XML-RPCとかAtomPubなどとはまったく違うんですね。

なんというか、禁断の・・・いや、貴重な情報ありがとうございました。
623nobodyさん:2007/11/30(金) 12:46:37 ID:???
フォームメールに入力された内容を半角→全角に変換するプログラムがわかりません。

$str = '$mystr';
$kigou ='@!"#$%&\'()=-^\\|{}:;+*?_/<>';

require 'jcode.pl';

if ($FORM{'namae'} ne ''){
$mystr = $FORM{'namae'};
&hankaku;
}

sub hankaku{
&Jcode'convert(*str,'euc');
if($str =~ /^[0-9]{7,11}$/){
&jcode'tr(*str,'0-9A-Za-z','0-9A-Za-z');
}elsif ($str =~ /\x8E/) {
&jcode'h2z_euc(*str);
}else ($str =~ /$kigou/){
&jcode'tr(*str,'@!”#$%&’()=−^¥|{}:;+*?_/<>','@!"#$%&\'()=-^\\|{}:;+*?_/<>');
}
&Jcode'convert(*str,'sjis');
$str = $value;
exit 0;
}

1度eucに変換してからと考えたんですが。
624nobodyさん:2007/11/30(金) 13:06:38 ID:???
>>623
Unicode::Japanese
625nobodyさん:2007/11/30(金) 13:27:37 ID:7wito75u
2007/11/30-2007/12/01,00-24,[動作させる値]

のようなdatファイルを下記でブランチさせると、指定範囲外だと判定されてしまうようなのです。
改善するにはどこを直せば良いでしょうか・・・最後の日付部分の比較だけで判定されてる・・?
localtime(time)取得やDAT読み込みは大丈夫っぽいです。

foreach $sdat(@set){
next, if $sdat eq "\n";
@sdat = split(/,/,$sdat);
@ddat = split(/\-/,$sdat[0]);
@d1dat = split(/\//,$ddat[0]);
@d2dat = split(/\//,$ddat[1]);
@tdat = split(/\-/,$sdat[1]);
if(
($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[0] eq '*' || $d2dat[0] >= $year))
&&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[1] eq '*' || $d2dat[1] >= $mon))
&&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[2] eq '*' || $d2dat[2] >= $mday))
&&($d1dat[0] eq '*' || ($ddat[1] ne '' && $d1dat[0] <= $year) || ($ddat[1] eq '' && $d1dat[0] == $year))
&&($d1dat[1] eq '*' || ($ddat[1] ne '' && $d1dat[1] <= $mon) || ($ddat[1] eq '' && $d1dat[1] == $mon))
&&($d1dat[2] eq '*' || ($ddat[1] ne '' && $d1dat[2] <= $mday) || ($ddat[1] eq '' && $d1dat[2] == $mday))
&&($sdat[1] eq '*' || ($tdat[0] <= $hour && $hour <= $tdat[1]))
){
chomp $sdat;
$url = $sdat[2];
last;
}
}
626nobodyさん:2007/11/30(金) 13:32:25 ID:???
ひどすぎわろた
627nobodyさん:2007/11/30(金) 15:56:59 ID:7wito75u
失礼。自己解決しました。
628nobodyさん:2007/12/10(月) 07:32:09 ID:aPvXjzqK
Perl5.x+CGIです。

現在、複数のプロセスから、同じデータにアクセス(読み書き)したいと考えています。
異なるプロセス間で共有される静的な変数、というようなイメージです。

外部ファイルやデータベースなどを経由する方法以外で、
このような処理を実現するにはどのようにすればよいか、ご存知の方がいましたらお願いします。

やはりmod_perlが適当でしょうか。
629nobodyさん:2007/12/10(月) 11:08:15 ID:???
静的な変数?

ていうかそれプロセスが落ちたらデータは消えていいってこと?
素直にファイルなりDBなり使えばいいとおもうんだけど、それができない理由は?
630nobodyさん:2007/12/10(月) 11:47:45 ID:???
質問の意味がわからないけど
mmapやmemcacheみたいなの?
631nobodyさん:2007/12/10(月) 13:16:59 ID:???
読み書きするのに静的ってナンダロ

スレッド使うMPM+mod_perlで:shared使うとか
shared memory使うとかそういう話かな?

質問の仕方が初心者臭いし素直にDB使っとけって気がする。
632628:2007/12/10(月) 20:47:52 ID:???
>629-631
ありがとうございます。遅くなってすみません。
ご想像通り初心者です。初めて触ったのは何年も前ですが、仕事とか全然関係ないので。


Perl ←―→ 外部ファイル、DB
    ↑
ここのコストが凄く重いので、可能な限りアクセスを減らしたいと考えています。
Perl側で保持しておけば多少は減るかなあと。
要は、「キャッシュ」のようなものだと思っていただければ。


>629
>プロセスが落ちたら
はい、構いません。もう一度、データ本体から取得するだけなので。

>631
>読み書きするのに静的
「静的変数」と「定数」は全くの別物という認識だったのですが、
もしかするとPerlの世界だと違うのかもしれません。少し調べてきます。

>630-631
>mmap、memcache、shared
軽く調べてみただけですが、そういうことです。勘違いしてるかもしれませんが。
この辺のキーワードを参考に、深く見てみようと思います。
633nobodyさん:2007/12/12(水) 13:49:47 ID:uWSb2hJm
すみません質問です。
複数画像ファイルが入っている特定フォルダから更新日が一番最新のファイルを
探して表示させたいのですが出来ますでしょうか?
尚、ファイル形式は不定です。
教えてください。
宜しくお願いします。
634nobodyさん:2007/12/12(水) 13:58:00 ID:???
(stat 'filename')[9]
635nobodyさん:2007/12/12(水) 16:11:40 ID:???
質問です。
aaa.htmというファイルを読み込んで、その中に書かれている変数を変数展開したいと思ったのですがそう簡単にはいきませんでした。
print qq|$_|;
とすれば変数展開されるかなと思いましたがそれもだめ。
置換を使えば簡単なのですが、置換以外の方法がありましたら教えてください。

--------aaa.htmの内容--------
<html>
<body>
$a
</body>
</html>

--------ソース--------
$a = 'aaa';

open(IN, "< aaa.htm");
@html = <IN>;
close(IN);

print "Content-type: text/html; charset=Shift_JIS\n\n";
foreach (@html)
{
print $_;
}
636nobodyさん:2007/12/12(水) 16:27:53 ID:???
HTML::Templateでも使っとけ
637635:2007/12/12(水) 16:52:55 ID:???
evalをつかったらなんとかなりそうです。

>636さんレスありがとう
638nobodyさん:2007/12/12(水) 17:26:25 ID:BkwLyerT
Encode.pm 5.85でEUC→UTF-8変換時に、
「」などの漢字が化けてしまうのですが、
これを化けないように工夫するにはどうすればいいのでしょうか?
639nobodyさん:2007/12/12(水) 18:06:55 ID:???
>>638
Encode::EUCJPMSを入れて、cp51932を使う。
640nobodyさん:2007/12/13(木) 08:48:25 ID:???
>>635
s/\$(\w+)/${$1}/g;
641628=632:2007/12/13(木) 20:33:46 ID:???
自己レスな上に遅レスです。
色々と検討してみた結果、速度や安全性に疑問も多いですが、とりあえずshm○○を使ってみようかなと思います。
ありがとうございました。
642nobodyさん:2007/12/14(金) 03:20:01 ID:jWEjvsMQ
質問です。
Usteramで録画したflvをダウンロードしたくて、
http://unknownplace.org/memo/2007/10/03を参考に以下のソースを実行しました
#!/usr/bin/env perl

use strict;
use warnings;
use AMF::Perl;
use LWP::UserAgent;
my $cid = shift || '5Fq8cQp9eHsEEknbQ22OOZniqS2xUiuz';
my $amf = AMF::Perl::Util::Object->new;
$amf->addBody('client.watch_video', '/1', { cid => $cid });
my $outputstream = AMF::Perl::IO::OutputStream->new;
my $serializer = AMF::Perl::IO::Serializer->new($outputstream, 'utf-8');
$serializer->serialize($amf);
my $amfdata = $outputstream->flush;
$amfdata =~ s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/;
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new( POST => 'http://gw.ustream.tv/gateway.php' );
$req->content( $output );
$req->content_type('application/x-amf');
$req->content_length( length $amfdata );
my $res = $ua->request($req);
my $deserializer = AMF::Perl::IO::Deserializer->new(AMF::Perl::IO::InputStream->new($res->content), 'utf-8');
use YAML;
print Dump $deserializer->getObject->getBodyAt(0)->{value};
643642:2007/12/14(金) 03:21:23 ID:jWEjvsMQ
実行結果は以下の通りです。

Content-Length set when there is no content, fixed at /Library/Perl/5.8.6/LWP/Protocol/http.pm line 196.
Can't use an undefined value as a HASH reference at test.pl line 37.
どうすればいいでしょうか。

よろしくお願いします。
644nobodyさん:2007/12/14(金) 08:48:00 ID:???
37行目って何処よ
645nobodyさん:2007/12/15(土) 20:24:19 ID:???
$text = <STDIN>;

として、処理中に何らかのテキストを入力させたいです。
英数字は問題ないのですが、日本語を入力したときが変です。

aあ

と入力して、バックスペースを押すとちゃんと消去されません。2回おせば「あ」の表示は消えるのですが、
受け取った文字のaも消えてしまっています。
解決策を教えてください
646nobodyさん:2007/12/15(土) 22:15:15 ID:???
IPアドレスから携帯のキャリア判定してる人ってみんなここから
新しいIPアドレスが追加されたか定期的にチェックしてるんですか?
http://ja.wikipedia.org/wiki/%E5%88%A9%E7%94%A8%E8%80%85:Tietew/%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%E3%81%AEIP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%AA%E3%82%B9%E3%83%88
647nobodyさん:2007/12/15(土) 22:41:06 ID:???
ついでにききたいのですが、
@text = <STDIN>;

ってやったときに、入力を終わりにするにはどうすればいいのですか?
648nobodyさん:2007/12/16(日) 02:59:28 ID:???
>646
そこから調べてるかどうかはともかく、公式サイトを見るのは確かだな。
まあ、IPアドレスが追加されること自体はあんまり無いし……。
649nobodyさん:2007/12/16(日) 11:33:56 ID:???
>>646
リモートホストに変換して判断してる。
650nobodyさん:2007/12/16(日) 16:00:14 ID:???
>>649
ホストに変換するのは失敗することあるらしいぞ。
直接IPから判断した方が確実。

気にするほどじゃないとは思うけど、どうなんだろ
651nobodyさん:2007/12/16(日) 18:41:45 ID:???
perlで2ちゃんねるの専用ブラウザみたいなのって作れるんでしょうか。
652nobodyさん:2007/12/16(日) 19:23:33 ID:???
ネットワークをサポートしていて、文章の出力が出来るなら大抵の言語で可能だと思うよ。
653642:2007/12/17(月) 11:34:49 ID:FgX+pG+l
>>644
37行目は一番最後のprintの部分です。
654nobodyさん:2007/12/18(火) 10:34:57 ID:???
たとえば、sample.plに、

require('lib/lib.pl');
&dosomething();

と書いておいて、lib/lib.plに、

sub dosomething{
  open(FH, '>> baka.log');
  print FH time."\n";
  close(FH);
}

とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。
これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。
または絶対パスを使うしかないのでしょうか。
ヒントだけでもお願いします。
655nobodyさん:2007/12/18(火) 11:18:35 ID:???
>>654
じゃあ、ヒントだけ…
つ %INC
656654:2007/12/18(火) 16:52:48 ID:???
>>655
ありがとう!
こーゆー用途に使うのな。
657nobodyさん:2007/12/19(水) 01:05:36 ID:???
ハッシュ配列の各要素をリファレンスとして関数の引数に渡したいのですが
よくわからなくて試行錯誤の末下のような方法にたどり着きました

$AA{'name'} = '1234';
$BB[0]{'name'} = 'abc';
$BB[1]{'name'} = 'ああああ';
$BB[2]{'name'} = '!?';

kansuu( \%AA );
$tmp = \@BB;
kansuu( ${\$tmp->[0]} );
kansuu( ${\$tmp->[1]} );
kansuu( ${\$tmp->[2]} );

sub kansuu
{
  my $h = $_[0];
  print "$h->{'name'}<br>";
}

BBの要素を kansuu() に入れるために
もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?
658nobodyさん:2007/12/19(水) 01:14:31 ID:???
my %AA = ( name => 1234 );
my @BB = (
{name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる
{name => 'ああああ'}, #$BB[1]に〃
{name => '!?'} #$BB[2]に〃
);
kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる
kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す
kansuu( $bb[1] );
kansuu( $bb[2] );

sub kansuu {
printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す
}
659nobodyさん:2007/12/19(水) 02:00:39 ID:???
$,@,%,\と(),{},[]と->の組み合わせで大抵何とかなる。
正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う
my $scalar = 'abc'; #スカラー
my $scalar_ref = \$scalar; #スカラーのリファレンス
my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど
my @array = (1,2,3); #配列
my $array_ref = \@array; #配列のリファレンス
my $anon_array_ref = [1,2,3]; #無名配列のリファレンス
my %hash = (a=>1,b=>2,c=>3); #ハッシュ
my $hash_ref = \%hash; #ハッシュのリファレンス
my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス
my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト
my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト
my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト
#素直に取り出せる
printf "scalar=%s\n",$scalar;
printf "array=%s\n",$array[0];
printf "scalar=%s\n",$hash{a};
#アドレスっぽいのがとれる
printf "scalar_ref=%s\n",$scalar_ref;
printf "array_ref=%s\n",$array_ref;
printf "scalar_ref=%s\n",$hash_ref;
#リファレンス先の値書き換えたり取り出したり
$$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref;
$array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1];
$hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b};
#デリファレンスする(copyが作られる)
my $scalar2 = ${$scalar_ref};
my @array2 = @{$array_ref};
my %hash2 = %{$hash_ref};
660nobodyさん:2007/12/19(水) 07:53:49 ID:???
CGI.pmでmetaを出力したいのですがうまくいきません。
↓これを出力したいのですが・・・
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

ttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/cgipm.html

このページの解説によると、

use CGI;
my $q = CGI->new;

print $q->start_html(
              -head=>meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。

661660 続き:2007/12/19(水) 07:54:19 ID:???
print $q->start_html(
              -head=>$q->meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

とやると一応うまくいくのですが、なぜか
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />


このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか?
CGI.pmは3..31です。
662nobodyさん:2007/12/19(水) 10:23:45 ID:???
>>660-661
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

my $q = CGI->new;
$q->charset('UTF-8');
663660:2007/12/19(水) 23:37:11 ID:???
>>662

ありがとうございました!
664657:2007/12/20(木) 08:31:41 ID:???
>>658-659
ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです
665nobodyさん:2007/12/20(木) 10:28:40 ID:???
> 超わかりやすくて助かりました
> 今のプログラムの色んなところがもっと簡潔に書けそうです

本当はわかってないくせに。
666nobodyさん:2007/12/20(木) 13:33:18 ID:???
>>658-659ですべてが理解できれば天才
667nobodyさん:2007/12/20(木) 13:39:25 ID:???
最低限は書かれてて分かりやすいとは思ったぞ
668nobodyさん:2007/12/20(木) 16:21:00 ID:???
読む気もしねぇよ
669nobodyさん:2007/12/21(金) 21:13:42 ID:???
でもああやって思いつく限りの書き方試して要素やハッシュ値見てればなんとなくでもわかってくるはず。
めんどいけど。
670nobodyさん:2007/12/22(土) 18:50:11 ID:???
あんな変な列挙を眺めるんじゃなくて、続初めてのPerl読むべきだろ。
671nobodyさん:2008/01/02(水) 06:47:19 ID:???
perl5.10 に移行した人います?
672nobodyさん:2008/01/02(水) 20:07:21 ID:???

依存コードは書いてないけど
673nobodyさん:2008/01/03(木) 00:16:04 ID:???
ノシ
cygwinで5.10入れてみた
use 5.10;で書いてみてる
674nobodyさん:2008/01/05(土) 22:21:41 ID:???
変数の中身を展開せずに確認したい場合ってどうすればいいんでしょうか?

$test = "今日は\n いい天気です $wether";

こんな変数があるとして、$test自体は展開してほしいんですが、
中身の\nや$wetherは展開せずに出力したいのです。
675nobodyさん:2008/01/05(土) 22:58:36 ID:???
'

ちなみに、weather?
676nobodyさん:2008/01/06(日) 03:58:05 ID:???
>>674
$testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?

リファレンスにしてアドレスを確認する手もあるけど
677674:2008/01/06(日) 14:08:20 ID:???
うーん、無理みたいですね。諦めます。一応問題は解決しましたので

>>675
そうです;
>>676
なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。
678nobodyさん:2008/01/06(日) 16:36:10 ID:???
>>674はなぜ>>675の一行目を無視するんだ?
それが答えじゃないか。
>>676はそれもわかってないみたいだが。
679nobodyさん:2008/01/06(日) 23:12:25 ID:wcb81UNa
$kekka = int(200 * 0.29);
print "$kekka";

このような計算をしたら、結果が57になりました。
intって小数点が発生した時に切り落とすはずですよね?
えと、なぜこんなことになるのか意味が分からないのですが、
誰かご教授お願いします
680nobodyさん:2008/01/07(月) 01:59:09 ID:???
681nobodyさん:2008/01/07(月) 11:17:24 ID:???
それ、今じゃ間違いじゃないってのが一般的。
語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。

いつもいつも空気読めない人が指摘するよな。
682nobodyさん:2008/01/07(月) 11:27:36 ID:???
>>679
$kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";

こう書けばOK
683nobodyさん:2008/01/07(月) 11:29:04 ID:???
>>681
誤用でない方が一般的だとする根拠は?
684nobodyさん:2008/01/07(月) 11:38:36 ID:???
回答にはなってないけれど、こちらの環境でもいくつか試してみた
ので、その結果を書いておく。
何でこんな風な結果になるのだろうか。私も分からなかった。

$kekka = 200 * 0.29;
print "$kekka";
出力:58

$kekka = 200 * 0.29;
$kekka = int($kekka);
print "$kekka";
出力:57

$kekka = int(200 * 0.29);
print "$kekka";
出力:57

$kekka = int(2 * 29);
print "$kekka";
出力:58
685nobodyさん:2008/01/07(月) 12:30:31 ID:???
浮動少数の扱いの問題。
use bignum; これで解決。
686nobodyさん:2008/01/07(月) 21:15:48 ID:XSyaqzwg
>>685
おぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。
687nobodyさん:2008/01/07(月) 21:22:49 ID:???
ためしにPerlじゃなくてLispで
(* 200 0.29)
ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな
688nobodyさん:2008/01/07(月) 22:41:02 ID:???
誤差については、がっこで習うものだと思ってたけど、そうでもない?
689nobodyさん:2008/01/07(月) 22:44:33 ID:???
俺は習ったけど、もしかしたら教えてないところも少なくないかもしれん
690nobodyさん:2008/01/07(月) 23:59:36 ID:???
情報工学を扱う授業でもなきゃ教わらないんじゃね?
少なくとも俺は浮動小数点の丸め誤差については習ったことない。

あと高校の世界史も。
691nobodyさん:2008/01/08(火) 00:07:25 ID:???
>>683
>>681じゃないがなんかの辞書に載ってた気がする
ソースはない
692nobodyさん:2008/01/08(火) 00:31:05 ID:k+nta2fc
丸め誤差の知識はありますけど、
コンピュータの中で200*0.29ってどうやって計算してるか分からない
そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか
さっぱりw
693nobodyさん:2008/01/08(火) 00:34:28 ID:???
しかも
(* 20 0.29)
これは5.8って表示されるから困るw
694nobodyさん:2008/01/08(火) 00:38:53 ID:???
自前のショッピングカートの消費税を int($sum * 0.05) みたいに計算してるんだけど、大丈夫だろうか…
695nobodyさん:2008/01/08(火) 07:14:24 ID:???
>>694
>>685にすれば大丈夫かと
696nobodyさん:2008/01/08(火) 08:15:35 ID:???
俺は一番最初の質問者ではないが、浮動小数点の丸め誤差については、
wikipediaにも載ってたね。
問題の解決には、 use bignum; つかえばいいわけで、それでいい
のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、
あとで100で割ったりする方法だったらちゃんとでるから
use bignum; しなくてもいいんだよね?
697nobodyさん:2008/01/08(火) 22:01:08 ID:???
>>696
0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?
698nobodyさん:2008/01/09(水) 00:10:32 ID:???
>>697
レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。
699nobodyさん:2008/01/09(水) 01:01:57 ID:???
うーん、俺も難しいことはわからんけど、
俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。
大量のデータを扱う人から見ればふざけた態度かもしれないけどね。
700nobodyさん:2008/01/09(水) 02:01:45 ID:???
LL的には人間にとっての最適化(コードの可読性)のほうが重要だからそれでいいと思うな
701nobodyさん:2008/01/09(水) 03:08:01 ID:480klIK2
リーダビリティ重要。(高橋メソッド風に)
702nobodyさん:2008/01/10(木) 23:51:33 ID:???
IPを10進数に変換したものと、
サブネットマスク形式のリストをマッチングさせたいんですが、
どんなループさせればいいですかね?

#判定ルーチン内
foreach (@list) {
 my ($min,$max) = subnetMinMax($_);
 return ($ip >= $min and $ip <= $max) ? 1 : 0;
}
としてるんですが、grep等を使ったほうが良いんでしょうか?
ループ内でサブルーチン呼ぶのがちょっと気になります。
703nobodyさん:2008/01/11(金) 00:04:09 ID:???
訂正orz

x: return ($ip >= $min and $ip <= $max) ? 1 : 0;
o: return 1 if($ip >= $min and $ip <= $max);
704nobodyさん:2008/01/11(金) 11:44:26 ID:???
@listの中にマッチするものが複数存在する可能性があって
何にマッチしたか全て取りたいならgrepだけど
有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?
705nobodyさん:2008/01/11(金) 16:30:20 ID:???
return $ip >= $min and $ip <= $max;
706nobodyさん:2008/01/11(金) 20:31:41 ID:???
>>704
なるほど。このままにしますありがとうございました。

>>705
そっか、そうですよね。
聞いてみて良かったです。
707nobodyさん:2008/01/12(土) 13:10:11 ID:???
「うんこ」を含む行の最後に「出る」と追加することってできますか?
「うんこ」の前後は英数字・日本語交じりで文字数は不定です。
$_ =~ s/(うんこ)/$1でる/;
だと、うんこ〜出るの間の文字が文末にきてしまいます。
文末指定は$みたいなので
$_ =~ s/(うんこ)/$1でる$/;
としてperlを実行させると、エラーなのか、プログラムが終わりません。
708nobodyさん:2008/01/12(土) 13:13:01 ID:???
if ( $うんこ =~ /うんこ/ ) {
 $うんこ .= ’でる’
709nobodyさん:2008/01/12(土) 13:38:43 ID:???
「うんこを含む行」「改行」 ⇒ 「うんこを含む行」「でる」「改行」

if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }
710707:2008/01/12(土) 13:54:47 ID:???
>>708
全角を半角にしてやってみたりしましたが、エラーでした。

>>709
できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?
711nobodyさん:2008/01/12(土) 18:35:26 ID:???
なにこのうんこスレ
712nobodyさん:2008/01/12(土) 19:18:44 ID:???
>>710
index
713707:2008/01/12(土) 22:50:20 ID:???
>>712
すみません、わかりました。ありがとうございました。
714nobodyさん:2008/01/13(日) 13:16:41 ID:rzzkvCmj
怠惰が美徳だの
エロエロ言語だの
言うけどさ
俺が習ってきた主な4つの言語のなかじゃ
間違いなく一番習得が苦しかった

つまり、学習コストは高い
Perlより習得が難しい言語ってあるの?

私見では達人レベルを目指すならC++が全言語のなかで一番習得困難
そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)
715nobodyさん:2008/01/13(日) 13:17:19 ID:rzzkvCmj
スレ間違えた( ゚д゚ )
716nobodyさん:2008/01/13(日) 21:52:12 ID:???
配布用のスクリプトを書く予定なんですが、
変数名のつけ方で悩んでいます。
たとえば、
my $title;
my $script_content_title;
my $ScriptContentTitle;
sub param{}
sub parse_URL_encoded_string{}
sub ParseURLEncodedString{}
等、色々書き方ありますが
短い方が良いのか、わかりやすい名前が良いのか、
又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、
意見ください。
賛否両論あると思いますが、極力万人受けするものを選びたいです。

長文すみません
717nobodyさん:2008/01/13(日) 21:53:50 ID:???
配布スクリプトの中身の変数名なんて誰も見ねぇよ
718nobodyさん:2008/01/13(日) 21:56:06 ID:???
>>717
学習、改造用として配布したいんです。
719nobodyさん:2008/01/13(日) 22:43:42 ID:???
perldoc perlstyle
720nobodyさん:2008/01/13(日) 23:03:26 ID:???
変数や関数の名前の付け方は、どんなプログラムを書こうとしている
かというところもあるからな。
例えば、関数名で html_ をつけるとそうでないものとの区別がついて
分かりやすくなるけれど、全部の関数に html_ がついてたら
逆に無意味に長いだけとなる。
ここでアドバイスが欲しかったら、その書こうとしているプログラムや
ソースをもう少し具体的にだすとかしないと話は進まないと思う。
721716:2008/01/13(日) 23:22:17 ID:???
>>719
ありがとうございます。全部読みました。

基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp    #局所
$LOCK_KIND #定数

>>720
プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。

おかげ様で書き方が頭に浮かんできました。ありがとうございました。
722nobodyさん:2008/01/14(月) 02:09:11 ID:???
Perlプログラマは"不精"なので面倒なタイピングはしません。
でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。
こんなイメージ。
723nobodyさん:2008/01/14(月) 02:26:48 ID:???
怠惰と傲慢と短気だっけなラリーの三原則。

ネーミング重要。(高橋メソッド風に)

でも職人芸的なところあるよねネーミングセンスって。
なかなかそこは難しい。
724nobodyさん:2008/01/14(月) 04:10:53 ID:???
果たして自閉症の描くイメージとは
725nobodyさん:2008/01/14(月) 04:15:16 ID:???
>>716
もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo
726nobodyさん:2008/01/14(月) 17:41:01 ID:???
ダミアン先生はPerl界屈指のハッカーだが、著作物での記述にクセが全くないわけではないからね。

一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。
これがなかなか大変だし難しい。
そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり
ブログを定期的にチェックし続けないといけないから。
そういうことをしてない自称Perl使いが結構俺の周りにはいて、
そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。
727nobodyさん:2008/01/14(月) 18:57:12 ID:4AKnbZN2
ファイルに入っている文字を出力するつもりなのですが、
メタ字が混ざっていることもあり、ちゃんと出力できません。
あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、
何か効率の良いメタ字対策はないでしょうか?
728727:2008/01/14(月) 19:02:23 ID:4AKnbZN2
すみません。微妙に文書が狂っていました。
ファイルに入っている文字からの出力の際の
文字化けする文字の対策をお願いします。
729716:2008/01/14(月) 20:00:43 ID:???
>>725-726
オライリーファンの俺には最高の本かもです。
>>727-728
余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。




730nobodyさん:2008/01/14(月) 20:08:53 ID:???
>>727
情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?

ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。

コードを示してはどうですか。
731727:2008/01/14(月) 20:18:57 ID:4AKnbZN2
$i = 0;
while($list = <IN>){
 (undef,$name[$i],undef) = split(/:/, $list);
 $i++;
}
@name = sort(@name);
while($line = <@name>){
 print "<option value='$line'>$line</option>";
}
えーっと、コードはこのような感じです。
ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。
732nobodyさん:2008/01/14(月) 20:21:10 ID:???
メタ文字がhtmlの解釈の問題を引き起こしてるんじゃないよね?
733nobodyさん:2008/01/14(月) 20:23:30 ID:???
metaタグで宣言している文字コードと異なるとか…
html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…
734727:2008/01/14(月) 20:30:22 ID:???
>>733
タグで宣言しているコードは関係ないのではと思います。
出力するとき、一部の文字がうまく表示出来ていませんから。
735727:2008/01/14(月) 20:32:56 ID:???
現状としてはファイルの中の「ソ」とかに\を付けていけば表示はうまくいくのですが、
ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。
736nobodyさん:2008/01/14(月) 20:40:00 ID:???
737nobodyさん:2008/01/14(月) 20:46:05 ID:???
>>735
use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932

↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。
738nobodyさん:2008/01/14(月) 20:54:55 ID:???
あw
binmode IN, ':encoding(shiftjis)';
かな?
739nobodyさん:2008/01/14(月) 20:57:33 ID:???
>>731
DBにアクセスしているのにファイルハンドルから@nameに格納しているとはいかに?
@nameへの格納の仕方が心許ないです。せめて以下のようにするとか。
my @name = map { (split(/:/))[1] } <IN>;
splitの対象が全角のコロンですが、perlソースと取り扱うデータの文字コードが合っていないと
間違いの元ですよ。

で、optionタグで書き出すべき文字列のリストが@nameに入っていて、それをどうしてグロブ
演算子を使っているのかわかりません。私はこんなこと一度もしたことありませんが…。
ここで、@nameの各要素がいったん解釈されてしまっていて、カタカナのソなどSJISの2バイト目の
\x5cが取り除かれてしまっています。単に
for (sort @name) {
  print qq{<option value="$_">$_</option>\n};
}
でいいと思うのですが。
740nobodyさん:2008/01/16(水) 00:34:21 ID:???
CGI::Applicationで index.cgi?rm=<デタラメなキー> のように
run_modesで定義されなかったrun_modeを指定するとエラーが発生させられてしまうのですが
未定義の場合デフォルトのrunmodeを起動させる方法は無いでしょうか?
741nobodyさん:2008/01/16(水) 02:08:57 ID:???
$self->run_modes(
    AUTOLOAD => \&catch_my_exception,
);
742nobodyさん:2008/01/16(水) 02:17:14 ID:???
>>741
ありがとうございます!試してみます。
743nobodyさん:2008/01/16(水) 04:59:20 ID:FWbaTTLj
5.005です。
以下のような、引数が省略可能なサブルーチンがあるとします。

 sub Func(;$\@\%) { (省略) }

このとき、引数が渡されたのか、それとも省略されたのかを
Func内で判断する方法を教えてください。

なお、そのままifに入れると偽となるような値(例えばスカラーの値が0)の場合も、
引数が渡されていると判断します。
744nobodyさん:2008/01/16(水) 05:29:59 ID:???
>>743
引数の数から判定
sub Func(;$\@\%) { print scalar @_ }
Func(); # 0
Func(undef); # 1
Func(1, @hoge); # 2
745nobodyさん:2008/01/16(水) 05:44:10 ID:???
>744
ありがとうございます。
なるほど、サブルーチンを使う時は常に@_を意識しないとダメだってことですね。
746nobodyさん:2008/01/16(水) 11:29:46 ID:???
@_ ってカタツムリみたいだよね。

@_ii
747nobodyさん:2008/01/16(水) 14:19:16 ID:Z4nycbhz
かたつむり大作戦
748nobodyさん:2008/01/16(水) 20:06:54 ID:L/Qn1HzA
質問です!

入門書を見ながら「URLにパラメータを加える」というのをやりました。

〜〜/test.cgi?list=man

とURLにパラメーターをくっつけ、cgiで

&ReadParse( *form );
$sex = $form{ 'list' };

と受け取ったつもりだったのですが、結果をprintしてみると

manman

と2回表示されてしまいます。これは何が悪いのでしょうか?
749nobodyさん:2008/01/16(水) 20:30:55 ID:???
いるんだよ、自分で勝手に照会用のコードを切り詰める奴
750748:2008/01/16(水) 20:51:36 ID:???
失礼しました。手当たりしだい試してたら解決しました。
なんだか色々と間違ってたようです。
751nobodyさん:2008/01/16(水) 22:40:40 ID:QOevDgBW
CGIモジュール等を使わない、
一般的なuriデコードのバグってどんな事ですか?

同じkeyに複数のvalがある場合の対処はしてます。
752nobodyさん:2008/01/17(木) 00:41:41 ID:???
>>751
区切り文字が & でなく ; のときとか、マルチタイプで送られてきたときとか、XSS対策とかかな?
753nobodyさん:2008/01/17(木) 12:39:49 ID:???
ちょっと考えてみてほしい
ドラゴンボールというのは、集めれば願いがかなうアイテムだ
それに対して、
ウンコは、いくらドッサリ集めてもウンコにしかならない
このように両者は一見似ているようで本質的に異なる
754nobodyさん:2008/01/17(木) 12:41:44 ID:???
>>751
巨大なクエリーとか、lengthがでたらめとかかな?
# httpdの仕様にもよるな
755nobodyさん:2008/01/17(木) 17:15:28 ID:???
uriデコード?とは関係ないけど
CGI.pm使うとmod_perl環境(Apache::RegistryやModPerl::Registry)で
-ParseHeadersやPerlSendHeader offしてあってもheaderを正しく扱えるので
CGIでもmod_perlでも動きます。ってプログラムが作りやすくなる。
756nobodyさん:2008/01/17(木) 17:17:24 ID:???
>>751
バグってどういうこと?

引数には、ある程度想定されるものしか入らないはずなんだから、
$form{'hoge'} とか、引数として使う値に想定される正しい値が入っているかのチェックを行えばいいんじゃないの?
757751:2008/01/17(木) 18:58:22 ID:???
>>752
区切り文字はCGI.pmでも&か:ですよね。

>>754
cgi側では解決できないような感じしますね。

>>755
それは良いコト聞いた。

>>756
オライリーの本読んでたら一般的にバグがあるとの事です。
CGI..pm使えとの一点張りです。
なので、どこにバグがあるのかなと ← いまここ

みなさんレスありがとうございます。
758nobodyさん:2008/01/17(木) 23:23:09 ID:???
とりあえず>>751がド初心者だということは分かった。
759nobodyさん:2008/01/18(金) 00:48:01 ID:???
>>758
スレタイ読めカス
760nobodyさん:2008/01/18(金) 12:04:46 ID:Z4Jr4bli
ファイルをサーバにアップロードしたいCGIがほしいのですが
どこかいいサンプルないでしょうか?

アップロードしたいファイルはエクセルファイルです
761nobodyさん:2008/01/18(金) 12:15:45 ID:???
ぐぐれかす
762nobodyさん:2008/01/18(金) 12:39:13 ID:???
アップロードされたファイルのを受信するCGIなのか、
それともファイルをアップロードするCGIなのか知らんけど
http://search.cpan.org/~gaas/libwww-perl-5.808/lib/HTTP/Request/Common.pm
http://search.cpan.org/~lds/CGI.pm-3.33/CGI.pm#CREATING_A_FILE_UPLOAD_FIELD
763nobodyさん:2008/01/18(金) 12:51:11 ID:???
>>760
ちゃんとした日本語で
764nobodyさん:2008/01/18(金) 14:27:48 ID:???
アップロードしたがってるCGIが欲しいんだろ
765nobodyさん:2008/01/18(金) 15:13:46 ID:???
意思を持つCGIコワス
766nobodyさん:2008/01/18(金) 16:38:38 ID:???
>>760 こんな感じですか?
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI qw/:standard/;
use constant MAX_WAIT => 10;
my $q = new CGI;
$q->charset('utf8');
my $wait = rand(MAX_WAIT);
my @mind = qw(uploadしたい uploadしたくない uploadしてもいい);
my $mind = $mind[ int( rand(scalar @mind) ) ];
print start_html(
-head => meta({-http_equiv=>'refresh', -content=>"10; URL=$ENV{SCRIPT_NAME}"}),
-title => 'CGIの気持ち'
),$mind,end_html;
767nobodyさん:2008/01/19(土) 01:06:12 ID:???
>>766
$waitは、どこで使ってるの?
-head => meta({-http_equiv=>'refresh', -content=>"$wait; URL=$ENV{SCRIPT_NAME}"}),
とかやりたかったのか?
768nobodyさん:2008/01/19(土) 14:38:24 ID:gMv3rNuv
すみません、少し数学の話になるかもしれませんが、
100%の確率のうち30%が当たりという設定をして
くじを引かせる場合、

my $rate = 30;
my $atari = int((rand(100))) + 1;
if($atari <= $rate){
 print "あたり\n";
}

これで30%ということに理屈ではいえるのでしょうか。
それとも上か下かなので2分の1になるのでしょうか。

ご教示いただけますと幸いです。
769nobodyさん:2008/01/19(土) 15:04:56 ID:???
算数のレベルだぞ
770nobodyさん:2008/01/19(土) 15:25:31 ID:???
すみません
771nobodyさん:2008/01/19(土) 16:00:15 ID:???
>>768
そういうときは、そのコードを何万回か繰り返してあたりとはずれのカウントを取って、
実際に30%くらいになるかを調べればいいんですよ。
772nobodyさん:2008/01/19(土) 17:54:09 ID:???
>>768
極東連合乙
773nobodyさん:2008/01/19(土) 18:03:47 ID:???
>>768
10000回だけ繰り返してみた。

あたり=3031
はずれ=6969
774nobodyさん:2008/01/19(土) 21:24:36 ID:???
>>771
ありがとうございます。

>>773
実行有難うございます。
私の方でもやってみましたが、平均値が30%になりました。
安心しました。
775nobodyさん:2008/01/19(土) 23:16:40 ID:???
#!/usr/bin/env perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(strftime);
my $q = new CGI;
print $q->header(), $q->start_html();
#print $q->dump; # for debug
my $outputdir = "log"; # ファイルを置く先 (ディレクトリ)
my $fh = $q->param('uploaded_file');
my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子
if ($fh ne "") {
my $timestamp = strftime "%y%m%d%H%M%S", localtime;
my $outputfn = "$outputdir/$timestamp$ex";
open(F, "> $outputfn") or die;
flock(F, 2);
if (defined $fh) {
while (<$fh>) {
print F $_;
}
}
close F;
print qq{saved as <a href="$outputfn">$outputfn</a>};
}
print $q->start_multipart_form(-name => 'myform'),
$q->filefield(-name => 'uploaded_file'),
$q->submit("OK"),
$q->endform,
$q->end_html(), "\n";
776760:2008/01/19(土) 23:18:40 ID:???
ファイルをアップロードするCGIを探してます。
日本語おかしかったですね、すいません。
サンプルを探したんですが
>>775のままだったら
ファイルをアップしたときにファイル名が
アップロードした日付になってしまいます。
ファイル名を変更することなくアップロードするにはどうすればいいでしょうか?
777nobodyさん:2008/01/20(日) 00:14:39 ID:1RDcSYMg
my $outputfn = "$outputdir/$timestamp$ex";
のところを、そうじゃなくすれば良い。
778nobodyさん:2008/01/20(日) 00:15:00 ID:???
>>776
マルチタイプを分割して、そのヘッダ部分に名前あるよ。
779nobodyさん:2008/01/20(日) 02:12:08 ID:???
ついでにフォルダ名も表示してやれば、閑古鳥鳴くこと間違い無し。
780nobodyさん:2008/01/20(日) 03:03:09 ID:???
サーバにファイル名を任意に保存出来るって危険じゃね?
同名ファイルの処理が必要になるし、文字化けとかあるし。
文字化けとかしたら、ダウソとか出来なくなる場合もあるし、
削除とかはsshログインして * とか使って消さないといけなく
なる場合もある。(解決は出来るから問題なしともいえるのだが)
日本語はファイルと一緒にコメントとして管理すべきだと思うけど、
どうかな?
781nobodyさん:2008/01/20(日) 10:25:46 ID:???
>>780
間違いなく正しい。
782nobodyさん:2008/01/20(日) 19:19:48 ID:xw354eHR
上の人とは別人だけどファイルのアップロードに関して質問

open(OUT, ">$filename");
binmode(OUT);
while (read($fh, $buf, 1024)) { print OUT $buf; }
close(OUT);
close($fh);

上記なソースをよく見かけるんだけど、
三行目で一気に処理するんじゃなくて、
1024バイトずつ取り出して処理する理由って何?
783nobodyさん:2008/01/20(日) 19:21:07 ID:???
1000MBのバッファ蓄えろというのか
784775:2008/01/20(日) 19:37:21 ID:???
>>777
具体的にどうかえればいいのでしょうか?
教えてくださいとはいいません。
やってください

>>780
ご意見ありがとうございます。
785nobodyさん:2008/01/20(日) 20:21:40 ID:???
完全に自分専用とかなら別なんだろうけどな。
786nobodyさん:2008/01/20(日) 22:56:33 ID:???
>782-783 に関連した便乗質問で悪いけど、
レン鯖とかも考えた時の常識的なメモリ使用量ってどのくらい?
シュワルツ変換とか使っていいものかいつも悩む。
787nobodyさん:2008/01/20(日) 23:26:35 ID:???
>>786
「レンタルサーバ メモリ使用量」でぐぐってみたらどうかな?
ま、突き詰めるとそのサービスの仕様次第となるだろう。
シュワルツ変換も「やってはいけない処理」ではなく、重たい処理
でしかないからな。それだけの質問では何もいえない。
具体的なソースを出して、この負荷は問題ないか?とかなら分かるが。
788nobodyさん:2008/01/21(月) 21:15:32 ID:29cYlZ80
input type=file で送るファイルを指定しますが、
この場合のファイル名そのものを取得するようにするには
どのようにしたらよいですか?
789nobodyさん:2008/01/21(月) 21:26:25 ID:???
>>788
HTTP_CONTENT_TYPEを見て、boundaryで区切って分割して、そのヘッダを読む。
790nobodyさん:2008/01/21(月) 22:20:09 ID:29cYlZ80
>>789
有り難うございます
よく分かりませんが、ヒントを元にくぐってみます
791nobodyさん:2008/01/21(月) 22:33:12 ID:MggCWroJ
toolkitについての質問です。

toolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、
[% myheader = 'my/index.cgi' %]
[% INCLUDE myheader %]
などされるとソースが見えてしまいます。
なんとか規制できないでしょうか?
phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。
同等の機能はあるのでしょうか?
$this->security = true;
$this->security_settings["INCCLUDE_ANY"] = false;
$this->security_dir = "/path/to/templates";
$this->trustes_dir = "/path/to/php";

または、テンプレート内で使える関数を指定できるとかありますでしょうか?

日本語マニュアル見てみましたが、それらしいものがありませんでした。
http://www.hakoniwa.net/tt/
792nobodyさん:2008/01/21(月) 23:09:44 ID:???
>>787
亀レスですみません。ぐぐってみました。
>782-783 のような流れをたまに見るので業界の暗黙知が
あるのかと思いましたが特に無いようですね。
会社毎に見ていくと具体的な数字を出している所は少なかったですが、
少ないところで2MBと10Mb(=1.25MB?)でした。
793nobodyさん:2008/01/21(月) 23:29:51 ID:???
ムーアの法則があるので、数値は出しにくいところがある。
あるサーバで5秒くらいかかっていたのが、最新のでは1秒くらいで終わるので、
ぜんぜん問題にならなくなったとか。

でも、1分を1秒にするのはムーアの法則でも5年以上はかかるわけで、
そのくらいの規模はどう頑張っても無理だろという話だ。
794nobodyさん:2008/01/22(火) 09:20:05 ID:???
>>791
INCLUDE自体を抑制するやり方はわからんが、

If a BLOCK definition is not currently visible then the template
name should be a file relative to one of the INCLUDE_PATH directo-
ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE
options are appropriately enabled.

これを利用すれば普通は十分じゃねーの?
795nobodyさん:2008/01/22(火) 10:10:27 ID:???
テンプレート編集自体はtoolkit使うわけじゃないだろ?
そこでチェックすりゃいいんじゃね?
796791:2008/01/23(水) 00:37:55 ID:fM6ljyqY
>>794
>もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。
とのことですが、相対・絶対でスクリプト指定できてしまうということですよね?
考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか?

>>795
たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、
入れようとしているシステムが銀行ほどではないんですけど、絶対にユーザにソースが漏れてはいけないシステムなんです。
(今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。
html-templateでも、includeなど規制する機能はなさそうですし・・・。

使いたい機能はifとloopだけなんですけど、
perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか?
797nobodyさん:2008/01/23(水) 09:55:40 ID:???
>>796
HTML::Template には no_includes ってオプションがあるけど?
798nobodyさん:2008/01/23(水) 10:07:27 ID:???
INCLUDE_PATH以下に見られちゃいけないファイル置かないという選択肢はないの?
799nobodyさん:2008/01/23(水) 10:27:22 ID:???
>>796
そんな大事なシステムをお前程度のスキルの人間が任されていることに
激しく不安を感じるのだが...
800nobodyさん:2008/01/23(水) 11:28:58 ID:???
INCLUDE_PATHに関数渡すと・・・
801nobodyさん:2008/01/23(水) 11:58:33 ID:???
802nobodyさん:2008/01/23(水) 14:51:21 ID:???
データベースにutf8でデータを入れて、携帯の絵文字対応のsjisで取り出そうとしようと思っています。

$s = Unicode::Japanese->new;
$s->set($aaa);
$str = $s->sjis-imode;

という風に、perlで記述したところ、0という値しか返ってきません。ちなみに$aaaをそのままprintすると、文字化けします。
何がいけないのかよくわかりません。どなたかお答えいただけるとうれしいです。
803nobodyさん:2008/01/23(水) 14:59:42 ID:???
sjis-imodeが悪いと思うよ。sjis_imodeだろ。

$str = ($s->sjis) - 'imode';

と書いたのと同じだな。いちおうエラーにはならないが、
use strictとuse warningsを使ってればいろいろ怒られる
のではまらないですむパターンの間違いなので、なぜ
使わなかったのかよく反省しとけ。

804nobodyさん:2008/01/23(水) 15:07:11 ID:???
さっそくのご返答ありがとうございます。
試してみましたところ、こんどは??????という文字列が返ってきました。
いま現在、iモードシュミレータを使って表示させているのですが、これは携帯を使ってテストしないのが悪いのでしょうか?
805nobodyさん:2008/01/23(水) 15:27:16 ID:???
>>804

iモードシミュレータとなるとそれはもはやPerlの話題ではないな。
適切なところへいって質問するほうがお互いのため。

その前に$strを16進ダンプ表示してみて期待したバイト列になってるか
どうかぐらいは確認しといた方がいいとは思うが。
806791:2008/01/23(水) 21:46:29 ID:fM6ljyqY
>>797-802
いろいろな案有難うございます。
一つづつ試してみます。
どうもありがとうございました。
807nobodyさん:2008/01/23(水) 23:17:40 ID:FgvU3OwA
だれか
>>775をいじってくれる
心のやさしくて暇なやつはおらんのか
サーバに日本語のファイルをUPしたいんだ
808nobodyさん:2008/01/23(水) 23:18:24 ID:???
するなといわれてそれを納得しておいてなんだそれはw
809プログラミング歴2ヶ月:2008/01/23(水) 23:19:54 ID:bNex267N
ローカルホストで動かしたときに、mkdirでディレクトリを生成できていたのに
いざwebにアップロードしてみると、ディレクトリの生成をやってくれません。
この場合、原因として何が考えられるのでしょうか。
ちなみにperlのパスはあっています。

mkdirなどでググって見ても、よくわかりませんでした。。。
ヒントだけでもいいんで、どなたかよろしくお願いします。(_ _)
810nobodyさん:2008/01/23(水) 23:27:24 ID:???
>>809
まずはパーミッションの確認からだろうな。
811nobodyさん:2008/01/23(水) 23:52:28 ID:???
>>809
他には2階層以上のディレクトリはmkdirで作れないとかかな?
812プログラミング歴2ヶ月:2008/01/24(木) 00:03:36 ID:+24Wb9Pu
>>810,811 さん
ご親切にご教授いただきありがとうございます。
先ほど、パーミッションを変更したところ解決いたしまして、とても感謝しております。
しかしそれと同時に新たな問題が浮上してきまして、困っています。。。

mkdirを行った後に、とあるdatファイルに文章を出力しているのですが、
出力した後の改行コードが■になってしまいます。。。
こっちもローカルホストではうまくいっていたのに、なぜなんでしょう??
813nobodyさん:2008/01/24(木) 00:05:46 ID:???
改行コードの違いかな?
ttp://www.tohoho-web.com/wwwxx011.htm
814nobodyさん:2008/01/24(木) 00:28:39 ID:???
>>812
ヒント
・UNIXではLF、WindowsではCRLF。
・\nはLR、\r\nがCRLF。
・FTPのアスキーモードで転送すると自動相互変換してくれる。
815プログラミング歴2ヶ月:2008/01/24(木) 00:53:36 ID:+24Wb9Pu
>>813,814さん

解決しました。ありがとうございました!
マジに感謝してます。
816nobodyさん:2008/01/24(木) 10:27:32 ID:???
>>815
例えばxyzzyみたいに、改行コードを確認したり、変更できる
テキストエディタを入れておいたほうがいいよ。
817nobodyさん:2008/01/24(木) 10:41:34 ID:???
サクラエディタおすすめ。
818nobodyさん:2008/01/26(土) 19:03:18 ID:???
保守
819nobodyさん:2008/01/28(月) 12:09:42 ID:fVIm37qB
Perl初心者です。
簡単なPerl/CGIのプログラム(掲示板など)が書ける程度のレベルです。

mod_perlの超初心者向けの解説本、ウェブサイトがあれば教えてください。
できれば日本語でお願いします。


あと、今は退社された方が書いたらしい、現在稼動中のプログラムのソースを入手したんですが、
ソースの最後に

 exit;

って思いっきり書いてたりするんですが、これって大丈夫なのでしょうか?

820nobodyさん:2008/01/28(月) 12:53:50 ID:???
821nobodyさん:2008/01/28(月) 15:21:58 ID:eRROoQGz
ありがとうございます。

これに関して、オーバーライドを利用したコードを書いているとき、
ある関数(この場合はexit)が、どのパッケージに属しているかを調べる方法があればお願いします。
822nobodyさん:2008/01/28(月) 16:14:02 ID:Fd8GryNX
ときどき見かけるcodepageというのはどういうものなんでしょうか。
たとえば、TeraTermPro with SSHの設定でcodepageというのがあります。
ほかにもありますがこれを例にとります。
ヘルプやgoogle検索で調べても引っかからないのでここでおたずねします。

locale=japanese codepage=932
だとどうもShift-jisの設定をなんらかの形でやるみたいです(付属ヘルプ)。
locale=japanese codepage=65001
だとutf-8みたいです。
それで、私のマシンはWindowsなので、codepage=932で統一しておけばいいんでしょうか。
ケースバイケースなのでしょうか。
相手マシンがFreeBSDで通信することがあるのですが、その場合は、
設定の漢字受信/送信ともutf-8でokですか??
unixだとeucとも聞きますが、最近はutf-8化したほうがいいようなことも聞きます。
ので、よくわかりません。

もちろん、ソースを何で書くかはケースバイケースなのは知っています。
分からないのは、TeraTermの設定で
漢字受信/送信 と codepage という2つのよく分からない項目がある点です。

TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
それにperlプログラミングでよく登場するので、ここで質問させていただきました
823nobodyさん:2008/01/28(月) 16:22:56 ID:???
exitはダメだけどexit(0)なら大丈夫、
実はそう言われてるけど逆で、exit(0)はダメだけどexitなら問題ない、
最近のヤツはどっちでもいい(具体的なバージョンはか書かれてない)、

色々と情報が混ざってて、調べれば調べるほど混乱してきた orz
824nobodyさん:2008/01/28(月) 17:37:21 ID:???
動いてんならいいじゃない
825nobodyさん:2008/01/28(月) 18:19:41 ID:???
そうします。
826nobodyさん:2008/01/28(月) 18:33:58 ID:???
UTF8の文字列で、全角ひらがなが入ってきた場合、全角カタカナに変換しようとしているのですが
思うように行きません。

$name =~ tr/ぁ-ん/ァ-ン/

一度、sjisやらecuやらに変換して、文字コードで置換させないと駄目でしょうか
827nobodyさん:2008/01/28(月) 18:39:31 ID:???
UTF8ならむしろ文字コード変換しないほうが置換しやすくないか?
828nobodyさん:2008/01/28(月) 18:55:50 ID:???
>>826
そんなことはない。

use utf8してないとかdecodeしてなくて$nameがバイトのままとか
そういうあたりじゃねーの?

use utf8;
binmode STDOUT, ":encoding(utf8)";

foreach (ord('ぁ') .. ord('ん')) {
my $h = my $k = chr($_);
$k =~ tr/ぁ-ん/ァ-ン/;

printf "%x %s %s\n", $_, $h, $k;
}
829nobodyさん:2008/01/28(月) 19:04:20 ID:???
>>822
> TeraTermは有名なので当然スレがあるかと思ったらありませんでした。

テラターム
http://pc11.2ch.net/test/read.cgi/linux/1012915309/
830nobodyさん:2008/01/28(月) 19:21:58 ID:???
>>829
誘導thx!! いやースレタイ検索で引っかからなかったもんで。

831nobodyさん:2008/01/28(月) 21:13:04 ID:???
確かにこりゃ罠だな……
832nobodyさん:2008/01/30(水) 17:37:10 ID:irpAKk1D
ActiveperlでローカルPC上に作成したWEBサイトにIE等でアクセスし、
その処理結果をファイルにしてデスクトップ上に出力したいのですが、
デスクトップまでのパスをどう取得すればいいか分かりません。
ログインユーザ毎にデスクトップのパスが変わってしまうので、
そのあたりを上手く解決できる方法があれば知りたいです。
833nobodyさん:2008/01/30(水) 18:10:39 ID:???
perlとは関係ないがユーザ毎に環境変数ってのが存在する
834nobodyさん:2008/01/30(水) 18:43:24 ID:???
use strict;use warnings;
use Win32::OLE;
my $sh = Win32::OLE->new('WScript.Shell');
print $sh->SpecialFolders("Desktop");


use strict;use warnings;
use Win32 qw/CSIDL_DESKTOP/;
print Win32::GetFolderPath( &CSIDL_DESKTOP );
835nobodyさん:2008/01/30(水) 21:04:32 ID:FClDhuIR
require Hoge;
は通るんですが、
no strict 'refs'; require "Hoge";
が通りません。Can't locateとなります。
文字列からrequireするにはどう書いたらよいでしょうか。
836nobodyさん:2008/01/30(水) 21:12:10 ID:???
Hogeってのを用意すればいい
837nobodyさん:2008/01/30(水) 21:17:18 ID:???
どうもです。
Hogeはあるつもりなんですが、前者と後者は同じものを指してないですか?
838nobodyさん:2008/01/30(水) 21:29:04 ID:???
拡張子を省略していたせいだった気がしました。ありがとうございました。
839832:2008/01/30(水) 21:59:46 ID:???
>>833
システム環境変数とユーザー環境変数ってやつですよね。
ここにあらかじめデスクトップへのパスを設定するという事でしょうか?

>>834
ソースありがとうございます。
実際に実行してみたんですが、CGIとして実行すると
SYSTEM ユーザ名義で実行され、ログインユーザでのパスが取れませんでした。
DOS窓から実行するとバッチリなんですが…。

少し調べた所、WMIで実現できそうな気がしてきたので
そちらを当たってみようと思います。ありがとうございました。
840nobodyさん:2008/01/30(水) 22:29:21 ID:???
3年ぶりくらいにPerlを使ってみたのですが、
以前は日本語の検索の時、EUCを使わなくてはいけないとかあったと
思いますが、普通にshift-jisで書いて、パターンマッチも問題なし
だったのですが、今のバージョンのPerlは文字コードとか気にしなくて
良くなりました?それともたまたま文字化けしなかっただけ?
841nobodyさん:2008/01/30(水) 22:53:08 ID:???
>>840
これを実行してみたらどうなる?
print "表現";
print '表現';
842nobodyさん:2008/01/30(水) 23:05:02 ID:???
>841
だめっすね。
まだjcode.plとか使ってるんですかね。
実は全てunicodeで問題なくなったりしてますか?

日本語のパターンマッチで注意することとかまとめた
いいページ知ってたら教えてください。
843nobodyさん:2008/01/30(水) 23:12:08 ID:???
>>842
一部の文字列を使う時だけ注意をして、POSTで受け取った文字列を
jcode.pl 使うという程度でも、Shift-JISでいけることはいける。
ttp://www.shtml.jp/mojibake/sjis_cgi.html
844nobodyさん:2008/01/30(水) 23:19:37 ID:???
>843
thxです。しばらく離れていましたが、少し思い出しました。
結局Perlはその間進化していなかったのね。
845nobodyさん:2008/01/30(水) 23:19:46 ID:???
クライアント、サーバ共にWindowsで、SQLServerとVB使っている
システムでも記号とか入力しようとすると駄目な場合もあるからな。
シビアに全部に対応とか考えなくても良いのではと思ったり。
846nobodyさん:2008/01/30(水) 23:22:28 ID:???
>>844
Perl は 5 が出てから結構経っているはずだよ。
3 年前に触ったのも 5 じゃないかな?
そこまで大きな変化が無いからこそ、という
メリットももあるんだけどね。

次に 6 には、構文とか大きな変化があるらしいから
そっちに期待だなw
847nobodyさん:2008/01/30(水) 23:45:06 ID:???
たとえば This is a pen.という入力があって、
「This」にマッチしたら、
htmlの色のタグを付けて<font color>This</font>と置換する場合、
これをやると次に「This is」に色を付けたい場合マッチしなくなる
のですが、上手いやり方あります? 先に「This is」の置換を
する位しか思いつかない。
848nobodyさん:2008/01/31(木) 01:44:59 ID:???
検索に使うデータは別に持っておくというのはどうだろうか。

Thisにマッチしたとき、
いきなり This → <tag>This</tag> と変換するのではなく、例えば「1番目の単語にマッチした」という情報だけ保存しておく。
で、最後にまとめて置換する。

Perlの持つ強力な文字列操作が活かされないという欠点はあるが。
849nobodyさん:2008/01/31(木) 07:23:10 ID:???
$in_str = "This is a pen.";
$out_str = '<font color="red">' . $in_str . "</font>";
ここで $str に検索対象の文章を入れる。
$str =~ s/$in_str/$out_str/g;
850nobodyさん:2008/01/31(木) 09:05:07 ID:???
>849
それ同一箇所を何度も置換する場合でも大丈夫?
851nobodyさん:2008/01/31(木) 09:23:09 ID:???
>>850
具体的にどういう場合?
852nobodyさん:2008/01/31(木) 09:59:40 ID:???
>849
<tag>This</tag> is a pen.
が$strに入ったら、次にThis isは一致しないでしょ?
853nobodyさん:2008/01/31(木) 10:21:21 ID:???
優先度つけて順番にやるしかない
その優先度はあなた次第だもの。
854nobodyさん:2008/01/31(木) 12:45:35 ID:???
s/This is|This/REPLACEMENT/gみたいなことしたいんだろうか?
一括してやるなら長い方を先にすればいい
855nobodyさん:2008/01/31(木) 13:03:27 ID:???
This is a pen.
  ↓
<tag>This is</tag> a pen.

このあとに、「tag」というフレーズで検索する可能性は否定できない。
いや、細かくマッチ条件つければ別だろうけど。
856nobodyさん:2008/01/31(木) 21:12:55 ID:ZyBf2Z6K
配列と文字を引数とする場合の書き方がよく分かりません。できるのでしょうか?
以下のようにやってもだめでした。
&subtest(@arr,$str,@arr2);
function () {
my (@arr,$str,@arr2) = @_;

}
857nobodyさん:2008/01/31(木) 22:22:57 ID:???
>>856
(@arr,$str,@arr2)は新しい配列として扱われるので、サブルーチン側では区切りが分からん。
arrとarr2は参照を渡すとか、要素数が分かってるならサブルーチン側で@_をspliceするとかがいいかも
858nobodyさん:2008/02/01(金) 00:10:05 ID:???
>845

長い方を先にした場合、
ThisとThis isとis a penがあって、
結論は<font>This is a pen</font>に色を付けたいのだ。

848の方法かなぁ。
ただ、入力テキストが100M位、マッチする検索リストが1万個とかなので、
動かせるか・・・。

Perlよりwordマクロとかの方がいいのかなぁ。
wordなら何度重なって色付けても問題ないし・・・。
859nobodyさん:2008/02/01(金) 00:32:08 ID:???
>>856
ヒント:リファレンス
8601/2:2008/02/01(金) 03:03:29 ID:???
>>858
途中まで書いてまじめにやると面倒だという事は分かった。
あとは頑張ってくれ。

#!/usr/bin/perl -w
use strict;
my $str = 'This... This is, This is a pen.';
my @target = ('This', 'This is', 'is a pen');
my $tag_o = '<font color="#ffff00">';
my $tag_c = '</font>';
my $tag_r = qr|</?font[^>]*>|;
my $tag_e = qr/(?:(?!$tag_r).)*/s;
for (@target) {
my $re = join qr/(?:$tag_r)*/o, split /(\s+)/;
$str =~ s/($re)/add_tag($1)/eg;
}
print $str;
8612/2:2008/02/01(金) 03:04:31 ID:???
sub add_tag {
my $substr = $_[0];
if ($substr !~ /$tag_r/o) {
$substr = "$tag_o$substr$tag_c";
} elsif ($substr !~ /\Q$tag_o\E/o) {
$substr =~ s/(\Q$tag_c\E)/$1$tag_o/go;
$substr .= $tag_c;
} elsif ($substr !~ /\Q$tag_c\E/o) {
$substr =~ s/(?=\Q$tag_o\E)/$tag_c/go;
substr($substr, 0, 0) = $tag_o;
} elsif ($substr =~ /^($tag_e)\Q$tag_c\E($tag_e)\Q$tag_o\E($tag_e)\z/o) {
$substr = "$1$2$3";
} elsif ($substr =~ /^($tag_e)\Q$tag_o\E($tag_e)\Q$tag_c\E($tag_e)\z/o) {
$substr = "$tag_o$1$2$3$tag_c";
} else {
die $substr; # ココを頑張ってくれ。
}
$substr =~ s/\Q$tag_c$tag_o\E//go;
$substr;
}
862nobodyさん:2008/02/01(金) 04:53:15 ID:hS8kNEG7
if(A1 < B1 && A2 < B2 && A3 < B3 && A3 < B3 && A4 < B4)
{
$page_dsp .= <<"EOM";
<tr>
<td colspan="2" >
<form action="????.cgi" method="post" onSubmit="return send_check()">
<select name=ku class=slc>
<option value="no">
EOM

#この中の条件式(ifの条件付オプション)は省略
{$page_dsp .= "<option value=\"1\">\n"; }

$page_dsp .= <<"EOM";
</select>
<input type=hidden name=back value="no">
<input type=hidden name=id value="$kid">
<input type=hidden name=pass value="$kpass">
<input type=hidden name=mode value="ku">
<input type=submit class=btn value="オン">
</td></form></tr>
EOM
}
else{$page_dsp .= "<tr><td colspan=2 align=center>終わり</td></tr>\n";
}

以上のように、最初の5つの条件
(各々全部の、左の数値が右の数値と同じかそれ以上の時にセレクトを非表示)
で動かしたいのですけど、5つの条件中3つの条件しか満たしてないのに非表示に
なります。
条件が5つ揃ってから非表示にするにはどうすればいいですか?
ご教授お願いします。
863nobodyさん:2008/02/01(金) 05:30:16 ID:???
落ち着け
864nobodyさん:2008/02/01(金) 07:45:40 ID:???
>>862
それはない。他にミスがあるはず。
865nobodyさん:2008/02/01(金) 16:52:45 ID:hS8kNEG7
命令が作動しなかったのは今回は説明で省略した命令(ifの条件付オプション)と
最初の5つの命令との相性が悪かったからかもしれませんね。

省略した部分内には、最初の5つの命令を一個ずつ(計5個)指定して、条件が満たされるごとに
オプション項目が一つずつ消えていき、全部満たしたら最初の5つの命令でセレクト
ごと非表示にするつもりでいたんです。
866nobodyさん:2008/02/01(金) 16:54:10 ID:???
相性とな?
867nobodyさん:2008/02/01(金) 16:55:34 ID:???
バルクメモリさしたら動かなかった
相性が悪かったということだな
868nobodyさん:2008/02/01(金) 19:03:10 ID:???
>>862
まずは、配列の勉強頑張れ。
869nobodyさん:2008/02/02(土) 05:09:34 ID:???
修士出たら就職を考えている現在3回生の情報の学生でperlが一番すきですが、
今年に入ってからいろいろと求人情報を集めてみたところperlの仕事少ないですね
噂には聞いてましたが、僕は何が何でもperlを仕事にしたいのです
まあそれはおいといて、perlを仕事としてみたときどんな感じですかね?
皆さま先輩方の多くはperlを仕事としていらっしゃると思ったので、
是非とも業務内容、他言語と比べたときの待遇、仕事のやりがいなどなど、
ポジティブな意見(勧め)もネガティブな意見(愚痴)も生の声としてお聞かせ願えればと存じます。
870 ◆TWARamEjuA :2008/02/02(土) 07:42:12 ID:???
perlを仕事にするところはほとんど無いと断言できるです。
仕事の中でperlを使うことはたくさんの現場であるです。

おいらは今、製造業の中でperlを利用しています。
昨今の機器はLANでデータを採取できたりします。
それを高ぁーいWindows専用のアプリでデータ加工することなく、unix(含むlinux)なサーバにてcronでデータ採取・計算・加工してDB(DB_Fileで充分)に登録。(もちろんperlで)
そいつを拾ってエクセルに貼り付けるだけ(もしくはSpreadsheet::Writeで書き込むも良し)でもデータの共有が出来たりします。
記録計のようなグラフを作るにしてもGDだけで充分。

部品の計測をするのでも、今時のマイクロメータは数値をUSBで送ってくれる物があったりします。(USBテンキーみたいな出力をしたりする)
それをExcelにちまちま放り込むよりか、単純テキスト(csvでも良いけれども)で保存して、perlを使っていろんな形や計算をさせることも出来たりします。

以前勤めていたWEB屋(主にデザインやHTML書き)でも、Excelのデータを1件1HTMLファイルに変換する作業がありました。
(その求人に応募したのだ(照))
3000件近いデータを変換すると云うことで、2-3か月近い工程を組まれていたことがありました。
どうやら手動で書き換え作業をと目論んでいたようです。
けれどもデータ構造と特性を見極めるのに2日、それを変換するperlスクリプトを2日、変換作業たったの10秒って事がありました。
その当時、その部署の長は目を丸くしていましたです。
まだまだperl=CGIっていう感覚で居られたからです。
その後、ちまちまと元データ(Excel)の修正が入ってきても数秒で修正完了。
デザイン変更があってもテンプレートを書き換えるだけでおしまい。
あまった2-3か月の期間、他の仕事を色々とこなしていました。

ようは仕事に使う道具の1つとしてperlというのを持っていればどんな業種にでも使えるんじゃないかな。

そんなこともあって製造業の現場であるにもかかわらず、おいらのところにだけは使い慣れたMacOSX(iMacG5)なんてのを無理を聴いて貰って備え付けましたですです♪
871nobodyさん:2008/02/02(土) 11:18:13 ID:???
perlを仕事で使うなら修士はオーバースペック。
高卒で十分な土方に好き好んで修士雇う経営者がいるのか?
872nobodyさん:2008/02/02(土) 11:21:37 ID:???
修士雇う経営者がいないなら高卒って言えばいいだけのこと
そんなこともわからないのか?
873nobodyさん:2008/02/02(土) 12:03:51 ID:???
perl土方は頭悪いな。
高卒で足りる仕事には高卒の賃金しか払わないという事だよ。
874nobodyさん:2008/02/02(土) 13:18:25 ID:???
>>872
それ、学歴詐称にあたるんじゃないの?
ちょっと前、問題になったでしょ。
875nobodyさん:2008/02/02(土) 13:33:00 ID:???
perl土方は新聞を読まない。
876nobodyさん:2008/02/02(土) 13:46:46 ID:???
WEB系いきゃいいんじゃないの?
個人的にはなにがなんでもPerlとかいってるPerl使いは嫌だけど
877nobodyさん:2008/02/02(土) 14:25:02 ID:???
Perlがちょっとくらいできても仕事ねえぜ、と修士出の自宅警備員が言ってみる。

>>874
それ公務員ね。試験区分に対象の学歴があってそれに沿うことが望ましいとされてるから。

というかこれマ板のネタだろ。
878perl好き情報3回生(本物) ◆qqt5.0NxB6 :2008/02/02(土) 14:40:08 ID:???
ちょっと失礼します。
僕はWebprog板に>>869と同一内容の書き込みをした者です。
>>869は偽者であって僕がマルチポストをしたのではないことを明言しておきます。
トリップをつけたので本物しか相手をしないようお願いいたします。
迷惑をおかけして申し訳ありません。
お騒がせしました。
879nobodyさん:2008/02/02(土) 15:45:41 ID:???
質問です。XML::RSSを使って、外部から取得したRSSを加工してHTML(euc-jp)に出力しているのですが、
一部の記号(それも機種依存文字含む)が文字化けします。

− → \x{ff0d}
o → \x{339c}

機種依存文字に関しては、根本的に対応することに意味があるのか疑問ですが、せめてwindowsな環境で
文字化けしないようにしたいのです。どうしたらいいでしょうか?

あんまし分かっていませんが、重要そうな部分だけ。
use XML::RSS;
use LWP::Simple;
use encoding 'euc-jp', STDOUT => 'euc-jp';
use open IN => ":encoding(euc-jp)";
use open OUT => ":encoding(euc-jp)";
binmode OUT => ":encoding(euc-jp)";

my $rss = new XML::RSS;
$rss->parsefile($site_file);
my $item_list = $rss->{'items'};
$item = ${$item_list}[0];
my $desc = $item->{'description'};

#一応対策っぽいことをやって一部の記号には対応できた
$desc =~ tr/\x{005C}\x{00A5}\x{2014}\x{203E}\x{2225}\x{FF0D}\x{FF5E}\x{FFE0}\x{FFE1}\x{FFE2}/
\x{FF3C}\x{FFE5}\x{2015}\x{FFE3}\x{2016}\x{2212}\x{301C}\x{00A2}\x{00A3}\x{00AC}/;
880879:2008/02/02(土) 15:48:16 ID:???
ちなみに、
〜 → \x{FF5E} に化ける問題は、一番下に書いた置換で解決したのですが、\x{FF0D}は何故かそのまま
文字化けしたままです…
881879:2008/02/02(土) 15:55:11 ID:???
すいません、>>880は単純ミスでした、取り消します。
882879:2008/02/02(土) 15:57:31 ID:???
忘れていました。エラーメッセージが出ます。
hogehoge.cgi: "\x{ff0d}" does not map to euc-jp at hogehoge.cgi line 183.
883nobodyさん:2008/02/03(日) 01:13:34 ID:???
求人ってほとんどPHPだよなぁ。プラスDreamWeaverの使用をセットで。
perl使ってるところはライブドアとかはてなとか高レベルに使いこなしてるところばっかり。
初〜中級のところは全部PHPになってしまった。
884nobodyさん:2008/02/03(日) 03:35:42 ID:???
モバイルならPerlも使ってるとこそこそこあるんでないか
885nobodyさん:2008/02/03(日) 11:14:58 ID:???
正規表現とか以外なら、構文同じなんだからすぐに移植できるだろ。
あとはPEARとかを使いこなせればいいわけだから、Perlの基礎がある
のなら、1週間程度で、出来るといえるんでね?
Perlで作ったコードをPHPに移植して、これ、私が作りました、みたいな。
886nobodyさん:2008/02/03(日) 12:57:34 ID:???
PEARってperlでいうCGI.pmみたいなもん?
887質問:2008/02/03(日) 13:04:56 ID:34/ZwImQ
このスレでよいかわかりませんが・・・

項目を選択しボタンをクリックすると、あるページには選択した項目の画像ファイルを表示し、
もうひとつのページにはその選択した項目を表示させたいのですがどうしたらよいでしょうか?

最初のページには
<form action="A.cgi" target="表示させたいページ">
を埋め込んでいるのですが、当たり前ですがこれだと"表示させたいページ"にしか表示できません。

A.cgiのなかでさらにこの部分だけは他のページへ表示させるとかできませんか?
888nobodyさん:2008/02/03(日) 14:09:58 ID:???
>>886
CPANじゃね?
889nobodyさん:2008/02/03(日) 14:12:18 ID:???
>>887
それは、Perlの話じゃなくて、htmlの話じゃないの?
フレームタグを使って区切るか、テーブルタグを使って全部を表示させる方法がある。
板違いなので、これ以上の質問はしないように。
890nobodyさん:2008/02/04(月) 03:22:50 ID:???
>>879
メッセージのとおりで、変換表に該当するものがないんでしょ。
euc-jpMSとか使わないといけないんじゃないの?
891nobodyさん:2008/02/07(木) 12:55:00 ID:???
perl 5.8.5
CentOS 5.1

「out of memory」のときのエラーハンドリングの方法を教えてください。
dieのときは
$::SIG{__DIE__} = sub {〜〜〜};
でいけることまではわかったのですが
「out of memory」がハンドリングできないのです。
よろしくおねがいします
892nobodyさん:2008/02/07(木) 15:49:01 ID:???
OSの制限だから、ハンドリング考えるよりコード見直す。
それができないのなら、OSの制限上げる。メモリ積む。

893nobodyさん:2008/02/07(木) 19:10:28 ID:???
perl5.8

my @value=(0,1,3,8);  #任意のkey
my @hoge=('hoge1','hoge2','hoge3'....);  #表示用配列
my $disp;
foreach (@value)
{
 $disp .= ',' if $disp;
 $disp .= $hoge[$_];
}

という処理をしているんですが、これってJOINでできませんか?
map使ってもこれより簡単に書けないですよね?

894nobodyさん:2008/02/07(木) 19:28:15 ID:???
こういうこと?

my @value = (0, 1, 3, 8);
my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9');

print join ',', @hoge[@value];
895nobodyさん:2008/02/07(木) 20:34:51 ID:???
>>894
おお。ありがとうございます。コードがすっきりします^^
896nobodyさん:2008/02/08(金) 09:47:17 ID:???
すいません。もう一点。

my $value = "0,1,3,8";
my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9');

これは
join ',',@hoge[sprit',',$value];

ですよね?
splitしてjoinして勿体無い感じ。。
897nobodyさん:2008/02/08(金) 10:08:10 ID:???
splitとspliceは別物
898nobodyさん:2008/02/09(土) 18:24:58 ID:???
valueがスカラーで入れなきゃ一回joinで済む話。
899nobodyさん:2008/02/11(月) 09:15:09 ID:7AZat8M4
ファイルの最後の行番号を取得したいんですが、
my $endline = $. while (<FH>);
としてとりえず取得できたんですが、
その後
seek FH,0,0;
として、また1行目から別の処理したいんですがうまくできません。
seekの戻り値をprintしてみると1を返してますが、先頭には戻ってないようです。
windows環境なのが原因でしょうか?
900nobodyさん:2008/02/11(月) 09:31:45 ID:???
my $endlineだと局所化されて外側で取得できなくない?
seekしても$.はリセットされないから先頭に巻き戻したら$.= undefとかすればいい
901nobodyさん:2008/02/11(月) 11:26:23 ID:???
>>900さんレスありがとうございます。

>局所化
あ、ほんとだ。ミスってました。

undef $.;
reset $.;
それぞれ試してみましたが変化ありませんでした。

その後に
while (<FH>) {
  if ($. == $bigin .. $. == $end) {
といった処理をしたいんですが、どうもうまくいきません。
902nobodyさん:2008/02/11(月) 11:49:03 ID:???
$. = 0;としたらうまくいきました。
ありがとうございました。
903nobodyさん:2008/02/12(火) 21:28:15 ID:???
文字コードについて質問します。

utf-8から7bitJISへの変換なのですが、(メール送信のため)

Encode.pmもJcode.pmもローマ数字をJISにしてくれません。
Encodeでは「\x{2160}」と変換不可の場合のユニコード値に変換され、
Jcodeでは「?」になります

T(ローマ数字1)
\xE2\x85\xA0 utf8 → \x1B\x24\x42\x2D\x35 JIS

と手動で変換してやれば良いのですが、escシーケンスの処理がどうしたものかと・・・
904nobodyさん:2008/02/12(火) 23:23:01 ID:???
use lib '../lib';
のように相対パスを使うと出来るけど
use lib '/i/cgi-bin/lib';
のように絶対パスを使うと動かなくなります
サーバーの設定によって絶対パスだと読み込めなかったりするんでしょうか
普通のリンクだと絶対パスでリンクできます
905nobodyさん:2008/02/12(火) 23:31:03 ID:???
>>904
本当にそれが絶対パスであれば使えると思うのだが、おそらく違うんだと思う。
906nobodyさん:2008/02/13(水) 02:37:13 ID:???
>>904
perlから使う絶対パスはwebサイト上の絶対パスじゃないよ。
・ http鯖がルートとして扱うディレクトリからの絶対パス
・ 鯖のOSの絶対パス
の違いを理解しような。
907nobodyさん:2008/02/13(水) 02:39:50 ID:???
>>903
JISとかISO-2022-JPにはローマ数字はないから。

Encode::EUCJPMS - Microsoft Compatible Encodings for Japanese - search.cpan.org
http://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm

あたりをいれて、cp50220 とか cp50221 で変換する。
908906:2008/02/13(水) 10:48:35 ID:???
有難うございます
調べてみます
909904:2008/02/13(水) 10:49:51 ID:???
>>906でした
910nobodyさん:2008/02/13(水) 12:25:12 ID:???
>>907
ありがとうございます
Encode::EUCJPMSモジュールをいれて、

use Encode::EUCJPMS;
use Encode;
my $cp50220_str = Encode::from_to( $utf8_str , "UTF8" , "CP50220" );

で良いのでしょうか?
実はフォーム入力はShiftJISでして、CP932からutf-8に一旦エンコードしています。
これで問題はないでしょうか?
911nobodyさん:2008/02/14(木) 02:49:22 ID:???
>>910
UTF-8に変換するときにエラーになってなきゃ大丈夫なんじゃない?
〜 あたりが微妙ではあるけど。
912nobodyさん:2008/02/14(木) 10:56:12 ID:AY3pAm1W
教えてください。サーバではなくて、自分のPCにPerlをインストールしています。

#!/usr/bin/perl

use strict;
print "IEを起動します...\n";
system("C:/Program Files/Internet Explorer/iexplore.exe");
exit;

__END__

上のようにすると、IEは起動するのですが、コマンドプロンプトは残ったままで
タスクマネージャーにも perl.exetが残っています。(残るというか待ってるようですが…)
IEを起動したあとはPerlも終了して欲しくて検索したらexecというのがあったので
exec("C:/Program Files/Internet Explorer/iexplore.exe");としたら起動しませんでした。
IE起動後速やかにPerlを終了させるにはどうすれば良いでしょうか。
PerlはActivePerl 5.8.8をインストールしました。

もう一つは、my $url = 'http://www.google.co.jp/'; とした時に
IEにこの$urlを開かせるにはどうすればよいのでしょうか。よろしくお願いします。
913nobodyさん:2008/02/14(木) 11:58:11 ID:???
ヒント: system("start", $url);
914nobodyさん:2008/02/14(木) 12:23:37 ID:???
>>913
うわぁぁ。ありがとうございました!
915nobodyさん:2008/02/14(木) 12:27:34 ID:???
    /\___/ヽ   ヽ
   /    ::::::::::::::::\ つ
  . |  ,,-‐‐   ‐‐-、 .:::| わ
  |  、_(o)_,:  _(o)_, :::|ぁぁ
.   |    ::<      .::|あぁ
   \  /( [三] )ヽ ::/ああ
   /`ー‐--‐‐―´\ぁあ
916910:2008/02/14(木) 12:58:24 ID:???
>>911
ありがとうございます。
「〜」は手動でE3 80 9Cに置き換えています。

では教えていただいた方法でやってみようと思います。
917nobodyさん:2008/02/14(木) 15:13:40 ID:???
fedora8なマシンで監視装置をでっち上げようとしています

Net::SMTPについて教えて下さい

use Net::SMTP;

my $smtp = Net::SMTP->new( $mailhost );
$smtp->mail( $MailFrom );
$smtp->to( $MailTo );
$smtp->data();
$smtp->datasend( "From: $MailFrom\n" );
$smtp->datasend( "To: $MailTo\n" );
$smtp->datasend( "Subject: $e_subject\n" );
$smtp->datasend( "Mime-Version: 1.0\n" );
$smtp->datasend( "Content-type: text/plain; charset=ISO-2022-1\n" );
$smtp->datasend( "Content-transfer-encoding: 7bit\n" );
$smtp->datasend( "Reply-to: $MailFrom\n" );
$smtp->datasend( "$body\n" );

ここでbodyに例えばtestdataと入れると$bodyもメールとして届くのですが、
$bodyをtest:dataとする(半角コロンが入っている)と、$bodyが送られません

何が悪いのかご教示下さい
918nobodyさん:2008/02/14(木) 15:18:19 ID:???
半角コロン
919nobodyさん:2008/02/14(木) 15:28:13 ID:???
つ[ $smtp->datasend( "\n$body\n" ); ]
920917:2008/02/14(木) 15:31:16 ID:???
>>919
できました
ありがとう ( ;∀;)
921919:2008/02/14(木) 15:57:21 ID:???
>>920
よかったな。
バグった状態だと$bodyが送られてこないんじゃなくヘッダに入ってたはず。
メールヘッダと本文の切り分けは「半角コロンが入ってない行が登場した所から本文」って事になってるから、
どんな文が入るか分からん時は、ヘッダの最後に空行を入れれば桶。基本なんで覚えとくと便利。
922917:2008/02/14(木) 16:25:19 ID:???
>>919
覚えておきます
ありがとうございました(^^
これで沈みます
923nobodyさん:2008/02/17(日) 21:47:50 ID:???
>>921
ヘッダと本文は空行で分けられます。
ついでに言うと、改行は CRLF (\r\n) にすること。
MTA によっては受け付けてくれません。
924exe:2008/02/19(火) 11:44:47 ID:L1DAdjnk
ファイルにaからz、AからZを交互に連続で出力し、最後に改行して、この処理を10回繰り返す方法を教えてください。
aAbBcCdDeE・・・yYzZ のような形です。お願いします。
925nobodyさん:2008/02/19(火) 12:05:44 ID:???
宿題は自分でやろうな。
926nobodyさん:2008/02/19(火) 12:06:11 ID:???
print "aAbB.....yYzZ\n";

を10個コピペでおk
927exe:2008/02/19(火) 14:24:58 ID:L1DAdjnk
すいません。10回出力はわかるんですが、for文を使ってaAbBcC...zZの表示方がわからないのでどなたかお願いします。
928nobodyさん:2008/02/19(火) 14:25:28 ID:???
for(1..10) {
  for(65..90) {
    print pack("C*",$_);
    print pack("C*",$_+32);
  }
  print "\n";
}
929exe:2008/02/19(火) 14:42:37 ID:L1DAdjnk
nobody さんありがとうございます。

ちなみに↓の形で書くと、どうしたらよいでしょうか。
何度もすいません。

open (FILE, '>test1.txt') or die "$!";

for my $count (0..9) {
for my $i ("a".."z") {


}
print FILE "\n";
}

close(FILE);
930nobodyさん:2008/02/19(火) 14:59:33 ID:???
#
# $countってなんぞ?
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
  for my $i('a'..'z') {
    print $i;
    print uc($i);
  }
  print FILE "\n";
}
close(FILE);
931nobodyさん:2008/02/19(火) 15:01:42 ID:???
#
# ↑はウソ
#
open (FILE, '>', 'test1.txt') or die "$!";
binmode(FILE);
for my $count (0..9) {
  for my $i('a'..'z') {
    print FILE $i;
    print FILE uc($i);
  }
  print FILE "\n";
}
close(FILE);
932exe:2008/02/19(火) 15:06:17 ID:L1DAdjnk
ありがとうございます。$Countは適当においてる変数です。
933exe:2008/02/19(火) 15:54:07 ID:L1DAdjnk
先ほど↑で作ったファイルを出力として、小文字のみを取り除いた結果を標準出力に表示するにはどうしたらよいでしょうか?
自力でやらないといけないのはわかっているのですが、時間がなくて・・どなたかお願いします。
934nobodyさん:2008/02/19(火) 16:04:55 ID:???
#
# そういうウンコみたいな仕事を漏れにも回してくれよ
#
$sent = 'dTgZtyYthSGetLt';
$sent =~ s/[a-z]//g;
print $sent;
935nobodyさん:2008/02/19(火) 16:31:12 ID:???
馬鹿だな、まずはおっぱいうpしてからだろjk・・・
936exe:2008/02/19(火) 16:55:41 ID:L1DAdjnk
仕事では無いです。笑われてるかもしれませんが初心者の
自分にとっては色々難しくて。時間もありませんでしたので・・
937nobodyさん:2008/02/19(火) 17:15:11 ID:???
perlで外部サーバー上のファイルを読み込む方法はありますか?

OPEN("http://www.aa.com/a.cgi") みたいにして
a.cgiの出力結果を元にさらに処理をしたいと思っています

938nobodyさん:2008/02/19(火) 17:30:48 ID:gLoGL0Ae
>>937
いい手じゃないが、Linuxでwgetが入ってる状態で漏れが使ってる方法

$foo = `wget -O- http://www.aa.com/a.cgi`;
939nobodyさん:2008/02/19(火) 17:45:18 ID:???
いやそれが最強。wgetのWIN版もあるからな。-qも付けると良い。
940nobodyさん:2008/02/19(火) 17:55:56 ID:???
LWP
941937:2008/02/19(火) 19:26:35 ID:???
>>938
ありがとうございました
無事 取得することが出来ました。
あと[`]でくくるのはなぜなのでしょう?
942938:2008/02/19(火) 20:13:58 ID:???
>939
モジュール使った方が互換性高いし、そっちの方が良いと思ったんで。
>940のLWPを使うのが最良だと思うが、使い方調べてる気分的な余裕がないんで、
wget使ってそのまま今に至る感じだ。

>941
外部コマンド実行だから。``で囲むと外部コマンドを実行して標準出力が戻ってくる。

ちなみに"perl -T"でやってると、そのままじゃ外部コマンド動かない事があるんで注意。
$ENV{'IFS'}, $ENV{'CDPATH'}, $ENV{'ENV'}, $ENV{'BASH_ENV'}, $ENV{'PATH'}を
退避・削除してから外部コマンドを実行し戻す必要がある。
943nobodyさん:2008/02/19(火) 20:26:04 ID:???
LWP
944nobodyさん:2008/02/20(水) 08:23:23 ID:???
945937:2008/02/20(水) 12:35:11 ID:???
>>938-944
ありがとうございます。
LWPも使えました 研究してみます。
946nobodyさん:2008/02/20(水) 13:15:09 ID:???
@urlの中に500くらいのサイトのURLが入っています。
そのURLのページにキーワードか書かれているかどうか調べるとき、

foreach (@url) {
  LWPで取得してキーワードが見つかったら、$count++;
}

みたいにすると一つずつなので物凄く時間が掛かります。
10個くらい一気に取得する方法はないでしょうか?
947nobodyさん:2008/02/20(水) 13:35:03 ID:???
同じプログラムを10個並列に走らせてそれぞれに50サイトずつ担当させるのが一番楽だと思うよ。
948nobodyさん:2008/02/20(水) 13:43:09 ID:???
こういう場合ってほとんどはLWPで取得するのが一番時間かかってるのかな?
949nobodyさん:2008/02/20(水) 13:59:11 ID:???
>>947
そうですか…分割してみます。

>>948
応答待ちが長いと停止状態です。
950nobodyさん:2008/02/20(水) 14:34:00 ID:???
fork
951nobodyさん:2008/02/20(水) 15:01:34 ID:???
プロセスで並列化するとプロセスAは終わってるけど
プロセスBは重いサイトがリストにあって終わってないとか
無駄に待ち時間増えるから、threads使える環境ならthreadsのが楽でない?
952nobodyさん:2008/02/20(水) 15:03:07 ID:???
JISの文から携帯電話の絵文字部分を退避させたいと思っています。
正規表現について教えてください。

通常の2バイト文字と同様に絵文字[\x75-\x7B][\x21-\x7E]がエスケープシーケンス
\x1b\x24\x42と\x1b\x28\x42に囲まれます。

エスケープシーケンスをそれぞれ
$esc_in = "\x1b\x24\x42";
$esc_out = "\x1b\x28\x42";
とし、絵文字を
$emoji = "[\x75-\x7B][\x21-\x7E]";
とします。

元の文を
$str="今日は晴れでした■気温は10度です。";(■は笑顔の絵文字 \x79\x79 )

この$strは
$esc_in今日は晴れでした■気温は$esc_out10$esc_in度です。$esc_out
とエスケープされます。

やりたい事はこれを
$esc_in今日は晴れでした$esc_out[7979]$esc_in気温は$esc_out10$esc_in度です。$esc_out

というように[]で絵文字コードを囲い、エスケープシーケンスの整合性をとるというものです。

どなたかご教授いただけないでしょうか?
953nobodyさん:2008/02/21(木) 00:49:43 ID:???
それのどこがWeb Programmingなんだ?
954nobodyさん:2008/02/21(木) 02:07:00 ID:???
JISコードは加工には向かないので、Encode::JP::Mobileあたり使って
いったんutf8文字列にしてから加工して戻す方がたぶん見通しいいよ。
955952:2008/02/21(木) 03:31:08 ID:???
>>954

ありがとうございます。そちらの方で検討させていただきます。

このような複雑な置換について私は苦手でして、もしこれがお分かりになられるなら後学のためにも教えていただきたいのですが、ご無理でしょうか?

956nobodyさん:2008/02/21(木) 10:36:05 ID:???
マッチした文字列の前後は$esc_inで囲って
マッチした文字列はルールに沿って変換
ってことかな?
957nobodyさん:2008/02/21(木) 10:36:46 ID:???
×$esc_inで囲って
○$esc_inと$esc_outで囲って
958nobodyさん:2008/02/21(木) 10:39:56 ID:???
無理に書くとこんな感じ? 全くお勧めしない。

# 絵文字部分を1文字ずつ加工。
# 1バイトずれてマッチしたり、ascii部分にマッチしないようにしてるので面倒
$str =~ s{
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)
([\x75-\x7b])([\x21-\x7e])
}{
sprintf "%s\x1b\x28\x42[%02x%02x]\x1b\x24\x42", $1, ord($2), ord($3)
}gex;

# 冗長なエスケープシーケンスの並びを除去
$str =~ s/(\x1b\x24\x42)+/$1/g;
$str =~ s/(\x1b\x28\x42)+/$1/g;
$str =~ s/\x1b\x28\x42\x1b\x24\x42//g;
$str =~ s/\x1b\x24\x42\x1b\x28\x42//g;
959952:2008/02/21(木) 14:20:04 ID:???
>>958
ありがとうございます。
やはりすごい複雑になってしまうんですね。
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)

を見てもさっぱり理解できません。
これが絵文字でない文字を指すというのはわかるのですが、詳しく教えていただけないでしょうか?
または参考になる書籍などがありましたら教えていただけないでしょうか。
960952:2008/02/21(木) 14:25:02 ID:???
書き忘れましたが、Encode::JP::Mobileを使い無事utf8にできました。

これを作った方すごいですね。こんな便利なものがあると知りませんでした。

961初心者:2008/02/21(木) 14:43:22 ID:eHzrHpy8
perlでカレンダーを作るのですが、プログラミングする内容としては何がひつようでしょうか?
何から書いていいやらとっかかりがわかりません。どなたかアドバイス等をお願いします。
962nobodyさん:2008/02/21(木) 14:48:53 ID:???
ggrks
963nobodyさん:2008/02/21(木) 14:49:53 ID:???
とりあえず以下のサブルーチンを作る

1. 本日の年・月・日・曜日を返す
2. x年y月z日の曜日を返す
3. x年y月1日の曜日を返す
4. x年y月の月末日を返す
5. x年y月の前月を返す
6. x年y月の翌月を返す
7. x年y月z日の前日を返す
8. x年y月z日の翌日を返す
964初心者:2008/02/21(木) 15:13:33 ID:eHzrHpy8
ありがとうございます。
965初心者:2008/02/21(木) 15:26:58 ID:eHzrHpy8
今年のようなうるう年かどうかを調べるにはどうしたらよいのでしょうか?
966nobodyさん:2008/02/21(木) 15:35:05 ID:/bZGgDSr
閏年の定義に当てはまるかどうかを調べればよい。>>965
西暦が4で割り切れて、100で割り切れなければ閏年。
西暦が4で割り切れて、400でも割り切れれば、100で割り切れても閏年。
967nobodyさん:2008/02/21(木) 15:35:25 ID:???
いちいち相手にするからググればわかるような質問が絶えないんだよな
968nobodyさん:2008/02/21(木) 15:38:45 ID:/bZGgDSr
悪かった。今は反省している。
969nobodyさん:2008/02/21(木) 16:23:42 ID:???
閏年を知る必要は無いはず。
月末=翌月1日の1日前( x年y月の月末日=(x年y+1月1日)-1日 )だから、
PerlインタプリタとOSとライブラリにバグがなけりゃ閏年だろうが、平年だろうが
関係なく計算できる。

Date::Calc使って計算すりゃ一発で出るだろ。
970nobodyさん:2008/02/21(木) 16:35:43 ID:???
ググっても分からないような初心者質問って?
971nobodyさん:2008/02/21(木) 17:03:05 ID:???
>>1
972nobodyさん:2008/02/21(木) 18:08:27 ID:???
>>969
ggrksには同意だが、
たとえば誕生日の入力で2/29が妥当かどうかってのは閏年を判別しなきゃいかんだろ。

質問者の意図は知らんが。
973969:2008/02/21(木) 18:13:29 ID:???
>>972
名前: 初心者 ID:eHzrHpy8 が継続的に質問してるんで、
ID:eHzrHpy8 : 「>961 カレンダーを作りたい。」
nobodyさん: 「>963」
ID:eHzrHpy8 : 「>965 月末日を知るのに閏年を知りたい」

って一連の流れだと思ったんだが、違うのか?
974nobodyさん:2008/02/21(木) 18:21:25 ID:???
要するに2月のカレンダーを作るときには、3月1日の日付から−1してやって、日付を取得すれば
いいってことを>>969は言ってるんだね。

カレンダーを書くルーチンを考えたことないから、参考になるね。
975nobodyさん:2008/02/21(木) 19:03:40 ID:???
localtime使う前提だよね?
末日計算を前提としてる話とごっちゃになっとる
976nobodyさん:2008/02/21(木) 19:18:16 ID:???
もちろん。

でもさ、カレンダーを書くcgiくらい、散々ソースが転がっていそうな気がするんだけどね。
その辺の中から、適当に拾ってアレンジすれば目的は果たせるんじゃないの?
977nobodyさん:2008/02/21(木) 19:26:16 ID:???
自分が使うカレンダーならどっかから拾ってくればいいが、
課題ともなるとそうもいかないんじゃない?
978nobodyさん:2008/02/21(木) 19:33:08 ID:???
というか、今更perlの課題とか出す大学とかあるの?
979nobodyさん:2008/02/21(木) 20:55:28 ID:???
>>952とまったく同じ文章が今日MLに流れてきてたけど、同一人物?
980nobodyさん:2008/02/21(木) 23:37:02 ID:???
>>978
専門学校とかじゃね?
981ID消し挑戦w:2008/02/23(土) 16:05:17 ID:???
テスト^^;
982nobodyさん:2008/02/23(土) 16:40:22 ID:???
自分用モジュールつくってるんだけどさ

package hoge;

use strict;

my $test = 'ABC';

sub new {
 my $pkg = shift;
 bless { hoge => $test, },$pkg;
}

みたいに先頭で定数定義してメソッド内で使いまくるのって問題ありますか?
これならuse strictしない方が良かったりする?
983nobodyさん:2008/02/23(土) 16:46:25 ID:???
外部値で初期化したいなら引数として渡せば?
984nobodyさん:2008/02/23(土) 17:07:54 ID:???
>>982
問題ないとおも。
ただ、定数として明示したければ、
use Readonly;
Readonly my $test = 'ABC';
しといた方が
985nobodyさん:2008/02/23(土) 17:09:32 ID:???
定数は大文字にする習し
986nobodyさん:2008/02/23(土) 18:07:36 ID:???
(・∀・)
987nobodyさん:2008/02/23(土) 18:54:14 ID:???
>>983
箱から出したくないしので、blessに絡めたくないんです。
ちなみに全メソッドで使います。

>>984
CPAN配布物ですかね?
名前からして便利そうですが、標準で入ってないのは遠慮したいです。

>>985
おk

コールバックあたりも調べてみます。

とりあえずみなさんありがとうです。
988nobodyさん:2008/02/23(土) 19:03:14 ID:???
use Vars, oursなんてあったのか。
989nobodyさん:2008/02/23(土) 19:57:03 ID:???
>>987
標準ならconstantプラグマ
990nobodyさん:2008/02/23(土) 21:32:08 ID:???
以前は値を返すだけのsub使ってた。
991nobodyさん:2008/02/23(土) 21:46:40 ID:???
>>987
CPAN配布物だけど、純Perlソースだから、インスコしなくても、
下記からダウソして自分のモジュールと同じディレクトリに入れればよさげ。
http://search.cpan.org/src/ROODE/Readonly-1.03/Readonly.pm
992nobodyさん:2008/02/23(土) 21:47:49 ID:???
空のプロトタイプ付きサブルーチンはコンパイル時に展開されるので
効率はいい。constant プラグマはいわばその構文糖。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html#Constant_Functions

変数展開コンテキストに埋め込みたいなら、リテラルのリファレンスに
名前を付ける方法もある。
http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html#Symbol_Tables

パッケージグローバルな my 変数も、そのパッケージ内でうっかり
書き換える心配が無いのなら別に悪い選択肢じゃない。
993982:2008/02/23(土) 22:24:31 ID:???
>>991
ダウソしました。できるだけ理解してから使ってみます。

>>990,>>992
サブルーチンでやるならsub Readonly () { 'ABC' }でおkですね。
とりあえず自分用はそうします。

もし他人に配布するような事があれば>>989,>>991が良いっす

短時間ですごい勉強になりました。ありがとう
994nobodyさん:2008/02/24(日) 18:30:29 ID:???
保 守
995nobodyさん:2008/02/25(月) 16:37:54 ID:???
 次スレ希望
996nobodyさん:2008/02/25(月) 17:52:22 ID:???
テンプレ貼るなら立ててやるよ
997nobodyさん:2008/02/25(月) 19:27:13 ID:???
ほらよ

Perlコーディング初心者質問スレ Part 57
http://pc11.2ch.net/test/read.cgi/php/1203935151/
998nobodyさん:2008/02/25(月) 20:00:31 ID:???
乙です。
埋め
999nobodyさん:2008/02/25(月) 20:07:07 ID:???
埋め
1000nobodyさん:2008/02/25(月) 20:07:31 ID:???
埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。