Perlについての質問箱 9箱目

このエントリーをはてなブックマークに追加
"The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc2.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

過去ログは>>2-4あたり
2get
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

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

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

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

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
6デフォルトの名無しさん:04/03/13 13:32
乙あげ。最近スレッドの消費速度速いね。
初心者の質問が多いからな。でもまあ初心者がラクダ本を暗記する頃には
今度は質問を答える側に回っているわけで、そういった循環は大事にしたいな、と。
初心者質問はいいとしても、明確なスレ違いは答えずに誘導を徹底したいところ
>>7が良いこと言った。試験に出るぞ。
問題は暗記するほど使い込む奴が何人いるか棚。
Thread.pmのpodを見ると

>新しいコードではThreadモジュールの使用は推奨されない。
>代わりにthreadsモジュールとthreads::sharedモジュールを直接利用することが推奨される。

と書いてあるんだけど、これってマジですか?
threads.pmなんて聞いたことも無いぞ?
しかも何でモジュールなのに小文字で始まってるんだよ!
Perl 5.6 introduced something called interpreter threads.
Interpreter threads are different from ``5005threads'' (the thread model of Perl 5.005)
by creating a new perl interpreter per thread and not sharing any data or state between threads by default.
ActivePerl5.8.3をインストールしたんですけど、
plファイルのアイコンがトカゲマークに変わってしもた・・・
どうせならpmファイルもデフォルトで関連付けろと言いたい。
>>12
Perl5.6から新しいスレッドモデルになったと。
Thread.pmが後方互換性のためだけの存在とは思わなかったです。

ついでに質問なんですが、ActivePerl5.8.0で
以下のようなスクリプトを動かすとエラーが出ます。
$resultを出力した後でエラーが出てるので
スクリプトの終わり方に問題があるのかと思うのですが、
原因がよく分からないです。対処法はありますか?

#ソース
use Thread;
my $t = Thread->new(\&hoge);
my $result = $t->join;
print($result);
exit;

sub hoge
{
foreach(0..10)
sleep(1);
}

#エラーメッセージ
Free to wrong pool 27c9f0 not 273f88 during global destruction.
1514:04/03/13 17:10
ちょっと修正です。

sub hoge
{
foreach (0..10) { sleep(1); }
return 1;
}
ActivePerl 809 windows 2000 で試したが、出ないよ
>>7
駱駝本一冊マスターするのに、何ヶ月くらいかかる?
>>7,10,17
数年使ってるはずだが、暗記していないと余裕で断言できるな。
ActivePerl の HTML リファレンスがすげー役に立ってる。

>>11
>しかも何でモジュールなのに小文字で始まってるんだよ!

小文字で始まる場合はプラグマだというのが慣習のはず。
で、strict とかも実際にモジュールがあるぞ。
19デフォルトの名無しさん:04/03/13 18:18
暗記なんていらん。プログラミングは九九じゃないし、地理や歴史でもない。
せいぜい自分が使い易いように参考資料を整備しておけば困らない。
あとは、単に読んで理解する力があればいい。
ラクダ本に書かれてることある程度覚えてないと、
人のコードが読めないと思うけど。
調べながら読めばいい。
読んでから調べてもいい。
>>993
>>996
レスありがとうございます。

みなさんとやり取りで、自分の質問するべきことがやっとはっきりしました。
作ってみたいと思った処理の部分は、例えば、
5桁の数字をランダムに発生させ、その数字を発音させる、
という感じのものでした。これをwavファイルやmp3ファイルを使用して出力
させるとなるとファイル数がとても多くなると思います。
>>996 様が言われるように私には不可能かもしれませんが、「音声合成」と
ぐぐってやってみたいと思います。
1〜9 1刻み
10〜19 1刻み
20〜90 10刻み
100
1000
で「つうぇんてぃ・ふぉー・さうざんど・すりぃ・はんどれっど・ふぃふてぃ・ふぁいぶ」と順に流す。
ファイル数は29。…そんな多いか?
俺もラクダ本暗記してるとは言えないがどこを見れば知りたいことが載ってるか分ってる
どのスレで質問すればいいか察しは付く
何て単語で検索すればいいかだいたい分る
そうゆうもんでしょ
>>25
プログラム組め。
27デフォルトの名無しさん:04/03/14 10:14
Windows200で ActivePerl v5.8.3を使っています。
UTF-16で"\n"を出力すると、00 0d 00 0a になることを
期待していたのですが、00 0d 0a になってしまいました。
これってどうすればよいでしょうか?
use Encode;
open $out, ">:encoding(UTF-16)", "out.txt";
print $out "\n";   # 00 0d 0a になる
print $out "\x0a"; # これでも 00 0d 0a になる
print $out "\x0d\x0a"; # 00 0d 00 0d 0a になる
close $out;
use utf8;
use Encode;
open $out, ">:perlio:encoding(UTF-16)", "out.txt";
print $out "hoge\x0d\x0ahoge\n";
close $out;

open $in,"<:bytes","out.txt";
local $/=undef;
my $a = <$in>;
$a =~ s/([\x00-\x20\%\x80-\xff])/'%'.unpack('H2',$1)/ge;
print $a;
29デフォルトの名無しさん:04/03/14 11:49
>>28
そのプログラムの出力は
%fe%ff%00h%00o%00g%00e%00%0d%00%0a%00h%00o%00g%00e%00%0a
ですが、ファイルの中はやっぱり 00 0d 0a になります。
悪かった。

open $out, ">:raw:encoding(UTF-16)", "out.txt";
print $out "\x0d\x0a\n";
close $out;

open $in,"<:bytes","out.txt";
binmode $in;
3128,30:04/03/14 12:19
どうも :crlf と対になるのは :raw らしい。

しかしperlfuncのbinmodeには
Note that, despite what may be implied in ``Programming Perl'' (the Camel) or elsewhere,
:raw is not the simply inverse of :crlf
-- other layers which would affect binary nature of the stream are also disabled.

とあるんだよな。わからん。
3227,29:04/03/14 12:57
なるほど。:rawですか。
激しくありがとうございました。
33デフォルトの名無しさん:04/03/14 14:48
$aa>=$aa[3]
>>23
>これをwavファイルやmp3ファイルを使用して出力
>させるとなるとファイル数がとても多くなると思います。

だから、
前スレ>>991
> http://www.lhs.com/realspeak/demo/ とか。
> http://demo.lhsl.com/realspeak/speak.asp
> Language=Japanese&Frequency=8&Voice=Tomoko&UserText=tokyo
> を渡せばwavが返ってくる。
じゃあかんの?と聞いてるんだが。
35デフォルトの名無しさん:04/03/15 00:08
WindowsでPerlスクリプトからexeを生成するのに
perl2exeしか知らなかったんですけど
ppっていう便利なツールがあるんですね。
皆さん知ってました?

http://perldoc.jp/docs/modules/PAR-0.75/script/pp.pod
>>24
※こういうやり方があるのですね。了解です。

>>34
> http://www.lhs.com/realspeak/demo/ とか。
※ここにはアクセスできて実際にファイルを作成してもらったのですが、
↓のアドレスにアクセスすることが出来ません。

> http://demo.lhsl.com/realspeak/speak.asp
※アクセスすると、
”Error: Please try again later.”というエラーが表示されて、
↓を実行することが出来ません。

> Language=Japanese&Frequency=8&Voice=Tomoko&UserText=tokyo
> を渡せばwavが返ってくる。
※渡してみたいのですが渡すことが出来ません。
どうすればアクセスできるのでしょう?


37デフォルトの名無しさん:04/03/15 14:03
>35
ActivePerl5.8.3で ppm>install PAR でインストールして
pp -o packed.exe source.pl で生成できました。
簡単ですね!
質問させて下さい。

上手く説明出来る自信がないのですが、
mainパッケージから呼び出したモジュールAが、
同じくmainパッケージから呼び出したモジュールHogeからも呼び出されていた場合、
二回呼び出される事になるのですか?

なんと言ったらいいのか、、メモリの中にモジュールAは二つ存在する事になるのですか?
実際にはありえない例ですが、大きいモジュール(例えばCGI.pmなんか)を各packageから呼び出しまくってた場合、
システムダウンするなんて事とかがありえるのかな、と。

{
  package main;
  use Hoge;
  use Foo;
  use A;
}
{
  pachage Hoge;
  use A;
}
{
  pachage Foo;
  use A;
}
>>36
POSTメソッドじゃないとダメよ。
40デフォルトの名無しさん:04/03/15 17:06
>>38
一意な名前空間は一個しか存在し得ない
あんたが一章のマニュアルページを10回読んだからって
10章の知識を得た事にはならないし、
10ページに増えてたりしない
>>38
ラクダ本3版VOL2の29章のuseの項を読むと最初にこう書いてある

「use宣言は、指定されたモジュールを(まだロードされていなければ)
ロードして、そのモジュールからサブルーチンと変数を現在のパッケージ
にインポートする」

ここに書いてあるようにロードは1回しか行われないので安心すれ。
ただしインポートは何度も行われる。

たとえば上の例でAの中に変数$xというのがあってエクスポートされてた
としよう。

そうするとインポートされるたびに、同じ変数が$main::x, $Hoge::x, $Foo::x
という名前でも参照できるようになるが、変数の実体は一つで増えるわけ
じゃない。
まぁ、百万個以上ものシンボルをエクスポートするようなモジュールを
複数のパッケージからuseすれば、おそらくメモリ不足に陥るシステムもあるだろうな。
4338:04/03/15 20:39
>>40-42
丁寧なご説明有難うございます。非常に良く理解出来ました。
メモリを少しでも節約したいのならば、

use Module ();

と呼び出すのが良さそうですね。
# 名前空間も綺麗に保てるし一石二鳥、かな?

>>41 氏の解説を見る限り、
ラクダ本には私の細かい疑問の的確な答えが載ってそうな気がします。
激しく欲しいのですが、、




手が、、出ない、、orz
昨日買った黒ヒョウ本のevalの項を読んでいて思いついたのですが、

if ($word eq 'hoge') { hoge(); }
if ($word eq 'hage') { hage(); }
if ($word eq 'fooo') { fooo(); }
else { die; }

としていたのを

eval "$word();" or die;

とするのってアリですか?
>>41
たまたま手元にラクダ本があったから参照しただけで、perldoc -f use
すれば

It is exactly equivalent to

BEGIN { require Module; import Module LIST; }

except that Module must be a bareword.

とか

The "BEGIN" forces the "require" and "import" to happen at com-
pile time. The "require" makes sure the module is loaded into
memory if it hasn't been yet.

といった感じにちゃんと説明されてるのであきらめずによく調べよう。
46デフォルトの名無しさん:04/03/15 20:55
間違えた。上は >>43 ね。

>>44
(1) $word()の戻り値が偽だったときにdieしてしまう。

(2) $wordの値がhoge,hage,fooo以外だがたまたま定義されているサブルーチン名だったときは
それが呼ばれてしまう

(3) それどころか$wordにとんでもないプログラムの断片が含まれていたらそれがそのまま実行される
たとえば$wordの値が'system "rm -rf /"; hoge'だったら...((((;゜Д゜))))ガクガクブルブル

ということでその置き換えはもとのとはかなり振る舞いが違うものになってしまっている。

たぶん$wordの値がその3つの値のどれかであるか調べるところはちゃんと
書かないとだめ。もちろん$wordの値になにか仮定をして良ければある程度
はサボれる可能性はあるけどね。

$wordが3つの値のどれかであることが保証されれば、呼び出しはevalを使うまでも
なく &$word() で十分。

if ($word eq 'hoge' || $word eq 'hage' || $word eq 'fooo') { &$word(); }
else { die; }

とか、だらだらeqを並べるのがかっこ悪いならあらかじめ
%CHECK = (hoge=>1, hage=>1, fooo=>1); というハッシュを用意しといて

$CHECK{$word} or die;
&$word();

といったあたりかな。
%ftbl = (
foo => \&foo,
bar => \&bar,
baz => sub{ BazClass->baz(@_) },
);

$x = $ftbl{ $word } or die;
$x->(@args); # or &$x(@args)
4944:04/03/15 22:08
ぐぁ、(3)がめっさキツイ。
ちゃんと変数の中に何が入っているのかチェックしないと駄目なんですね。
サボりすぎちゃイカン、と。

出なおしてきます。
50デフォルトの名無しさん:04/03/15 22:17
Net::Telnet の waitfor() って、二つの条件で待つことってできるんですかねぇ??
'/>/' と '/quit/' とかで分岐させたいんですけど。
51デフォルトの名無しさん:04/03/15 22:18
本当に初心者ですみません。
PealのIF文でマザーのビープ音をならさせたりすることって
可能でしょうか?もしよければ教えてほしいです。
へんな質問失礼しました
if ($word =~ m/^(hoge|hage|fooo)$/) { &$word(); }
とか
配列から要素を格納個数に応じた確率でランダムに選択するのに
@data = qw( a a a b b c );
$select = $data[ rand(@data) ];
とやっていましたが、個数が多いと配列が膨れ上がってしまいます。
(a が1000個とか)

%data = ( a => 3, b => 2 c =>1 );
というハッシュに対して同じように確率に応じた要素選択をするにはどうしたら良いでしょうか。

foreach (values(%data)){ $sum += $_; }
foreach (keys(%data)){ if( rand($sum) < $data{$_} ){ $select = $_; last} }

というのを思いつきましたが、Perlに熟練した皆さんならもっと美しいコードを書くような気がします。
54デフォルトの名無しさん:04/03/15 22:37
>>50
waitforの引数にはパターンが使えるんだから | で区切って並べりゃいいと思うが。
マッチした文字列はリストコンテキストで呼べば返してもらえる。

あるいは

You can specify more than one pattern or string by simply providing
multiple Match and/or String named parameters.

とあるのでパターンそのものを複数与えることもできそう。
Yahooで使っているような、ロボット対策の
idを画像で表示させて、それをテキストボックスに入力させる
認証ってどうやったらできますか?
5650:04/03/15 22:47
>>54
情報ありがとうございます。
明日、さっそく職場でためしてみます!!
>>53
>foreach (keys(%data)){ if( rand($sum) < $data{$_} ){ $select = $_; last} }
コードとやりたいことが違ってない?
これだとどれ一つとして選択されない場合があると思うんだが。
rand() は一回だけで、0<=x<1, 1<=x<1+2, 1+2<=x<1+2+3 のどこに入るかで判断するべきなんじゃないかと。
58デフォルトの名無しさん:04/03/15 23:21
>>47
関連して聞きたいんですが、44じゃないです。
---main.cgi
use Mode;
use CGI;
my $cgi = CGI->new();
my %params = $cgi->Vars;
($params{'mode'} || 'foo')->new( \%params )->execute();
---Mode.pm
package Mode;
sub new{
my $class = shift;
my $params = shift || {};
bless $params => $class;
}
package foo;
use base Mode;
sub execute{# fooの処理}
package bar;
use base Mode;
sub execute{# barの処理}
package baz;
use base Mode;
sub execute{# bazの処理}
-----------------------------------
こんな感じで処理振り分けしてますが、なんか問題あるしょうか。
セキュリティ関係ちょっと疎くて不安なのですが。


$r = rand($sum); foreach (keys(%data)) { if ($r < $data{$_}) { $select = $_; last} $r -= $data{$_}; }

キーの数が十分少なければこれでいけると思う。一種のバカサーチなのでキーの数が
たくさんあるときは二分法ぽくするとかもう一工夫したいところ。
>>53
やってることは >>59 と同じだが。

use List::Util (sum first);

%data = ( a => 3, b => 2 c =>1 );
$idx = rand(sum values %data);
$select = first { ($idx-=$data{$_}) < 0 } keys %data;

>>58
セキュリティつうか、$param{mode} が foo, bar, baz 以外だったらエラーで落ちるけどいいの?
基本は外からやってくる値は信用しない、だと思う。
>>60 自己レス
×use List::Util (sum first)
○use List::Util qw(sum first)
>>58
modeパラメタで渡した任意の名前のモジュールのnewを呼べるってことだから、引数に
hashのreference渡されてOKなものに限定はされるけれども、とってもキケンそうな気が
します。横着しないでチェックしたほうがいいと思うよ。
>>53
5箱目の >>199 にこんなのがあった
これで上手く行く理由は俺には分からん

@weight = (25, 25, 150);
foreach (@weight) { $max = $_ if $_ > $max };
until ( $weight[$key = int(rand(@weight))] > rand($max) ) {}
print $key;
>>63
へーって感じのコードだ。
スクリプトの動きをよく見て、
3行目の二つのrandに着目してマトリクスを作れば納得いくと思う。
lwpってインスコするとコマンドラインから直で呼べるんだね
ActivePerlでtailコマンド自作して間違ってheadって打ったら色々出てきて気づいた
同じ振る舞いをさせているつもりなんですが、
これって使い方として正しいですかね?

# code1
if ($foo & $bar & $baz) { &hoge; }
die;

# code2
$foo and $bar and $baz and &hoge or die;
>>66
& はビットの論理積。 and と (ほぼ) 等価なのは && 。

code1 は常に die するが code2 は $foo、$bar、$baz、&hoge
の全てが真を返す場合は die しない。

http://perldoc.jp/docs/perl/5.6.1/perlop.pod
6866:04/03/16 16:08
>>67
あっ、、申し訳ない、typoです。
正確には、

# code1
if ($foo && $bar && $baz) { &hoge; }
die;

でした。

> code1 は常に die するが code2 は $foo、$bar、$baz、&hoge
> の全てが真を返す場合は die しない。

と言うことはcode2を以下のようにすることでほぼ同じ振る舞いになりそうですね。

$foo and $bar and $baz and &hoge;
die;
69 :04/03/16 16:44
ディレクトリを作って、その下にファイルを書き込みで
オープンしたいと思い、

$dirname = "hoge";
$filename = "hoge.dat";
mkdir $dirname, 755 or die "error";
open WFILE ">$dirname/$filename";

としてもうまくいきません・・・
そこでディレクトリを移動してから作ろうと思って
chdir $dirname or die "error";
としたけどこれも失敗します。

ディレクトリを作って、そこにファイルを作成したいだけなんですけど
一般的にはどういう手順で行うのでしょうか?
どなたか知恵を下さい!
>>69
何が上手くいかないのがわからん。エラーメッセージくらい書けよ。

あと、openの構文が間違っているが、まさかその所為じゃないよな?
>>69
mkdir $dirname, 0755 or die "error"; # 8進 だから 0をつけれ
open WFILE, ">$dirname/$filename"; # , が抜けてた
7269:04/03/16 17:12
すんません。雑に書いてしまいまひた・・・
mkdir $dirname, 0777;
open WFILE, ">$dirname/$filename";
でうまくいきました。。。。お二人ともビンゴです。
>>72
マジメにエラーハンドリング書くほどのものじゃなくても or die "$!"; ぐらいは
つけといた方が何かといいと思うよ。
質問させてください。
ファイル名のチェック用にスクリプトを作成してるんですが、

my $str = "filename++";
my $key = "name++";
$str =~ /$key/i;

のような場合、$keyが変数展開されてしまい、エラーが出てしまいます。
$strや$keyは、都度変わる文字列にしたいため、''を使わずに、
マッチ時に変数展開させないようにする方法はありますか?
質問の意味が分からない。毎回 $key の内容が変わる可能性があるのなら
変数展開されないと困ると思う。エラーがでるのは、正規表現がおかしい
から。

$key に与える文字列で複雑な正規表現を使わないで、部分的なマッチで
いいのなら
$str =~ /\Q$key\E/i
のようにして、+ がメタ文字あつかいされないようにすればいい。
7653:04/03/16 19:43
>>57
あ... orz

>>59-60
スピードはさほど問題ではないので、この方法を使おうかと思います。
二分法まで使わなくても、サーチ方向を前からと後ろから使い分けるだけで私の場合は十分そうです。

>>63
カコイイけど分からん(汗
7774:04/03/16 19:47
御答えいただき、ありがとうございます。
お恥ずかしい限りですが、メタ文字扱いされない方法として、
変数展開されなければいいと短絡的に考えていました。
もう少し用語の勉強もしたほうがいいですね…。

やりたいことは無事出来ました。
ありがとうございました。
>>39
すみません、「POSTメソッドじゃないとダメ」という意味が分かりません。
ぐぐっても?でした。
自分でホームページを作って、
http://demo.lhsl.com/realspeak/speak.asp
をそこに埋め込めば良い、
ということなのでしょうか?
79名無しさん:04/03/16 21:59
>>78
POSTメソッドでパラメータを渡す、つうのはCGIプログラミングの
初歩の初歩、の話なのだが。
まずはCGIの基礎から学んでこい。話はそこからだ。
decode処理のスクリプトどっかから
パクってこいばええよ。
あとは適当にやれ。Perlなんか適当にやればいいよ。
基礎から学必要ぜんぜんないよ
でも正規表現は覚えたほうがええよ。
>>79
了解です。
Perlの質問に始まって、CGIの基礎に向かってしまう。
Perlの質問へ戻ることができるのは、いつのことやら・・・。
先は長そう(^^;)
話を簡単にするために、@weight = qw ( 1 1 6 )とする。
想定する結果は、
8(1+1+6)分の1の確率で0が、
8(1+1+6)分の1の確率で1が、
8(1+1+6)分の6の確率で2が、
戻ってくればいいことがわかる。
で、3行目に着目。
最初の乱数が横軸、後者の乱数が縦軸とした場合、以下のような結果になる。
  0 1 2
0 0 1 2
1 * * 2
2 * * 2
3 * * 2
4 * * 2
5 * * 2
*:乱数の再計算。つまりは、振りなおし。
数字:$keyに代入される値。

気合入れてコード追えよ。
8(1+1+6)
64かとオモタ

自分で算出した確率がおかしいと思ったらuntilの条件部ばっか見てて「振りなおし」を考慮してなかったや
オブジェクト指向についてお聞きしたいのですが、
どの本を見ても良くわからないことがあるのです。

package main;
sub new {} # <- コンストラクタ

上記のように、mainパッケージの中でコンストラクタ作っても問題ないのでしょうか?

なんか自分でも何が聞きたいのかわかり難いのですが、なんと言うか、
どの本をみても本体から読み込む別のモジュールの事について話をしているような気がしまして、、

ってこれって意味無いのかな?
>>84
意味ないです。
JavaでMain.javaなんてクラス作らないのと同じです。
>>84

> ってこれって意味無いのかな?
意味があるかどうかはあんたが考える事。
コンストラクタったって単なるクラスメソッドだし、
sub newにしたからってコンストラクタになるわけじゃないし、
聞いてる事がよくわからないです。
>>82
そうか、matrixにすると一発で分かるな
試行毎の確率考えないで、振り直しの無限数列が収束するとか考えてた俺は馬鹿か
>>84
Javaとかだったら、そのクラスのコンストラクタはクラスの中に書くことが言語仕様によって規定されてるけど、
Perlではそうではない。
というか、Perlではそもそもルーチンやメソッドやコンストラクタなどを区別しない。
ルーチンに、コードによってメソッドやコンストラクタの能力を持たせることができるだけだ。
だから、どんな風に組もうともそれはお前の自由だが、逆に自己流のコーディングをすることで、
教科書的コーディングの持つ様々な利点や簡便さをドブに捨てていることになる。

……もしかしてお前、strictとか嫌いなんじゃないか?
package main;
sub new{
shift;
bless {} => hoge;
}
package hoge;
use base main;
sub method{
my $self = shift;
print ref $self;
}
package foo;
my $obj = hoge->new();
$obj->method();
# hoge です。あはは
ちょいと質問なんですが、
あるオブジェクトが、あるメソッドを持ってるかどうかが知りたいのです。
例として
$obj = TestObj->new();
で $obj->method(); をしてエラーにならないか
ということなのですが・・・
前スレあたりで名前空間の一覧を出す方法が出てた気がするのですが、
過去ログが見つからなくて・・_no

ご存知の方がいましたら、教えていただけないでしょうか?
威張るのはだめなん?
92デフォルトの名無しさん:04/03/17 23:37
正規表現で
/((埼玉)....|......)県県庁/
を日本語に訳してくれ。
頼む。。。
>>90
名前空間の方はよく知らないけど、メソッドあるか調べるならそのもの
ずばりのcanというのがあります。

perlobj(1)のDefault UNIVERSAL methodsのあたり参照。
>>90 TestObj 名前空間の名前は %TestObj:: の中にある。
>>93-94 のように can を使うのが本筋だけど、>>91 のように
eval って $@ を調べるのもあり。名前空間にこだわるなら、

exists $TestObj::{method} && defined &TestObj::method

>>92 文字コードとPerlのヴァージョンによるのでなんとも言えない。
96デフォルトの名無しさん:04/03/18 01:17
>>95
日本語1文字は2文字として見られる様です。
>>92
多分、文字コードがEUCで、no utf8なんだとは思うんだけど、正直、意味不明
のコード。>>96 の通りとして直訳すると、

「埼玉(全角2文字)県県庁」か「(全角3文字)県県庁」にマッチして、
$1 が「埼玉(全角2文字)」、$2 が「埼玉」か
$1 が「(全角3文字)」、$2 が undef。

「〜県県庁」に引っ掛けて「〜」の部分に取り出したかったのかなぁと思うん
だけど、その場合、EUC ならこう書くと思う(SJIS なら[\xA0-\xFF]{4}を
.... に替える)。

/([\xA0-\xFF]{4}|和歌山|鹿児島)県県庁/

ただし、$1 が本当に県名かは要チェック。
98デフォルトの名無しさん:04/03/18 06:27
$symlink_check = (eval { symlink("",""); }, $@ eq "");
if (!$symlink_check) {
$c = 0;
while(-f "$LOC") {
$c++;
if ($c >= 3) { &error("■ロック中"); }
sleep(2);


上記で、symlinkが出来るかどうかのチェックをしているようなのですが、
1行目の(eval { symlink("",""); }, $@ eq "") がよく分かりません。どのような値が帰ってくるのでしょうか?
>>98
そのシステムでsymlinkをサポートしていれば真、なければ偽が返る。

symlinkをサポートしていないシステムでsymlinkを実行すると致命的
エラーになるので、evalしたあとに$@を見ることでそれをつかまえようと
しているわけだ。

symlinkの引数が空文字列なのは、わざと失敗させることでゴミが残らない
ようにしてるんだろうな。

perldoc -f symlinkには $symlink_exists = eval { symlink("",""); 1 }; という
同じような例がある。
100デフォルトの名無しさん:04/03/18 12:01
>>99
詳しい説明
サンクスコ
>>93,94,95
助かりました ありがとうございます
>>91
うはっ「威張るってなんだろう?」とか思ってました(汗
evalだとあった場合に実行しちゃうので・・・ 存在するかどうかだけを知りたかったのです。
まぁ なんにせよありがとうございました。
103デフォルトの名無しさん:04/03/19 00:39
#!/usr/bin/perl
open FILE, "test.txt";
print $! . "\n";

ってしか書いてないのに、実行すると
『デバイスに対する不適切なioctlです』
と必ず出てしまいます。リブートしても同じ。OSはRedHat9(2.4.20-8)。
FreeBSDに入れ直して同じようにしたら出ません。

これはRedHat9のせい?
104デフォルトの名無しさん:04/03/19 00:59
三乗根をSqrtのように使いたいんですが、なんとプログラムすればよいでしょうか?
x**(1/3) # xの3乗根
これでできるかな。
>>103
RedHatは知らんが、必要がないならばprintに渡す引き数で文字列の連結はしない方が早いぞ
print $!, "\n";
>>103
openが成功してるときは$!の値は意味がないと思われ。
108デフォルトの名無しさん:04/03/19 08:02
@x = split /-/, $y;
と同様の動きをするプログラムを
spiltを使わず、s///gなどを使って書いてください。
悩んでまつ(´・ω・`)へるぷ・・・
109デフォルトの名無しさん:04/03/19 08:30
while($y =~ m/-?([^\-]*)/cg) { push(@x, $1) }
>>108
簡単じゃん、答えるまでもない。ああ、やりゃいい。
ヒント:m!!g
>>109
だせぇ、でもTMTOWTDIで許す。
って、優香、宿題にマジレスすんなよ。
悩め > 108。
112デフォルトの名無しさん:04/03/19 08:38
誰がPerlの宿題を出すのよ。
113デフォルトの名無しさん:04/03/19 08:40
>>108
@x = grep($_ ne '-' , ($y =~ m/(.)/g));
114113:04/03/19 08:41
ごめん。$y囲む括弧いらんかった。
ここは馬鹿ばっかか?うpする前にちったぁ試せ。
特にオマエだ > 113
116113:04/03/19 09:07
試せだと!ちゃんと試したさ!

$y = "a-b-c";

_('Д` )_ )_ ダメカ...
$y = "-aA-bB-cC-";でやれ。
@x = $y =~ m!([^\-]*)(?:-)!g;
@x = $y =~ m!([^-]+)!g;
unshift @x,'' if $y =~ m!^-!;

118は$y='abcd';のとき失敗。一行はむずい?
Perlスレの特徴は、こういう「ちょっとしたクイズ」っぽい話題になった途端、
水を得た魚のようにヘタレどもが集まってくることだな。
ワッチしてるオマエは(ry
splitクイズに参加の皆さん、

By default, empty leading fields are preserved, and empty
trailing ones are deleted.

の後半を忘れてませんか?

と重箱の隅をつついてみる。

123113:04/03/19 09:48
解けた。
>>113の正規表現を(-|[^\-]*)にすれば一行だ。
124113:04/03/19 09:51
*じゃなくて+だ。恥ずかしい…。
その前に何で
@x = split /-/, $y;
じゃだめなのかと・・・。
いいじゃんこれで
MIME::Parser についての質問はこのスレで良いんですか?
1行は無理でしょう。
@x = $y =~ m!([^-]*)(?:-|$)!g;
while (@x&&!$x[$#x]) {pop @x}

>>124
$y = '-aA-bB--cC---dD--';だったらどうなる?
108は中級釣り師
>>126
どーぞ。ただし答えられる奴がいるかどうかは又別問題
130デフォルトの名無しさん:04/03/20 00:10
単純にこれでいいと思う

@x = ($y =~ m/[^\-]+/g);
131デフォルトの名無しさん:04/03/20 00:17
しまった。これだった

@X=$y=~/-/g;
>>108
my @x = $y =~ /([^-]*)(?:-*$|-)/g;
--$#x;
インスタンス変数について教えてほしいのですが、モジュール内で使用しているインスタンス変数を、別のモジュール
で使用する場合どうしたらいいのでしょうか?

例えば、下の例でいくと$testは空白のままです。
fooの所でhoge->new();を追加すると11が帰ってくるのですが、
このようにしないと、インスタンス変数は使えないのですか?

package main;
my $hoge=hoge->new();
my $foo=foo->new();

package hoge;
sub new {
my $class = shift;
my $define = {};
$define->{'BUZ'} = '11';
bless $define,$class;
}
sub GetBuz {
my $self = shift;
return $self->{'BUZ'};
}

package foo;
use base hoge;
sub new {
my $class = shift;
my $define = {};
bless $define,$class;
my $test = $define->GetBuz;
print "$test";
}
>>133
> 例えば、下の例でいくと$testは空白のままです。
当然だろ、$define = {}だぜ。

> fooの所でhoge->new();を追加すると11が帰ってくるのですが、
> このようにしないと、インスタンス変数は使えないのですか?
普通はnew()も継承するけどな。オマエのも別に間違いではない。


あと、foo->new()で作られたインスタンスのrefは’’だよ、気つけな。
それからuse strict入れるとエラーなるぞ。
135134:04/03/20 16:26
>普通はnew()も継承するけどな。
このままだと、語弊があるな。普通は明示的に$define = hoge->new();などのようにするつぅ事。
何もperlに限った話ではないと思うぞ。何か勘違いしてないか >133
>>133
fooはhogeを継承しているが、newはfooで定義しなおされているので、
foo->new()ではhogeのnewは実行されない。

hogeのnewは継承を意識したクラス引数を取るパターンになってるので
fooのnewを以下のようにすればいいんじゃないかな。あとprintのあとで
$defineを返してないのは凡ミスだろう。

sub new {
my $class = shift;
my $define = $class->SUPER::new();
my $test = $define->GetBuz;
print "$test";
$define;
}


$define = hoge->new() か、
$define = $class->SUPER::new() で一度、
hoge側のnewを呼び出しておかないと、いけないんですね。
継承ってことだから、use base qw(hoge); を行えば全部
利用できるかと勘違いしてました。

もちっと修行してきます。
138枢軸 ◆AmzNr0BSVY :04/03/20 23:16
スマン
flock FH,2
sleep 1;
は、sleepがなくとも、同時期書き込み防止できるよね?
>>138
有っても無くても防止出来ないかもしれない。
140枢軸 ◆AmzNr0BSVY :04/03/20 23:28
seekが必要って事でつか?
ならseek FH,0,2も追加。
>>140
sleepもseekもロックとは無関係。
よくある誤りだが、open FH, ">$file"などとしていると、
ロックする前にファイルを空にしてしまう。"+<$file"とするべき。

142枢軸 ◆AmzNr0BSVY :04/03/21 00:56
>>141
サンクス、sleepは理解できたが、
seekの動きがいまいち理解できない(´;ω;`)ウッ…
143枢軸 ◆AmzNr0BSVY :04/03/21 01:16
>>139
何故か教えれ!!
つか >138 のコードには肝心のオープンと書き込みが書かれてないんで
アドバイスしようがない。どういう使い方してるの?
関数についての説明ならリファレンスからくだ本でも読む方が。

146デフォルトの名無しさん:04/03/21 10:31
標準入力から一文字取り出したいです。
read(STDIN,$data,1)などしてみましたがlinuxの入力バッファリングに阻まれているのが現状です。
>>147
ありがとう。モジュールがないと厳しいみたいですね。
149デフォルトの名無しさん:04/03/22 05:46
XML::Parser::Lite について。
ハンドラの中で正規表現を使うとSegmentation fault (core dumped)で落ちる。

# --- begin script --- #
use XML::Parser::Lite;
my $p = new XML::Parser::Lite;
$p->setHandlers(Start=>sub {my $tag = shift; $tag =~ s/a//});
$p->parse('<tag></tag>');
# --- end script --- #

環境は、
  $ perl -v
This is perl, v5.8.2 built for cygwin-thread-multi-64int

  $ less /usr/lib/perl5/site_perl/5.8.2/XML/Parser/Lite.pm
package XML::Parser::Lite;
# $Id: Lite.pm,v 1.1.1.1 2002/11/01 14:53:57 paulclinger Exp $
$VERSION = sprintf("%d.%s", map {s/_//g; $_} q$Name: release-0_60-public $ =~ /-(\d+)_([\d_]+)/);


おまいらの環境ではどうなる?
>>149
PERL58.DLL内でAccess Violation。

perl -v

This is perl, v5.8.3 built for MSWin32-x86-multi-thread
(with 8 registered patches, see perl -V for more detail)

Copyright 1987-2003, Larry Wall

Binary build 809 provided by ActiveState Corp. http://www.ActiveState.com
ActiveState is a division of Sophos.
Built Feb 3 2004 00:28:51
文字列のソートについて質問です。
「"D","","A","C","B"」といった配列を通常にソートした場合、
「"","A","B","C","D"」と並び替えられますよね?
それを「"A","B","C","D",""」といったふうに、何も入ってない部分が一番最後に回ってくるように並び替えたいんです。
この場合、どのようなソート順の定義をすればいいか、何方かご教授お願いします。
>>151
map { chop; $_ } sort map { $_ . "\xff" } @input;
>>151
@tmp = sort grep length, @input;
push @tmp, ('') x (@input - @tmp);
154149:04/03/22 20:00
>>150
ありがとう。ActivePerlでもダメなんだね。
俺がダメなことしてんのかなあ・・・?
>>154
callbackの中にregexpがあると落ちるみたいだね。
XML::Parser::Lite.pm覗いたけど、あたしの頭じゃ、よう分からん(^^;;;;
作者にレポートしたら?

XML::ParserならOKだよ。
あと、callbackはsub {my $expat = shift; my $tag = shift; $tag =~ s/a//}
156デフォルトの名無しさん:04/03/22 23:57
>>151
ソート順の定義を素直にやるなら

sort { ($a eq '' || $b eq '')? ($b cmp $a): ($a cmp $b) } @input

てな感じになるだろう。でも比較方法指定なしのソートのほうがかなり速いので
153の方が速度的には有利だと思うよ。
小規模なスクリプトでのオブジェクト指向って無駄でしょうか。
例えば、サブルーチンを一つのパッケージに纏めるだけの単純なもののような。

必要無いなら使わなくても良いとも思ったのですが、
今のPerlはオブジェクト指向だなどという言葉もちょくちょく聞くので
特に必要が無くてもそのような記述にした方が良いのかとも思い迷ってます。
#確かに見た目は良くなるというか多少読み易くはなるのですが……
>>157
「オブジェクト指向デザインは、それが意味のある場合に使い、
そうでない場合には避けること」…と駱駝本には書いてある。
>>157
> 小規模なスクリプトでのオブジェクト指向って無駄でしょうか。
無駄って事はないと思うよ。
今複数カテゴリチームのBBSとML管理、及びそれぞれのチームのIndexページ
を統合するやつ書いてるんだけど、初めてOOPで書いた。
ついでにHTMLもテンプレート化してHTML吐き出しを排除。デザインもcssファイルで
外部ファイル化してる。
正直、もう戻れないなあ、と思ってます。
前回書いた奴は2500行のべた書きだけど、触る気にならないです。ってか
それがOOPで書いてみようか、っていう動機なんだけど。
だってちょっと触りたいな、と思ってもさっぱりワヤで自分で書いたものなのに
見る気もしない。
モジュールもせいぜい長くても100行程度、短いのは30行ぐらいしかないのもある。
オブジェクトにする意味があるのなら大きい小さいは関係ないと思います。
興味があるなら小さいものでもやってみるべきだと思う。
本当に新たな手法を手に入れる事になるから。

その上で、
「オブジェクト指向デザインは、それが意味のある場合に使い、
そうでない場合には避けること」
は、もっともです。

100行止まりのスクリプトなら、全部mainパッケージ内で
グローバル変数で書いた方が早い。いくつかサブルーティン化
したものと比べるとすぐ分かる。
明確に関連機能が分けれてパッケージング出来るときはoopやってて、
規模が中程度ならサブルーチン化
小規模ならば無名サブルーチン

みたいな使い分けしてるっぽ。
Linux 上で ACL を操作する libacl ライブラリを Perl で OOP 使っていじくるパッケージを作りますた。
よければみんなでよってたかってぃι"めτください。
163149:04/03/23 22:03
>>149の問題なんだけど、XML/Parser/Lite.pmの中に
「splitやregexpは使えません」って書いてあった。

ソース解析してたら
>Start=>sub {my $tag = shift; $tag =~ s/a//}
で定義されたサブルーチンが直接正規表現の中に埋め込まれていた。
そのせいみたい。
164157:04/03/23 22:19
ありがとうございました。
自分の書いているのは機能を分けるとなると
サブルーチン一つにパッケージ一つとかになるような
簡単なものばかりなので必要無いなら使わないの言葉に従う事にします。
#既に幾つかOOで書き直して居たりしますが
165デフォルトの名無しさん:04/03/23 22:33
すみません、全くの初心者なのですが、perl 5.8.2での質問です。
文字コードのスレに書き込んだのですが確かな回答が得られませんでした。

test.txtという、shift-jisで保存されたテキストファイルがあります。
(ファイル名も、置かれているディレクトリも常に同じ。)
このファイルを、utf-8に変換したいのですが、やり方がわかりません。
いろんなサイトを参考にして、何種類かやり方があるようなことがわかり、
試しに、
use utf8;
$input_filename ='C:\hoge\test.txt';
$output_filename ='C:\hoge\test.txt';
open my $in,'<:encoding(shift_jis)',$input_filename or die "open $input_filename: $!\n";
open my $out,'>:encoding(utf8)',$output_filename or die "open $output_filename: $!\n";
while(<$in>){print $out $_;
}
close($in) or die "read $input_filename: $!\n";
close($out) or die "write $output_filename: $!\n";
という風に書いてみましたが、結果はtest.txtの中が空になるだけでした。
166デフォルトの名無しさん:04/03/23 22:34
上の続きです。
また、別のやり方として、
use utf8;
$input_filename ='C:\hoge\test.txt';
$output_filename ='C:\hoge\test.txt';
use Encode qw(from_to);
open my $in, "<", $input_filename or die;
open my $out, ">", $output_filename or die;
while(<$in>){
from_to($_, "shift_jis", "utf8");
print $out $_;
}
という風なやり方も試してみましたが、結果は同じでした。
どこがいけないのでしょうか?
ちなみに、保存するファイル名を変えるとうまくいくのですが、
できれば同じファイル名にしたいのです。
どなたか詳しい方、よろしくお願いします。
167デフォルトの名無しさん:04/03/23 23:21
$output_filename ='C:\hoge\test.txt';
↑!
>確かな回答が得られませんでした

あれだけはっきり書いてやったのに。失せろ。
>>165
>open my $out,'>:encoding(utf8)',$output_filename or die "open $output_filename: $!\n";
これやった瞬間にファイルが空になる。
開いたファイルは閉じような。
171デフォルトの名無しさん:04/03/24 11:49
my $pass = <STDIN>; で標準入力からパスワードを得たいのですが、
この時に、Unix系のOSのログイン時のようにキー入力をエコーしないようにしたい
のですが何かいい方法があったら教えてください。
172171:04/03/24 11:58
あ、スイマセンでした。sttyでできそうなのでやってみます。失礼しました。
use strict つかった場合 ハッシュにに変数
初期かええていないって

環境変数 は どう
お前らって入門書なに読んだんですか?
一度はラマ本読んだ方がいい?
駱駝本は買うべき?
>>173 ??? 意味わかんない
>>174
俺は 駱駝本⇒カワセミ本って来て、
常駐してるのはCGI&Perlポケットリファレンス
キレイなサンプルコードがあればそれ見たほうが早いかも(なかなかないがね)
174じゃないがカワセミ本って・・・
何?
Web上で配布されてる奴でお勧めになるコードとか聞きたいけど
大抵は自作自演以下略な流れになるんだよなあ……。
>>174
>>4 参考
とりあえずラマ本とEffective Perlは読んでおけ
ラクダは金あるなら買ってもいいけど、perldoc で大抵間に合う

かわせみの和訳はぼろぼろ
182181:04/03/24 18:54
>>179
つーかそれじゃないだろ?
183デフォルトの名無しさん:04/03/25 11:46
サンクス、
とりあいず今の本読み終ったら、ラマ本読んでみるよ。
あ、思わず前板のログ消してもーた
185デフォルトの名無しさん:04/03/29 06:50
復帰オメデトあげ
183: デフォルトの名無しさん<><>04/03/25 11:46<>
サンクス、 <br>
とりあいず今の本読み終ったら、ラマ本読んでみるよ。 <>

184: デフォルトの名無しさん<>sage<>04/03/25 14:31<>
まずクックブックを薦める。後はperldocで間に合わない時だけでいい。 <>

185: デフォルトの名無しさん<><>04/03/25 17:38<>
「CGI&Perlポケットリファレンス」はPerlのリファレンス本としては <br>
最強でしょ。 <>

186: デフォルトの名無しさん<>sage<>04/03/25 18:03<>
下記のテンプレサイトのsmtpでのメール送信スクリプトを使用して、添付ファイルを送付することは可能でしょうか。 <br>
ttp://www5a.biglobe.ne.jp/~n_rieko/perl/smtp.htm#perl <br> 普通のメール送信までは出来たのですが、ログを添付ファイルとして送付したいと思っています。 <br>
<br>
net::smtpやqmailも使用出来るのでそちらを使ったほうが早そうですが・・。 <>
187: デフォルトの名無しさん<>sage<>04/03/25 18:39<>
ヘッダ、データ部の作成ってところで、$send_dataに自由に何でも <br>
入れられるできるようになってるので、添付ファイルつきのメールが <br>
どうあるべきかをよく調べて作ってやれば可能だと思う。MIMEの <br>
RFCを読むとか、出来合いのメールアプリで自分に添付ファイルつき <br>
メールおくって中身を見てテキトーに真似するとかね。 <br>
<br>
私ならCPANにあるMIME-ToolsかMIME-Liteあたりを使うと思うけど、 <br>
使い方調べたりする手間とどっちが楽かは微妙といえば微妙だな。 <br>
コレも一種の"There's more than one way to do it"ということで。 <br>
<>

188: デフォルトの名無しさん<>sage<>04/03/26 11:00<>
<a href="../test/read.cgi/tech/1079114157/187" target="_blank">>>187</a>さん <br>
ありがとうございます、検討してみます。 <br>
<br>
2Mのログ7つを固めて送らなければいけないので負荷の問題で、もっと軽い処理にしなきゃいけないかとも思っています。 <>
特定のドライブの空き容量を調べたいのですが、どのようなコマンドを使えばいいのですか?
use Class;
my $instance = Classs->new();

こんな感じのtypoとか、実行前にメソッド呼び出し先のクラスが正しくuseされているか
チェックするツールがあった気がするのですが、誰か知りません?
>>188
激しくシステム依存な予感

>>189
Perlは実行しないとクラスがuseされてるかどうか分からないし、
実行前にクラス名のtypoを見つけることは出来ない。残念だが。
C++なりJavaなりに移行するか、実行時エラーで我慢するしかない。
191デフォルトの名無しさん:04/03/30 11:08

CGI::SessionをCPANよりインストールを試みましたが、
途中で、止まってしまいます。OSは、FreeBSDです。


~~~~~~~~~~
BEGIN failed--compilation aborted at blib/lib/CGI/Session/File.pm line 12.
dubious
Test returned status 2 (wstat 512, 0x200)
DIED. FAILED tests 2-14
Failed 13/14 tests, 7.14% okay
t/api3_mysql........skipping test on this platform
t/api3_obj_store....(offline mode: enter name=value pairs on standard input)
_(プロンプト)

何か入力を促されていると思うのですが、適当に入力しても反応が
見られません。

どのように対処すればよろしいでしょうか?
よろしくお願いします。
192性器:04/03/30 16:19
Pattern Match で
(?{ last }) とか (?{ next }) とかするとPerlが止まってしまいます
何で???
193189:04/03/30 16:34
>>190
厳密に文法を解析してエラーチェックしてくれなくてもよいのだけど、

my $f=shift @ARGV;
open(F,$f);
while(<F>){
  $classes{$2}=1 if(/(^use )(.*);$/);
  print "line $.: warn $2 have not been loaded.n" if( /(s{1,})(w*)->(.*)((.*)/ && !$classes{$2} );
}
close(F);

のような単純な正規表現よりは強力なのきぼんぬな感じなのですが、
何か良いツール無いですかね。
テスト
\\ \7 \n
質問です。使用してるのはActivePerl v5.8.2です。

$x = (2050 / 2.05) - 1000;
print $x;

としたとき、本来、$xは0になると思うのですが、0になりません。
正しい計算結果を得るにはどうしたら良いのでしょうか。

ぐぐっても、perlは倍精度浮動小数点だということしかわからず。
それが関係してるのでしょうか?
ちなみにgoogle計算機でも0にならなかったです。
>>195
$x = int(2050 / 2.05) - 1000; # 小数点以下切り捨て
$x = sprintf("%3.0d", 2050 / 2.05) - 1000; # 精度を明示的に指定
197デフォルトの名無しさん:04/03/30 21:20
Javaのプロパティファイルを読み込むモジュールはありますか?
199197:04/03/30 22:48
>>198 検索してみますた。

Data-Properties-0.02 # TODO:エスケープを処理していない。←論外
Config-Properties-0.56 # Unicodeエスケープにも対応!

というわけで、Config-Propertiesを使ってみます。
200デフォルトの名無しさん:04/03/30 23:37
sub is_filehandle {
  my $fh = shift;
  # ファイルハンドルとして扱える、*FHや$fhが渡されたときだけ
  # 真になるようにするにはどう書けばいいですか?
  return $fh =~ m/^(GLOB|\*)/; # みたいな方法しか思いつきません。
  # 確実な方法を教えてくださいです。。。
}
open(FH, '<', 'test1.txt');
print is_filehandle(*FH), "\n";
open(my $fh, '<', 'test2.txt');
print is_filehandle($fh), "\n";
201デフォルトの名無しさん:04/03/30 23:46
>>200
FileHandle モジュール使え
202デフォルトの名無しさん:04/03/31 00:00
型グロブってなんですか?
C/C++でいうとなんですか?
203デフォルトの名無しさん:04/03/31 00:16
sub is_filehandle {
my $fh = shift;

return defined *$fh{IO};
}

かな?
やっぱCもできた方がよろしいのかしら?
HTML→JavaScript→Perl→PHPときて今アセンブラに手を出してますが何か飛ばしてる気分
>>196
補足しとくと、2.05 ちうのは「中途半端な数」だ
浮動小数 演算 誤差 とかでぐぐれ
>>203
ありがとう!
浮動小数点数なんて貧乏臭い物使わず
use bignum;
$x = (2050 / 2.05) - 1000;
でいいじゃん
208デフォルトの名無しさん:04/03/31 09:50
質問です。今、Perlで再帰的な構文の解析をしようとしています!
再帰的な構文をマッチする正規表現を構築するため、正規表現の
再帰部分を<HOGE>として、表現全体と置換するようにしてみました。
しかし、3層のネストをマッチする表現を構築しようとしたところで、
Perlの文字列型が溢れてしまい困っています。
そこで質問なのですが、Perlでは正規表現の一部をプリコンパイルしたり出来ますか?
あるいは、長い正規表現を短い正規表現で代替する方法はありませんか?
本物のパーサーは書きたくないです…。教えてエライ人!
>>208
perlの正規表現は再帰を扱う機能がある
>>208
(??{ code }) でいけると思われ。詳細はperlre(1)参照すれば
バランスしたカッコにマッチするパターンの例もあるよ。
211195:04/03/31 12:13
いろいろ答えてくださった方たち、ありがとう。
本気で初心者で申し訳ないんですが質問です。
入力された文字列に特定の文字が入っているかどうかを
探すにはどうやればいいんでしょうか。
(たとえば"●"または"▲"の文字が入っていればOKと返すような)
m/●|▲/
>>213
ダウト。たとえばEUCなら

"□ゥ" =~ m/●|▲/

は真なので日本語のマッチは結構難しい。

ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match

あたりが参考になると思う。

unicodeにしちまえばいいという話もあるらしいが
そっちはよくわからんので詳しい人ドゾー。
しょうもない質問で大変申し訳ありません。
当方、ここ数日でperlを詰め込んでいます。
とほほさんや色々のサイトを見ながらある文章の意味を調べているのですが、

if (/$XX=([^\;]+)\;?/)
{

の意味がさっぱりです。
すみません、どなたかヒントなどをいただければ大変ありがたいです。
>>215
\; -> ;
ヒントなど。
217でふぉな名無しさん:04/04/02 18:42
>>215
1.正規表現を勉強する。
2.だいたい分かったら実際にうごかして確かめてみる。
218デフォルトの名無しさん:04/04/02 22:47
>>217
わかんねーからきいてんじゃんかよ
ばかかおめー
>>212-214
普通このようとならindexじゃない?
>>215
ヒントなど。

「俺→胃袋→宇宙」
>>215
ヒントなど3。

Mハゲ=ベジータ;

>>215=ベジータ
2つのファイルがあって,
1つはid(id.txt)だけの
1
2
3
のようなファイルで,
2つめはidと名前の書いてある(db.txt)データベース
1,田中
2,鈴木
3,山田
があったとき,id.txtの内容をdb.txtを使って,
田中
鈴木
山田
のように置換したいのですが何かいい方法はありますでしょうか?
id.txtを1行ずつ読み込み,db.txtの内容を配列に格納し,
foreach文で配列を回して,idがマッチしたときにidに対応する
名前に置換しようと思ったのですが,名前の配列の取り出し方が
わかりませんでした.
>>222
open DB, '<' . $db_txt or die $!;
my %db;
while (<DB>) {
  /^(\d+),(.+)$/ or next;
  $db{$1} = $2;
}
close DB;

open ID, '<' . $id_txt or die $!;
open TMP, '>' . $tmp_txt or die $!;
while (<ID>) {
  /^(\d+)$/ or next;
  print TMP $db{$1}, "\n";
}
close TMP;
close ID;
rename $tmp_txt => $id_txt or die $!;

この処理を頻繁にやるなら db.txt は予め DBM 等に。
224デフォルトの名無しさん:04/04/03 02:17

ダッセーw
225212:04/04/03 03:13
無事できました!
ありがとうございました!!
226222:04/04/03 03:21
>>223さん

ありがとうございました!
Perlビギナーのため,ハッシュの使い方もわかりませんでしたが,
勉強になりました.
最初にidに対応する名前を配列に設定して,次にidファイルのidに
マッチした配列を書き込むということなんですね.
227デフォルトの名無しさん:04/04/03 06:01
ifって予約語?
m// と //は同じって事でおk?
>>224 そうか?perlらしくていいとおもうけどな
229デフォルトの名無しさん:04/04/03 09:02
>>215
if (/ # 正規表現開始(m/の省略形)
$XX # 変数XXの内容を正規表現の一部として展開
= # イコール文字
([^\;]+) # セミコロン以外の文字の一つ以上の連続
\;? # 任意のセミコロン
/x) # 正規表現中に空白とコメントを含めるためのオプション
{

$XX = 'hoge'; # のとき、
hoge=abcde; # や
hoge=abcde # がマッチする
hoge=; # と
hoge= # はマッチしない
foobar=agadgfaskdjagfasd #は当然マッチしない
# しかし
foobarhoge=abcde;abcde
# でも「hoge=abcde;」の部分がマッチするので、
# 使い方によっては/^$XX=([^\;]+)\;?$/としないと危険かもしれない。
230デフォルトの名無しさん:04/04/03 12:21
んーとね、ここで教えてもらったモジュールで、無事コンペに応募できた。
まさに天からの助けだったよ。
前スレなので、もうどなたかもわからないけど本当に本当にありがとう。

勝ったらまたカキコしまつ。
>>228
224じゃ無いが、ここらへん俺もダサいと思う。
> open DB, '<' . $db_txt or die $!;
> open TMP, '>' . $tmp_txt or die $!;
open DB, "<$db_txt" or die $!;
ってことか?

TMTOWTDI
openに引数を3つで渡すのはいちお安全のためでもあるのだよ
235デフォルトの名無しさん:04/04/03 18:31
@$ref[0][1]はどう解釈すればいいの?
syntax error
237デフォルトの名無しさん:04/04/03 18:54
@{$ref[0]}[1]

{@$ref[0]}[1]
はどう解釈すればいいの?
後者はsyntax error
{} でデリファレンスする場合

スカラ ${ }
配列 @{ }
ハッシュ %{ }
グロブ { }

のようにグロブ以外は { の前にコンテキストを示す記号が入る。

もしグロブをデリファレンスしたかったのなら
perl -e 'use strict; my $ref =[\*STDOUT]; print {@$ref[0]}[1] '
は STDOUT に対して [1] の無名配列の文字表現を出力する。
240デフォルトの名無しさん:04/04/03 22:26
>>238
アフォ
([^\;]+) # セミコロン以外の文字の一つ以上の連続
どうして"意外"なの?
>>239
グロブ(type glob)のデリファレンスは *{ $var } だぞ。

print {FILEHANDLE} (args)
これはグロブをデリファレンスしているわけじゃない。
間接メソッド呼び出し
method {object} (args)
と同じ構文でファイルハンドルを参照しているだけだ。



>>241
まず自分で勉強してこい
最近プログラム始めました。
どーしてもわからないところで詰まってるので、質問させて下さい。
テキストファイル(ハンドル:TXT)に、
1,名前,メール,内容
2,名前,メール,内容
3,名前,メール,内容
ってな感じでデータ保存してまして、
この最後の行の最初の文字から何行分データがあるか数えたいのですが、

open(TXT,"+>> $txtfile");
@txt = <TXT>; #全データを取り込み、
$last_txt=pop(@txt); #最終行の文字列を取り出して、
@words=split(/,/,$last_txt); #文字列を配列に変換し、
$last_id=shift(@words); #last_idを取り込む
push(@txt,$last_txt); #元に戻す
close(TXT);
ってな感じでやってるのに、$last_id=3となりません。
どこがいけないんでしょうか?


245デフォルトの名無しさん:04/04/04 04:14
perl初めて一ヶ月の俺が言うのもなんだけど
テキストファイルの最後に改行が2つないかい?
俺が思うに改行が2つあるため
@txt = ("1...\n","2...\n","3...\n","\n");
って感じになったと思う。
ちなみに
@txt = ('1,名前,メール,内容', '2,名前,メール,内容', '3,名前,メール,内容');
$last_txt=pop(@txt);
@words=split(/,/,$last_txt);
$last_id=shift(@words);
push(@txt,$last_txt);
print $last_id;
で3になった。

漏れの質問だが
コンストラクタってなんだ?
教えてくれ。。。
>>244
何行分のデータがあるかを知るのに、最後の行の最初の項目から得なきゃならん特別な理由があるのか?

無ければ配列の要素数は配列をスカラに代入することで得れる。
$last_id = @txt;
248245:04/04/04 04:49
ていうか
open(TXT,"$txtfile");
print ((split /,/,(@x=<TXT>)[$#x])[0]);
この二行でいいじゃん。
ところで、
<FH>;
って感じに略したら、どの配列変数に代入されてるの?
>>248
一ヶ月にしては上達しすぎ。
ファイルを一気に読んで配列に入れて一気に書き込むとメモリを喰う。
一行ずつ読んで一行ずつ書き出すとヘッド動きまくりでHDDが痛む。

この辺りの取捨選択ってどう言う基準でやってますか。
>250 バッファリングって知ってるか? 1文字ずつ書いてもたいしてかわんねーよ
バッファ・リング【名】

固定長のバッファをリング状に連ねたもの。
一番古いバッファから、新しい書き込みによって破壊されていく。
少ないメモリーで効果が発揮されることが特徴。
現在は、メモリーに余裕があるため使われなくなった。
>>251
さすがに一文字ずつはCPUの無駄使いな余寒
>>253
このあたりはよく釣れますかね?
255でふぉな名無しさん:04/04/04 10:40
>>252 それはリングバッファやろがー(つっこみ)
>>255
ありがとう。
あなたいいひと。
257でふぉな名無しさん:04/04/04 10:52
う、送ってしまった_| ̄|○

>>250
Perlのよーな言語を使うなら気にするな。
そのあたりはOSにまかしとけ。特定環境を想定するもんじゃないし。
メモリがんがん使うと仮想記憶が動いてHDDを動かすわけだし
気にするときりがない。
そもそも最近のHDDはそんなにやわじゃないし、そこまで気にする
よーなでけープログラム書けるようになってから悩め(笑
258244:04/04/04 11:51
プログラム初めて5日と、
一ヶ月では知識&発想がちゃいますね。
ありがとうございました。
246の人もサンキューデス。
配列の要素数を知るっていう配列操作調べたけど、
ないと思ってました。それでいけるんですね。
書き直してみます。
259デフォルトの名無しさん:04/04/04 14:31
$file = <*>
この意味を教えてください
>>259
<*> はカレントディレクトリのファイル一覧(配列)を取得します。
>>259ですが試してみたら、
そのファイル一覧配列の一番先頭のファイル名が代入されました。まる。
肛門
262デフォルトの名無しさん:04/04/04 14:53
上から一行だけ読み込みでは?
webprogのほうで質問すべきかもしれませんが、むこうは人がすくないっぽい
のでこちらで質問させてください。

CGI::Sessionでセッションを使用しようとしてるんですが、セッションデータ
の引継ぎの方法がよくわかりません。
最初に
$session = new CGI::Session("driver::File", $sid, {Directory => $session_dir});
でセッションオブジェクトを生成し、
$session->param("aaa", "v_bbb");
$sid = $session->id();
のようにデータをいれ、セッションIDを取得し、そのIDで新しいセッション
オブジェクトを
$session = new CGI::Session("driver::File", $sid, {Directory => $session_dir});
のように取得しても、そのセッションオブジェクトからは前にいれたデータは
取り出せません。(もちろんセッションデータは指定のフォルダに存在しています)

質問したいのは、セッションデータを引き継ぐ方法として上記のやり方は
正しいのかということと(間違ってるからうまくいかないのだとおもいますが)、
もし間違っているのであれば、どうすればうまくいくかということです。

よろしくお願いします。
お帰りください
>>263
Webプログラミング板に行った方が適切な回答が得られると思うが、
手元で簡単に試した限りではそのやり方で問題ないはず。

% perl -e 'use CGI::Session; $s=new CGI::Session(undef, undef, {Directory=>"/tmp"}); $s->param("aaa", "bbb"); print $s->id(),"\n";'
cbcea6ee8470002e9a3f496fdb8a6c24
% perl -e 'use CGI::Session; $s=new CGI::Session(undef, "cbcea6ee8470002e9a3f496fdb8a6c24", {Directory=>"/tmp"}); print $s->param("aaa"), "\n";'
bbb

どっか別のところで間違えてんじゃねーの?
266263:04/04/04 16:47
もすこし試してみます。
267263:04/04/04 17:07
265さんとまったく同じコードでやってもだめでした。
やっぱりwindowsなのがいけないのかなぁ・・・
268デフォルトの名無しさん:04/04/04 21:58
原因は多分コレだと思う。前ハマったから。

× Directory => "/tmp"
○ Directory => "C:\\tmp"

CGI::Sessionは、Windows上ではバックスラッシュつかわないとダメなのです。

これがあなたの助けになればいいのですが :)
269デフォルトの名無しさん:04/04/04 22:27
@bar=qw(a b c d e);
hoge(\@bar);

sub hoge()
{
my @foo1 = @$_[0];
my @foo2 = @{$_[0]};
}
で@foo2の方が期待した結果を得れるのですが
@foo1と,@foo2ではどう違うのですか?
270デフォルトの名無しさん:04/04/04 22:32
@$_[0];



@{ $_ }[0];

って意味なんじゃね?
271デフォルトの名無しさん:04/04/04 23:33
@{ $_ }[0]; ってどういう意味なのですか?
272245:04/04/05 01:09
>>247
サンクス。

<FH>;
って感じに略したら、どの配列変数に代入されてるの?
しつこい様だが誰か教えれ!
>>244
は大学生と見た!
>>272
たぶんどこにも代入されない
1行飛ばしたい時に使ったりする
空読みって言ったりする
275デフォルトの名無しさん:04/04/05 01:57
@{ $_ }[0]; ってどういう意味なのですか?
>>274
一行飛ばすとは?
277デフォルトの名無しさん:04/04/05 02:06
>>276

274 名前:デフォルトの名無しさん :04/04/05 01:45
>>272
たぶんどこにも代入されない
空読みって言ったりする
>>277,274
アリガト!(´▽`)
>>275
たぶん、配列の1個目の要素をデリファレンス。と思う。

#コンストラクタが理解できねぇ・・・
279デフォルトの名無しさん:04/04/05 02:19
もういいや、やっぱり2chは2chだねw
280デフォルトの名無しさん:04/04/05 02:22
ご指導いただきたいことがあります。

Perlの勉強を始めているのですが、初心者用の本「初めてのCGI&Perl」というを買いました。
しかし、詳しい文法・レファレンス・関数等やPerl独特の省略表現などについての記述が薄く、私にとってとても分かりにくいのです。
またPerlでよく利用されている正規表現についても、知識の薄い私にとって、この本は分かりにくいのです。

よろしければ、Perlについてこれらを満たすことの出来る良書を紹介していただけませんでしょうか。
具体例もあるに越したことは無いのですが、それよりも文法・リファレンス・正規表現について詳しく解説してあるものが欲しいです。
専門書でもかまいませんが、でぉるだけ安価な良書を紹介いただければ更に嬉しく思います。

参考までに私の知識レベルとしては、C、VB、C++、で一般的な業務アプリケーションが作成できるレベルです。
利用形態としては、CGIとローカルでのログ整理のスクリプト処理・データベースのローカル更新などを検討してます。

識者の皆様本当によろしくご指導くださいませ。
282デフォルトの名無しさん:04/04/05 03:06
テキストの中に

name = "hoge1" value ="hoge"
name = "hoge2" value =1230

などを

while (m/name=\"(.*?)\".*value=(.*?)(\ |>)/g)
{
%data = (%data,$1 => $2);
}

と連想配列に入力するのですが""で囲まれた要素は""まで入力されてしまいます。
これから""を除くにはどうしたら良いでしょうか?
s /\"//s;とかすると要素に文字列にダブルクォーテーションが入った時に
期待どおりに結果が出ないので困っています。

どうかご教授を。
>>282
s/\"(.*)\"(?=.?value)/\1/g;s/value.?=.?\"(.*)\"$/\1/;
>>275
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perllol.html

>>281
>>4

>>282
$data{$4} = $8 while /
  name \s* = \s*
    (?:
      (")
    |  (')
    |  (\b)
    )
    (.*?)
    (?(1)")
    (?(2)')
    (?(3)\s)
  \s*
  value \s* = \s*
    (?:
      (")
    |  (')
    |  (\b)
    )
    (.*?)
    (?(5)")
    (?(6)')
    (?(7)(?:\s|$))
/gx;
285282:04/04/05 10:44
>>283
>>284
ありがとうございます。
>>282
そのテキストファイルって、
 hoge1 = "hoge"
 hoge2 = 1230
とかじゃだめなの? name とか value とか冗長じゃね?

あと >>282のコードを、 %data = (%data, eval($1) => eval($2) ); とするのではだめ?
name = "hoge1" value ='hoge' x 10
name = "hoge2" value =1230 * 10
とかも書けるよ。危険だけど
287250:04/04/05 16:41
あまり気にしないことにしました。

>>257
プログラムはでかくないけど読むファイルは数千行〜一万行くらいあるっす(´・ω・`)
まあサイズ自体は1M〜5Mくらいだけどアクセス結構あるので……。
#念のため言うと共有鯖では無く専用サーバっす。
#分割駄目・生テキストファイルでやってくれと言う謎の制約ががが。
perlの置換及び正規表現についての質問です。
「test,hoge1,testtest,hoge1,hoge1,hoge2,test」
という文字列があった場合、2番目に出てくるhoge1や最後に出てくるhoge1のみを
検出、置換する場合はどうすれば良いのでしょうか?

上のデータを用いて「2番目に出てくるhoge1をhoge3にする」場合の期待値
「test,hoge1,testtest,hoge3,hoge1,hoge2,test」

文字をsubstrで切り刻みながら置換するのではなく、正規表現で綺麗に一発で
出来そうな気がしないでもないのですが、どうやったらよいのか分かりません。
何か良い方法があれば教えてください。
宜しくお願いします。
289デフォルトの名無しさん:04/04/05 20:42
s/^(.*?hoge1.*?)hoge1/\1hoge3/
>>287
一気読みダメ、1行ずつダメ
んじゃ間とって数十行ずつやれば?w
292デフォルトの名無しさん:04/04/06 10:48
PerlってOOPができるんですよね?
ちょっとgoogleで検索してみましたが、どうもnamespaceといったキーワードがないです。
Perlでオブジェクト指向プログラミングをするとどんな感じになるんですか?
293288:04/04/06 11:57
>>289
ありがとうございます。
最初は何故これで行くのかが分からなかったのですが

(.*?hoge1.*?)hoge1
が「前後に何か文字がある可能性があるhoge1とその後ろにあるhoge1」

\1hoge3
が「\1は最初の括弧の内容をそのまま、その後ろはhoge3に」

ということで良いんでしょうか?
$data =~ s/^(.*?hoge1.*?)(.*?hoge1.*?)hoge1/\1\2hoge3/;
で3番目のhoge1が置換されるから、こういう解釈であってると思うのですけど・・・
>>293
.*?と.*の違いを理解しよう。キーワードは最短マッチと最長マッチ。
295デフォルトの名無しさん:04/04/06 13:34
>>294
答えじゃん!
>292
クラスはpackage に過ぎない。オブジェクトはblessされた物に過ぎない。
でnamespaceとOOPってなにか関係あるの? packageでじゅーぶんじゃん
>>282
こんなのは?

# conf_file
$data = {
hoge1 => 'hoge',
hoge2 => 1230,
};

package main;
do('conf_file');
print $data->{hoge1}; # hoge
print $data->{hoge2}; # 1230
>>298
細かいツッコミだが

#--- conf_file ---
my $foo = 'hoge'; # 識別子 foo は script から見えない (見せない)
{
hoge1 => $foo,
hoge2 => 1230,
};

#--- script ---
#!/usr/bin/perl
use strict;
my $bar = do './conf_file' or die; # 謎の変数をいきなり出現させない
print $bar->{'hoge1'}; # hoge
print $bar->{'hoge2'}; # 1230
__END__
300288:04/04/06 19:28
>>294
>>295
>>297
?の有無の差でなにがどうなるか分かりました。
>>297さんに教えていただいた先の情報は正直まだ理解できてるとはいえませんが
頑張って読んでます。
ありがとうございました。
>>282
yet another.
パース方法に悩むならXMLも一興。

# hoge.xml
<hoge1>hoge</hoge1>
<hoge2>1230</hoge2>

use XML::Simple;
my $xml = XMLin('hoge.xml');
my $hoge1 = $xml->{hoge1};
my $hoge2 = $xml->{hoge2};
302デフォルトの名無しさん:04/04/06 22:09

XMLの使い方を勉強しなおせ、ばか
303デフォルトの名無しさん:04/04/06 22:12
$mname =~/([\s\S]*)\./;
これは何をやってるのか教えておくれ
>301
ルートエレメントが2つあっちゃダメだろ
データ構造も変だし。属性使え
>>301
うーん、なんとなく >>282 はもともとからXMLのような気がしてきた。
<hoge name=namae value=aaa />
↑こういうデータから抽出したいのかも。
メル欄がのこってた(w

>>303
\s : 「空白」一文字とマッチする正規表現演算子
\S :「空白以外」の一文字とマッチする正規表現演算子
\. : ドットにマッチ。

よって $mname =~/([\s\S]*)\./; は、
「空白と空白以外の続きで、最後がドット」の文字列にマッチする。
つまり、わからん。何がしたいんだ?
/^(.)\1+$/

この意味を教えてください
308でふぉな名無しさん:04/04/06 22:35
>>281
もう定番だがEffective Perlなぞはどうだろう。
既にプログラミングの素養はあるわけだし、281に必要なのは
この本の趣旨である「Perlらしいプログラミング作法」とか
そのためのよりつっこんだ文法(トークン)への考察ではと推察する。
私もCあがりなのでなんかCっぽい記述になりがちで面白くない。
で、この本で改めて理解を深めている最中だ。ちなみに\2800
309263:04/04/06 22:38
原因が判明したので一応報告です。

最初のセッションオブジェクトをファイルに保存するより早く二個めの
セッションオブジェクトが作成されていたので、最初のセッションオブジェクト
で生成したセッションIDが結果的に見つからず、新たなセッションオブジェクト
を生成していました。
310でふぉな名無しさん:04/04/06 22:47
>>287
なんだ、いまどきたった数Mbyteなら気にするな。
その程度メモリに常駐しているプログラムなんてごろごろいるだろ。
キャッシュとかバッファリングとか仮想記憶とかそんなあたりで
ちょっとOSのファイルやメモリ管理論をかじれば全然気にならなくなる。
すれ違いになるんでこんぐらいで止めとく。
>>307
^ : 文字の先頭から検索
(.) : () は見なかったことにして、 . は何らかの文字 1文字。
\1: 直前の() 内で囲まれた正規表現にマッチ。した文字列
+ : 直前の正規表現が一回以上繰り返している場合マッチ。
$ : 文字列の最後

よって、「文字列の先頭から、1文字以上の何らかの同じ文字が文字列の終端まで続いている」文字列にマッチする。
つまり、なにがしたいんだ?
312デフォルトの名無しさん:04/04/06 23:24
$ : 文字列の最後
ってなんですか?
>>307
連番トリップを検索する時に使う正規表現。
^ は行頭
$ は行末 だぜよ
315デフォルトの名無しさん:04/04/07 01:50
じゃあ、
$hoge="bc";
$hoge=~s/^/a/;
print $hoge
はどんな結果でしょうか?
>>315
正規表現道場@2ch Part3 s/煽り|荒らし/あぼーん/g
http://pc5.2ch.net/test/read.cgi/php/1069245758/l50
317デフォルトの名無しさん:04/04/07 14:21
サブルーチンの局所化はどうすれば良いのでしょうか?
>>317
package
319デフォルトの名無しさん:04/04/07 14:40
Net::SMTP を使ってformメールを使っていたのですが、
新たにサーバを移転し、SMTP認証が必要になったため

my $smtp = Net::SMTP->new('smtp_server');
$smtp->auth( $smtp_username, $smtp_password );

とauthの一行を追加したのですが全く送ってくれません。
perldoc.jpでは、

auth ( USERNAME, PASSWORD )
SASL認証を試みます。

とありますがSASL認証とSMTP認証って違うのでしょうか。
perldoc.jpにはSMTP認証についての記載はありませんでした。
モジュールの使い方とか
翻訳してあるいいページありませんか?
322デフォルトの名無しさん:04/04/07 15:07
>>318
localで*xxxの時、サブルーチンも局所化されてないのですか?
323デフォルトの名無しさん:04/04/07 15:08
>>321
どうも。助かりますた。
324デフォルトの名無しさん:04/04/07 15:28
>>322
それは型グロブの局所化。
なぜmyで出来ないのかは疑問。
325319:04/04/07 15:56
>>319
あきらめてsendmail使おうと思いまして、

use Mail::Mailer;
$sendmail = '/usr/sbin/sendmail';
my $mailer = Mail::Mailer->new("$sendmail");

としたのですが、
syntax error at (eval 21) line 1, near "require Mail::Mailer::/usr/s"

と、おこられました。

Sends mail using any of the built-in methods.
You can alter the behaviour of a method by passing $command to the new method.
sendmail
Use the sendmail program to deliver the mail. $command is the path to sendmail.

perldocで読みましたが、僕には
sendmailへのパスをnew methodに渡せ、と読めるんですが。。
何か勘違いしてますか?
sub add {
local($x, $y) = @_;
return $x + $y;
}
  このプログラムの意味を教えてください!!
>>326
僕ちんはそんな釣りには引っかからないよーーーぺっぺっぺっ""
>>326
…ここに聞く前に、なんか初心者本でも買えば?
>>325
第一引数はメールクラスのタイプ。sendmail, qmail等。
第二引数以降にsendmailのパス等を指定する。
>>325
なんだかとってもわかりにくいマニュアルだが、SYNOPSYSに

$mailer = new Mail::Mailer $type, @args;

とあってあとの方のARGUMENTSってとこに

"new" can optionally be given a $command and $type. $type is one
"sendmail", "mail", ... given above. The meaning of $command depends
on $type.

と書いてあるのでなんとなく

my $mailer = Mail::Mailer->new('sendmail', "$sendmail");

とやれって意味じゃないかと思う。試してないのではずしてたらスマソ。



open(IN,"a.txt");
$a = <IN>;
$frg = &Sub_a($a);

print "$frg\n";
close(IN);

sub Sub_a{
$frg2=False;
if(@_ eq "a"){
$frg2=True;
}
return $frg2;
}
------------------------------------
>cat a.txt
>a
------------------------------------
なぜか上手くいきません〜。。。
すみませんが、ヒントください!

332デフォルトの名無しさん:04/04/08 11:43
perlでプログラム組んでる奴バカじゃね〜の?
>>331

open(IN,"a.txt");
$a = <IN>;
chomp $a; # 改行があれば改行を削る
$frg = &Sub_a($a);

print "$frg\n";
close(IN);

sub Sub_a{
$frg2=False; # 通るけど、引用符で括った方が安全だよ
if($_[0] eq "a"){ # ここが一番問題。スカラーとリストのちがいに注意
$frg2=True; # 通るけど、引用符で括った方が安全だよ
}
return $frg2;
}
334325:04/04/08 12:22
>>329
>>330
あ、なるほど。
早速やってみます。
ありがとうございました。
335デフォルトの名無しさん:04/04/08 21:52
$array[0] = (10, 20, 30, 40); #?
print "$array[0][1]"; # 20

こんな感じに二次元配列を宣言したいのですが、どうもうまくいきません。
337デフォルトの名無しさん:04/04/08 23:00
$array[0] = [10, 20, 30, 40];
>>287
1.データファイルについてMD5やstat()などでハッシュを取り別ファイルに保存する
2.データファイルについて、indexを作成しファイルに保存(行毎に探索するのではなくseekで飛べるように)
3.もしデータファイルに改変があってもハッシュとの整合性で検出できる。改変があったらハッシュとindexデータを再生成

っつー感じではどうか。
「perlではsegmentation faultやスタック破壊は起きない」は真でしょうか?
ただし、処理系や他言語で記述したモジュールのバグに起因するもの
とsyscallの不適切な使用によるものは除くとします。
>>339
Perlに限らずあらゆるアプリケーションにおいてそうなんだが、「100%ない」とは言い切れない。
ただ、俺自身は今まで3年以上Perlをいじっているが、単体のPerlでSEGVったことはない。
341デフォルトの名無しさん:04/04/09 15:27
lacal (*in) = @_;
の意味がわかりません。
初めはlacal (*in) = \@_;のミスだと思っていたのですか、そうじゃないみたいです。
>>341
呼ぶ側が

foo(*X);

となっていたら、そうやって受けるのは自然だと思うが?
>>342
サンクス!
型グロブを引数として渡すのは頭に無かったです。
344デフォルトの名無しさん:04/04/09 15:38
こんなクソ言語やめてrubyにしろよ
345*:04/04/09 19:33
「Perl書法」(増井俊之 著)という本を見つけ、ASCIIから
anonymous ftpからソースをダウンロードしようと思ったが
10年前の情報だったので手に入らなかった
誰かソースコードを持っている人はいませんか?
>>345
著者に直接聞いたら?
347デフォルトの名無しさん:04/04/09 19:47
文字列から2文字づつ取り出したいんだけど
スマートな方法はありますか?

$str="abcdef";
for $x (split(/(..)/g,$str)) {
print "$x\n";
}

ってやっても、ひとつおきに null が混ざるんだけど。
substr使うのが普通なのかな。
いろいろあるけど、正規表現にこだわるなら
$str="abcdef";
for $x ($str =~ /(..)/g) {
print "$x\n";
}
split について誤解があるみたいだから、
perldoc -f split
もしといてね。
349347:04/04/09 20:26
>>348
すばらしいです!
split(//,$str) とかで1文字づつ取り出せたんで
誤解してました。勉強します。
> for $x ($str =~ /(..)/g) {
おおおおっ、正規表現オプション g の素敵な使い方ですね。
351デフォルトの名無しさん:04/04/09 22:49
$str="abcdef";for ($str=~/(..)/g){print "$_\n"}
$str="abcdef";for (split(/(..)/g,$str)){print "$_\n"}
これの出力結果が違うのはどうしてですか?下のものには
余計な空の行が入ってしまうように思います。
CGIの方に書くべきか迷ったんですが、こちらに書かせていただきます。
Perlで、メッセンジャーが起動されているかどうかチェックすることって可能ですか?
オンラインゲームの不正にメッセンジャーが使われることを回避したいのです。
>>353
可能でしょう。 でも、あなたの言ってるオンラインゲームがCGIゲームなんだったら、結構面倒かも。
でも、メッセ側でオンライン状態を通知しないとかされたらムリか。

>オンラインゲームの不正にメッセンジャーが使われることを回避したいのです。
ネトゲでメッセの使用を規制するって正気の沙汰とは思えないですがね。
そもそもやろうと思えばメッセンジャーじゃなくても通信手段は
いくらでもあるわけで、あまり気にしない方がいいんじゃ?
変数やファイルハンドルの名前について 命名規則or慣習ってありますか?
変数名については man perlstyle するべし。

ファイルハンドルは IO::File を使えば名前なんか考えなくていい。
STDINからの入力を受けたいんですが、
よくあるパスワードを入力する時のようにユーザのターミナル上に出力される文字を*に変換する方法を教えてください。
>>358
ハァー?
HTML勉強しなおせ
Perlで例外処理ってどうしますか?
dieだと catchできませんしね
Errorモジュールなるものがあるらしいですが、
アレを使ったほうがいいですか
>>360
いや、シェル上での話です。HTML勉強すればtemcapでも読めるようになりますか?プゲラ
いちお、質問者なんだから見当違いの回答者がいても
「プゲラ」とか煽るのは禁句だと思うぞ
use Term::ReadKey;
>361 exit,die は eval で捕捉できる。
>>363
ごめんなさい。
グーグルでもう一回探しなおしてきます。
>>365
>C:\>perldoc eval
>No documentation found for "eval".

よくわからなかったのでぐぐったのですが、よくわからないので
もう少し教えてください。

try { /*例外を投げたいような処理→*/ throw new NullPointerException; }
catch (Exception e){ /*例外処理*/ }
みたいなコードは

eval { #例外が起こるかもしれない処理、例えばゼロ除算
}
if($@){ #例外処理
}

って書けばいいわけですか?

簡単といえば簡単ですが、難しいといえば難しいですね。
気軽に使っても問題ないのかな
perlfunc の中だろ。 問題ないよ。
>>367,>>369
ガッ

このスレでぬるぽみるとは思わなかった・・・
370デフォルトの名無しさん:04/04/10 22:53
>>367
気軽に使っていいよ。ほんの少しだけ遅くなるけど。
ちなみに、try-catchに馴染んじゃった人、例外に型が無いと抵抗がある人は、

http://search.cpan.org/~uarun/Error-0.15/Error.pm
とかもある。
>>368-370
どうもありがと。try-catchが大好きというわけじゃないので、
必要な場面でどんどん使って生きたいと思います。
ただ、catch(char* e){} catch(int e){} みたいに型で処理を分けられないみたいなので、
必要になったときはerror.pmのお世話にならせてもらいます。
実際には例外もそんなに出番が無いかもしれないけど。
open() or hoge();とか、ゼロ除算の場合でも$x = $a / $b unless($b);ってしたほうが楽かもしれない
__WARN__
__ヽ(`Д´)ノ__
ppmを実行しようとすると下記の様なエラーが発生するのですがどうしたらよいのでしょうか?
Error: neither 'HKEY_LOCAL_MACHINE/SOFTWARE/ActiveState/PPM//InstallLocation'nor
'HKEY_CURRENT_USER/SOFTWARE/ActiveState/PPM/InstallLocation'found in registry at
C:\Perl\bin\ppm.bat line 29.
と表示されてしまいます。何回かインストールしなおしてもこの様な状況で
ActivePerl-5.8.0.806-MSWin32-x86を使用しています OSはXPです
少々スレ違いかも知れませんがよろしくお願いします
>>374
build 809にupdate汁
デコードするときの質問なんですが

$value =~ s/</</g; <と>はタグ拒否だとおもうんですが
$value =~ s/>/>/g;  "と&を置き換えるのはなんでですか? 
$value =~ s/"/"/g;
$value =~ s/&/&/g;
htmlの仕様による。
ちなみに、君の書き込みで、変換前と変換後の文字が同じに
なってまつよ。
&& &>とか書かないとね。
<pre>&</pre>
ちなみに&ほげほげは他にもたくさんあるので、HTML::Entities
使うほうが楽だと思われる。
&amp;
381デフォルトの名無しさん:04/04/11 10:57
>>376
最も大きな理由は、置き換えないと悪い人に利用されるから。
Googleで「XSS 脆弱性」を検索してみることをオススメする。

手抜きすると「致命的不具合」扱いになって、情報処理推進機構様がやってきますよ(w
>>375
解決しました。本当に感謝してます ありがとうございました
何故2chはperlで作られてるの?
phpとか、jspとかに移行する気はないの?
歴史的経緯だ。
もとはサーバ会社がサーバの宣伝に提供してたから、その会社の許可してる一般的な構成でないといけなかった。
php?jsp? 2chが移行するならCだと思う。
read.cgiはCになってなかったっけか。
bbs.cgiは一部の鯖で
perlccでバイナリになってたりする
ttp://espion.s7.xrea.com/diary/20040122.html#p01

perlcc よりもSpeedyCGIのが早い。


一番のネックはプロセス起動のコストなのよ
やっぱここはmod_perlで
mod_perl面倒だからいらねー。apacheとperlのコンパイルオプションあわせないといけないし。
httpdのプロセスサイズもmod_perlだと難。SpeedyCGIならスクリプトごとに最大バックエンド数設定できるし。
irc.2ch.netはSpeedyCGI使ってるね。NTさんの日記にかいてた。
板違い。WebProg板に逝け。
今ライブラリ作ってて そこからファイルを読み込みたいんですが、
このときのファイルパスってライブラリの呼び出し元からのパスになりますよね
これをライブラリからのパスにしたいんですが どうすればいいでしょうか
>394 @INCを順にたどってライブラリのファイルを検索、見つかったパスを使う
396394:04/04/12 23:25
>>395
呼び出し元で @INC にパスを追加して
ライブラリ側で検索して使う
ってことですか?

@INC に追加するのが何となく気持ち悪い感じだけど
呼び出し先でもできるだろ
398394:04/04/12 23:46
任意の場所から呼び出したいし、 CGI で使おうと思ってるんで絶対パスでの記述も嫌だなぁと
>>394
ライブラリのパスに依存という仕様自体が激しく気持ち悪いが、

#--- Foo/Bar.pm ---
package Foo::Bar;
use Cwd 'cwd';

my $my_path;
while ($my_path = each %INC) {
  $my_path =~ s|(?<=Foo/)Bar\.pm$|| or next;
  $my_path = cwd . "/$my_path" unless $my_path =~ m|^(?:[A-Z]:)?/|;
  last;
}
print "$my_path\n";

#--- script ---
#!/usr/bin/perl
use Foo::Bar;
__END__
毎月発売の刊行物を、発売日に忘れず書店へ購入に行くするように、
リマインダーみたいにその日にメールで通知してくれるような簡単
なスクリプトを cron で実行させたいと思っているのですが、ドシ
ロートなのでうまく動いてくれません。どこがマズイのか教えてい
ただけるとありがたいのですが。
------------------------------------------------------------------------------
#!/usr/bin/perl

$sendmail = "/bin/mail";
$mailto = "myaddress¥@example.com";
$subject = "Don't forget to get NHK textbook¥ !";
$body = "今日はNHK語学講座テキストの発売日です。¥n忘れず書店へ行って購入するように¥!";

$commandline = "$sendmail -s $subject -t $mailto ";

exec $commandline;
------------------------------------------------------------------------------
試しにコマンドラインから上記スクリプトを実行すると、以下のような
エラーが出ます。
------------------------------------------------------------------------------
sh: -c: line 1: unexpected EOF while looking for matching `''
sh: -c: line 2: syntax error: unexpected end of file
------------------------------------------------------------------------------
一行目には`なんて打ってないのでエラーの意味が分かりません。

## ちなみに、この場合のエラーメッセージが伝えるところの
##「一行目」というのは、スクリプト中の $sendmail = "/bin/mail";
## の行を指すのですよね?そこからして間違ってますか?

環境は Redhat8 です。Perl は上記の通り、/usr/bin/perl
>>400
とりあえず、smtpをtelnetで体験してみると良いかもですよ:-p

.
>>402
ちうか、HTTP SMTP POP3 IRC あたりは
telnet叩いて手で喋れないと、漢ならば!

いったんプロトコルを理解してから各モジュールを使えば
ぐっと理解は深まるし、何かあったときの解決も早い。
>>400
つーか、\を エンマーク¥(&yen;)にしている時点でネタ ケテーイ
$@を気にせずeval()/eval{}するモジュール大杉
autouse, List::Util, Scalar::Util お前らの所為で小一時間ほど悩んじまったじゃねーか
405400:04/04/13 21:09
ありがとうございます。

>>401,402

んー、「 smtp を telnet で体験してみる」というのは、
つまり、コマンドラインから mail の送信をやってみる、
というような意味でしょうか?もしそういう意味なので
あれば、ウチのサーバ(上述のRedhat機)では telnet
を通さないようにしているので、代わりに ssh でのセッ
ションで、同等のことを何度かチェックしているのです
が.....つまり、その時(=ssh セッション中での mail コ
マンドでメールの送信をやってみたりすること)に、対
話式にコマンドが聞いてくる部分がスクリプトに盛り込
まれていないと、こっちが「返事」をしたことにならな
い、というような理解でよいのでしょうか?しかしもし
そうだとすると自分が書くにはちょっと荷が重いです。

>>403

んー、ネタではないつもりなのですが.....。\(←全角)
って、ここでは¥になっちゃいますよね?違うのかな?
Tk日本語乳力まずいな。
JPEGもうつらんし(window ,active perl 5.8)
TCL/TKにGUIは乾杯してる。。。
でもTCLは気持ち悪いしな
407でふぉな名無しさん:04/04/13 22:11
>>400
ってゆうかさ、
shellから
/bin/mail -s Don't forget to get NHK textbook¥ ! -t myaddress¥@example.com
って打ってちゃんと動くか?動かないだろ。
そのスクリプトの exec $commandline; ってこれをやろうとさせてるんだよ?
で、これみればエラーメッセージの意味、理解できないかい?
ま、Perl云々以前の問題だな。

print $commandline;
で何を実行させようとしてるのか、ちゃんと確認してからexec なりしてやれよ。
401 に答えが出ている気がするんですけれど。。。

.
409400,405:04/04/13 23:31
>>407
ありがとうございます。

https://www.stackasterisk.jp/tech/program/perl03_03.jsp
の猿真似で、以下のスクリプトにて送信できるようになりました。

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

$from = "myusername¥@mydomain";
$to = "myaddress¥@example.com";

open MAIL, "|nkf -j -mO| /usr/sbin/sendmail -f $from -t $to";

print MAIL "From: Schedule Reminder <$from>¥n";
print MAIL "Subject: Don¥'t forget to get textbook¥!¥n";
print MAIL "To: $to¥n";
print MAIL "¥n";
print MAIL "今日はNHK語学講座テキストの発売日です。¥n";
print MAIL "忘れず書店へ行って購入するように!¥n";

close MAIL;
---------------------------------------------------------

で、目的のものは得られたのこれで良しと言えばそうなのですが、
当初の自分がやろうとしていた >>400 の書式とは違うので気持
ちが悪いというか、これではまったく勉強になりません。
410400,405,409:04/04/13 23:31
## 「改行が多すぎる」だの、それで改行を詰めたら
## 今度は「長すぎる行がある」だの言われて跳ねら
れるので分割しました。

確かに、今回の丸写しスクリプトは、書いてみればまぁなんとな
く納得は行くのですが、しかしいつまでも丸写しをしている限り、
ちょっとした応用も利きそうにありません。

>>400 のダメな例では、まずbodyが挿入されないのはダメダメと
して、次に、-s $subject の状態だと、>>400 の例に挙げている
ような定型 subject では、途中にスペースがあるので、最低でも
-s ¥"$subject¥" のようにしてやらねばならないこと、までは分か
りました。

しかし >>400 を叩き台にした場合、文字コードを変換するプロセス
をどこに噛ませてやればいいのかが分かりませんでした。そもそも
>>400 の書式では、どのように修正してもまったく見込みがないの
でしょうか?
>>410
man sendmail
自作のCGIを、ソース改変できない状態(二次使用できない状態)にしてサーバーに置いておきたいのですが、
何かいい方法はないでしょうか?
413デフォルトの名無しさん:04/04/14 07:24
すいません、掲示板を作ったんですがどなたか
いろいろな機能を作るのを手伝ってくれませんか?
私はHTMLを勉強しているのですがperlも覚えたいと思っています
暇な時でもいいので掲示板のお手伝いをしてくれませんか?
http://windows.s56.xrea.com/ウザかったら普通にスルーしてください
すいません、ageてしまいました・・・
415デフォルトの名無しさん:04/04/14 09:46
CGIの話題はWebprog板へ
サイト作りの話題はWEB制作板へ
ここはPerlに関する質問や雑談などをするスレです。
416遙皇 ◆HEHARUKAoo :04/04/14 11:14
int64使ってるスクリプトってperlcc通らないんですね。
Segmentation faultが出てビクーリしますた。
417401:04/04/14 18:07
>>405
完全にperlの話ではありませんが乗りかかった船なので、、

> コマンドラインから mail の送信をやってみる、というような意味

まさしくその通り。

> ウチのサーバでは telnet を通さないようにしているので、

あーちとズレてますね。そー言う事じゃないんですよ。
何も考えず「smtp telnet」でググって下さい。
んで出てきたサイトを片っ端から開いて読んで下さい。
貴方のやろうとしている事の根本はソレです。
どんな事でもまずは根本を理解するのが近道ですよ。

# 全てを理解したならば、私が >>401 で書いた事もきっとわかるはず。

.
>>417
MAIL FROM: 408
RCPT TO: 417
DATA
こういう風に書いてあげるとよいかもですね。(わ

.
250 OK
みなさん、結構SMTPの生通信やってるんですね
俺も勉強せねば。メールはちょとやってみたい。
420402:04/04/15 00:53
漏れのばやいは、本業がケータイ公式サイト鯖立て
その他社内鯖管理とかやってるんで
どーしても3〜5層には詳しくならざるを得ない罠






もちろん8層は苦手だ orz
>>412
Storable.pmを使ってデータをfreeze→ファイルに保存
freezeされたプログラムを実行する単なるローダだけをCGIで記述
>>421
DocumentRoot の外に置けば済むような。。。
$msg = "<hr>\n"
. "<div class=header>\n"
. "<span class=name>$FORM{'NAME'}</span>\n"
. "<span class=time>$time</span>\n"
. "</div>\n"
. "<div class=mesg>$FORM{'MESG'}</div>\n";

    この.の意味ってなんですか?

>>423
文字列を連結する演算子。Perlは型がいい加減な言語なので、数値と文字列で
加算/連結の演算子を分けないと混乱するとかしないとからしいYO。
>>424ありがとうございました
426デフォルトの名無しさん:04/04/15 14:55
$| って出力をバッファリングしないものと本に書いてあるのですが、
何の役に立つのですか?
画面表示が速くなるだけ?
>>426 例題。
perl -e '$|=1;for(0..4,"\n",5..9){print;sleep 1;}' < /dev/null

非バッファリングはスループット的に見るとむしろ遅くなるが、
上記例題を見れば、どういう場面で必要かわかるだろう。
428デフォルトの名無しさん:04/04/15 15:47
>>427
有り難うございます。ある問題を抱えてまして、どうやら$|=1が原因らしいと
いうところまでは分かったのですが、$|=1 の意味を正確に理解していなかった
為に質問させていただきました。あの例題で動きがよく理解出来ました。有り難
うございました。

最初の"ある問題"も質問しようと思ったのですが、もう少し調べて見ようと思います。
解決できなかったらまたお願いします(>_<)
429デフォルトの名無しさん:04/04/15 19:21
以下のようにcgiで動かしているのですが、httpヘッダがそのまま表示
されてしまいます。

#!/usr/bin/perl
$| = 1;
print "Content-type: text/html\n";
print "Pragma: no-cache\n\n";
print "<html>test</html>";

-----------------------------------
tcpをダンプしたらこんな感じでした。ヘッダとして出しているつもりが本文となってしまっています。

HTTP/1.1 200 OK
Date: Thu, 15 Apr 2004 10:20:52 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=EUC-JP

18
Content-type: text/html

12
Pragma: no-cache


11
<html>test</html>
0
-----------------------------------
$| = 1; を外すと正常に動きます。何故なのでしょうか?
(apache2です)
>429

Transfer-Encoding: chunked

を調べろ。 君の悩みは HTTP RFCの範囲だ。
>>429
chunked coding 云々の話になるので
Webprog板へ逝け、と云いたいトコロなのだが

とりあえず $| = 1; を、ヘッダを吐いた直後にはさんでごらん?
というか \n\n じゃなくて \r\n\r\n だろ
>>432
\x0D\x0A\x0D\x0A だろ
434デフォルトの名無しさん:04/04/16 03:24
open(OUT, ">file.txt");
print OUT "hoge";
flock(OUT, 2);
close(OUT);
これでhoge書き込み中の、読み書きは防げますか?(全てのプログラムにflock使用してます。)
ちょと待ってくれ。>>429
「18 や 12 や 11 や 0 みたいな謎の数字は何?」と訊いているんじゃなくて
>>429 が HTTP ヘッダのつもりで出力したの文字列が,メッセージボディの方に
 来ちゃったのはなんで?」と訊いているように見えるけど,
それでもやっぱりチャンク形式エンコーディングの話題になるの?

つーかごめん。漏れも >>429 の悩みには答えられないわけだが。
436デフォルトの名無しさん:04/04/16 04:47
>>435
そんなことより>>434に答えてくれませんか?
防げません
>435
apache2は知らんけど ネットワーク関係のプログラムで安易に \n を使うのはやめれ。
\nが指すものは環境によって変わる。 http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
HTTPメッセージヘッダの改行は \n ではなくて \x0d\x0a (CRLF) だ。
もしこれで直るならHTTPの範囲だし、apache関係のスレで調べた方がいいよ
このスレで>>1を読んでから質問する人いるのかな
440デフォルトの名無しさん:04/04/16 08:13
open(OUT, ">file.txt");
print OUT "hoge";
flock(OUT, 2);
close(OUT);

open(OUT, ">file.txt");
flock(OUT, 2);
print OUT "hoge";
close(OUT);
と同様。
441デフォルトの名無しさん:04/04/16 10:44
>>430-433,435,438,435,439
有り難うございます。
実際私が疑問だったのは、$|=1; を書くのと書かないのとでなぜ
こんな違いが出るのかが知りたかったのですが、apacheの機能と
関係があるようですね。
気軽に$|=1;とするのは止めるようにします。何故こうなるのか
をご存知の方がいないかなと思ったのですが。

あと、純粋なperlを聞くこの板でcgiの事を聞いてしまい失礼しました。
442デフォルトの名無しさん:04/04/16 11:41
441はここの住人に失望したようだ。
つーかみんな、誰が誰だか混乱してるな(;´Д`)
444デフォルトの名無しさん:04/04/16 21:10
ウチで使ってるapacheは1.3.29だけど、440のプログラムで

HTTP/1.1 200 OK
Date: Fri, 16 Apr 2004 12:01:17 GMT
Server: Apache/1.3.29 (Debian GNU/Linux) mod_fastcgi/2.4.0 DAV/1.0.3
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

11
<html>test</html>
0


という結果になる。なのでapacheのせいのような気がするんだよな。
$|=1だと各print毎にwriteシステムコールが呼ばれるが、$|=0だと
バッファされて全部が一気に一回のwriteでかかれると思うので
その辺の違いでapacheのバグでも踏んでるじゃないかと。

ファイルの入出力についての質問です。
sub tsu{
 $i=0;
 open(IN, "data.txt")||die"data.txtをオープンできません:$!\n";
 while($guho=<IN>){
  $xml1[$i]=$guho;
  $i+=1;
 }
 close(IN);
以下略

というようなサブルーチンを作ったのですが、Jperlで実行したところ、
data.txtをオープンできません:No such file or directory
とでてくるんですが、文法ミスでしょうか?わかりません。
あ、data.txtはちゃんとこの.plファイルのあるフォルダに存在します。
>>445
スペースがないのが気になる。
open IN, "data.txt" or die "data.txtをオープンできません:$!\n";

my する気がないのなら、、、
1 while push @xml1,<IN>;
>>446
@xml1 = <IN>;
プログラムに問題はないと思う、ファイルのパーミッションは?
ついでに
sub tsu {
$i = 0;
open IN,"data.txt" or die "$!\n";
while ($guho = <IN>) {
$xml1[$i] = $guho;
$i++;
}
close IN;
}
って書け、見にくい。
全角スペース使うな。
ここにこれ置いておきますね(AA略

&nbsp;
450445:04/04/17 00:46
ありがとうございます。家のPCだとうまくうごかせました。
う〜ん、どうなってるんだ。現在調査中^^;
451433 ◆60FZTwCTrE :04/04/17 03:21
>>429
ちょっと考えてみた。
$| = 1; ってのは、selectとかしてないんだったら
STDOUTのバッファリングを止める(=本来ブロックされるべき読み込み処理も、
行末などを待たず即座にreturnする)
という命令になるので、>>429の例では次のような感じか?

1.「$|=1;」した時点で、Apache側がCGIのSTDOUTをバッファしなくなり
  ソケットデータ読み込みからreturnする
2.不意にreturnしてしまい(このあたりがバグなのか?)
  Apacheはヘッダ読み込みが終わったと勘違いして、デフォルトのヘッダを出力
3.次のデータからは、本文扱いになってしまう
4.ちなみに、「18」「12」「11」と3分割されてしまうのは、print文の数による。
  1つのprint文で出力した場合は分割されないはず

間違っていたらスマソ
452433 ◆60FZTwCTrE :04/04/17 03:22
すまそ、>>451の訂正
誤 ソケットデータ
正 STDOUTストリームデータ
>451
スレ違いだけどレスしとくな。
パイプって知ってるか?なんでCGI側の内部のバッファ動作いじるだけでapache側のreadが中断されるんだよ?
apache2で問題なのはread後のバッファ内容検査の部分だと思うが…

あと、CGIで$|をいじるってことは当然 nph- だよな?
でないとどうせapacheの子プロセスが一旦バッファするから意味ないぞ。
454429:04/04/17 09:53
そのようですね。$|=1とした場合に『Transfer-Encoding: chunked』をapache
が付けるということは$|の段階でそこから本文扱いになってしまうようですね。

perlでは$|=1と$|=0で出力の方法が違うのでしょうか?
本文に 18,12,11などの数字が入るのは明らかにおかしいと思うのですが
バイナリで見るとperlがそういう文字列を出力しているのでしょうね。
apacheのバグかもしれませんが。
trussを使えばどういう出力をしているのか分かりそうですが、ちょっと
私には敷居が高いですね...。
455429:04/04/17 09:56
上は >>451への返事です
456デフォルトの名無しさん:04/04/17 12:02
Apacheのバグのわけねーだろ。
一体何人が使ってると思ってるんだ?
まず自分の設定ミスを疑えよ。
>>454
数字が入るのがおかしいと認識しているのならそれは間違い。
あらかじめ長さがわからないCGIの出力をchunkedで送るのは
HTTP/1.1を使う限りよくあることだ。chunkedエンコーディング
がよくわからなければ、HTTP1.1のRFCを読むとかしろ。
ttp://www.cresc.co.jp/tech/java/Servlet_Tutorial/Lesson_38.htm
あたりも例があってわかりやすいかな?

問題はCGIの出力のヘッダ部にあたるところがそう解釈されずに
本文としてclientに送られてしまっていることだと思う。
458429:04/04/17 14:45
あの文字は次行のバイト数を表してるんですかね?
>>457で教えてもらったページで勉強します。

ということで終了。有り難うございました。助かりました。
perl板でこんな感じになってしまってすいません。

最後に一言。
>>453 でnph-じゃないと$|=1の意味がないって書いてあるけどそんな
ことはない。この場合apacheはバッファしない。確かにあのサンプル
だけみて意味がないと言ったなら理解はできるが。
>>1に従ってこれ以上は書きません。
このスレ、一気に殺伐になったな。
殺伐は珍しくないと思うが。。。
いや、漏れにはためになったが
462デフォルトの名無しさん:04/04/18 21:59
そんあことより>>1よ聞いてくれよ。この前Perlについての質問箱に行ったんです、Perl質。
(中略)
要するに、Perlユーザは絶望的に親切なのだ。
いや、漏れにはよくわからなかったが
このスレの半分は質問レスで、
残り半分は病的に親切な解答レスでできています。
Apache::Session::MySQLについての質問なのですが
生成したセッションIDは前もって作っておいたsessionsテーブルのid(1番目のフィールド)に
保存されますが、そのセッションIDと対になるセッション変数の内容(tieしたハッシュの内容)は
a_session(2番目のフィールド)にバイナリの形で保存されているという解釈で良いんでしょうか?

一旦生成したセッションをdeleteで削除すると、該当するレコードが消えるというのと

tie %session, 'Apache::Session::MySQL', セッションID,\%attr;
tied(%session)->delete;
my $id = $session{visa_number};

の順番に処理するとセッションの情報は消えても%sessionの中身は消えないのは分かったのですが
(最初セッションを消したから、その時に%sessionも初期化されなおすのかと思い込んでました)
deleteせずに直接該当のレコードを削除したらセッションIDでtie出来なくなったので
a_sessionに情報が保存されてるのかと思ったのですが、それで良いんでしょうか?

宜しくお願いします。
>>1 読もうな
>>466
CGIというよりモジュールの使い方だからここでOKかと思ったのですが
板違いだったら申し訳ありませんでした。
>>465
まー、WebProg には↓というスレがあるんでそっちの方が適任かもね。
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/

で、せっかくソースも提供されてるんだから、素直にソース嫁。
使ったことないがさくっとソース眺めたところではそのようだ。
シリアライズにはデフォルトでは Storable を使ってる。
そして、なぜ実装の詳細が知りたいのかが気になる。
469465:04/04/20 09:24
>>468
そうですね、ソース読むべきでした。
ごめんなさい。

DBのデータに結びついているセッションのデータが別の場所にあって
deleteを使わずに直接レコードを消してしまったら、それが消えずに残っちゃうのかな?
と思っての質問でした。
・・・やはりソース読むべきでした、この内容なら。
申し訳ありませんでした。
470デフォルトの名無しさん:04/04/20 23:52
Perlも日本語使えたら結構便利なんだけどね〜
一々convertするの面倒だよ
会社の中にアスキーコードしか使わない奴なんて何人いるんだろ?
>>470
どの部分の日本語のことだゴルァ

use encoding であまり困ってなかったりして。
472デフォルトの名無しさん:04/04/21 01:32
確かに会社だと平気でファイル名やディレクトリ名に
マルチバイト文字使う人いるよね
>>472
WindowsXP日本語版はOSが使ってますが
だからといって「デスクトップ」と半角カナもいやだ
半角カナはマルチバイトではないんだが
質問です。
正規表現なのかforeachで処理するのかできないのかよくわからないのですが
たとえば 長い文字列の中で「<(xxxx)>」という文字列に複数一致させて
$1を用いてif文などの処理を1つづつ行うことは可能なのでしょうか?
>>476
for (/<(xxxx)>/g) { $1 }
>>476
m//演算子のgオプション

% perl -e '$a="gaga hoge"; while ($a =~ /(\S+)/g) {print $1,"\n"}'
gaga
hoge
Perlのようなもの
ファイルに対して $(<FH>)[0] や $#(<FH>) のような事をするにはどうすれば良いですか?
ファイルを配列に読み込まずに、本物の配列のように扱いたいのです。
>>480
tie して DB_File した方が楽かもねぇ。。。
>>480
けっきょくファイルを読んでくることに変わりはないし、
Perl(に限らず、ふつうのファイルシステム)は
可変長テキストのランダムアクセスには弱いぞ。

インデクスだけdbmで組んでみれば?
たぶん>>480は、数百万行規模のファイルを読ませたいと
想像したが、いかが?
いえそんな大層なものではなく、読み込むファイル自体は千行程度のCSVです。
で、それの特定の要素でソートするために今は配列に入れてやってますが、
その過程でファイル自体を完全に配列のように扱えれば楽なのに、と思ったのです。

要は、出来るだけメモリを喰わずにCSVファイルの中身をソートして
出力しようというのが動機です。
484ひよこ名無しさん:04/04/22 19:45
ちょっと前にPerlでプログラムを作りました。
掲示板のようなプログラムです。
そのPerlで記述した文法の中で、文字化け対策を行っていました。
テストサーバでは良くある文字化けリストの文字を打っても
文字化けが起こりませんでした。
でも本番用のサーバでは良くある文字化けを打つと文字化けが
起こってしまいました。
これはサーバの環境が違うからでしょうか?
485482:04/04/22 20:23
>>483
現在のPerlでは、そのような機能は実装されてないし、
CSVは一見固定長に感じるだろうがファイルシステムから見れば
可変長テキストデータだから、けっきょく全行読み込んでこないと
行を切り出すことすらママならないのだ。

@a = <FH>; で全行取ってこれるだけでもありがたいと思おう。

>>484 WebProg ニイケ (ぴゅう太風)
Perl 5.8.4 release age

メンテナンスリリースなんでそんなには変わってないが、個人的にはこれが嬉しい

・In place sort optimised (eg @a = sort @a)
>>478
ありがとうございました! そういう書き方ができるのに
気づきませんでした。いままでSplitで分割してました…。
>>483
環境によるだろうが、千行程度なら気にせずメモリに読み込んで構わないんじゃないか?
たかだか数十〜数百KBだし。
で、ファイルが非常に大きくてメモリに全部読み込めないとか、メモリをできるだけ節約するなら、
既に出ているインデックス案か、分割して普通にソート後、マージソートでいいんじゃないだろうか。
すみません、よろしければ教えてください。
WindowsXPでJperl(5.005_03)を使用しております。

ミリ秒単位を表示したいのですが、localtaimでは秒までしか取得できません。
ぐぐってみたところ
Win32::Timer
で可能と書いてあったのですが、よくわかりませんでした・・・
申し訳ないですが、どなたか教えてくださいませ。
よろしく御願いします。
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
>>477-478
これらの文って、
検索した結果を全部配列に入れた後にforによるループが始まるの?
それとも、検索して引っかかる毎にブロックの中が評価されてるの?
>491
forはいったん全部配列に入る。 whileは正規表現の中でループ回る。
お好みでどうぞ。
>>480
もういないかもしれないが、Tie::File というモジュール使えば配列通して行ごとにファイル内容を
扱えるようだ。
ttp://search.cpan.org/~mjd/Tie-File-0.96/lib/Tie/File.pm
ファイル全体をメモリに置かず基本的にオフセットで管理、キャッシュも使ってるようだ。
>>475
マルチバイトの半角カナもあるわけだが
WindowsXPが使ってる半角カナは単バイトなのだが
>>495
たぶんUCS-2だ。もはや単バイトではなかろうて。と、脱線してみる。
プライベートな変数ってどういう意味ですか
>497

プライベート
1.パブリックの反対
2.秘密の行為を指して使う(例:プライベート・セックル)

変数
1.定数の反対
2.変な数
秘密の変な数ってことか。
500デフォルトの名無しさん:04/04/25 03:07
オブジェクト指向を勉強できる良いWebページありませんか?
今読んでる本は、殆ど何も書いてないので・・・。
OOそのものを知りたければわざわざPerlで勉強することないと思うけど。
http://www.rfs.jp/sitebuilder/perl/04/02.html
例えば、
@hairetu = ( 123, 456, 789)
となっている配列の値をを、
%hash{'a'} %hash{'b'} %hash{'b'}
というキーになっているハッシュに値として順番に入れるには
どういう方法をとるのが一番やはいですか?
初心者の私は場合わけして入れるしか思いつかないのです。
お願いします。
すいませんs/やはい/はやい/です
たびたびスイマセンあほな質問しました。
すぐに思いつきました。
酒飲んでると駄目ですね。
>502
解決したようだが一応。
上の質問の書き方だと何がやりたいのかよくわからない。特に
>@hairetu = ( 123, 456, 789)
>%hash{'a'} %hash{'b'} %hash{'b'}
の対応付け。なんで a, b, b なのか。
ついでに $hash{a} なんじゃないの?とか。
@k=qw( a b c);for(0..$#hairetu){ $hash{$k[$_]}=$hairetu[$_]}
507デフォルトの名無しさん:04/04/25 18:26
%hash{'a'}というのは$hash{'a'}だよね?
まとめて入れるなら
@hash{ qw/a b c/} = @hairetu;
とか?
508491:04/04/25 23:06
>>492
おお、forとwhileで違いがあるんですか。
whileの方が使い勝手よさそうですね。
昨日>>502を書き込んだものです。
誤表記等、今書きこみるとぐだぐだですね。
みなさんのおっしゃるとおりです。すみません>>505

これからは飲酒しての質問はしない様にします。

>>506,507ありがとうございます。
Perlをインスコしてコマンドプロンプトに
ppm、install time-hires、install io-zlib、install win32-api、install http-lite
と入力していくんですが、
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
C:\Documents and Settings\○○ ○○>ppm
PPM - Programmer's Package Manager version 3.1.
Copyright (c) 2001 ActiveState SRL. All Rights Reserved.

Entering interactive shell. Using Term::ReadLine::Stub as readline library.

Type 'help' to get started.

ppm> install time-hires
Cannot chdir back to C:/Documents and Settings/○○ ・○: No such file or direc
tory at C:/Perl/lib/FindBin.pm line 182
BEGIN failed--compilation aborted at C:/Perl/lib/FindBin.pm line 188.
Compilation failed in require at C:\Perl\site\lib\ppm-conf\ppminst.bat line 16.
BEGIN failed--compilation aborted at C:\Perl\site\lib\ppm-conf\ppminst.bat line
16.
Error: connect: Unknown error

C:\Documents and Settings\○○ ○○>install io-zlib
'install' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
と出てしまい実行できません。
再起動、再インスコを何度も繰り返してみたのですが実行できません。
なぜできないのか指導お願いします;;

環境
win xp H.E
CPU セレロン1.4G
インスコ ActivePerl-5.8.0.806-MSWin32-x86

このスレの発見が遅れてしまいマルチっぽくなってます。
向こうでも謝罪はしておりますが申し訳ありません。
512510:04/04/27 14:28
と出てしまい実行できません。
再起動、再インスコを何度も繰り返してみたのですが実行できません。
なぜできないのか指導お願いします;;

環境
win xp H.E
CPU セレロン1.4G
インスコ ActivePerl-5.8.0.806-MSWin32-x86

このスレの発見が遅れてしまいマルチっぽくなってます。
向こうでも謝罪はしておりますが申し訳ありません。
513遙皇 ◆HEHARUKAoo :04/04/27 14:47
>>512
ppmの前にcd\って打ってみたら?
Administratorでインスコしてごらん?

ユーザ名がマルチバイト故にハマってる症状にみえる。
初めて一週間の超初心者です。質問させてください。
名前一覧表(name.txt)があって
ミケ
ポチ
ハラス
と、中身が記述されています。個別にファイルも作ってあります。(ミケ.txt、ポチ.txt)
で名前から選んで削除するときに,name.txtの内容をリストに表示して選択して、
そのデータが $name として渡ります
unlink("$name.txt"); で個別のファイルは消えるんですが、その次に
name.txtの中身の$nameに該当する部分も削除したいのですが何かいい方法はありますでしょうか?
name.txtを1行ずつ読み込み,$nameにあたる行がきたら別のテキストに格納するか飛ばすかして,
もとのルーチンに戻そうと考えたのですが,思い通りにいきません。
(name.txtの中身が空白になるとか、途中までしか記述しないとか)
何か考え方が間違ってるのでしょうか?
if (open(IN, "name.txt")) {
while (<IN>) {
$dname .=$_;
chop;
if ($_ eq $name) {} ←ここをどうしたらいいのか?
}
close(IN);
}

どなたか答えていただけないでしょうか?お願いします。
>>515
name.txt を全部読んで削除するしかない。

以下、もし>>515がCGIで使われてる場合のアドバイス。
読む->変更->書く のような動作はファイルをロックしないとヒドい目に遭う。
ロック云々に関してはWebprog板にスレ立ってたようなので割愛。

ロックが嫌いならば、
「同じ長さの特別な記号で書きつぶす」
という手法も使えなくもない。
517510:04/04/27 17:45
>>513
インスコ完了しました。
ありがとうございます。
>>514
まだ試していませんがまたおかしいようでしたら試すため
知識の1つにさせて頂きます。

ありがとうございました。
518デフォルトの名無しさん:04/04/27 18:42
CGIから入った新参者ですけど、
CGI以外にどんな用途があるんでしょうか?
元々UNIX上でテキスト処理に使われていたらしいですが・・・
>>518
UNIX上でテキスト処理に使っておりますが、何か?
定期的に FTP接続でとあるファイルを取得するのに使っていますが、何か?
521でふぉな名無しさん:04/04/27 22:26
とあるニュースサイトから記事を取得して自分の携帯に
自動メール配信していますが何か?
http proxyに使ってますが何か?
ハッキングに使ってますが何か?
量子計算に使ってますが何か?
Perl内蔵(ちうかActivePerlリンク)の2chブラウザ作ってますが何か?
Perlスクリプト作成補助ツールとして使っていますが何か?
とあるOSのカーネルモードに組み込もうとしてヤケドしましたが何か?



*このヌレは藻前らがPerl自慢をするヌレになりますた*
      *ごゆっくりお楽しみください*
遺伝子解析に使ってますが何か?
「そうかラムちゃんのTシャツを・・・」と思い出しながらしてますが何か?
何をですか?
531デフォルトの名無しさん:04/04/28 01:15
質問させて下さい。
solarisサーバ上で動くソケット通信プログラムを作っています。
やる事は、あるポートで受けたデータを少し加工してファイルに書き込むだけです。
inetdで起動させようとしているのですが、ファイルが作成されません。
実際はデータ加工の処理が入るのですが大体の処理は以下のようなかんじです。

$|=1; # バッファリングしない
while (<STDIN>){
open(FILE,">> log.txt");
print FILE "$_\n";
close(FILE);
}

print文を、
print FILE "abcde\n";
等と変えてみたのですがダメでした。
クライアントとからは、サーバプログラムをinetdに登録する前は接続エラー(当然ですが)となり、
inetd登録後は接続エラーにならないので一応起動されてはいるようなのですが・・・。
inetdを使わずソケットを作成すればうまく行くのですが、これだとコンソールからの起動となり
大前提がコンソールを表示してはいけないとなっているので苦戦中です。
inetd使用時のファイルに扱い方に問題があるのでしょうか?
またinetdを使用しなくても、コンソールを表示せずにプログラムを起動する方法が
ありましたら教えて頂けないでしょうか?よろしくお願いします。
デーモン
>>531
Proc::Daemon はどうですか?
もしくはDaemontoolsで起動するとか。
534515:04/04/28 11:39
>>516
>name.txt を全部読んで削除するしかない。

すいませんが全く意味がわかりません。
name.txtを1行ずつ読み込んで削除するのはダメだということですか?
なんかすごい頭の悪い質問の仕方をしてるみたいで申し訳ないんですが・・・
>>534
ファイルシステムというのは、文字単位で挿入/削除するのに向いてないので、
テキストエディタでやっている「1行削除」のような簡単なことではないのだよ。
現にテキストエディタのようなものでも、先頭の1行を削除したら、
(エディタのメモリ上にある)ファイルイメージを全部元ファイルに上書きしてる。

>name.txt を全部読んで削除するしかない。
これの回答だけ書いておく。

open(F, "name.txt");
@a = <F>;
close(F);

splice(@a, 5, 1); # たとえば削除

open(F, ">name.txt");
print F @a;
close(F);

もっとアトミックに更新を行う方法もあるが割愛。

「同じ長さの特別な記号で書きつぶす」 の方が楽なケースもあるが、
(削除したい行へファイルポインタを持って行き、0x09 などを殴り書きするとか)

リストに「削除マーク」を追記していくという手法もあり。
(レコードが増えたら "うんこ\n" を追記し、
 レコードが消滅したら "\tうんこ\n" などの、他とは区別できる行を追記。
 name.txt を読み込みながら、メモリ上で有効リストの再構成を行う。
 リストが長くなりすぎたらときどき掃除)
>>534
んの前に、ファイル管理name.txtなんか作らなければいいじゃないかね。
その name.txt の内容って、ディレクトリの情報そのものじゃん。

ディレクトリの情報から取得するようにすればファイルを unlink したら
ディレクトリの一覧からは消えるんだから・・・ええと説明めんどい。

つまり、いいたいことは name.txt は捨てて opendir() 使え。
>>531
log.txt というファイルが作られるディレクトリはどこか
openに失敗した時のことを考慮しているか
失敗する理由はなにが想定されるか

これらの点を検討せよ
$foo =~ s///;
$bar = $foo;

$bar = $fooを置換しその結果を返す;
のようにやりたいのですが、どうすれば良いのでしょうか。
mapやgrepを試してみましたが配列が返って来るのでダメでした……。
>>538
$bar = $foo;
$bar =~ s///;
>539
すみません書く時に間違えてました。
そちらの方を一回でやりたいのです。
($bar = $foo) =~ s///;
優先度を変えるだけで良かったのですね。
ありがとうございました。
自分でHoge.pmというモジュールを書いているのですが、Hoge.pmのnewで
bless {
foo => undef,
bar => undef,
}, $self;

で、new内で初期化するサブルーチンinitを呼び出して、
sub init
{
my $self = shift;
$self->{foo} = new AAA::Foo;       # Fooオブジェクトを生成
$self->{bar} = $self->{foo}->newbar(); # Foo::Barオブジェクトを生成
}
とかしようとすると、
Can't use string ("Foo") as a HASH ref while "strict refs" in use at Hoge.pm
というエラーが出ます。

実際のスクリプトでは、Hoge = Fooだったり、CPANから落として来て入れたモジュールに
Fooというモジュールがあったりして、名前が被ってるからstrictが怒ってるのかなぁと思ったのですが、
googleで調べてみると、ハードリファレンスじゃなくてシンボリックリファレンスだから
駄目なんだ、とか書かれており、よく分かりませんでした…。
どうすれば良いのでしょうか?
Perlのバージョンは5.6.1です。よろしくお願いします。
>>543
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlobj.html

sub new {
my $self = shift;
bless { foo => undef, bar => undef }, $self;
$self->init();

としているに 300 ペリカ。
>>544
とりあえずリンク先を読む前に支払いを…
ノ⌒[300ペリカ]

…読んで参ります
use Error qw(:try);
my @array = (1,2,3);
foreach(@array){
 try {
  throw Error();
 } catch Error with {
  next;
 };
}
これって無限ループになるのだけど、なぜ?
use Error; にしたり、ループにラベルつけると期待通り。
>>546
Error.pmのcatchの処理をするところでwhile(1){...}
があるので、そのループへのnextになっちまってるんだ
と思う。ラベルつけるとOKなのはそのせい。

use Error;だと期待通りってのは勘違いじゃないかと。
tryの前にprint "$_\n";いれるとわかると思うが
use Error qw(:try);のままでラベルつけたときと
全然動作違うよ。
548546:04/04/30 16:46
>>547
ありがとう。 while(1) ありました。
use Error; は勘違いでした。stacktrace を始めてるみたいです。
あとでもう少しコードを追ってみるです。
# 件の問題でコケた瞬間 apache のログが数十GBに→停止。
# なかなか良いトラップでした。。。
いきなりサーバーで実行ってか?なかなか良いクラッカーになれるぞ。。。
オブジェクト指向の、メソッドの継承に関する質問なんですが、
Aというクラスと、Aを継承するBというクラスがあったとして、
Aのメソッドsay()が
sub say {
 print "I'm ";
}

Bのメソッドsay()が
sub say {
 # super.say()みたいなもの
 print "20 years old.";
}

で、$b->say();とした時に、I'm 20 years old.と表示させたいのですが、
super.say()みたいなものって、Perlではどうすればいいのでしょうか?

$b->SUPER::say();
$b->say();
とやれば、結果的には同じ結果が出るみたいですが、モジュールのカプセル化とか
そういうの考えると、あまりこういうやり方は良くないんじゃないかと思いまして…。
Perk/TkでScrolledウィジッドに日本語を表示すると、ウィンドゥを閉じるときに
エラーが出ます。「問題が発生したため、Perl Command Line Interpreterを
終了します。」と出力されます。プログラムは一応動くのですが、終了時にエラー
が出るのが気持ち悪いのです。

どなたか解決法をしりませんか?表示にはフォントとして"System"フォントを指定
しています。環境はWindowsXP HomeとActive Perl 5.8.0.805です。

>>550
SUPER::say()
>>550
B は A を継承しているのだから、A の事を「知って」いて構わない。

sub say {
  my $self = shift;
  $self->SUPER::say();
  print "20 years old.";
}

$b->say(); # I'm 20 years old.

use B; するスクリプト中で $b->SUPER::say(); とするのはマズいが、
子の中で親クラスのメソッドを呼んで悪い道理はあるまい。

http://perl.infoware.ne.jp/documents/perlboot.ja.html
>>552,553
あ、なるほど$selfからさかのぼればいいのですね。
ありがとうございました。
無名ハッシュや無名配列の存在意義が良くわかりません。
名前付き(?)ハッシュや配列のリファレンスでは駄目なのでしょうか。
確かに、例えばモジュール等でリファレンスが欲しい場合の手間は省けますが。
>>555
>確かに、例えばモジュール等でリファレンスが欲しい場合の手間は省けますが。
その理解でいいよ。

これらの神髄は、入れ子構造、Cで言う struct とか
リストを作るときに発揮される。
リファレンスはスカラが収まる場所にはほとんど格納できるから。

Perl4の頃は、配列のハッシュのようなものを実現するためには
デリミタをつけた文字列をハッシュの各エントリに .= (文字列追加)して
取り出すときに split したりとか…苦労したもんだ。

%h = ('foo', [0..2], 'bar', [4..6]); とか。
要素の参照は $h{'bar'}[2] -> 6 でできる。

リファレンスはそれ自体が型を持っているというのもポイント。
元々Perlは型が緩い言語だったが、リファレンスはけっこう型に厳しい。
そして、「何のリファレンスか」を得ることもできるので、文脈依存の処理が書きやすい。
>>555
リファレンスが欲しい場合に
名前付き配列/ハッシュを作ってからそのリファレンスを得る方法
でも、五割がたはまぁ、いい

でも、残りの半分は 無名配列/ハッシュ を使った方がスマートだ。
# Perlの性質上、どうしても使わなきゃダメって場合は少ないけれど
# 無名配列を使うよりも非常に複雑で無駄な手間がかかる


嘘だと思ったら、ためしにシュワルツ変換を無名配列を使わずに書いてごらん。
変数名考えるのがマンドクサイ時とか('A`)
perl2exe使ってる人いる?
wperlが指定できい(?)っぽくてDOSがウザいんだけど。。。。
ちなみに俺は金払ってません_| ̄|○
>>559
-gui で窓なし可。









                             コピペ
                             ただしウザイ「金払え」ダイアログが出てきた(w
                             ショートカットが実用的かも。
562デフォルトの名無しさん:04/05/02 13:23
膨大な辞書ファイル(64Mほど)の中から、検索ワードのワードの意味を探索
して新しいファイルに書き込むプログラムを書いているんですが、探索方法
を逐次探索でやるというまでもなくものすごい時間がかかってしまいます。
こういうときはどのような探索方法をどのようにして実現すればよいでしょうか?
なにか常套手段などありますでしょうか?

ちなみに辞書ファイルはアルファベット順になっており、一行の形式はcsvです。
"単語","意味1","意味2",・・・
使ってるよー
コンテキストメニューに自作のツール登録してる
>>563>>559に対してです^^;

>>562
妥当な線でインデックスを作成しとくとか
もしくはアルファベットごとに辞書ファイルを分けちゃうとか
>>562
ちみのやりたいことは、perl dbm でぐぐると解決するものと思われ

64Mの元ファイルを処理するのが1度でいいのなら、
もっと手抜きできる方法はいくらでもある。
566562:04/05/02 14:12
>>564,565
ありがとうございますた。
とりあえずがんばってみます。
567デフォルトの名無しさん:04/05/02 14:56
>>562
Search::Dictでいけるかも
あるオブジェクトManagerの中で、別のオブジェクト(子孫とかではない)Memberを大量に管理したいのですが、
何か比較的かしこい方法はありますでしょうか。
Memberは、それぞれユニークなIDを持っています。のでハッシュを使うのが筋だとは思うのですが、
Managerで$bless {member => \%member}, $pkg;
で、$self->{member}->{'ID'} = new Member();
とかやるのも、あまり美しくない気がして…。
「大きいファイルはインデックスを作っておく」というのが良くわかりません。
どうやって作るのでしょうか。
>>569
意味がわからないの?やり方がわからないの?
どっち?
両方といえば両方です。

漠然と、例えば行頭の位置を index() で検索して
別のファイルに記録して置いたりするのかな等とは思ったのですが、
でも内容が変わったらその度に作り直さないと駄目な気がして、
書き込みが多い場合は却って負荷が大きくなるのではないかと思ったのです。

で、もしかしたらこの考え方は間違いで別の良い方法が有るのかと思い、
そうであればやり方が思いつかないのでご教授願えたらと。
>>571
ディスクの容量に制限がなけりゃDB_FileかGDBM_Fileを使って
HASHにするのが一番速い。
>>567 の Search::Dictは見たのか?
Search::Dictは2分探索だがこれを補完探索に書き換えれば
もっと速くなるだろう。
Serch::Dictについてはログを良く読んでいませんでした。
これから少し試してみます。
>>574
いっぱい試せ。
モジュールあるならモジュール使おう
>574
自戒の意味が篭められているように見受けられました。
577デフォルトの名無しさん:04/05/04 08:58
オライリー以外でまったくのPerl初学者に薦める本はなんですか?
>>4のEffective Perlは初学者向けじゃない?
Effective Perlは
Perlはまったく初学者だけど他の言語ならプログラミングできるよ
つうひとにはお薦めできると思う。
579577:04/05/04 09:29
Javaしか経験ないのだけれど
じゃじゃじゃじゃあ、effective perlかってみます。
サンクス。
580デフォルトの名無しさん:04/05/04 11:23
pure perlのコードでSegmentation Faultを起こすことはできますか?
>>580
perl -e 'kill(11,$$)'
>>578
Effective Perlは
他の言語の経験があって、「飲み込みの速い奴」ならお勧めできるな

なんでオライリーを避けるかよく分からんが
ラマ本より優れた入門書はないと思うけどな
packageで定義された変数やら関数やらの一覧を
取る方法ってありませんでしたっけ?

例えば、main で定義された関数やら変数やらの一覧とる方法
>>584

%main:: とか、package hoge; なら %hoge:: とか
ふと mod_perl 上で undef %main:: してみたらサーバリスタートかかったハァハァ
>>586
お前勇気あるな。
そういうのって心理的抵抗があって無意識のうちに避けるものだが。
rm -rf /に近いものあるな。
>>585
キタ━!!ありがとう。
一生懸命 %{main} こうやっててできなかった…。
::つければいいのね。
>>586
敬意を込めてバカ勇者と呼んでいいか?
undefするとは思いつかなかった、俺もやってみるよ
↑テロリスト
↑テロリスト
↑ロリスト
↑リスト
まあどうせ mod_perl (registry)使える鯖なんて大抵自分専用にレンタルしてるとこか
ローカル鯖だろうから良いんじゃない(例外もあるけど)。
ウチはWin2K+Apache2+mod_perl2のローカル鯖で>586に載せた事をやった。

元々は途中でパッケージ名書き換えたときに書き換え前のパッケージ名が
テーブルに登録されたままなのを発見して、
面倒だから undef() すれば初期化されるかなとか思ってやってみたら失敗したという話(´∀`)アハハ

(´∀`)アハハ
IRCクライアントを弄ってみてるのですが、Net::IRCのイベントループを止めて、
サーバとの接続を切って、Net::IRC::Connectionオブジェクトと
Net::IRCオブジェクトを捨てるにはどうすればいいのでしょうか。
モジュールのソースも読んだのですが、Net::IRC::Connection::quit()で
サーバとの接続を切る(と思われる)くらいの事しかわかりませんでした…。
標準入力からコマンドを入れて、安全に終了させたいのですが…。
Windowsで初めてCPAN使ってモジュールインストールしたらルートに「.CPAN」なるフォルダが生成されました。
これは消してもかまいませんか?
599遙皇 ◆HEHARUKAoo :04/05/05 12:51
>>598
キャッシュだから消してもいいと思うけど
毎回初期設定からやりなおしになったりすると思う
ルートに置かれるのはなんか気持ち悪いよな
っていうか場所指定出来たような。
っていうか普通は$HOME/.cpan/なのでは?
603デフォルトの名無しさん:04/05/06 12:22
$honbun = "aaabbbcccdddeeefffコーヒー";
$honbun =~ s/$FORM{'text'}/<font style=\"background:#00ffff\">$FORM{'text'}<\/font>/g;
print "本文=$honbun";
というプログラムで本文を置換したいんですけどフォームからaaaなどを入力してもエラーにはならないけど
コーヒーと入力するとエラーになってしまいます。
どうしたらコーヒーと入力してもエラーがでないんでしょうか?
>>603
CGI/Perlの質問はWebprogで。

「ー」=0x815B ゆえに起こってる問題。'[' = 0x5B.
完璧な答えを書くのマンドクサので

quotemeta
\Q

あたりのキーワードで、Perlマニュアル調べれ。
コーヒー
ヤッターマン
ライター

以上の3つの単語を正しい順に並べなさい。
おこし
につけ
たきび
○○○
だんご
608597:04/05/07 00:17
こちらもwebprog板で聞いた方が良い内容なのでしょうか?
毎回Ctrl+cで止めるのはきついです…。
>>608
start() でNet::IRCにイベントループさせるのではなく
do_one_loop() を使って自前でループさせれば?
>>609
つまりstart()を止めるメソッドとかは実装されていないということですか…。
わかりました。do_one_loop()使ってみます。
ありがとうございました。
>>610
つーか、start() の中身が

while(1){
$self->do_one_loop();
}

こんな感じ
>>610
Net::IRCのドキュメント読まずに書くけど

start()メソッドの実装は
sub start {
my $self = shift;

while (1) {
$self->do_one_loop();
}
}
なので、自前でループしても全然問題ないみたいね。
613デフォルトの名無しさん:04/05/07 21:30
すみません、ちょっと力を貸してください。

現在、掲示板を改造しているのですが
名前につけるトリップの他にMACアドレスで生成する
トリップの機能をつけたいのですが

どのようにMACアドレスを取得すればよろしいでしょうか。

イメージはこんな感じです。

名前 山田太郎◆KdCIエD  ◎CDgfg87Dg2

◆は名前のトリップ     ← 使うか使わないかは自由
◎はMACアドレストリップ ← 自動的に付く
>>613
IP アドレスではなく MAC アドレス?
MACアドレスの意味わかってないだろ
インターネット掲示板じゃなくてイーサネット掲示板とは珍しいな。
ていうかWebprogに逝く前に回線切って首吊って(tbs
MACアドレスでトリップ…
凄い、画期的だ。

ぜひともそれが実現するまで2chに来ないでほしい。
自鯖なら実現出来るよ。

いいか、実現するまでくるなよ。
MACアドレスをCGIに送ればいいだけでしょ。
どんなAPIがあるかは調べてないから分からないけど
ipconfig.exe /all
でPhysical Addressを取り出せば取り敢えずできる。
標準出力をつないで取れ
>>619-620
誰が送るんだ?
詐称出来る情報に意味あるか、ヴォケ
ネットワーク板にでも行ってこい
ネタをネタと見抜けない人に(2chで釣るのは)難しい
>>621
送信したデータがどういう経路をたどるか分かってます?
そんなこと言ったら、全ての上りデータに意味がなくなってしまいますが。
ネットワークの仕組みを勉強してみては?
>>623
へぇ……
IP アドレス詐称して TCP で通信するのはかなり難しいが
625デフォルトの名無しさん:04/05/08 11:28
>623
ヴァカ発見
マジワロタage
626デフォルトの名無しさん:04/05/08 11:57
超初心者でスマソ 座標を指してある数字が4つある場合左からXYXYでいいんでしょうか? あと座標0,0は画面左上であってますか?
>>626
使ってる座標系を明示しろ。極座標系なら r, θ, φ, t かもしれんし、
同次座標系なら x, y, z, w だろうし。

> あと座標0,0は画面左上であってますか?
その座標系の定義による。
>>623
>ネットワークの仕組みを勉強してみては?
ワロタ、お前がしろよ

629626:04/05/08 13:15
>>627
???
自分のプログラミングレベルが低すぎるのでLANケーブルで首つっt(ry
ただ単に矩形領域の指定なのではないかと推測
それならば、普通は (x1, y1, x2, y2) だわな
631デフォルトの名無しさん:04/05/08 13:43
>>623
PerlスレなんだからPerl(CGI動作上)で取得する方法例を明示して下さいよ。
ののしり合いはそれからにしてください。

>>629
座標系はいくつかの表現方法があって数学的素養です。
どういう座標系かは扱うライブラリ等に依存しますので一般論はありません。
その世界でどう定義しているかが話の出発点です。
>>631
>Perl(CGI動作上)で取得する方法例を明示して下さいよ
サーバ側から取れるわけないでしょ。バカですか?
>>632
オチツケ!煽る方間違ってるぞ!
>>631
方法1:MACアドレスを送るようIEを改造する
方法2:MACアドレスを送るブラウザを自作
方法3:MACアドレスを送るプロ棋士を自作して自分のマシン設置。IEからそのプロき(ry
方法4:諦める
方法5:泣く
方法6:逆切れする
>>633
いや、間違ってるつもりはないが・・・?
636634:04/05/08 13:57
ああ、IEだけじゃなくてIISとかApacheも改造する必要があるかな?
>>634
ちゃうちゃう。俺がいいたかったのは、元の質問ではクライアントが限定されてないでしょってこと。
だからクライアントでMACアドレス取って送ればええやんって言ったの。
そしたら何か勘違い君が「Perl(CGI動作上)で取得する方法例を明示して下さいよ」とか自身満々に言ってるわけ。
>>615
>>618
>>621
>>624
>>625
>>628
>>631
残念でしたね(プ

まぁMACアドレスも偽装できるんで>>621の2行目には同意。
>>637
まあたしかに。サーバ上で動くPerlだけでは実現不可能だ罠
そして世の中には、PPPのようなMACアドレスを持たないインタフェイスも
あることを知って、くずれおちるのであった orz
もひとつあるな。
ルータの内側のセグメントじゃ、MACアドレス衝突さえしなきゃいいので
MACアドレス偽装され放題で、謝罪と賠償を要求されるニダ...チォブ
>>625
>>628
謝罪はまだですか?こっちはひどく傷ついているんですが。
ごめんなさいの一言も言えないぐらい恥ずかしいですか、そうですか。
WebProgの初心者スレかと思った。
>>638
> まぁMACアドレスも偽装できるんで

て言うか、IP アドレス持ってても MAC アドレス持ってないこともあるんだから、どんな方法使ってもダメだよ。
645644:04/05/08 14:26
>>640 で外出だった...。
646デフォルトの名無しさん:04/05/08 14:48
MACアドレス偽装出来るかどうかなんてことじゃなく、
ネットワークそのものに対する知識でヴァカにされてるのに
マジウケルw
お前ら、レイヤーって言葉知ってるか?(w
>>646
で、どこがおかしいと思う?言えないの?ふーん。
レイアースなら知ってるよ
大前提:
MACアドレスはレイヤー2で使うアドレスなので
レイヤー3(IP)やレイヤー4(TCP)では全く使わない、情報として含まれていない。
故に、サーバ側がヘッダ等からMACアドレスを取得するのは不可能

# 細かいところは突っ込むな、スレ違いで解説なんかしたくねぇ > 分かってる人

クライアントが送るとか言ってる奴
 → ネットワーク越しのアプリケーションで、クライアントが自称する情報なんか信用できないって

>>631 は皮肉だろ
クライアントが送ることに意味はないから、(出来るものなら)サーバ側で取得する方法言ってみろと
マジレスって言ってるけど今まで出てきた話をまとめてるだけやん。何がしたいのやら。
単なる知ったかだろ。
言ってることも微妙に間違ってるし。

> ネットワーク越しのアプリケーションで、クライアントが自称する情報なんか信用できないって

なんていってる奴は、ネットで電子決済なんてできないといってるようなもんだよ。
PKI ぐらい勉強してから書き込んだ方が恥をかかなくていいと思う。
信用出来ないからこそ信用性を確保しなきゃならんのだろうが
偽装されてても信頼性なくてもどうでもいいんじゃねーの?
だって最終的には>>613

名前 山田太郎◆KdCIエD  ◎CDgfg87Dg2

◎CDgfg87Dg2 に使われるだけですよおまいら。
◎CDgfg87Dg2ですよおまいら
おまいら ◎CDgfg87Dg2 ですよ
655デフォルトの名無しさん:04/05/08 15:57
↑の流れがPerl厨の無能さを晒す結果になったなワラ
そもそもスレ違い
おまえら、GWはもう終わりましたよ
>>657
厨は、明日までかもしれない罠。鬱。
よくこれだけ盛り上がれるなぁ・・・
ひょっとして元質問者は送信元IPのMACアドレスを取得できると思ってたのかなぁ
>>659
降り出しに戻す気ですかー(w

↓では次の方ドゾー
661デフォルトの名無しさん:04/05/08 22:30
すっげード素人な発言なのですが、
windowsとかで.pl使うと、エラー表示が一瞬でて消えてしまいます。
どうにかならないでしょうか?
662デフォルトの名無しさん:04/05/08 22:44
質問の仕方も素人だな。
とりあえずだな、
.pl拡張子のファイルをダブルクリックするとっていう意味か?
Windowsのバージョンは?
それならDOSプロンプトかコマンドのプロパティの設定がらみだ。
もしくは専用のツール使え。
>661
ActivePerl
http://www.activestate.com/Products/ActivePerl/

入れてる?
どうもありがとう。
>>662
>質問の仕方も素人だな。
お手を煩わせます。
>.pl拡張子のファイルをダブルクリックするとっていう意味か?
そうゆう意味です。
>Windowsのバージョンは?
2000です。
>それならDOSプロンプトかコマンドのプロパティの設定がらみだ。
やってみます。
>>663
入れてます。this is perl, v5.6.1と出ました。
そりゃスクリプトが終わったらperl.exe も終わってコンソールは閉じるのが普通だわな。

それじゃ困るんなら

・cmd開いてそこから実行
・batファイル書いてそのプロパティで閉じないように指定
・スクリプトが終了しないように <STDIN>; などの行を末尾に入れる
 (これで改行かCTRL-C入れるまで終わらない)

等の手段をとる。
>>655
ありがとう。あれから探して専用ツール入れてみました。
慣れてないので妙です。

<STDIN>; は試してみましたが、なんだか上手くいきませんでした。
他の二つは、後で調べてやってみたいと思います。
>>664 なんか勘違いしてた。すまん。
Windows2000だったら
[フォルダオプション]-[ファイルタイプ]からplを探して
拡張設定のほうをいじるようかな。
"c:\perl\bin\perl.exe" "%1" %* とかなってるのを
cmd.exe /k c:\perl\bin\perl.exe "%1" %*
にするぐらいしか思いつかん。バッチ作るとか面倒ってことだろ。
でもこれだとperlでの引き数指定できないし、開発とかする目的なら
Copalとかだったかの統合環境もどきツール使った方が楽かも。
>>667
いえ。こっちの質問の仕方が良くなかったのです。ありがとう。
http://homepage3.nifty.com/aokura/#Perlを始めよう
これ入れてみました。アイコンだけ元の黄○に戻して今使ってます。
Copal後で調べてみます。Copalがよさげだったら乗り換えます。
質問なのですが、現在次のようなことをしたいと思ってperl で
プログラムを作ろうと思っています。

1 住所を日本語で入力(Excel等で)
 東京都 港区 芝浦 1-1-1

2 入力したファイルを読み込み
 順番を逆にする
 東京都 港区 芝浦 1-1-1 を
 1-1-1 芝浦 港区 東京都
と。
3 逆の順番に並び替えたものを
ファイルに書き込み

読み込みは open を使って
順番を逆にするのは、reverse とか sort を使うのってのは
わかるんですけど、具体的にそれらを組むってなるとちょっと
わからないんです。
ヒントでもかまいませんのでどなたかご教授いただけますか?
よろしくおねがいします。
>>669
1.読み込みは open を使って
2.一行読み込んで配列に格納
3.順番を逆にするのは、reverse とか sort を使う
4.ファイルに書き込み
5.2へ戻る

質問は何ですか?
>669
ああそれは、
whileで回しながらspritをスペース区切りで使って
@なんたらにブチ込んでやれば良いんですよ。
splitだった・・・寝ます。
>>669
やりたい順番にやりたいことを書けばよいです
ヒントは全部自分で言ってますよ
あとはgoogleなどの検索サイトで調べてみて下さい
674デフォルトの名無しさん:04/05/09 03:02
おまえら真性のアフォだろ
日本語で入力(Excel等で)って書いてあんじゃん
            ~~~
>>674
ふーん、だから?
>>674
Excelで「名前を付けて保存」→「ファイルの種類」のところを調べてごらん。
(ってなんでム板でこんな低脳なことを教えなきゃならんのだ)
677デフォルトの名無しさん:04/05/09 05:48
Excel等ですが・・・
   ~~~
>>674は今顔を真っ赤にしてレス削除の方法を探しまくっているところですから
そっとしてあげてくれませんか
Excelで開けるファイルはxlsだけだと思ってる阿呆(>>674)が
いるというのはこちらのスレでよろしかったでしょうか?
わざわざCSVなんかで保存しなおさなくても
COM経由でセルを書き換えていけばいいだけじゃん。
>>680
なるほど。どんな感じのプログラムになるの?
雰囲気だけでもいいから書いてみてくれないかな。
669です。
とりあえず現状では、ファイルを読み込んで、別名のファイルに
書き込むってのはできました。
わからないのは
reverse や sort を組み込むのがよくわかりません。
今の時点で作成したのは以下の通りです。

open(in, "<address.txt");
open(out, ">revaddress.txt");
while (<in>){
print(out);

}
close(in);
close(out);

今の段階では txt 形式で住所を読み込んでいます。
プログラム初心者なんで…お願いします。
683デフォルトの名無しさん:04/05/09 16:01
@a = split(/ /);
print reverse @a;
Perlで大量のデータを扱う時に、様々な方法があるでしょうけど、
どういう場合にはこういう方法を取るべきとか、こういう特徴を求めてるなら
これを使うべきとか、この程度のデータ量ならこうだとか、このタイプのデータなら
これで十分とか、メリット・デメリット・ポピュラーかそうでないか、用途別、
そういう比較・解説をしてくれているサイトはないでしょうか?
DB関係はさっぱり触ったことがないので、何をどうするのがポピュラーなのか知りたいのです。

それともPerlでデータを取り扱う時はこれ一択だとか決まってるのでしょうか?
685デフォルトの名無しさん:04/05/09 16:55
perlmagick を使って画像に文字を埋め込んでいます。
その際にどのようなフォントが利用できるのか、
また、どのようにして利用できるのか、が分かりません。
できれば、HG創英角ポップ体にしたいのですが、こういうことは
可能なのでしょうか?

環境は Debian woody で、
ii perl 5.6.1-8.7 Larry Wall's Practical Extraction and Report
ii perl-base 5.6.1-8.7 The Pathologically Eclectic Rubbish Lister.
ii perl-modules 5.6.1-8.7 Core Perl modules.
ii perlmagick 5.4.4.5-1woody A perl interface to the libMagick graphics r
です。
有識者の方、アドバイスよろしくお願い致します。
686デフォルトの名無しさん:04/05/09 17:26
<a href="http://xxx.xxx.xxx/"></a>
<a href="http://zzz.zzz.zzz./"></a>

<a href="http://xxx.xxx.xxx/">http://xxx.xxx.xxx/</a>
<a href="http://zzz.zzz.zzz./">http://xxx.xxx.xxx/</a>
としたいのですが、これを自動で処理させるには、どのように
記述すればいいですか?
度々の質問ですみません。669です。
open(in, "<address.txt");
open(out, ">revaddress.txt");
while (<in>){
@a = split(/ /);
print reverse @a;
}
close(in);
close(out);
と作成して実行させると DOSの画面上では問題ないのですが
revaddress.txt には何も入力されていません。
どこか問題があるのでしょうか?
printにファイルハンドルを付けろ。
690デフォルトの名無しさん:04/05/09 18:32
>>686
まずURLを取り出す。マッチングで()使って$1使うとか。
次にタグの間で分割して取り出したURLをいれりゃぁええやろ。
669です。
ヒントを出してくれたみなさんありがとうございました。
無事に完成することができました。
693デフォルトの名無しさん:04/05/09 20:05
>>691 ありがとうございました。
CSV保存でSTDINのほうが楽な場合が多そうだけど、場合によっては
これも使えそうですね。
関数に文字列を渡す時にヒアドキュメントを使う場合、
foo(<<TEXT;
my text
TEXT
);
のように最初の終端文字列の後にセミコロンをつけるとエラーが出て、
省くと正常に動作するのですが
これはどのバージョンの perl でも同じですか?
ウチは 5.8 を使っているのですが、仕様なのかバグなのか良く解らないので。
↑のは引数を括弧で括った場合だけのようですね。
>>694
&foo(<<TEXT);
my text
TEXT
ああー、口では良く説明できませんが何となく仕組みがわかりました。
ありがとうございます。
>>697
もういっちょ補足。

my @array = (<<H1, <<H2, <<H3);
ヒアドキュメント1
H1
ヒアドキュメント2
H2
ヒアドキュメント3
H3

なんてことも出来る。
なんか気持ち悪いね・・・
>>699
鏡見ちゃったの?
>>700
いや、君を見ちゃったのさ
お〜い山田君!
>>701に座布団一枚!
<<HOGE から HOGE までを一括りと考えてはダメで
<<HOGEが変数と同じ、そして(少し離れたところで)ヒアドキュメントが始まり、HOGEで終わると考えよう。

そうすると foo(TEXT); がOKで foo(TEXT;); がNGなのはすぐに納得行くね
foo($a); と foo($a;); の違いだ。
>703
説明下手くそだな〜
今日はじめました!
しかし何から始めたら良いか分からない・・・w

誰か超初心者な問題だしてください。
>>705
あなたは何者ですか?
>>706
日本人です
ハズレ。出直して来い。
perllerです。
Perlistです。
711685:04/05/11 00:02
>> 685
どなたか分かりませんか?
よろしくお願いします。
713684:04/05/11 03:40
あの〜、どなたか…。
最近はSQLでなくXMLなんかも使われてきてるようですが…。
>>713
csv 使え。それで困ったら他の手段を考えろ。
>どなたか分かりませんか?
こういう質問の仕方をよく見るが、喧嘩うってんのかと思う。
アホウはテメエだけ。
716デフォルトの名無しさん:04/05/11 12:23
>>715
>こういう質問の仕方をよく見るが、喧嘩うってんのかと思う。
こういうつっこみの仕方をよく見るが、DQN度高いなと思う。
字義通りとるアホウはテメエだけ。

「おはようございます」に「はやくねえよ」と答える知能の低さ。
>>716
気にならないなら、さっさと>>685の質問に答えてやれよ。
それとも>>685と同類のアホウか?(w
そんなことより、俺は今日ヒアドキュメントのセミコロンの位置の意味がわかって感動した
(ありがとう >>696
ここは本当にプログラム技術を語る板なのか
>>719
それ思い込み
ここは分かったつもりになってるだけの初心者が何も分からない初心者の質問に答えるスレですよ
ちがうだろ、気に入らない質問のしかたをしてきた人をいびるスレだろ。
自分の気に入る質問が来ない暇人が適当にだらだらとレスるスレだろ?
雑談スレです
chompってなんて読むの?
ちょんぷ
超マジックパワー
チョン ( ´,_ゝ`)プッ
729685:04/05/12 19:18
もし質問の仕方が気に障ったなら申し訳ありません。
perlmagick で annotate を使って書き込むデフォルトのフォントは
あまりかっこいいフォントではないので、変更したいのです。
調べたところ、-font オプションで指定できるということは分かっているのですが、
どのようなフォントが指定できるのか、他から持ってきたフォントでも
使えるのか、そのためにはどうすればよいのか、が分かりません。
そのため、こちらでお分かりになる方がいらっしゃれば・・・とお伺いしました。
もし、お分かりでしたらぜひご教授ください。
よろしくお願いします。

>perlmagick を使って画像に文字を埋め込んでいます。
>その際にどのようなフォントが利用できるのか、
>また、どのようにして利用できるのか、が分かりません。
>できれば、HG創英角ポップ体にしたいのですが、こういうことは
>可能なのでしょうか?
分るけど教えてやんね、自分で何とかしろ
ここで質問しても返事なんて期待してはいけない
プラットホーム依存でいいならWin32::APIつかってDIBつくってDCつくって描画するのが正解。
%x% という文字列を aaa に置換する場合、
s/%x%/aaa/;
で良いでしょうか?s/\%x\%/aaa/ とエスケープすべきでしょうか?
どちらでも置換できてしまうんですが。
>>733
<q cite="http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlre.html">
Perlにおけるバックスラッシュ付きメタキャラクターはすべて
\b, \w, \n のように alphanumeric であることに気がついて
いるでしょ う。他の正規表現言語の幾つかのものとは異なり、
alphanumeric でないバックスラッシュ付きシンボルはありません。
ですから、\\, \(, \), \<, \>, \{, \} のようなものは常に、メタ
キャラクターではなくリテラルキャラクターとして解釈されます。
</q>
>>733
%はメタ文字ではない。だからエスケープする必要は無い。そのくらい調べろ。

>>734
的外れな回答は止めろ。
その文章では「英数字以外の文字をエスケープすると常にそのものとして扱われる」とあるだけだろ。
<q> は引用ですね(・∀・)ニヤニヤ
>どちらでも置換できてしまうんですが。
に対する回答にはなってると思うが

心の狭い奴が多いものだなぁ
738735:04/05/13 18:06
>>736
自分だけが特別物知りだと思い込むのは良くないな。
>>734<q>で囲まれてなければ「その文章では」ではなく「お前のレスは」とでも書くのが普通だろ。

>>737
なるほど悪かった。「的外れな回答」ではなく「中途半端で役に立たない回答」とでもするべきだったな。
質問者の質問は「エスケープすべきか否か」だぞ。



739733:04/05/13 18:40
>>734
なるほど。つまり % はメタキャラクターじゃないから \% としても % と同じことで、
わざわざエスケープする必要は無かったわけですね。
ありがとうございました。
まあ自信が無ければとりあえずエスケープしておけば良いよ。
\wとか全く使わないなら\Q使うのが楽だけど。
741遙皇 ◆HEHARUKAoo :04/05/14 00:07
citeには誰も反応しないのか・・・
>>741
どう反応すればいいんだ?
>>741
お前、恥ずかしい奴だな

745デフォルトの名無しさん:04/05/15 01:40
誰か骨のある質問してくれ〜〜〜〜
SMART! ウェブ講座の中の人たちはいつまで江ノ島旅行に行ってるのですか?
俺、最近思うんだけどさ・・・
Perlにオブジェクト指向って必要なのかな・・・?

・・・と、言うか、オブジェクト指向自体必要なのかと疑問に思う。
748デフォルトの名無しさん:04/05/15 10:50
モジュールの多くがオブジェクトで書かれているけど
>>748
それは何故なんだろうね・・・
オブジェクトにしなくてもいいような・・・
パッケージ概念があるんだから、変数の衝突もないし、
さらに、Perlのオブジェクトにはプライベート変数なんて概念ないし。

リファレンスで構造体を作成。
その構造体の変数にアクセスする関数を作成。

使う時は、その関数を呼び出すだけで、
無理にオブジェクトにする必要ないのでは・・・?と思う。
>>749
> 使う時は、その関数を呼び出すだけで、
> 無理にオブジェクトにする必要ないのでは・・・?と思う。
「関数を呼ぶだけ」と「メソッドを呼ぶだけ」の違いがそんなに無理なことなの?
>>750
そう、だからほとんど違いがないでしょ。
だから、オブジェクトにする意味があまりないような・・・って感じ。

Perlのオブジェクト指向って何のためにあるのだろう?って考えると、
C++とか使う人が、扱いやすいように。そんな理由から。
それ以外に利点が考えられないんだよね。

なんて言うか・・・
オブジェクトなんぞ必要ない!と言い切る人とかいてるけど、
最近、そういう人の気持ちが分かってきたような・・・
752名無し募集中。。。:04/05/15 14:54
記法に過ぎんと俺は割り切ってるが
結局構造体のリファレンス返す程度のもんでしょ?
753733:04/05/15 15:00
>>734
>>735
分かりました。ありがとうございました。

ちなみに、>>739 さん、私を騙るの辞めて下さい。
>>749
っていうかそれ自体が既にオブジェクト思考なんだと思うが。
指向とか嗜好とかでもいいんだけどね。
オブジェクト指向ってあくまで思想的なものだったりプログラムの
保守技術やら記述の美しさや再利用性とかそういうメリットを求めての
結果というかテクニックとか実装みたいなもんだろ。
言語仕様にあるのはあくまでオブジェクト指向を支援するものであって
そのひとが必要ないなら必要ないでいいし、使うとメリットがあると思えば
使えばいいだけのこと。あたりまえなはなし。

で、小さいプログラム作っているうちはあまり感じないが数百人を超える
プロジェクトとかになってくればそれだけ厳密性や独立性が大きく問われる
ことになりオプジェクト指向という一種の作法をみんなで使うことが重要だったりも
するってことやろ。
>>752
>>754
まぁ、な〜んとなくオブジェクトって物が無駄な気がして言っただけなんだけど・・・
オブジェクト指向を使えば保守性が格段にあがるとか、
あまりそうは思えないんだよな・・・
独立性も、オブジェクトを使わなくても独立性を持たせれるし・・・

しかし、オブジェクト指向って作法をみんなで使うって部分は利点があるな。
ちょっとなるほどと思った。
もう答え出てるかもしれんけど、同じ物(オブジェクト)をポコポコ作る時は雛型(クラス)があった方が楽じゃん。そんだけ。
ついでにいうと>>749は勘違いしてるかもしれんが、

# pacage Windowがあるとして
$window = &Window::new(); # 構造体へのリファレンスを返す
&Window::setup($window, @args)
&Window::show($window);

とか言うのも立派なオブジェクト指向になってる。それを

$window = new Window();
$window->setup(@args);
$window->show();

と書けるようにしただけ。
君が言ってるのは、「オブジェクトなんていらないジャン。変数$windowがあればいいじゃん」ってことだろうけど、
その変数$windowをオブジェクトって呼んでるんだよ。
>>755
>>757の例で言えば
後者の方がなんとなく(・∀・)イイ!!って感じれればそうかけばいいし
べつに前者みたいでいいじゃんって思えば前者で書けばいい。
保守性が格段によくなるわけじゃないけどなるべく簡素にかけたほうが
いいのはいうまでもないでしょ。何度もいうけど格段に変わるもんじゃあない。
非常につまらない例で恐縮だが
&Window::show($widow);
なんていうつまらんバグをやっちまう確率がへる訳だ。そういう効果もある。
バグなんて結構こんなつまらない勘違いの類いであったりもするだろ。
例えば変数のスコーピングに関してもより人間が管理する部分が減るだけ
バグの確率が減少する。
確率は0にはならないだけにこういう言語の仕様の活用で減らせるバグは
ほんの少しでも減らして行こうという姿勢もある訳だ。
759横入君:04/05/15 19:38

俺、あんま自分でオグジェクト作らんけど、あれだよね。
インポート式のモジュールはサブルーチンの名前空間汚す。
多少なりとも意識して使えば問題ないけど、なんとなく気持ち悪い。
オブジェクト指向はあれさ、パッケージ名一つ汚すだけ。

でもあれなんだよね、プロトタイプが使えないんだよね。
俺はルーチン作る時プロトタイプに頼りまくってる。

もしかして、間違ったこと書いてたら突っ込んでやって下さい。
OOの一般論は他のスレでやるべきだということはわかってるんだろう。
perlの実装がいいか悪いかという話ならともかく。
761デフォルトの名無しさん:04/05/16 00:37
while(<STDIN>){
  if($_ == 'a'){ print("a\n"); }
}
上のコードを実行して「a」以外の文字
例えば「b」を入力しても、if文が実行されてしまいます。
この書き方は間違ってるんでしょうか?
>>757 >>758
う〜ん?
その構造体がオブジェクトなの?
たしかに、オブジェクトと言えばオブジェクトなんだろうけど・・・
オブジェクト指向の利点の一つは、
グループ化して関数わかり易いですよ(?)ってヤツじゃないの?

たとえば・・・
$window = new Window();
$window->setup->size(200, 100);
$window->setup->color("red");
$window->show();

・・・みたいな。
この辺に、わかりやすさがあってみんな使ってたんだとばかり思ってた。
でも、これってあまり意味ないな〜とか思い出したって訳。
書き方も「$」が「&」になるか、「->」が、「::」になるかの違いだけで済むし。
たしかに、引数を書かないといけないから一行が少し長くはなるけどね。

でも、まぁ記法としてオブジェクト使うって言うのなら多少利点があるかな〜と思った。
Aさんは第1引数に構造体を渡してもらうのを期待してる関数を作って、
Bさんは第2引数に構造体を渡してもらうのを期待してる関数を作って・・・
そんな事になったら、わかりにくくなるしね。
・・・まぁ、引数の順番がめちゃくちゃでも大丈夫にする事もできるんだけど。

しかし、その構造体事態がオブジェクトだと言うのなら俺の勘違いですた。
・・・でも、C言語にも構造体はあるぞ・・・
でも、オブジェクト指向では・・・ まぁいいっか。
要は、好きにしろって事だね。(w
>>759
たしか、オブジェクト内でプロトタイプ宣言は無視されるんだっけ?
俺は、プロトタイプ宣言しない派なんだよ。
理由は、忘れちゃったけど・・・
それも、あまり意味がないって理由でプロトタイプ宣言を使わないようにした。

>>760
そりゃいえてるね。
じゃ、この話題は終了で。

>>761
if ($_ eq "a") { print "a\n"; }
Yes
765761:04/05/16 00:51
eqですか… ずっと困惑してましたので助かりました。
Perlは、C言語知ってる人には馴染みやすいとよく聞くんですが
どうもまだシックリきませんねぇ…
>>765
C屋なら、らくだの最後だけ立ち読みしといたほうがいい。
よけいな手間が減る。
>>765
文字の比較と数字の比較は違う。

数字で等しいと真 「==」
文字で等しいと真 「eq」
数字で等しくないと真 「!=」
文字で等しくないと真 「ne」

文字の比較で、大なり小なりの比較もあるけど、
あまり使わないだろうから、覚える必要なし。
768761:04/05/16 01:00
>>766
「プログラミング Perl」(通称青らくだ本)
という書籍があるみたいですね。
有意義な情報をありがとうございました。
769761:04/05/16 01:05
>>767
Perlは変数のデータ型がないんで、比較の時はキャストされるのだと思ってました…
文字と数値は比較の仕方が違ったんですね。
オブジェクト指向ネタは荒れがちな気がすると思いつつ。

オブジェクト指向的な考えは、現実の操作や状態なんかをもとに
設計したり実装するのに便利。例えばUIまわりとかね。

あと、保守も多少は楽になる。
少なくともコピペを繰り返すよりはいいし、仕事をしててよく依頼される
「似てるけど、ちょっと違う」処理を何度も書くときは重宝します。

というわけで自分の経験としては、趣味的なプログラムより
業務系のプログラムと相性が良い、という印象。
あと、ネットゲーみたいにバシバシ機能追加/変更するようなものも、
オブジェクト指向のほうが機能追加/変更しやすいです。


まあ、ラリーさんもオブジェクト指向の必要性は感じているから
Perl6はその辺りがより強化されるのでしょう。
個人的には楽しみにしてますけど、Perl6は人気ないっぽいのが残念。
>>769
型がないから「どうキャストすれば分からない」ため、
==とeqみたいな違いがある、と考えればよろしいかと。
>>762
> しかし、その構造体事態がオブジェクトだと言うのなら俺の勘違いですた。
> ・・・でも、C言語にも構造体はあるぞ・・・
> でも、オブジェクト指向では・・・ まぁいいっか。
Cでオブジェクト指向するって話はぐぐれば出てくる。
classキーワードがなければオブジェクト指向じゃないってのは偏見
Perl の場合は、例えば HTML::Template なんて
Perl にオブジェクト指向があって良かった一例だと思うよ。

何にせよ、既に言われている通りソレを必要だと感じている人が使えば良い。
>>762
構造体ですら、どうでもいいんだよ
言語仕様によるところのメソッド呼び出しだとか、構造体はどうでもいい
オブジェクト指向ってのは考え方なの
その考え方でコードを書くときに便利なように、幾つかの約束事が用意されていたり、強制されていたりするだけ

蛇足だけど、「オブジェクト指向」って言葉はおかしいんだよね
「オブジェクト指向ほげ」だとか「オブジェクト指向ふが」と言うべき
それをしないから混乱する。

オブジェクト指向プログラミングをする際に、オブジェクト指向プログラミング言語は必要じゃないよ
それこそC言語でも出来るし、BASICでも出来るんじゃない? 俺はやりたくないが(w
確かにオブジェクト指向的なコードを書くのにオブジェクト指向言語は必要ないね。
僕はPerlでプログラムを書いていて、ある日とつぜん
特定の関数群を呼ぶときは常に第1引数が特定のハッシュ変数になるのに気づいて
「あ」
とか思って、以降は素直にオブジェクト指向的な書き方をするようになったのさ(苦笑)。

776デフォルトの名無しさん:04/05/16 03:58
ちょっと、このスレの趣旨とズレているかもしれませんが
Perl用の開発環境とかエディタは、皆さんどういう物を使用してますか?
何か良い物があれば教えて頂きたいのですが。
     ∩  
     |∧∧     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (  ,)∩  <  >>777 が!!
     丿  ノ    \________
    〜  .つ
     し~

   彡


 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     |||  ガリ
     |||    ガリ
     ∩  .|||
     |∧∧ |||   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     (TД)∩  < オレの >>777 がぁぁぁぁぁああ!!!
     丿  ノ    \______________
    〜  .つ
     し~


 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
779776:04/05/16 04:21
>>777
こんなスレがあったんですね!
今からジックリ見て来ます。
どうもありがとうございました。
780デフォルトの名無しさん:04/05/16 07:47
何処かにPerlの日本語ヘルプはありませんか?
783デフォルトの名無しさん:04/05/16 09:48
緊急なので、お願いします!
print 100000000000000000000000000;
とすると、出力結果は
1e+026
となってしまいます。
100000000000000000000000000
と出力させるにはどうすればいいでしょうか?
よろしくおねがいします。
print "100000000000000000000000000";
785783:04/05/16 10:00
>>783
レスありがとうございます。
変数に、
$x = 10000000000000000000000000;
と入ってる場合はどうすればよいのでしょうか?
変数に何が入ってたって、>>784 で問題ないと思うが。
787783:04/05/16 10:17
>>786
$xには数値の1000000000000000000が入っています。
誤解させてお面なさい!
>>787
> $xには数値の1000000000000000000が入っています。

はぁ ?
「変数に何が入ってたって」 って書いてあるんだが...。
>>786
ワロタ

>>787
イヤイア、786は$xに123が入ってても
10000000000000000000000000がプリントされるぜ。
それがお望みなんだろ。

こういうのもある。
use Math::BigInt;
$x = Math::BigInt->new(10000000000000000000000000);
print $x,"\n";
perl -e "print sprintf('%.0f',10000000000000000000000);"
791783:04/05/16 10:45
すいません!
どれも、1111111111111111111111111111111111の場合うまくいきません。
本当に説明不足でごめんなさい。
>>791
それは、変だな。
俺の環境なら、ちゃんと
100000000000000000000000000
と出力される。
PC を買い換えるか、プログラマに向いていないとあきらめることを推奨する。
793783:04/05/16 10:53
100000000000000000000000000
と出力したいのではなく、
1111111111111111111111111111111111
と出力したい場合です。
>俺の環境なら、ちゃんと
>100000000000000000000000000
>と出力される。
プッ、日本語勉強しようね。792ちゃん。
>>793
792は無視しといていいよ。
795アヒャヒャヒャ:04/05/16 10:56
print "1111111111111111111111111111111111";
ワロタw
>>794
> プッ、日本語勉強しようね。792ちゃん。

ネタにマジレス、かっこいいなぁ。(藁
>793
・BigIntを使う
・コードに数値を直接書き込まない。newには生の数値でなく文字列を渡す

OK
perl -MMath::BigInt -e "print Math::BigInt->new('1111111111111111111111111111111111')"

NG
perl -MMath::BigInt -e "print Math::BigInt->new(1111111111111111111111111111111111)"
792はマジで勘違いしたのだと思うが。
800783:04/05/16 11:06
みなさん、親切にレスありがとうございます。

2**1000
などの計算の場合はどうすればいいでしょうか?
>800
もちろんMath::BigInt のperldoc は見てから質問してるんだろうな?
802780:04/05/16 11:09
>>782
情報をありがとうございます!助かりました!

>>781
はは…
>>799=>>794 なのか ?
「プログラマに向いていないとあきらめることを推奨する。」
と書いておけば、ネタだと言うことに気づくと思ったが、俺もまだまだだな。(藁
>>800
1に2を1000回掛ける
>>804
   2 * 2 ⇒ 4
   4 * 4 ⇒ 16
☆ 16 * 16 ⇒ 256
   256 * 256 ⇒ 65536
☆ 65536 * 65536 ⇒ 4294967296
☆ 4294967296 * 4294967296 ⇒ 18446744073709551616
☆ 18446744073709551616 * 18446744073709551616 ⇒ 3.4028236692093846346337460743177e+38
☆ 3.4028236692093846346337460743177e+38 * 3.4028236692093846346337460743177e+38 ⇒ 1.1579208923731619542357098500869e+77
☆ 1.1579208923731619542357098500869e+77 * 1.1579208923731619542357098500869e+77 ⇒ 1.3407807929942597099574024998206e+154

として、☆ がついている数値を掛けると言う方法もあるよ。
>>805
んな事しっとるわい
はいはい、あとからなら何でも言えるからねぇ。
ていうか、どうしてperlは16桁以上の数値をあんな形にするのよ?
>>807
阿呆だね、尾マイは。783を囲んで駄弁る会をぶち壊すような真似はすんなょ。
ところで、783は逃亡か(w
CGI初心者です。
あるCGIから別のCGIにPOSTするにはどうしたらよいですか?
また、その際に送信側でパラメータのセット、
受信側で取得する方法も教えてください。
ちなみにPerlのバージョンが古いので
CGI.pmモジュールは使えません。
cgi-lib.plか何かでできないものでしょうか?
どなたかお知恵を。
>>811
WebProg板へ
>>811
板違い
浮動小数点くらい学校で習うよなぁ。
学校で習うつーより一般常識だろ
流石に一般常識では無いだろ(w
コンピュータ使ってりゃ常識だけどな

817デフォルトの名無しさん:04/05/17 09:37
浮動小数点計算は小学生で勉強します。
818デフォルトの名無しさん:04/05/17 10:15
たぶん浮動小数点計算という言葉に面食らってるのかも知れない。
819デフォルトの名無しさん:04/05/17 10:46
面食らってるのは「浮動小数点に」ではなく、「指数表記に」ではないのか?
820デフォルトの名無しさん:04/05/17 14:08
複数行(行数不明)のファイル(test.txt)
--test.txt--------------
1=2=3
4=5=6



7=8=9
------------------------


open(FIL, "test.txt")
@mes = <FIL>;

foreach(@mes){
@w = split(/=/, $_);
push( @$DataArray, \@w );
}
print LOG "[0][0]:$DataArray->[0][0]\n";
print LOG "[1][0]:$DataArray->[1][0]\n";

結果が以下ののようになり最後のレコード分のデータしか格納されません。
[0][0]:7
[1][0]:7
どなたか、全てのデータを上手く格納する方法教えて頂けないでしょうか。
>@w = split(/=/, $_);

my @w = split(/=/, $_);
822デフォルトの名無しさん:04/05/17 14:28
Cのコードの
#include <stdio.h>
void set_a(int *p);

int main()
{
int a[10], i;

  set_a(a);
  for(i = 0; i < 10; i++){ printf("%d ", a[i]); }
  return 0;
}

void set_a(int *p)
{
int i;
  for(i = 0; i < 10; i++){ p[i] = i; }
}

と同じコードをPerlで書こうと思って
以下の様に書いたのですが、配列にうまくデータを格納出来ません。
正しい書き方を教えて頂けませんか?
@a;
set_a(@a);
foreach $i(@a){ print("$i "); }

sub set_a
{
  for($i = 0; $i < 10; $i++){ $_[$i] = $i; }
}
>>820
open FIL, '<' . 'test.txt' or die $!;
while (<FIL>) {
  chomp;
  push @$DataArray, [ split /=/ ];
}
perl -e 'sub{for($i=0;$i<10;$i++){$_[0][$i]=$i}}->(\@a);for(@a){print "$_ "}'
>>822
それ、関数内で書き換えただけで終了してるぞ。
結果を受けないとダメに決まってる。

2行目
@a = &set_a(@a);

関数内で最後書き換えた値を返す。
return @_;

それと、関数呼び出す時は、「&」を頭につける。
付けたくない場合は、関数を使用前に作る。
main関数内で使う関数は、プロトタイプ宣言するか、
main関数より前に定義しておくってのはC言語と同じだろ。
>それと、関数呼び出す時は、「&」を頭につける。

これは間違いでしょ。リストを付ける、これが正解。
>>827
正直、お前は必要ない。
829822:04/05/17 15:06
>>825
配列はポインタで渡して、関数内で書き換える事が出来ないんですか?
普通の変数は、参照渡し出来ますよね。
$d = 0;
&set_d($d);
sub set_d{ $_[0] = 10; }

>関数呼び出す時は、「&」を頭につける。
>付けたくない場合は、関数を使用前に作る。
822のコードでも普通に動くみたいなんですが、
「&」を付ける意味って何なのでしょうか?
>822
ラクダ本の参照について書いてあるところ読みなはれ。
その例は参照渡しにすらなってない。

>「&」を付ける意味って何なのでしょうか?
Perl4はサブルーチンの呼び出しに&をシンボルの頭につけてた。
これは古い仕様。Cのようにカッコをつけるか、プロトタイプ宣言して
カッコを省略するかどっちか。
&set_d(\$d);
sub set_d( local(*d)=@_; $d[0]=10;}
>822 スマソ
@_に関しては少し特別だったの忘れてた。
ただし関数の引数がC++で言うところの「参照」と同じ扱いに
なるのは、いくつか条件があったはず。俺は紛らわしいから
いつもリファレンスでやり取りしてるけど。
833822:04/05/17 15:24
>>830
>その例は参照渡しにすらなってない。
う〜んでも、関数から帰って来た後、print("$d")で表示すると
しっかり「10」になってるんですが…
これって参照渡しとは違うのですかねぇ?

>Perl4はサブルーチンの呼び出しに&をシンボルの頭につけてた。
>これは古い仕様。Cのようにカッコをつけるか、プロトタイプ宣言して
>カッコを省略するかどっちか。
結局どういう事なのかイマイチよく分からないのですが、
うちの環境、ActivePerl5.8.3だと、関数呼び出し時に
&付けようが付けまいが、括弧付けようが付けまいが
プロトタイプ宣言しようがしまいが 全部普通に動くんですが…
>>830
知ってて言ってるならいいが

sub foo { print "[@_]\n" }
sub bar { print 'bar:'; foo }
sub baz { print 'baz:'; &foo }
sub boo { print 'boo:'; &foo() }

bar(1,2,3); # bar:[]
baz(1,2,3); # baz:[1 2 3]
boo(1,2,3); # boo:[]

>>833
>>827 は読んだか?
>>833
好きにしろ。

ただし、お前のソースは読みたくない。
836822:04/05/17 15:33
>>834
見過ごしてました。
今からじっくり見てみますよ。
>>833
ここで聞いても正確な答えが返ってくるとも限らないからラクダ本嫁としか言えない。
俺が言い得るのは、関数呼び出しに&をつけるのは古いということだけ、か。
暇なPerlerの人が答えてくれるかも。

>sub baz { print 'baz:'; &foo }
この書き方大嫌い。動的スコープ死ねw
>>832
引数のリストは展開されたあとにそれぞれの要素が一つずつスカラーへのリファレンスと
して@_に頭から入れられるので、f($d)なら必ず$dを変更することはできるが、f(@a)だと
@aのその時点で存在するところまでしか変更できない。極端な話@aがまだ空ならなにも
できないということじゃないかな。

とはいえわかりにくいのでオレもすぐにmy(〜) = @_;で受けてしまうし、引数で値返したければ
リファレンス使うようにしてるね。
>>838
>f(@a)だと
>@aのその時点で存在するところまでしか変更できない。

あ、なるほど。
教えてください。。。

use strict文を使うと定義されていない変数は怒られますよね。
Can't use an undefined〜、とかって。

ソースにですね、
@aaa = @{$bbb}
とか
foreach(@{$bbb}){

とか書きたいのですが、
@{$bbb}を定義しろと怒られてしまいます。

use strict文を使用すると上記のような書き方はできないのでしょうか?

ご存知の方、お教えくださいませ。。。
>>841
わーできました!
ありがとうございます!!
サーバーの管理人(root)でない人がCPAN入れることは可能ですか?
しょうもない質問かもしれませんがよろしくです。
845822:04/05/18 09:28
827のサイトを見てると、Perlは古い文法が残ってたりとか
関数にも色々な書き方のパターンがあったりして分かり難いですね…

で、結局PerlではCみたいに
配列を別のポインタで操作するみたいな事は出来ないんでしょうか?
Cでいうこんな感じ↓
int a[] = {0,0,0};
int *p = a;
for(int i = 0; i < 3; i++){
  p[i] = i;
  printf("%d ", a[i]);
}
@a=(1,2,3);
*p = \@a;
print "$p[0], $p[1], $p[2]\n";
>>845
Perl と C は別の言語なので、C の概念や流儀は捨てて考えた方がいい。

my @a = (0, 0, 0);
local *p = \@a; # no strict 'vars'
for (my $i = 0; $i < 3; $i++) {
  $p[$i] = $i;
  print "$a[$i] ";
}
848822:04/05/18 10:10
>>846
なるほど。
どうもありがとうございました。
849822:04/05/18 10:14
>>847
ご丁寧にありがとうございます。
確かにちょっと頭を切り替えた方がいいかもしれませんね。
すいません 質問があります。
perlでsetuidを立ててsystem関数を動作させようとしている
cgiがあるのですがアパッチのログには下記のように出てうまくいきません。
Insecure dependency in system while running setuid at createHomeDir.cgi


このcgiスクリプト内では
my $result = system("mkdir /home/hogehoge");
とディレクトリを作成する作業をしようと思っています。
スクリプトを作成した後
#chown root createHomeDir.cgi
#chmod 4755 createHomeDir.cgi
とやってrootで動作させるようにしているのですが、、、

何か情報をお持ちなかたはお教えいただけますとありがたいです。
851851:04/05/18 19:49

すいませんCGIの質問は
WEBプログラム板ですね。
失礼しました。
852850:04/05/18 19:50
どっひー ↑は850です。

えーっと板違いなのは重々承知ですが
850の情報をお持ちな方はご教授いだだけますとありがたいです。
>>852
ダメです。
>>852
useradd すればいぃのでは?
perl=>CGI 繋がりで webmin なんていかがです?
>>852
setuidしてるからtaintモードで実行されてるので、
本当にsystemにそう書いてるんなら、環境変数が
汚れてるんだろうな。

とりあえずperlsec(1)よく読め。ぐぐれば日本語訳も
みつかるだろう。
>>850
動くかどうかわからないが、-Uつけてみれ。
#!/usr/bin/perl -U
857デフォルトの名無しさん:04/05/19 00:51
いったい何時になったら日本語が使えるの?
世界中のハッカー諸君がんばってよ
いったいどういうコードかいてんの?
859デフォルトの名無しさん:04/05/19 01:37
いつまでたっても日本語つかえねーじゃんかよ
バグばっかでw
Perl改めApacheにしろよ>Larry
>>858
いや、日本語の勉強してるんだろ。
いつまでたっても(俺は)日本語つかえねーじゃんかよ
(俺の頭が)バグばっかでw
862デフォルトの名無しさん:04/05/19 01:55
じゃあ、perlで日本語つかるってとこみせてみろよ
放置で頼む皆の衆
>>862
Perl 5.8では既に多国語対応はかなりのところまで来ている。
http://d.hatena.ne.jp/tateisu/20040112

お前の使ってる安物プロバイダがどのバージョンのPerl使ってるかはしらねーけどな。
日本語つかる
UTF-8 使えるし、文字コード変換もあるし、だいぶ使い物になる気がするんだが
use utf8;

binmode($_, ":encoding(cp932)") for STDIN;
binmode($_, ":encoding(????)") for STDOUT;
$input=<STDIN>;
print STDOUT $input;

というプログラムにcp932の"〜"を食わせてeucの"〜"が出てくる
ようにするには????の部分に何を指定すればいいですか?

よくわからんが、それが普通にできる処理系ってあるのか?
最近のiconvだとEUCJP-MSとか使えるようになってるでしょ。
perlではどう書くのか知らないけど。
perlの問題じゃなくてUnicodeの変換テーブルの問題だな。
Unicode作ってる団体に抗議しとけ。

現実的な対応はこんな感じ。

use utf8;
{
package Encode::MyEUCJP;
use base qw(Encode::Encoding);
__PACKAGE__->Define(qw(MyEUCJP));

sub encode{
$_[1] =~tr/\x{ff5e}/\x{301c}/;
return Encode::JP::encode("euc-jp",$_[1],$_[2]);
}
sub decode{
die "not implemented\n";
}
}

binmode($_, ":encoding(cp932)") for STDIN,STDERR;
binmode($_, ":encoding(MyEUCJP)") for STDOUT;
$input=<STDIN>;
print STDOUT $input;

〜 だけじゃなく http://euc.jp/i18n/ucsnote.ja.html にある文字も処理することになるだろね。
871867:04/05/19 12:18
>>870
新しいEncodingをPerlで書いて追加できるってのはおもしろい
ですけど、ここまで大掛かりにやらないとならないものだった
とは... 単に自分の検索能力が低くて名前を見つけられてない
だけだと思ってましたが本当になかったのですね。回答ありが
とうございます。

Perlを使ってDNAからRNAへの転写をしようとしてます。

print "転写したいDNA配列を入力してください。\n\n\n";
$dna = <STDIN>;
chomp $dna;#改行コードを除く
if ( $dna =~ /^\s*$/ ){#何も入力がないなら
exit;
}
$DNA = "\U $dna \E";#大文字に変換
#####
$RNA = reverse $DNA;#逆にする
$RNA =~ tr/ATGC/UACG/;#AはU TはA GはC CはGに変換
print "転写されたRNA配列は\n";
print "$RNA\n";
print "です。\n\n\n";
exit;#終了

######の部分に
「ACGT以外の文字があった場合はプログラム終了」
というのをしたいんですが、
if ($DNA =~ /[^ACGT]/ ){
exit;
}
ではうまくいきません。
どこがいけないんでしょうか?
$DNAには常に空白が入ってるから、その正規表現には常にマッチする。
874872:04/05/19 14:47
$_ =~ s/\s//g;だ!
忘れてました。
むしろ
$dna = <STDIN>;
$dna =uc $dna;
$dna =~s/[^ACGT]//g;
length $dna or exit;
では?
876872:04/05/19 15:00
できましたできました。
ありがとうございます。
ありがとうございます。
>>875
それだとACGTが一文字でもあれば、他の文字がさりげなく
削られて何事もなかったかのように先に進んでしまうような
気がする。

$DNA =~ /^[ACGT]+$/ or exit;

とかの方がいいんじゃないだろうか。
878名無し募集中。。。:04/05/19 15:58
die if $DNA =~ tr/ACGT//c;

これでもいけるな
879デフォルトの名無しさん:04/05/19 18:45
みなさんこんにちは。

今回は教えを乞いたくてやってきました。
私は今、sendmailを使ったメール転送CGIに取り組んでいます。
ところがやってみると
No recipient addresses found in header
というエラーがでました。
これは、受け取り側アドレスがヘッダーの中にないというような
内容だと思うのですが、
To: $mailadr_toと指定していますし、変数にもアドレスは入っているのです。
あれこれいじってみても結果がかわりません。
if(open(SENDMAIL,"| $sendmail")){;
print SENDMAIL <<"EOM";

To: $mailadr_to
EOM
close(SENDMAIL);
}
受け取り側部分を取り出すとこんなソースです。
$sendmailのなかはsendmailのパスが-tをつけて入ってます

お気づきの点があれば、教えてください。

>>879
http://pc5.2ch.net/tech/
>Javascript は Web 制作板、CGI は Web プログラミング板へ。
>>879
>お気づきの点があれば、教えてください。

CGIとsendmail(8)の質問であることに気づいた。



open(F, "| /usr/sbin/sendmail -t");
print F <<EOS;
To: [email protected]

body
EOS
close(F);

ヘッダパートとボディパートは空行で区切りだこんちくしょう
手で sendmail 叩いて実験しろうんこ
ここの連中は絶望的に親切だな
883デフォルトの名無しさん:04/05/19 21:38
正規表現万歳
性器表現万○
あなたは知らない。親切の裏に隠された本当の真実を…
886デフォルトの名無しさん:04/05/20 08:58
世界人類総Perler化計画……



うわだれだやめろなにをすr
887デフォルトの名無しさん:04/05/20 10:12
組み込み関数の乱数を発生させる関数より、
もっとユニークな乱数を発生させる関数ってないですか?

組み込み関数の乱数だと、変に同じ数字がつづく事があるんで・・・
変に同じ数字が続くのも乱数といえなくもない。
同じ数字がまるで続かないのもそれはそれで
不自然だろ?(笑)

とりあえず最近のOSなら/dev/randomから読む
のが最強といっていいのだろうか? 手軽に使う
ならCPANのCrypt::Randomとかね。

ただモンテカルロ法みたいにたくさん必要だと
/dev/randomじゃ足りないと思うので、適当な
擬似乱数を使うことになるだろう。
Math::RandomとかMath::Random::MTとか試して
みるのがいいんじゃない?
890デフォルトの名無しさん:04/05/20 11:13
>>888
いい加減、うざいからやめてくれ。
>>890
オマイのほうが(ry
>890
別にここ初心者スレじゃないし資料読ませりゃ大抵わかるだろ。
それでもわからんなら仕方ないけど。
>>890が何に切れてるのか分からないのはオレだけ?
>>893
リンク先を見ようともしない奴なんだろ
>>893
サイトの宣伝だと思ってるんだろ。
896デフォルトの名無しさん:04/05/21 11:46
sjis 漢字コードかどうか調べる部分ですが、

my $c = ord substr($str, $pos, 1);
if (($c >= hex("81") && $c <= hex("9F")) ||
 ($c >= hex("E0") && $c <= hex("EA")) ||
 ($c >= hex("FA") && $c <= hex("FF"))) {

こんなBasicみたいな、Cみたいな書き方でないPerl風の
もっといい方法を教えてください。
$str =~ /^[\x81-\x9F\xE0-\xEA\xFA-\xFF]/
hex("81") => 0x81 (16進数値を書く記法がある
ord substr => ord $str (ordは文字列の先頭1文字を見る
899896:04/05/21 12:01
>>897 ポン!そうですた・・・ありがとうございます。
>>898 難しく考えすぎてました・・ありがとうございます。
900デフォルトの名無しさん:04/05/21 13:25
>>893
リンクを貼るだけで回答した気になっているのが気に入らない。
BSDのman嫁もそうだけど、リンクを示すなら、
該当箇所のヒントぐらい与えないと、ハッキリ言って
情報価値ゼロ。本人は得意げにリンクを貼るぐらいだから
そのドキュメントに書かれていることに熟知してるんだろ?w
>>901
>該当箇所のヒントぐらい与えないと、ハッキリ言って
>情報価値ゼロ。

んなこと言ってるから、いつまでもアホウのまんまなんだよ。
>>902
だったら放置すればいいだろ
>>888
はきちんとした回答だと思うが。情報価値ゼロとか言ってる香具師はリンク先見てないだろ。
905デフォルトの名無しさん:04/05/21 14:22
>>904
せめてなにか一言でもかけ。
age荒らしの言うことなんかどうでもいい。
perlでAutoIt(他アプリケーションの操作の自動化)みたいな事出来ますか?

荒らしじゃないですよ、一応言っとく。
何処かに初心者板とかないですかね?
Win32::APIたたけば可能は可能。
しかしそれに特化した利便性はない。
>>907
Win32::GuiTest使ってみたら?
910893:04/05/21 18:14
つまり>>890 = >>900 = >>905>>901
単にやる気がない人ってことか。
リンクだけ貼るやつは知ったかの臭いがしていやだってこと。
>>911
ソースの先を我がものでコピペするより1024倍好感が持てるが?
913デフォルトの名無しさん:04/05/21 18:47
受け取り方の個人差なんだからガタガタいわんと。
RTFM! は昔からの伝統で

ぐぐれ は、今の常識だろーよ。

少なくとも俺は機嫌が悪くても、正答のヒントくらいは書く。
http://search.cpan.org/search?query=random
の方はともかくとしても

http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlfaq4.html#Why_aren_t_my_random_numbers_ran
の方はヒントの書き様もクソも無いだろ
リンク先どころかURLすらも読んでない奴にバカ丁寧にしてやる必要があるのかねぇ
916デフォルトの名無しさん:04/05/21 20:34
こんばんは。
perl勉強中の名無しです。
今、TSVに区切られたファイル(約200件)を、
Postgresのテーブルに流し込むということをやっています。
調べてみたところ、Postgresに[copy]コマンドというものを発見。
これで流し込む事は出来ました。
しかし、copyはPostgreSQLのプロンプトでしか使えないようです。
perlの中で[insert]文を書いて流し込みたいのですが、
この場合どのような書き方をすれば良いのでしょうか。
どうぞ宜しくお願いいたします。
>>917
ありがとうございます。
DBD::Pgですか。
ド頭に宣言するアレですね。
今日は徹夜でやってみます。
結果は後ほど報告まで。
919デフォルトの名無しさん:04/05/21 20:59
うざい性格。。。
perlの場合ドキュメントはそこそこ読みやすいからな。
親切に書かれてるものをさらにくだいて書く必要があるかどうかってのがポイントだろ
誰が書いても同じものを書き直すのはただの手間でしかない。
○○嫁っていうの、文系DQNみたいでなんかいや
ドキュメントを参照すれば正しいし、関連する事も書いてるし
それで不十分ならその旨質問すればちゃんと答えてくれてるだろ
何が気に入らないのか分からんな

「man読め、CPAN行け」だけなら俺もちょっと酷いかとは思うが
具体的なポインタまで示してくれてるんだから十分に親切だと思うぞ
このスレ的にはラクダ本のページ数で答えよう。
そうすれば本も売れてウマー
924デフォルトの名無しさん:04/05/21 22:27
じゃあ2nd Editionで。
ラクダ本高くて買えない。。。
実は誰も第3版持ってない予感
>>926
意外と有り得るかも、持ってたとしてもほんの数人じゃない?
以前からPerlやってりゃ要らないもん、特に2版とか持ってる人は

趣味的にやってみよう、とか思ってプログラミング初心者なのに買いましたよ3版。
順当に初めての〜から買うべきだったのかと思ってちょっと欝。
テキストをHTMLにコンバートしたかったんです。
あと自作の掲示板とか。
>>927
新機能の差分は欲しいんだけどねぇ。
Cookbookのほうが重宝するですよ。

930907:04/05/22 02:06
レスくれた人ありがとう、頑張ってみるよ。
>>928
ちょっとすればラクダ本買ったことが間違ってなかったことに気がつくよ。
それまでの辛抱。
ラクダ本もそうだが、ラマ本とかあのシリーズは翻訳がカスだからいけない。
理系人間が生真面目に正確に翻訳しただけの技術文書。
プロの翻訳家が翻訳すればもっとわかりやすくて魅力的な文章になりperlにより親しめるというものだがな。
日本語訳なんだから変数名も$hanakoとか$tarouとかに変えればいいんだよ。
@sushi = qw(toro ikura hirame);とか。

あのくそ面白くも無い翻訳文章を、何度も何度も読み返して体に慣れさせないとラクダ本は読了できない。
苦痛でしかないと思うが、>>928ガンガレ
体がラクダになれた頃、君は一皮剥ける。
木佐貫は「ムケてない」堀内監督が酷評
http://news14.2ch.net/test/read.cgi/mnewsplus/1084965631/
>>932
そりゃ訳者に言い過ぎ。
935928:04/05/22 10:29
>>931
がんばります。

>>932
2巻はまだ買ってないし、プログラミング用語にも疎いので、スカラーとかレキシカルとか難しい
英語は(時々日本語も)意味を調べなおして自分で訳しなおさないと理解できなかったりしますw
スカラーコンテキスト→単数扱い、リストコンテキスト→複数扱い、評価→判定とか
まぁ、文系なので・・・・・・
>>928
古いラクダ本持って無いなら、買っても間違いじゃないと思うよ
正しく歩けるから、そこらのCGI向け初心者本とか買うよりはずっと正解
>>936
「初心者のためのPerl」じゃなくて、「初心者が書いたPer」だろ、
って言いたくなる本もあるしね。

>>932
オライリー本のほとんどは訳者がわかって訳してる。
それだけでコンピュータ本の翻訳としては平均以上。

>>937
訳者がわかって訳していても、その本を読むPerl初心者が取っ付き難いのが問題だといっているんだよ。
オライリー本を訳したのは訳者であって翻訳家でないというのが我々の不幸。
英語の言い回しをそのまま忠実に訳すから日本語になった時面白くない。
ラクダ本の訳にケチつけてるやつら…
一度「プログラミングC++」の訳読んで見れ。泣くから。
オライリー本(訳書)は
「日本語から英語(原文)を想像してそれを日本語に訳す」
のが正しい読み方だと俺は思ってる。

「プログラミング言語C++第3版」の訳はあまりにもひどすぎる。
訳者に「ニホンゴワカリマスカ?」って聞きたくなるし
正誤表を印刷したら26ページにもなったし
そこに載ってない間違いも少なくないし...
まあPerlスレで言うことじゃないか。
ことさら騒ぐほど訳のひどい本とは思わんけどなあ。
むしろかなりましな部類だと思う。
>>938の要求が過剰なだけ。
忠実に訳してもらえば原語の想像はしやすいが、こなれた訳だと全然想像できなくなるので、
難しい問題ではある。一つの語を全然別の語に訳しなおすとか。
>>938
存在するならば、コンピュータ書籍を翻訳できる翻訳家を列挙してくれ。
「リファクタリング」の訳はまともじゃないかな。
946デフォルトの名無しさん:04/05/22 15:49
パスの通っていないところにある perlのファイルを全く違うところから
相対パスなどで実行するとき、

$ ../../tools/mytool.pl foo.txt

そのperlファイルが自分と同じディレクトリにあるライブラリをrequireで
呼んでいる場合、下のように実行パスを調べて付加してやらないと
カレントを探してないといわれていまいます。

#/usr/bin/perl
#mytool.pl
if ($0 =~ /^(.*\/).*$/) { $epath = $1; } else { $epath = './'; }
require $epath .'mylib.pl';

なにかもっといい方法があるのでしょうか?
my $path=$0; $path=~s/[^\/\\]+$//; require $path.'mylib.pl';
Win の ActivePerl 5.8.3 で日本語を使おうと思ったら、なんかすごく訳わかんないんですけど・・・
use utf8 とか use encoding 'shiftjis' して、
-f に utf8 で全角を含む文字列を渡すと結果が間違いとか。(多分このせいで File::Find がおかしくなるとか)
system ('echo OKあ'); の結果が予想したようにならないとか。
なんか設定があるのかと思って探しましたが、見つかりませんでした。

(元が Unix のツールだから、システムコールで unicode は考えてないのかと思いましたが、
open は大丈夫なのでちょっと不思議だなあ、と)


use utf8 とか use encoding 'shiftjis' しないと、SJIS でスクリプト書くの大変ですし。

みなさんスクリプトやデータに日本語(SJIS)使いたい時、どうしてます?

use encoding や use utf8 しないで、EUC でスクリプト書いて、I/O を jcode などで自分で変換するのが
一番確実な気がしてきました。(特に unicode を使いたい訳でもないので)
が、そんなもんなんでしょうか?

今書いてる奴は実行環境の問題で jperl は使えないし。
>>948
こんなのは。
use encoding 'shift_jis';
use Encode;
sub en{
    encode('shift_jis',$_[0]);
}
sub de{
    return decode('shift_jis',$_[0]);
}

my $path='c:\test';
opendir(my $dir,en $path);
my @files=grep {$_ ne '.' && $_ ne '..'} map {de $_} readdir($dir);
closedir($dir);
たぶんファイルの文字コードを指定できるように、
ファイル名の文字コードやコマンド引数の文字コードを
指定しとくとunicode文字列を適当に変換してくれる
ような仕組みも必要なんだろうね。いちいち自分で変換
するなんてめんどくさくてやってられん。
951949:04/05/23 00:41
追記
Win32::OLEとかを使う時などは結構役に立つと思う。
myopendirとか作ってラップするという手もあるけど、この手法なら非標準の出力先・入力元(Win32::OLEなど)でも使えるので。
ただし入出力するものにde en とつける必要があるが(ただdecodeとかそのまま使うよりは楽)
system (en 'echo OKあ');
>>950
読み込んだり書き出したりする時に文字コード変換する仕組みはあったと思うぞ。
my $sjisfile='sjisfile.txt';
my $utf8file='utf8.txt';
my $eucfile='euc.txt';
open my $in,  "<:encoding(shiftjis)", $sjisfile or die;
open my $out, ">:encoding(utf8)",   $outfile or die;
open my $out2, ">:encoding(euc-jp)",   $outfile or die;
while(<$in>){print $out $_;print $out2 $_}
close($in);
close($out);
close($out2);
ファイル名とか、システムコール/APIに渡す文字列をエンコード/デコードする仕組みがどうって話しじゃないの?

ストリーム中のデータはPerlIOが処理してるれるけど、それじゃなくて。
953948:04/05/23 23:42
私もとりあえず自分で SJIS 変換してごまかしたんですけど、
それだと結局、ファイル名に SJIS にない Unicode 文字使われた時に File::Find::find が
おかしくなるとか、結構ツライんですよね。

個人的にはいらないんですけど、Win だと意識せずにファイル名に使ってる人とかいるんで。

open のファイル名では使えたような気がしたんですけど、今ためしたらダメでした。

なるほど、現時点の Perl では、ストリームI/O でしか Unicode を意識してないって事ですか?
それならそれで判断しやすいんで、当面は自分でコード変換しますけど・・・。

そもそも Win 版は ANSI 版の API しか使ってないのかな。
最近 Win では ActivePerl しか使ってないけど、本体を自分でビルドしたら変わるかもしれないですね。
ヒマできたら調べてみよ・・・
954948:04/05/23 23:49
そういえば、find については、普通の SJIS 文字でもおかしくなった事がある気がします。
別の原因だったかもしれないですけど。
955948:04/05/23 23:52
たびたびスンマソン。
私の勝手な思いとしては、変換というよりは、システムコールが Unicode 対応なら
そのまま渡すと思っていたんですが、結局はそうじゃないんですね?
Perl自体がUnicode対応でも、モジュールが全てそうだというワケではないよ
File::Findについては調べてないけど
957325:04/05/24 10:54
>>938
オライリーの本、そんなにわかりにくいとは思わないけど。。。
オブジェクト指向perl勉強しようと思ってマスターコース読んだけど、
イマイチしっくりこず、「実用perlプログラミング」読んで目から鱗でした。
958教えてモンゴメリー伯爵:04/05/25 01:24
たとえばだ CSV形式のデータ 1,2,3,4,
               a,b,c,d
              あ,い,う,え
というデータがあるとしよう。
これをだな
              1,a,あ
              2,b,い
3,c,う

というふうにしたいわけだが....
どうしたらいいのじゃ

959教えてモンゴメリー伯爵:04/05/25 01:27
明日またくるからなー
>>958
@csvData1 = split (/,/, $csv1);
@csvData2 = split (/,/, $csv2);
@csvData3 = split (/,/, $csv3);

for ($i=0; $csvData1[$i]; $i++) {
$newData = join (',', ($csvData[$i], $csvData[$i], $csvData[$i]));
push @newCsvData, $newData;
}

実際動かして試してないから、わからんが、
これで行けんだろ。
眠いから寝る。
>>960
間違えた。
>$newData = join (',', ($csvData[$i], $csvData[$i], $csvData[$i]));

ここの所。
$newData = join(',', ($csvData1[$i], $csvData2[$i], $csvData3[$i]));
へ変更。
このスレのやつらはどんなエディタつかってんだ?


スレ違い?
大昔 WordStar
昔  Vz
今  Meadow
emacs cperl-mode
965デフォルトの名無しさん:04/05/25 10:13
サクラエディタ
Jedit
vi
って、なんか上の方にも似たような話なかったか
別に埋め立てるためだからって
手垢のついた話題、無理に持ち込まなくてもいいぞ
> aaa.pl *.txt
と指定したとき、ファイル名の大文字・小文字の違いを無視して
ファイルを読み込ませる方法ってありますか?
>>969
意味ふめー

> aaa.pl *.txt
でどうになって欲しいの? (どこがまずいの?)
拡張子が、txt、TXT、Txtみたいに大文字小文字がバラバラでも、
*.txtって指定したら全部対象になるようにしたい。

元々がDOS使いの人間で、ファイル名の大文字小文字の違いを意識してなかった。
おかげで、*.txtって指定して、*.TXTが処理してなかったというテイタラクをしてしまった…
>>971
シェルが処理すべき問題で、Perlが処理すべき問題じゃない
readdir()とかと正規表現使えば出来ない事は無いけどな
while(<*.{txt,TXT}>){print "$_\n"} じゃだめか?カッコ悪いかそうか。
>>971
aaa.pl *.[tT][xX][tT]
>>973
カッコ悪くはないです。

拡張子といっても、3文字だけでも大文字小文字の組み合わせで8種類あるし、
txt、htm、doc、cntなど色々とあるので、もう少し流用しやすい方が嬉しい。

まぁ、txTなんて拡張子をつける人なんて考えられないけど、人のやることだし…

>>974
こんな手があるとは…
ってことは、973の {txt,TXT} を [Tt][Xx][Tt] とする手もアリですね。
最近のPerlの文字コードサポートについて解説したページを紹介してもらえますか?
File::DosGlobは?
$perl -MFile::DosGlob=glob -e 'print <*.txt>'

>>972さんが言っているように、aaa.pl *.txtと打ち込んだ時、
*.txtを展開しているのはPerlじゃなくてシェルだから、解法は
シェルの機能に依存しちゃうので厳密に言えば板違いかも。
Perlのパーサーは他のスクリプト言語と比べても重そうなのに、
どうしてPerlはこんなに速いんでしょうか。
とりたてて速いという程でも。
ユーザーが多いからそんだけバグも早くつぶれるし、
色々口出し^H^H^H助言してくれる輩もいるから、
自然と処理系も最適化されるんじゃないの。
980教えてモンゴメリー伯爵:04/05/25 22:06
>>960
960よ あっぱれじゃ見事処理できたぞよ
              
ほうびをやろう   これほうび→ (ω)
>>978
プリコンパイル方式だからとかそういう話でなくて?
パーサなんてどれも速度かわんねーだろ
C にしたってコンパイルが遅いのは、普通は毎回巨大なヘッダをコンパイル
しててるとか最適化のせいでしょ。そもそも Perl はネイティブコードのジェネレートも無いし。

何万行もあるコードかいたらそれなりに遅いとおもうけど、普通のスクリプトのサイズじゃ
たかが知れてるわな。
未だにPHPは速いとか言ってる人いるのかなあ
PHPは速い
>>985
はいはい
webPron板に行けばPHPが早いって言ってるヤツいぱーいいてる。
VBとPerlに詳しい方教えて下さい。
VBでPowerPointを操作するVBAをマクロ記録機能を使って作ったのですが、
これをPerlに置き換えられなくて困っています。
わかる方がいたら教えて下さい。

ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:="D:\test\test.bmp", LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=75, Top:=-74, Width:=570, Height:=689).Select
With ActiveWindow.Selection.ShapeRange
.Fill.Transparency = 0#
.Height = 344.62
.Width = 285.12
End With
With ActiveWindow.Selection.ShapeRange.ActionSettings(ppMouseClick)
.Hyperlink.Address = "D:\test\test.bmp"
.SoundEffect.Type = ppSoundNone
.AnimateAction = msoFalse
End With
With ActiveWindow.Selection.ShapeRange.ActionSettings(ppMouseOver)
.Action = ppActionNone
.SoundEffect.Type = ppSoundNone
.AnimateAction = msoFalse
End With

環境は
Pen3:1GHz
Memory:2GB
OS:Windows2000Professional
Soft:MSPowerPoint2002SP-2
    ActivePerl5.6.1.635
です。
そろそろ次スレ誰か立ててくり。
俺は立てられないので。
>>990
乙!
>>988
ひょっとして、全くやり方がわからんから、お前ら Perl で書いてアップしろって言ってるのか?
だったら、とりあえず \Perl\html\faq\Windows\ActivePerl-Winfaq12.html でも読めよ。

5.6.x にはこのファイルないかもしれんけど。無かったら 5.8.3 入れてドキュメントだけ見なよ。


がんばって書いてみたけど思ったように動かないなら、どう書いたのか書きなよ。

大体が、Perl でそれを書いたとして、できるのは実行した時に開いてるファイルに対する
処理だけなんだけど、それでいいのか?