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

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

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

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

過去ログは>>2-5あたり
2デフォルトの名無しさん:04/10/15 23:49:51
3デフォルトの名無しさん:04/10/15 23:50:21
[プログラミング自体の経験が無い奴はまずココを読め]
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/
4デフォルトの名無しさん:04/10/15 23:51:03
おいおい、次スレはあるって。
http://pc5.2ch.net/test/read.cgi/tech/1097547110/

削除依頼しておくぞ。
5デフォルトの名無しさん:04/10/15 23:56:02
>>4
こっちでいいよ
6デフォルトの名無しさん:04/10/15 23:58:13
削除依頼完了
7デフォルトの名無しさん:04/10/15 23:59:21
>>6
なんで次スレを立てて削除依頼だされなきゃならんのよ?
8デフォルトの名無しさん:04/10/16 00:13:04
既にあるから二重スレ立ては消されて当然だろ?
9デフォルトの名無しさん:04/10/16 00:23:42
Perlスレなんか消されて当然だろ?
10デフォルトの名無しさん:04/10/16 00:37:42
入力した単語($tango) が含まれる行を書き出す処理するためのマッチング処理で、

if ($_ =~ /$tango/)



if ($_ =~ /.*$tango.*/)

ってどっちの記述もまったく同じ効果ですか?
違いがわからないのですが…。
11デフォルトの名無しさん:04/10/16 00:45:12
$1 $2 $3 の値が違う
12デフォルトの名無しさん:04/10/16 00:49:21
っっぷううううううううううううううううううううううううううううう
1310:04/10/16 00:50:08
>>11さん
すみません。
具体的にどういうことか教えていただけませんか?
14デフォルトの名無しさん:04/10/16 00:51:34
>>11
$'、$`、$&じゃねーの?
15デフォルトの名無しさん:04/10/16 01:01:06
正規表現の外ではマッチの結果を次のように参照できます。

$1, $2, $3, ... ( )の部分にマッチした文字列
$+ 最後にマッチした( )部分
$& マッチした部分の文字列
$` マッチした部分から前側の文字列
$' マッチした部分から後側の文字列

たとえば、次のように使用することができます。

if ($time =~ /^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$/) {
$hour = $1;
$min = $2;
$sec = $3;
}
16デフォルトの名無しさん:04/10/16 01:01:32
>>10
その記述における目的にとっての「効果」は同じ。
でも勿論、マッチした文字列の内容は大きく異なっている可能性が高い。
正規表現にgオプションを付けたりすると、途端に動作に差が出る。
17デフォルトの名無しさん:04/10/16 01:01:39
ばかばっかwwwwwwwwwwwwwwwwwwwwwwwww
18デフォルトの名無しさん:04/10/16 01:03:00
$tango の中身が ? とかで始まってたりすると
ちょっと効果が変わるよね。
19デフォルトの名無しさん:04/10/16 01:04:16
>>18
あー、そっか。
2010:04/10/16 01:12:23
皆様、どうもありがとうございました!
21デフォルトの名無しさん:04/10/16 01:25:55
必要になったときモジュールを組み込みたいと思って
if ($hoge) { use MODULE }
と書いてみたのですが、どうもはじめからロードされてるように動きます。
マニュアルをみたら
「 use MODULE; は BEGIN { require MODULE } と一緒 」
とあったのですが、この場合
if ($hoge) { require MODULE }
と書けばよいと考えてしまってよいのですか?
22デフォルトの名無しさん:04/10/16 01:36:43
yes
23デフォルトの名無しさん:04/10/16 01:38:33
>>22
サンクスです。
これで良いんですね。安心しました。
24デフォルトの名無しさん:04/10/16 02:49:53
Inline::Ruby
25デフォルトの名無しさん:04/10/16 03:19:01
昔ソースコード中にCなどの別の言語のソースを記述できるというような
話を聞いた気がするのですがすっかり忘れてしまいました。
それ関係の情報へのリンクなり何なり教えていただけると喜びます。
26デフォルトの名無しさん:04/10/16 07:46:34
27デフォルトの名無しさん:04/10/16 09:24:59
>>26
ありがとん。
28デフォルトの名無しさん:04/10/16 11:00:57
>>24>>25にたいする未来予知か!?
29デフォルトの名無しさん:04/10/16 11:43:31
30デフォルトの名無しさん:04/10/16 11:53:38
逆に、C言語とかからPerlの関数を呼びたい場合は?
31デフォルトの名無しさん:04/10/16 12:18:53
system()
とか
exec()
とか
32デフォルトの名無しさん:04/10/16 12:19:21
   │ `'‐-.、,         \   \
    |     ``''''ー‐-- 、,,,,,,,,,\,,、-‐''|
   /:`'‐:.、,i~l            |   |
.  /:::::::::::::::| |:`''ーァ- 、,,,_     │  _,、|
  l:::::::::::::::::| |:::::::/      ̄`゙゙゙`''''''"´  ',
  |:::::::::::::::::| |:::::/              l
.  |::::::::::::::::::| |::/  ,、-----、     ._,、rz|
  !::;::、;::::::::| |/  ´  ̄``'''''`''   ‐゙'"´ |
  ll r‐、ヽ::| |'    、ィ'f''''ァ、   { ,rt'''ァ、i
   l l ノ { l::| |      ̄ ̄     ', ̄ ̄ ',
   ヽヽ,,ヽ';| |.             ',    !
    ヽ.  | |        ,.ィ    .'、  !
.    ヽ、,. | |       ´ `' = ,.ィ  /
     │ !.l       ,、rzi=,,,=iュ、 /
    ,rV  ','、     /∠-===`ォ V
.   / l l   ヽ'、    ′  ̄二二´ ./゙
   /  l ヽ   ヽ'、::::,,..     .,ハ,. ,l
.,、ri゙   \\   `'ヽ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|
  ',    \\   'ー:、;;;;;;;;;;;;;;;;;;;;;;;lヽ、
   ',     \\    `''‐:、;;;;;;;;;/ ヽ`'-、
   ゙、      \\      ヽ;;/   ヽ  `'‐.、
33デフォルトの名無しさん:04/10/16 12:23:57
>>30
perldoc perlembed 見れ。
34デフォルトの名無しさん:04/10/16 13:09:44
Perlの真髄はInlineに有り
35デフォルトの名無しさん:04/10/16 13:11:53
ぺrはくそ
るbyさいきょう
36デフォルトの名無しさん:04/10/16 13:48:23
>>33
ありがとうございます。
でも以前にこれみたとこは、わけわかめだった…。
37デフォルトの名無しさん:04/10/16 13:51:45
ある言語の中に他の別の言語を埋め込むことが流行ってるみたいですが
Perlの中でCなどを書いた方が、
Cで始めからストレートに書くより速いんですかね。
Rubyの中でPerlを記述した方が普通にその言語で書くより生産的?
よく分からないのですが。。。
38デフォルトの名無しさん:04/10/16 14:11:39
>>37
速いってのは、実行速度が? それとも開発期間が?
39デフォルトの名無しさん:04/10/16 14:14:26
>>37
それは馬鹿とハサミの関係だね。
うまく使えれば良いけどそうでなければむしろ泥沼にはまるんじゃない。
4037:04/10/16 14:25:09
>>38 >>39
レスどうもです。
いや、実行速度でも開発期間でもどちらでもよいのですが。
たとえばCだとインラインアセンブラとかでアセンブラ埋め込めたりできますけど
「ループの中のみ」とか、コアを絞りこんで置き換えて使うような
それ相当の機能と機能と考えたほうがよいのか。
そうじゃなくて全面的に記述はCで書いて、実行系はPerlでやる、みたいな
そういう存在なのか?よく分からなかったのです。すんません。
4137:04/10/16 14:28:16
なんというか部分最適向けなのか?全体最適向けなのか?
みたいな。。という素朴な疑問です
42デフォルトの名無しさん:04/10/16 14:47:50
>>37=40=41
CにPerlを埋め込んでというのは仕事では扱ったことがないので
あくまで想像に過ぎないのだが、Perlの強力な文字列操作機能を
Cから使いたいという要望はあるかもしれない。
実際、Perlでなら普通にやるような文字列検索や書換えなどを
C/C++でやるには、そういうライブラリもたくさんあるにはあるが、
全部をC/C++で済ますより、その部分だけPerlにまかせるれば
簡単に済む場合は多そうな気がする。これは部分最適の例かも。
そして、それが開発工数の削減につながるなら、開発プロセスの
全体最適ということにこじつけれるかもしれない。

いずれにせよ、それぞれの言語の長所がうまく活かして、
短所を補えるなら組み込みの意味もでてくるのでは。
言うは易しで行なうは難しという感じだが。
43デフォルトの名無しさん:04/10/16 14:59:58
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Perl
4437:04/10/16 15:20:22
>>42
レスありがとうございます。
相互補完的に使うものなのですね。
確かにCでヌル文字を常に意識しながらの作業は煩わしいといえば
そんな気がします(慣れれば、という面もありますが)
実は職場ではCを生業にやってるんですけど、
なんだかWEBやってる連中えらく盛り上がってるし
PerlでCをとなると漏れってリストラ?なんて内心ガクガクブルブルしてたんです。。
45デフォルトの名無しさん:04/10/16 18:01:05
しんと申します
*dataの*がなんだか教えて下さい。

if ($ENV{'HTTP_COOKIE'}) {
*data = GetCookie($ENV{'HTTP_COOKIE'});
@w = split(/\,/, $data{$cknm});
$cdata1 = @w[0];
$cdata2 = @w[1];
}
46デフォルトの名無しさん:04/10/16 18:28:45
>>しん さん
型グロブってものを示す記号です。型グロブで検索するといろいろでてきます。
例えば
!/usr/bin/perl -w
use strict;
use vars qw(*var);
*var = \"abc\n";
*var = [ qq(d e f \n) ];
*var = { g => 1, h => 2, i => "\n", };
*var = sub { "j\n" };
print $var;
print @var;
print %var;
print &var;
とすると
> abc
> d e f
> g1h2i
> j
と表示されます。>>45の場合、とりあえず型は定めずに
*dataにGetCookieの結果を保存しておき、取り出すとき$data{$cknm}として
ハッシュの要素として取り出しています。
47デフォルトの名無しさん:04/10/16 18:56:44
ちなみに my *var = 'abc' とはできないのであしからず。
48デフォルトの名無しさん:04/10/16 19:31:34
perlからWindowsのダイアログ使う方法ってないですか
49デフォルトの名無しさん:04/10/16 19:54:32
Win32API呼べば
50デフォルトの名無しさん:04/10/16 20:12:44
お前ら自分が糞Perlerであるという自覚は持ってるの?あ?
糞虫は死ねよ。
51デフォルトの名無しさん:04/10/16 20:23:37
Perl嫌いな人はお前らが思っているより大勢いるんだが(大爆笑)

インターネット上で叩かれるのみならず、市販の書籍でも
「私(監修者)はPerlがダイキライなので、この章はとばして読んでください。」
なんて言われる始末ぷぷぷ。

別の本では「Perlなど触りたくもないのですが、仕方がなく」と嫌々ながらwwwwwwwwwwwwwww

「もっとも、世界中のPerlプログラムなど、どれも皆単なる偶然で動いているだけなのでしょうから、
その意味で典型的なPerlプログラムと言えますが(わらい)」とか書かれたり。

ちなみに、残念ながら捏造でも何でもないwwwwww

ぷぷぷ。
ぷぷぷぷぷ。
Rubyやってて良かったよ。お前らと一緒にされるのはごめんだ。
汚らしいゴミperlerめ。プログラマ板から出ていくまでお前らを叩き続けてやるからな。
汚らしい。
糞虫。
嫌な気分になってくれれば幸いだ。俺はそれを望んでいる。
ゴキブリに感情があるのか知らんが。
52デフォルトの名無しさん:04/10/16 20:24:33
ActivePerlを使用しているのですが
変数の実数を知る方法は無いでしょうか。。

($test,$sasa) = split(/,/, $nihi);

$sasaに何が格納されているか知りたいのです。

cgiの中の<html></html>にprintf "$sasa"としてみましたがエラーだらけとなってcgi自体機能しなくなりました。
53デフォルトの名無しさん:04/10/16 20:26:04
>>52
二度と来なくていいよ。さよなら
54デフォルトの名無しさん:04/10/16 20:26:33
なんかそうとう根にもってるんだな
なんかあったのか? ルビ厨
必死さがかなり笑える。。ww
55デフォルトの名無しさん:04/10/16 20:32:13
>>52
試しにコマンドラインから実行してみて
そして観察してみてください。
56デフォルトの名無しさん:04/10/17 00:38:35
Perlの本を見てみたのですが
その本にはメモリの確保などの記述がなかったです
どのようにメモリは確保できるのでしょうか?
または そのような考え方はないのでしょうか?
素人質問ですいませんがお願いします
57デフォルトの名無しさん:04/10/17 00:41:14
>>56
Perlはソースが公開されているよ。
58デフォルトの名無しさん:04/10/17 00:43:16
>>57
だから何?
59デフォルトの名無しさん:04/10/17 00:44:20
>>58
何って・・・分からないの?
60デフォルトの名無しさん:04/10/17 00:44:26
フリーソフトの改造なのですが。
http://www.google.co.jp/」を「http%3a%2f%2fwww%5c%2egoogle%5c%2eco%5c%2ejp%2f」
に変換する関数(?)って、どんなのがありますか?
どちらかと言うと、戻したいんですけど、どうも手がかりがつかめません。

ttp://www.cj-c.com/cgi_s/access.htm
「url.log」で「http://www.google.co.jp/;google(日本);http://www.google.co.jp/;
と最初のデコードを修正して出力したいんです。
61デフォルトの名無しさん:04/10/17 00:45:57
頭のおかしいひとがいるようですね
62デフォルトの名無しさん:04/10/17 00:46:46
>>60
http://ash.or.jp/perl/tips_perl01.htm

# URLエンコード
$arg =~ s/(\W)/'%'.unpack("H2", $1)/ego;
# URLデコード
$arg =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/ego;
63デフォルトの名無しさん:04/10/17 00:46:53
>>56
基本的にPerlが自動で確保,拡張します
64デフォルトの名無しさん:04/10/17 00:47:08
>>61
おまえか?
65デフォルトの名無しさん:04/10/17 00:47:27
ドザじゃ分からないか。
66デフォルトの名無しさん:04/10/17 00:48:12
>>58
UTSL
6756:04/10/17 00:52:44
>>57
まさか ソースを読んで関数を見つけ出せということ?
個人でそんな気力はありませんorz

>>63
ありがとうございます
ということは リーク等はPerlにバグがないかぎりありえないということでしょうか?
また 基本的にと言うことは 意図的に確保する方法もあるのでしょうか?
68デフォルトの名無しさん:04/10/17 00:56:19
>>62
前から思ってたけどこれってウニコードのエスケープはデコードできないよね・・・
69デフォルトの名無しさん:04/10/17 00:57:16
一度確保したものは他で使い回すために終了までシステムに返すことはないとか。
伝聞だから本当かどうかは分からないけど。
70デフォルトの名無しさん:04/10/17 00:58:00
>>68
ウニコードのエスケープと URL エンコードは別物だからね。
71デフォルトの名無しさん:04/10/17 01:17:32
>>67
もしmallocみたいのを期待しているんだとすれば
期待はずれかもしれないけれど
例えば、配列 @a について $#a = 1000000; とかすると
それなりのメモリはされるはずです。そんな風な確保(?)の仕方はあります。
72デフォルトの名無しさん:04/10/17 01:23:40
ただ、現実問題、コード書いてて
メモリ確保を意識しなくっちゃらならない場面って
ほとんどありません。
73デフォルトの名無しさん:04/10/17 01:25:14
そんなこと考えなくてもいいのがPerlのいいところだしね。
ラクダ本のPOSIXモジュールのmallocの欄にもC固有のものであるとしか書かれていないし。
74デフォルトの名無しさん:04/10/17 01:25:45
>>69
fj の malloc/free 論争を思い浮かべてしまってイヤン。

まさかここで発動したりしないよね?
75デフォルトの名無しさん:04/10/17 01:28:05
メモリ確保を考える必要があるとすれば、
馬鹿みたいにデカいファイルを開くとかぐらいか…。


そんな機会は今までになかったけど。
76デフォルトの名無しさん:04/10/17 01:28:22
-DDEBUGGINGをつけてコンパイルされたPerlならどこで確保と解放を行っているか分かるね。
77デフォルトの名無しさん:04/10/17 01:29:01
>>67
リークに関しては、ガベコレが参照カウント式なので
リファレンス使って環状リンク等を作ると
自分でチェインを切らない限り、リークします。
サーバ書くとか、長く動くプログラムを作るときは注意したほうがよいです。
78デフォルトの名無しさん:04/10/17 01:30:08
itunohanashida
79デフォルトの名無しさん:04/10/17 01:31:33
ここだけ 10年時間がずれているレス
8077:04/10/17 01:33:16
ただし、すぐ終わる普通のプログラムの場合
これは大して気にする問題ではないです。
事実上。
8177:04/10/17 01:38:12
あれ?弱いリファレンスって
デフォルトになったんけ?
82デフォルトの名無しさん:04/10/17 01:44:26
>>81
>>78-79>>74のことだと思う。
8356:04/10/17 01:46:31
皆様ありがとうございました
どう確保するかではなく
要するに 意図的に確保する必要はない
なんですね
どうもありがとうございました
8477:04/10/17 01:48:43
>>82
そうか。びっくりした。
ありがとう。
85デフォルトの名無しさん:04/10/17 03:08:18
窓でPerlを使ってるが

5.6系統だとメモリー量がんがん増えてくね。
5.8でやっと改善したって感じ。
それでも、GCも頻繁にやってくれずにかなーりたたないと動作してないなぁ。

でも、ソースの組方しだいではメモリー使用量半分ぐらい減らせたりしたな。
86デフォルトの名無しさん:04/10/17 05:57:16
質問です
自分で書いたプログラムを実行したら
print() on closed filehandle HTML at ./aa.pl line 14.
という エラーが出ました
読んでみても意味が良く分かりません
HTMLは
open HTML , '>', "~/test.html";
で 開いたものです

すいませんが教えてください
87デフォルトの名無しさん:04/10/17 06:03:02
ファイルを開くことが出来たかどうかチェックしてないだろ。
88デフォルトの名無しさん:04/10/17 06:03:56
>>86
~
89デフォルトの名無しさん:04/10/17 06:06:49
ハァ?
9086:04/10/17 07:07:19
レスありがとうございます

>>87
どういうことでしょうか?
まだ 始めたばかりで分かりません
ファイルはopenで開いて次にもうprint で書き始めています
チェックと言うもののやり方を教えて頂けると幸いです

>>88
~を外してフルパスでやっても変わりはありませんでした
91デフォルトの名無しさん:04/10/17 07:09:10
or die $!;

とか。まともな本読んだ方がいいと思うが。
9286:04/10/17 07:38:51
>>91
ありがとうございます
どういうことでしょうか?
そういうチェックなら知っているのですが
open HTML , '>', "~/test.html"
なので 出力用に開いているので確実に生成されるのではないのでしょうか?
すいませんが教えてください
93デフォルトの名無しさん:04/10/17 07:48:56
>>92
とりあえず今のコードを可能な限り削って
エラーが再現する完全なコードを掲示してみそ。
9486:04/10/17 08:00:20
>>93
ありがとうございます
書き直さずに 再現性を高めるために削っただけですが以下のようなものです
#!/usr/pkg/bin/perl -w
use strict;
die "Usage: $0 ImageDirectry" unless ($ARGV[0]);
my $dir=$ARGV[0];
open HTML , '>', "~/test.html";
print HTML '<html>';
close HTML;

すいませんが よろしくお願いします
9586:04/10/17 08:03:19
上のも無駄なのが多かったですね
1番少なくすると
#!/usr/pkg/bin/perl -w
open HTML , '>', "~/test.html";
print HTML '<html>';
close HTML;

こんな感じだと思います
すいませんがよろしくお願いします
96デフォルトの名無しさん:04/10/17 08:08:18
>>95
とりあえず >>91 さんの言ってるとおり

open HTML, '>', "test.html" or die $!;

としてみることですな。
97デフォルトの名無しさん:04/10/17 08:08:52
>>96
あ、まちがい。

open HTML, '>', "~/test.html" or die $!;
9886:04/10/17 08:10:48
すいません 新規で編集し直したので抜けてましたね
いれても
No such file or directory at
で エラーで終るだけです
9986:04/10/17 08:17:27
色々とやってみたのですがどうしても通らないです
どなたか 通るファイルのオープンを見せてくださらないでしょうか?
それで通らないのなら私の環境が悪いと言うことなので
すいませんがよろしくお願いします
100デフォルトの名無しさん:04/10/17 08:20:52
まず open で ~ が使えないのは仕様。
http://tohoho.wakusei.ne.jp/lng/199905/99050073.htm

フルパスでもだめってのは謎だけど、
↓こうでもすればいいのかな?

my @uidentry = getpwuid($>);
open HTML, '>', "$uidentry[7]/test.html" or die $!;

セキュリティ的にはどうか分からんが。
10186:04/10/17 08:28:53
あれ?
チルダをフルパスにしたらできました
さっきはできなかったのに‥
さっきは なにか他のエラーでとまってたのかな‥
本当にすいませんでした
考えてくださった皆様ありがとうございます

>>100
ホームディレクトリにわたる 方法まで教えてくださりありがとうございます
それで行きたいと思います
私が今作ってるのはイメージビュアーなので  セキュリティーとかは関係ないのでw
今回は 途中で私のミスがあり長引かせてしまってすいませんでした
ありがとうございました
10286:04/10/17 08:38:30
わかりました
はじめから ファイルができない云々より
/の入ったパス名のファイルを作ろうとしていたのが原因でしたorz
本当に皆様には御迷惑をお掛けしました
本当にすいませんでした
103そんなのあるの?:04/10/17 09:20:44
(´-`)。oO(まさか\でないとだめな環境だったんだろうか・・・)
104デフォルトの名無しさん:04/10/17 15:24:39
文字列 aaa\nbbb\nccc\nddd\neee から正規表現で
aaa と eee に囲まれた部分(\nbbb\nccc\nddd\n)
を抜き出すことってできますか?
105デフォルトの名無しさん:04/10/17 15:32:03
>>104
/sスイッチで改行も含めてマッチします。
ターゲットが$_に入っている場合は大体こんな感じ
print $1 if (/aaa(.*)eee/s);
10660:04/10/17 16:25:29
>>62
ありがとうございました、ペコリ
107デフォルトの名無しさん:04/10/17 17:21:41
>105
ありがとうございました!
108デフォルトの名無しさん:04/10/17 18:17:26
つかPerlやるんなら「プログラミングPerl」くらい買おうよ。。。
109デフォルトの名無しさん:04/10/17 18:23:50
最初は「初めてのPerl」でもいい
110デフォルトの名無しさん:04/10/17 18:36:33
プロセス一覧を返してくれる関数は何でしょう?
111デフォルトの名無しさん:04/10/17 18:49:20
>108
やだ
112デフォルトの名無しさん:04/10/17 18:51:46
/proc以下を読め
113デフォルトの名無しさん:04/10/17 19:25:11
`ps`
114デフォルトの名無しさん:04/10/17 20:03:42
115デフォルトの名無しさん:04/10/17 23:41:21
@test = (1, 2, 3);
print "@test[2]\n";
print "$test[2]\n";

2行目と3行目の実行結果はまったく同じなのですが、
printするときは@と$、どっちを使ってもまったく同じなのでしょうか?
116デフォルトの名無しさん:04/10/17 23:47:44
>>115
スライス について調べるといい。
後は $, かな
そうそうw
俺は正直なところを言えばPerlにはがんばって欲しい。やられ役がいないと寂しいしw
だがPerlの糞コードや欠点を見ると笑えるし、またそれをちょっと煽り書きすると
信者が狂ったように絡んでくるそのことの方が楽しくて、このスレをチェックするようになった。
118115:04/10/18 00:00:27
>>116
ありがとうございます。
早速調べてみます。
119デフォルトの名無しさん:04/10/18 06:46:23
ruby厨とperl厨って
qmail信者とpostfix信者
チョンとジャップ
トンガリとスネ夫
と同じ雰囲気があるね
120デフォルトの名無しさん:04/10/18 14:19:12
>>119
おいおいRuby信者と同じにするなよ
そうそうw
俺は正直なところを言えばPerlにはがんばって欲しい。やられ役がいないと寂しいしw
だがPerlの糞コードや欠点を見ると笑えるし、またそれをちょっと煽り書きすると
信者が狂ったように絡んでくるそのことの方が楽しくて、このスレをチェックするようになった。
122デフォルトの名無しさん:04/10/18 17:11:27
DBIについて質問させて下さい
perl 5.8.x で扱うデータがutf-8です

なにが問題かと言うと、
$dbh->quote() で戻ってくるデータが全部NULLになってしまうのです。。

my $dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 });
$dbh->do(
sprintf(
qq#INSERT INTO TABLE (%s) values (%s)#,
join(',', @column_names),
join(',', map { $dbh->quote($_) } @{$data}{@column_names})
)
);
$dbh->disconnect;

これを回避する為にはどうすれば良いのでしょうか?
123デフォルトの名無しさん:04/10/18 18:36:40
>>122
> @{$data}{@column_names}
これ、なんか怪しくない?

quote する以前に、そのまま出力出来てるの?
124デフォルトの名無しさん:04/10/18 20:08:29
my $sth = $dbh->prepare('insert into table (?, ?, ?, ?, ?, ...) values(?, ?, ?, ?, ....)');
$sth->execute( @column_names, @{$data}{@column_names} );
こっちのほうがわかりやすくね?
125デフォルトの名無しさん:04/10/18 20:57:08
1.http://aaa.a.a/a.cgi

2.http://bbb.b.b/b/cgi

1のプログラム上から引数を渡して2のプログラムを動作させて
結果を1のプログラムに返すようなことって可能でしょうか?

2のサーバーのローカルにあるデータベースからデータを取得して
1のサーバーのローカルにあるデータベースにデータを保存したいと
おもっております。


126デフォルトの名無しさん:04/10/18 20:58:47
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
> (WEBプログラミング板 http://pc5.2ch.net/php/ )
127デフォルトの名無しさん:04/10/18 21:30:29
infoseekの無料HPサービスって、CGIで外部サーバに
アクセスできる?
128デフォルトの名無しさん:04/10/18 21:38:52
>>127
おまいは一つ前のレスも見れないのかと
129デフォルトの名無しさん:04/10/18 21:44:43
>128
つまらん奴
130デフォルトの名無しさん:04/10/18 21:45:41
正露丸ドゾー
つ●
131デフォルトの名無しさん:04/10/18 21:45:43
>128
黙れ
132デフォルトの名無しさん:04/10/18 21:52:13
>>122
$dbh->quoteがおかしいと思うならなぜそんな複雑なプログラム
で確かめようとするかな?
print $dbh->quote('あなたが渡してるつもりのもの');
だけ実行して結果みてみろよ。




133デフォルトの名無しさん:04/10/18 21:58:26
>132
日本語めちゃくちゃですよ。
134デフォルトの名無しさん:04/10/18 22:33:09
>>122
(1) ごくシンプルに考える限り、思うにあなたは @{$data}{@column_names}というよりも
@data{@column_names}とやりたかったのではないかと推測するが、いかがか?
(2) DBIつかってるってことと$dataという名称から想像すると
もし$dataの中身がハッシュリファレンスの配列へのリファレンス => [{a=>1, b=>2, }, {a=>9, b=>8}...]みたいの
ならば、@{@{$data}[0]}{@column_names} とする必要がある。
(3) $dataが単純なハッシュリファレンス {a=>1, b=>2...}なら確かにおかしい。
ひょっとして古いPerlから5.8にアップデートしたならばDBIのリコンパイルはちゃんとしたかい?
(4) $dataがシンボリックリファレンスならもう知らないにょ

いづれにせよ、$dataを Data::Dumper->Dumpなりして貼り付けてみそ。
135134:04/10/18 22:37:38
失礼。(2)は @{${$data}[0]}{@column_names}だ。
136デフォルトの名無しさん:04/10/18 22:43:06
>>125
可能です。LWP覚えてからWEB板で聞いてみなはれ
137デフォルトの名無しさん:04/10/18 22:55:37
C言語のfflushみたいなやつはperlにはないんでしょうか?調べたけどわからない・・・

エロイ方教えてください
138にょん:04/10/18 23:01:21
$| = 1 とか、よくやるけど。
$|で調べてみてにょん
139デフォルトの名無しさん:04/10/18 23:05:13
140にょん:04/10/18 23:11:15
open my ${138} => '>> 137';

(..たしかに => '>> はクドイな)
141137:04/10/19 06:38:38
にょんさん亀レスですが解答ありがとうございました。助かりました。
142デフォルトの名無しさん:04/10/19 09:05:38
>136
適当な回答するな。思いっきり条件付きだろうが。
143デフォルトの名無しさん:04/10/19 10:07:13
print <<"END_OF_DATA";
Content-type: text/html; charset=EUC-JP

<html>
<body>
${body()}
</body>
</html>
END_OF_DATA

sub body {
print "hello";
}

のように、ヒアドキュメント内に関数を埋め込むことができる
と聞いたのですが、これを実行すると、body()の実行結果が
最初に出力され、その後 Content-type 以下が出力されて
しまいます。

${body()} の位置に出力させることは可能でしょうか。
144デフォルトの名無しさん:04/10/19 10:13:39
先に変数に入れるようにしたら?
145デフォルトの名無しさん:04/10/19 10:15:27
>>143
文字列を埋め込むんだから、bodyは文字列を返さないとだめだろ。
printしたらその場で出力されてしまう。

あと${body()}は、${\(body())}の間違いだと思われ。
146デフォルトの名無しさん:04/10/19 10:19:10
>145
${\body()}で十分だろ
147デフォルトの名無しさん:04/10/19 11:14:13
sub body {
return "hello";
}
148デフォルトの名無しさん:04/10/19 12:17:04
sub body{ return \"hello"; }
149122:04/10/19 12:45:37
まず、$data は
 my $cgi = new CGI;
 my $data = $cgi->Vars;
です。書き忘れておりました。申し訳ないです。

そして原因もわかりました。
とあるデータの一部に \0 が含まれていた事で動作がおかしくなったようです。
\0 を取り除いてやる事で解決致しました。
# <select multiple>なんかだと\0で区切られるのを忘れてました、、

>>123
> quote する以前に、そのまま出力出来てるの?
ビンゴでした、、Data::Dumper->Dump してみたら
\0 を発見致しました。取り除いて見ると全く問題なしです。

>>124 確かにわかり易いのですが、
@column_names の値が固定ではないのと、一度だけの処理なので do を利用しております。
プレースホルダを利用した方が格段に処理が速いと言う事なら考えますが、
書き直しが面倒なので benchmark は敢えて取りません:-P

>>134
ありがとうございます。_|\○_
Data::Dumper->Dump で全てが解決致しました。
150デフォルトの名無しさん:04/10/19 16:01:37
$hogeみたいなスカラー変数内の文字列に行番号を打っていくうまい方法はありますか?
調べてみたけど、ファイルから読み出して行番号を打っていく方法しか見つかりませんでした。
151デフォルトの名無しさん:04/10/19 16:08:44
>>150
$hoge =~ s/^/++$i/emg;

少し凝るなら
$hoge =~ s/^/sprintf("%3d: ",++$i)/emg;
152デフォルトの名無しさん:04/10/19 16:32:04
うまくいきました。
ありがとうございました。
153デフォルトの名無しさん:04/10/19 17:14:25
binmodeを解除するコマンド、
つまりFHを明にテキストモード扱うようにさせるコマンド(方法)って
何かありますでしょうか?

FHならopen/closeすればいいのですが、
binmode STDOUT;
を途中で解除したいわけですが。
154デフォルトの名無しさん:04/10/19 18:34:37
>>153
binmode STDOUT, ":raw";

ただしラクダ3版には「binmode関数は、ファイルをopenしてから、その
ファイルハンドルに対して実際のI/O操作を行うまでの間に、実行しな
ければならない」とあるのでいいのかどうかはよくわからん。手元の
perl 5.8.4ではこれでいけたけど。

5.8.4のperlfunc(1)では以下のように

In general, binmode() should be called after open() but before
any I/O is done on the filehandle. Calling binmode() will nor-
mally flush any pending buffered output data (and perhaps pend-
ing input data) on the handle.

出力データがバッファされてればフラッシュされる(=I/O操作している
のが前提と思われる)という記述があるのでどこかで変更されたのかな?
155デフォルトの名無しさん:04/10/19 19:39:46
HSP 「21世紀にこんな言語はないだろう」

Perl 「Perlユーザは臭い」

Java 「Javaなんてうんこ」

C++ 「C++なぞ問題外.^^;;;」

Ruby 「Rubyこそ最高言語」

by Rubyユーザ一同
156デフォルトの名無しさん:04/10/19 19:49:38
と、思ってるのは作者と一部の信者と、
2chで馬鹿みたいな書き込みしてる偽信者ぐらいだろう…
157デフォルトの名無しさん:04/10/19 19:50:26
偽信者=perlerの自作自演
最低だなお前らwwwwwwwwwwwwwww
158デフォルトの名無しさん:04/10/19 20:48:14
質問です。

90分毎にhtmlファイルのソースを編集するってことを
したいと思っているのですが、

その場合

現時刻を計測

90分をカウントする

ファイルの読み込み

ファイルの修正

の繰り返し…って具合に作成すればいいのでしょうか?
159デフォルトの名無しさん:04/10/19 20:52:50

はい
160デフォルトの名無しさん:04/10/19 20:53:38
>>158
まあとりあえずそれでやってみれ
161デフォルトの名無しさん:04/10/19 21:21:46
Active5.8をファイルの編集作業に使用しているのですが、
ファイルのコードがshif-jisの為、うまく読み込んでくれません。
入力したファイルをutf-8に変換して編集後に再度元のコードに戻したいの
ですが、どのような方法があるでしょうか?
162デフォルトの名無しさん:04/10/19 23:58:16
>>161
いろいろな方法があります。

♪Active5.8とはなんぞや?
163デフォルトの名無しさん:04/10/20 00:17:07
>>161
Encodeモジュールを使う

♪Active5.8とはなんぞや?
164デフォルトの名無しさん:04/10/20 00:19:42
-Mencodingの方が手軽か
165デフォルトの名無しさん:04/10/20 00:43:15
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< くっちゃらはぴはぴ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< くっちゃらはぴはぴ!
Py厨〜〜〜〜!    >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」               ̄     / /

166デフォルトの名無しさん:04/10/20 00:56:34
Ruby >>>>>>>>>>>>>>>>>>>>>> Python>>>>>>>>>>>>Perl
167デフォルトの名無しさん:04/10/20 01:04:19
日本語≒英語>>>>>>>>>>>Ruby
168デフォルトの名無しさん:04/10/20 18:00:38
Cygwinのperlを使ってるんですが、

open HOGE1 ,">hoge.txt"
print HOGE1 "hello\n";
print HOGE1 "world\n";

と書くと、hoge.txtに
hello
world
と出力されるのはなぜでしょうか。
この場合、hoge.txt には world だけ出力されるのが正しいと思うのですが。
169デフォルトの名無しさん:04/10/20 18:06:20
open HOGE1 ,">hoge.txt"
print HOGE1 "hello\x0D";
print HOGE1 "world\x0D";
170デフォルトの名無しさん:04/10/20 18:20:57
>>168
なんで、そう出力されるのが正しいと思うのか、興味あるな。
171デフォルトの名無しさん:04/10/20 18:33:27
>>170
168です。
>と>>の違いがUNIXのものに由来していて、
">"が上書き用
">>"が追加の書き込み用
と説明されているからです。

Cygwin上のbashで
echo hello > hoge.txt
echo world >> hoge.txt
とすれば、hoge.txt の中は
hello
world
になりますが、
echo hello > hoge.txt
echo world > hoge.txt
ならば、hoge.txtの中は
world
だけになりますので、perlの場合でも同様だろうと考えたからです。
172デフォルトの名無しさん:04/10/20 18:41:38
open HOGE1 ,">hoge.txt";
print HOGE1 "hello\n";
close HOGE1;

open HOGE1 ,">hoge.txt";
print HOGE1 "world\n";
close HOGE1;

ってやってみれ
173デフォルトの名無しさん:04/10/20 20:03:18
> truncate(O_TRUNC)
>> append(O_APPEND)
open(2)をよく見てみれ
174デフォルトの名無しさん:04/10/20 20:16:04
初心者な質問失礼致します

hoge.txtに

>hogehogehoge$foohogehoge

と書かれているとき、$fooの値を
perl側で代入して読み込む方法はないでしょうか
175デフォルトの名無しさん:04/10/20 20:32:21
>>174
(´-`).。oO( 台風のせいかな? )
176デフォルトの名無しさん:04/10/20 20:32:59
>>174
eval使え…と言いたい所だけど、
$fooとhogeの間に区切りが無いみたいだから
$bにhoge.txtの中身を読み込んでおいて、
$b =~ s/\$foo/$foo/g;
かな。evalもこれも自分としては気持ち悪いけど

自分ならhoge.txtの中身を
>hogehogehoge%foo%hogehoge
とかしておいて、
$b =~ s/%(.*?)%/$h{$1}/g;
と、専用の連想配列から取り出して置換するな。
(hoge.txtが汚染されていた場合やばいから)
177デフォルトの名無しさん:04/10/20 21:44:21
>>176
有難うございます
$b =~ s/\$foo/$foo/g;
でやってみたいとおもいます

厨な質問で申し訳ありませんでした
178デフォルトの名無しさん:04/10/20 23:40:55
Perlの最新バージョンって5.9.1?
179デフォルトの名無しさん:04/10/20 23:46:23
6
180デフォルトの名無しさん:04/10/20 23:48:30
ruby
181デフォルトの名無しさん:04/10/21 00:59:04
6になったら、5のメンテするひとっていなくなるのか?
182デフォルトの名無しさん:04/10/21 01:15:37
>>178
Perl5 限定の話だとして、

安定版 (通常はこれを):
Perl 5.8.5
ActivePerl Build 810 (5.8.4 相当)

旧系列 (旧ヴァージョン依存のスクリプトを使う場合はこれを):
Perl 5.6.2
ActivePerl Build 638 (5.6.1 相当)
Perl 5.005_04 (gcc3 へ対応 etc.)
Perl 5.005_03 (こちらでも問題無し)

開発版:
Perl 5.9.1

MacPerl やらはよく分からず。
詳細は http://www.perl.org/ なり http://www.activestate.com/ で。
183デフォルトの名無しさん:04/10/21 16:44:59
>>181
そんなことはないと思う。
184デフォルトの名無しさん:04/10/21 22:21:23
>>182
MacPerlは5.6.2 r2 のもより。
OSXでは5.8.2のもより。
185デフォルトの名無しさん:04/10/21 22:22:34
>>184
$ perl -v

This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level
(with 1 registered patch, see perl -V for more detail)

だたスマソ@MacOSX 10.3.5
186デフォルトの名無しさん:04/10/21 22:37:25
おっ?マカも居たのか!
んじゃ、質問です。
OSの「開くダイアログ」を呼び出すモジュールと関数を教えて下さい。
MacJPerlに馴れちゃったんで、OSXになって不自由してます。
どうか、よろしくお願いします。m(_ _)m

MacOSX10.3.5 / perl v5.8.1-RC3です。
187デフォルトの名無しさん:04/10/21 23:10:52
>>186
そんな器用なものは入っていないかと思われ(苦笑)@だって標準のperlだし。
188デフォルトの名無しさん:04/10/21 23:17:53
>>187 追記
http://www.cpan.org/modules/by-module/Mac/
を見るといろいろとあるようなので、perl -MCPAN -e shell で突っ込んでみるのも良いかも?
189デフォルトの名無しさん:04/10/21 23:18:06
>>187
レスありがとう。
CAPNに出回ってないかと…。英語苦手なものでスミマセン。
いまは、AppleScriptを呼び出したり、逆にAppleScriptの
ドロップレットから、perlを呼んだりして、一応出来るんで
すが、なんか不毛な気がするので。
190デフォルトの名無しさん:04/10/21 23:28:59
>>189
踏む踏む、なぁるほど。。
漏れの場合、うに機と同じ感覚でterminalで動かしていたりするからあんまり苦になっていなかったりします(w

♪試しにperl -MCPAN -e shellしてみたらなんだかいろんなもの拾い始めた鬱@Securty up-dateしたら消し飛ぶ悪寒(泪)

・・・ ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY が取ってこれないみたい(滂沱)@ブラウザだと、ささっと取ってきやがる(怒)
191186:04/10/21 23:53:18
>>190
漏れも perl -MCPAN -e shell は、やったんです。
んがっ!けたたましくインストしたけど、正直ワケワカメorz。

darwin::MacOSX::File::Catalog.pm

が、臭いんだけど…。
MacJPerlでラクしすぎたせいで基本すら解ってない事に
気づきました。Mac用のモジュールって、MacPerl用だったり
しません?上のはdaewinってなってるから平気かと思ったん
ですけど。てか、勉強し直すか、Classic上でMacJPerl使います。
ごめんなさいでした。ショボーン━━(´・ω・`)━━
192デフォルトの名無しさん:04/10/21 23:55:34
その「@」の使い方はどこの文化だ?
193デフォルトの名無しさん:04/10/21 23:58:19
デカルチャー
194デフォルトの名無しさん:04/10/22 00:00:47
>>191
Mac::AppleEvents を入れてみたけれど、変なダイアログとか、喋ったりとかしたのでおそらく使えるかと思います(w@make test
使い方とかはマニュアル嫁ってことで。

ところで search.cpan.org は、もう寝たみたいですなぁ(哀)

>>192
俺様文化です(w
195デフォルトの名無しさん:04/10/22 13:26:10
 ActivePerl 5.8.xでのsystem()関数の挙動について質問。この関
数にリストで渡したときの挙動がNT系と9x系とで異なるのは仕様な
のでしょうか。たとえば「My Documents」の場所を示すスクリプト

use Win32::OLE;
my $wsh = Win32::OLE -> new('Wscript.Shell');
my $mydoc = $wsh -> SpecialFolders('MyDocuments');
system ("echo",$mydoc);

(例のため無理矢理echoを使っていますが)をNT系のOSで実行
させた場合には要不要に応じて二重引用符がつきます。

D:\home
"C:\Documents and Settings\USER NAME\My Documents"

ところがこれをWindows 98/Meで実行すると

C:\My Documents

となり、二重引用符でくくられません。

http://aspn.activestate.com/ASPN/Mail/Message/933468

以下のスレッドではbuild 630から二重引用符は不要になったとの
ことですが、話題がNT系だけで9x系の話がありません。
196デフォルトの名無しさん:04/10/22 14:38:34
実行したユーザ毎に ~/.hogeを作りたいのですが
ユーザはどのように特定したらいいのでしょうか?
197デフォルトの名無しさん:04/10/22 15:02:21
>>195
(´-`).。oO( cmd.exe と command.com の違いじゃないの…?)

>>196
(´-`).。oO( $< $> $( $) %ENV 辺りを眺めてみたら…?)
198デフォルトの名無しさん:04/10/22 17:42:26
perlで文字列の中から漢字を置換する方法を教えてください。例えば、
$value = "表示します。";
があった場合、
$value = "表\示します。";
に置換したいです。
$value =~ s/表/表\\/g;
ってやってみたらうまく動作しませんでした。
よろしくお願いします。
199デフォルトの名無しさん:04/10/22 17:54:27
200デフォルトの名無しさん:04/10/22 23:42:57
すみません質問です。
Net::POP3を使ってメールを受信するプログラムをダウンロードして使用しているのですが、
メールの内容が文字化けしてしまいます。
どなたかアドバイスをいただけないでしょうか?
プロンプトからtelnetで手打ちでPOP3のコマンドで取得するときは、
set codeset JIS Kanji をしているので文字化けしません。
【ダウンロードしたプログラムの一部】
connect処理
login処理
$ref_mailsize = $pop->list();
foreach ( sort {$a<=>$b} keys %{$ref_mailsize} ){
print "Mail NO.$_ $$ref_mailsize{$_}bytes\n";
}

*mailindex = $ref_mailsize;

foreach ( sort {$a<=>$b } keys %mailindex ){
print "\nMail No.$_ $mailindex{$_}bytes\n";

$ref_lines = $pop->get($_);

$line = 1;
foreach ( @$ref_lines ){
s/^\.\././;
print "$line: $_";
$line++;
}
}
201デフォルトの名無しさん:04/10/23 01:30:17
perl6って今どうなってるのですか?
リリース遅すぎると思うんですが
202デフォルトの名無しさん:04/10/23 01:32:44
rubyから必死にパクってます。
203デフォルトの名無しさん:04/10/23 02:18:35
例えば "掲示板" という文字、UTF-8でエンコードすると

"E6%8E%B2%E7%A4%BA%E6%9D%BF"
となると思います。

そして本来UTF-8のコードである "E6%8E%B2%E7%A4%BA%E6%9D%BF" を誤って
$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
でデコードすると

"牙ず? "

となってしまいます。
この "牙ず? " を元のUTF-8のコード "E6%8E%B2%E7%A4%BA%E6%9D%BF" に戻すには
どのように処理したらいいのでしょうか?
Jcode.pmを使用せずに元に戻す方法を知りたいのですがどなたか教えて下さい。
204デフォルトの名無しさん:04/10/23 02:29:41
perl5.8移行で
use encoding "utf8";
205デフォルトの名無しさん:04/10/23 03:09:01
>203
"牙ず?" になっちゃった事は、どうやって確認した?
UTF-8 文字列を無理やり EUC-JP と見なして表示させると、そう見えるね。
でも中身は 0xE6 0x8E 0xB2 0xE7 0xA4 0xBA 0xE6 0x9D 0xBF のまま
破壊されていないはず・・だから
 $str =~ /\W/'%'. unpack('H2',$1)/eg;
で良くね?

もしかしたら、破壊しちゃった?なら無理だけど。
206デフォルトの名無しさん:04/10/23 05:38:43
>>205
!を付けなければ破壊されないよ。
207デフォルトの名無しさん:04/10/23 08:38:57
>>203
誤ってデコードしなけりゃいいだけだと思うのだが、それは
別の香具師で手がだせないという問題?
208デフォルトの名無しさん:04/10/23 09:44:13
>>205-207 皆さんありがとうございます。
Jcode.pmを使ってエンコードすると"掲示板"に戻せるように変換されるので
壊れてはいないと思います。
 $str =~ s/\W/'%'. unpack('H2',$1)/eg;
でやると"牙ず?"をeucでエンコードしたことになってしまうみたいで
"牙ず?"にしか戻らなくなってしまいます。

209デフォルトの名無しさん:04/10/23 09:58:07
Perlの勉強をPerlについて書かれているWebページを見ながら1週間くらい前から始めました。
基本的な文法を覚え、参考にしているWebページにあるサンプルコード程度のレベルなら
何も見ずに書けるようになりました。
しかし、普段このスレで出る質問はまだまだ自分には難しく感じます。
中には理解できるものもありますが、見ただけでは全然わからないソースもあります。

参考書・参考ページのサンプルコードを真似してる超初心者のレベルを脱出し、
実用的なコードを作れる入り口のレベルに達してさらに上達していくためには
どのような勉強方法がいいのでしょうか?
本屋でPerlに関する参考書を見たのですが、どれもWebページで代用できるようなものばかりです。
このスレで質問に答えて下さるようなプロの皆様は参考書を見たりするような
基本的な勉強方法を終えた後にどのように今のようになりましたか?

よろしければお聞かせください。
210デフォルトの名無しさん:04/10/23 10:26:14
>>209
CPANにおいてあるモジュールのソースをperlインタープリターになったつもりで読みまくる。
211デフォルトの名無しさん:04/10/23 10:45:42
>>209
他人の書いたコードを読むのがいいのでは?
212デフォルトの名無しさん:04/10/23 11:10:47
>>210
これは...ちょっときついです。
まだまだ修行が足りないようです...。

>>211
周りにPerlを使って何かを作っている人がいないのです。
Webを検索すればたくさん出てくるでしょうか?
『これが俺の作ったソースだ! 見てくれ!』って感じで公開しているところは多いのでしょうか?
213デフォルトの名無しさん:04/10/23 11:32:07
>>212
酷いコードが多いからCGI関係はやめておいた方がいい
とりあえずuse strictしてあるコードを探して読みまくるべし
214デフォルトの名無しさん:04/10/23 12:05:41
>>209
他人のコードを読みまくると「どうしてこういう設計になってるんだ」という疑問が湧いてくる。
湧いてこないうちは読込みが足りない。湧いてきたらデザパタ勉強汁。
215デフォルトの名無しさん:04/10/23 13:19:57
>158 です。
プログラムは作成したのですが…
----------------------------------------------------------
#ファイルをオープンする。
open(file, "hogehoge.htm")|| die "hogehoge.htm をオープンできません:$!\n";

#文字列置換
print file "<br>\n";

$sec = $ARGV[0];
print "$ARGV[0] 秒タイマー\n";

until ($sec == 0) {
print $sec--, "\n";
sleep(1);
}

print "\a";
print "$ARGV[0] 秒経ちました。\n";

close(file);
------------------------------------------------------
実行させると、タイマーが作動するだけで、htm自体は何にも編集されていません。
どなたかご教授を
216デフォルトの名無しさん:04/10/23 13:46:58

馬鹿か。入門書でも読んでろ
217デフォルトの名無しさん:04/10/23 13:47:43

>>215

・・・・。あ、今日は休日か。
218デフォルトの名無しさん:04/10/23 13:53:51
CPANってセクハラっぽいね
219デフォルトの名無しさん:04/10/23 13:57:07
>>215
とりあえず、openで>か、>>が要るんじゃないか?
ま、このままじゃ、<br>しか、書き込まんが。
220209=212:04/10/23 14:39:49
>>213
>>214

ありがとうございます。
use strict、って確か文法を厳しくチェックしますよ、って言う宣言ですよね。
早速探して読みまくってみようと思います。
221デフォルトの名無しさん:04/10/23 15:25:17
222デフォルトの名無しさん:04/10/23 16:15:29
>>221
なんかむちゃくちゃですねスマソ
ちゃんと書き直します。。。
223デフォルトの名無しさん:04/10/23 17:34:15
>>222
http://age.tubo.80.kg/age01/img-box/img20041023183313.txt
修正と動作確認をしましたm(_ _)m
224デフォルトの名無しさん:04/10/23 22:25:31
まぁ普通はcron使うんじゃないかなーとか
Winならタスクスケジューラーもあるしなー
Macは・・・Macも最近はBSDか
225デフォルトの名無しさん:04/10/24 02:07:45
Perlでオブジェクト指向の手法を理解でき、使うことができるって言うのはどのくらいすごいのですか?
できる人とできない人をドラゴンボールの世界に例えて、戦闘力で教えてください。
226デフォルトの名無しさん:04/10/24 02:25:26
perlのシンボルテーブルの管理を行っているのはソースの
どの辺りでしょうか?
もう半日くらいperlのソース追っかけてるけど見つからない
227デフォルトの名無しさん:04/10/24 02:34:14
>>225
操気弾(エネルギー弾の遠隔コントロール)が使えるかどうか。
使えるけど使わない人も多い
ヤムチャは雑魚だけど、普通の地球人としては異常なレベルの強さ
228デフォルトの名無しさん:04/10/24 03:07:08
>>227
Perlでオブジェクト指向プログラミングができないと『会社で使えねぇヤツ』って事にはならないんですか?
他の言語(Java等) でも同じことが言えるのでしょうか?
229デフォルトの名無しさん:04/10/24 04:51:56
>228
Perl で OOP しない人→とにかく食べられればいい人
Perl で OO なモジュールを使う人→食べ方にも気を遣う人
Perl で OO なモジュールを書く人→厨房のごたごたまで覗く人

そもそも Perl の OOP は後付で個人的には変態的だと思う。
Java だと OOP は使って当たり前ではないかと。
230デフォルトの名無しさん:04/10/24 04:56:38
try-catchはいつ実装されますか
231デフォルトの名無しさん:04/10/24 06:27:22
C:\Documents and Settings\mypc\デスクトップ\KAJIKoreRC>perl kore.pl
Can't locate Win32/API.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .
) at kore.pl line 13.
となってしまいます。とりあえず()内が見つからないというのは理解できましたが、ではココからどうすれば良いのか皆目見当がつきません。
スレ違いというかそれ以前の問題だとは思いますが、どうかお教えくださいお願いします。
232デフォルトの名無しさん:04/10/24 07:51:06
>>231
その程度も自力解決できないようじゃそのうち罠botに
やられるのがオチなのでやめとけ(w
233デフォルトの名無しさん:04/10/24 08:12:13
>>230
perldoc.jpのError.pmを参照
234デフォルトの名無しさん:04/10/24 08:45:14
>>231
> ()内が見つからないというのは理解できましたが
いや、()内でWin32/API.pmが見つからない
235 ◆7CWqH7Oesg :04/10/24 11:55:21
>>231

「Documents and Settings」というフォルダに半角スペースがあるのわかる?
236デフォルトの名無しさん:04/10/24 12:00:41
( ゚д゚)?        罠bot

(つд⊂)ゴシゴシ

(;゚д゚)          罠bot

(つд⊂)ゴシゴシ
  _, ._
(;゚ Д゚)!        kore.pl


237231:04/10/24 12:18:09
>235 
分かります、ということはDocuments and Settings となっているところを
半角を削ればいいのでしょうか?
>236
罠かな…
238デフォルトの名無しさん:04/10/24 12:29:24
Perlのバージョン5.8.0と5.8.4はあるのですが
5.8.2等他のバージョンは現在入手可能でしょうか?
activestateのHPでは5.8.4しかDLできないようなのですが…;;
239デフォルトの名無しさん:04/10/24 12:34:51
Perlマニアですか?
240238:04/10/24 12:39:02
バージョン5.8.0と5.8.4ではどうも不具合が出るので
他のバージョンで試した方が良いとアドバイスをもらったもので…。
241デフォルトの名無しさん:04/10/24 13:14:27
>>230
use Error; セヨ。
もうとっくにある。
242デフォルトの名無しさん:04/10/24 13:25:17
>>209
即効性もなく、ひどく遠巻きな方法だけれど
sh, grep, sed, awk と進んで C のK&R本を読み、
オライリーの本を「初めての..」「ラクダ本」「クックブック」と進めていくと
文化的な背景も含めて理解しやすいような気がするよ。
少なくとも俺はそうだった。まぁ時代的に進めると単純にそうなるのだが...
243デフォルトの名無しさん:04/10/24 13:35:40
>>231
Win32::APIをuseしてる割には
Win32::APIがインストールされてない
(少なくとも C:/Perl/lib C:/Perl/site/lib . で見つからない)
ってことです。これってWin版にはバンドルされてるんだっけ?
244デフォルトの名無しさん:04/10/24 15:41:54
245デフォルトの名無しさん:04/10/24 19:52:54
>>226
PL_defstash PL_curstash あたりじゃないかなぁ? (in perl.c or gv.c)
Grepしてみてちょ。間違ってたらスマソ。→ see perlguts。

ttp://gisle.aas.no/perl/illguts/
が詳しい。

なお、HV* gv_stashpv(const char* name, I32 create)
を使うと Returns a pointer to the stash for a specified package するとのこと。
246デフォルトの名無しさん:04/10/24 20:44:53
つーか皆さんError.pmって使ってます?
俺はバリバリ使ってますけど。
247デフォルトの名無しさん:04/10/24 20:49:12
バリバリ使ってますけど・・・
248デフォルトの名無しさん:04/10/24 20:50:01
バリバリ使ってますよ。
249238:04/10/24 20:57:18
>>244
どうもありがとうございます。
あとでDLしてみますね。
250デフォルトの名無しさん:04/10/24 21:02:34
>>246-248
便乗質問!!
use Error すると record という関数がインポートされますが
これってどう使うのでしょうか?
マニュアルにはさらっと、シンタックスシュガーと書かれてるだけでよくわからんです。
知ってる方教えてくだされ。
251231:04/10/24 21:19:16
>244さん
ありがとうございます。Win32-API-0.41落としたのはよいのですが
インストはCのperlにおいてみたんですがだめでした。
どなたかごしどうおねがいできませんか?
252デフォルトの名無しさん:04/10/24 21:25:40
>>251
UNIX系だとその後
perl Makefile.PL; make && make install
ですぐ事は済むのだがね。。。
Winのひとおしえてあげてください。コンパイラ必要なのかな?
253デフォルトの名無しさん:04/10/24 21:37:22
>>251
Win32::APIはCのコンパイラがいるみたい。コンパイラを持ってるなら
perl Makefile.PL
nmake
nmake test
nmake install
ってやればいいんだけど、持ってないなら、ActivePerlを使ってればppmからインストールできる。
254231:04/10/24 22:18:49
253さん
ActivePerlを使ってppmからインストールしようとしましたが
ppm> install-API.pm
Unknown command 'install-API.pm'; type 'help' for a list of commands.
となってしまいます。
ココからどうすればよいのでしょうか? どうか御教授お願いできませんでしょうか?
255253:04/10/24 22:45:28
>>254
今インストールしようとしているモジュールはWin32::APIでしょ。
だから
ppm> install-API.pm
じゃ意味が通じない。
ppm> install Win32-API
でやってみ?
256231:04/10/24 23:22:54
255さん
ありがとうございます
Win32-API無事にインストできました。perlなんか楽しいかもしれないです(単純だ)
こんどは
Can't locate HTTP/Lite.pm in @INC (@INC contains: C:/Perl/lib C:/Perl/site/lib .
) at kore.pl line 14.
BEGIN failed--compilation aborted at kore.pl line 14.
となってしまいました。
もうどうしたらいいのか分かりません。もしよろしければ手を貸していただけないでしょうか?
257デフォルトの名無しさん:04/10/24 23:36:27
おめーうぜーよ
ちょっとは自分で考えろよ、ぼけ
258デフォルトの名無しさん:04/10/24 23:49:57
>>256
kore.plでぐぐったらここに思いっきり懇切丁寧に書いてあるわけだが...

ttp://tomato.cable.nu/buta/biginner.html

ということでうざいからもう来ないでね
259デフォルトの名無しさん:04/10/25 01:06:21
MFCのソースからすべてのクラス名を標準出力に
昇順にかつユニークに出力するプログラムを作成せよ。

但し、perlソースは5行以内かつ実行時間3000ms以下
260デフォルトの名無しさん:04/10/25 01:22:56
宿題はスレ違い
261デフォルトの名無しさん:04/10/25 01:27:14
>>260
出来ない人はレスしなくてOK
262デフォルトの名無しさん:04/10/25 01:47:58
>>259
それって質問なのか?

↓こっちでやれば?
Perlでリクに答えるスクリプトを作るスレ
http://pc5.2ch.net/test/read.cgi/tech/1086143976/l50
263デフォルトの名無しさん:04/10/25 07:39:47
オタの聖地、ROのBOTを動かしたい
でもプログラムのプ( ´,_ゝ`)の字もしらないこの俺
調べるのもまんどくせ2chへ質問しちゃえ


調べる気もない、教えてもらっても理解しようとする意志がない、Perlをやる気もはなっから無い
これじゃ嫌われるわな
264デフォルトの名無しさん:04/10/25 09:39:28
perl -e 'print &{&{sub{(my $v=1,sub{$v},$v=2)[1]}}},$v'
これの出力がなぜか"22"になります。これはどうしてでしょうか?
perl -e 'print &{&{sub{my $v($v=1,sub{$v},$v=2)[1]}}},$v'
これならちゃんと"2"になるんですが。分かる人いますか?
265デフォルトの名無しさん:04/10/25 09:40:39
すまそ。3行目はこれが正しいです。
perl -e 'print &{&{sub{my $v;($v=1,sub{$v},$v=2)[1]}}},$v'
266デフォルトの名無しさん:04/10/25 09:46:16
あ、my変数のスコープはリストないの一要素に限定ということか。そかそか。
(my $v=1,sub{$v},$v=2)の二番目三番目の$vはグローバルスコープの変数だったのね。失礼。
267デフォルトの名無しさん:04/10/25 12:04:40
>>266
試してみたら次の文にならないとスコープは有効にならないということ
のようですな。勉強になった。

while (((my $x = <>) == 1) || ($x == 2)) {
print "x=$x\n";
}

なんてやっても1しか受け付けないってことで、知らないとうっかり書いて
しまいそうだなぁ。use strictすれば怒られるからわかるけどね。

268264:04/10/25 12:46:17
>>267
ちょっと違ってたみたいです。。。
perl -e 'use strict;{(my $v=3,print "$main::v\n");print"$v\n"}print"$main::v\n"'

リストを作成するカッコにはスコープを限定する機能はないってことなのかな?
関数以外でスコープを限定するには{}(ブランケットっていうんだっけ 汗)
しかないのかな?

つまり
while(my($k,$v)=each %Hash){...}
というのは
my($k,$v);
while(($k,$v)=each %Hash){...}
と同じということなのかも。

ただし、>>264の例からも分かるようにリストの要素内ではスコープを確保される。
'use strict;(my $v=3,print $v,...
とは書けないんですよね。
269デフォルトの名無しさん:04/10/25 12:56:05
{
my($k,$v);
while(($k,$v)=each %Hash){...}
}
こうか。
あーなんかよくわかんなくなってきた。
ラクダ本読んで出直してきます。
270デフォルトの名無しさん:04/10/25 13:09:13
>>259
perl -e "while(<*.cpp>){open(IN,$_);while(<IN>){@a=/C[A-Z][A-Za-z]+/g;map{$h{$_}=1} @a;}close(IN);}END{foreach(sort keys %h){print qq<$_\n>;}}"
じゃだめ?
271デフォルトの名無しさん:04/10/25 13:29:23
>>269
ラクダ本読んでもスコープまわりの説明はいまいちハッキリしない
んだよな。perlsub(1)の「Private Variables via my()」という
見出しの中の以下の記述がオススメ。

The declared variable is not introduced (is not visible) until after
the current statement. Thus,

my $x = $x;

can be used to initialize a new $x with the value of the old $x, and
the expression

my $x = 123 and $x == 123

is false unless the old $x happened to have the value 123.
272デフォルトの名無しさん:04/10/25 18:18:40
>>271
あ、なるほど。セミコロンで区切られる式の評価順序の問題だったのですね。
リストと無名関数を使ってちょっと変わった構造のプログラムでも書いてみようかと
思ったのですが、myの評価順序はかなり制約になりそうですね。
273デフォルトの名無しさん:04/10/25 18:29:28
s/式/式内/
274デフォルトの名無しさん:04/10/25 20:44:08
ここはミスコピー用紙の裏?
275デフォルトの名無しさん:04/10/25 21:33:33
>>274
ですが、何か?
276デフォルトの名無しさん:04/10/26 01:30:04
RH9 と perl 5.8.5 で use encoding と ithread を同時に使うと
segmentation fault になっちゃうよ
どういうこと〜?
277デフォルトの名無しさん:04/10/26 09:47:41
Linuxはクソってこと
278デフォルトの名無しさん:04/10/26 13:05:38
すんません厨です。
ディレクトリ内の全てのファイルを置換したいのですが、
@a = <*.html> ;
foreach $i (@a){
open(YOMU,"$i") or die $!;
open(KAKU,"> $i") or die $!;
while ($a = <YOMU>) {
$a =~ s/<p>/<P>/g;
print(KAKU "$a");
}
close(KAKU);
close(YOMU);
}

上手くいかない。
279デフォルトの名無しさん:04/10/26 13:18:54
>>278
読み込み用と書き込み用に同一のファイルを同時に開くな。
tmpファイルを使うか、配列かなんかに突っ込んどけ
280デフォルトの名無しさん:04/10/26 13:28:42
>>278
-iオプションという手もあるな。大きなプログラムの一部にするには
ちょっと面倒だが。(Perlクックブックに例がある)
281デフォルトの名無しさん:04/10/26 13:35:06
>>279
あーそかそか。そうだね。ありがとう
>>280
調べてみます。
282NIDA:04/10/26 15:52:01
こんにちは、NIDA といいます。
// FC2 と Perl v5.8.3 です。

ちょっと質問なんですが、下のようなものを Perl で書く場合
どのようになるのでしょうか。

# ===================================================
int main(int argc, char* argv[]){

int i;
char str[ 32 ]="A";

for(i=0; i<26; i++){

printf("%s", str);
str[ 1 ]++;
}

return 0;
}

// 出力結果 : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

# ===================================================
283デフォルトの名無しさん:04/10/26 16:13:36
&perl;
sub main::perl{
$str= 'A';
for($i=0; $i<26; $i++){

printf("%s", $str);
substr($str, 1, 1)= chr(ord(substr($str, 1, 1))+1);
}
return 0;
}
284デフォルトの名無しさん:04/10/26 16:15:48
>>282
$str = "A";
for($i=0;$i<26;$i++){
@tmp = unpack("CC",$str);
print pack("CC",$tmp[0],$tmp[1]+$i);
}

285278:04/10/26 17:17:48
出来た。お礼まで。
286デフォルトの名無しさん:04/10/26 17:57:02
perl でアクセスできるデータベースを
作ろうと思うのですが、データ形式がテキスト形式でperlと相性のいい
DBを教えてください

287デフォルトの名無しさん:04/10/26 17:58:52
DBI:CSV
288デフォルトの名無しさん:04/10/26 19:08:20
>>287

サンクスコ
289NIDA:04/10/26 22:38:31

>>283, 284

chr, ord, pack, unpack なんて関数があるんですね。

ありがとうございました。 m(_ _)m
290デフォルトの名無しさん:04/10/26 22:43:18
Aがアラジンチャンスと思ってしまう、漏れは逝ってよしでつか?
291デフォルトの名無しさん:04/10/26 22:45:12
>>282
マジカルインクリメント

my $char = 'A';
foreach (1 .. 26) {
print $char++;
}

#結果 : ABCDEFGHIJKLMNOPQRSTUVWXYZ
292デフォルトの名無しさん:04/10/26 22:48:49
>>291
それじゃ半角じゃない。
str[ 1 ]++;とやっているから全角でやりたいのは確かだ。
293デフォルトの名無しさん:04/10/26 23:35:07
>>291
my $char = 'A';で半角になっているのに、
#結果 : ABC...と全角になっているのは何故ですか?
294デフォルトの名無しさん:04/10/27 00:42:04
print for ('A'..'Z');
ではだめ?(w
295デフォルトの名無しさん:04/10/27 01:04:40

カコイイ
296デフォルトの名無しさん:04/10/27 03:30:09
今ActivePerlとApache入れて試した。
cgiファイルで
#!/usr/local/perl
print "<html>\n";
print "<body>\n";
print "<h1>hoge</h1>\n";
print "</body>\n";
print "</html>\n";
って書いて動かしたら
ブラウザに書いたのが全部出た。hogeだけ表示させたかったんだがorz
タグとかprintとか表示されちゃったよ。何故?仕様?
297デフォルトの名無しさん:04/10/27 03:33:09
>>296
初心者用の導入サイトでも見ろよ
298デフォルトの名無しさん:04/10/27 03:38:01
スレ違いだけど、
print "Content-type: text/htnl\n\n";
を書かなきゃ表示されんぜ。
299デフォルトの名無しさん:04/10/27 03:39:00
htnl→htmlだた
300デフォルトの名無しさん:04/10/27 03:45:51
ここもおかしくないか?
#!/usr/local/perl
301デフォルトの名無しさん:04/10/27 03:47:48
>>300
君は本気で言ってるのかね?
302デフォルトの名無しさん:04/10/27 03:49:02
>>292
そもそも >>282 の例もおかしいことに気付いてやれよ。
303デフォルトの名無しさん:04/10/27 04:12:39
>>302
どこがおかしいんだ?
304デフォルトの名無しさん:04/10/27 07:46:01
perl -e'use encoding "euc-jp";print "A".."Z"'
こういうのやってみたいんですが、できますか?
305デフォルトの名無しさん:04/10/27 08:11:06
できない。

e'use

ほげなオプションありまへん。
306デフォルトの名無しさん:04/10/27 08:12:14
あ、でけた。>>305撤回。
307デフォルトの名無しさん:04/10/27 13:29:10
標準入力を標準出力したプログラムを作ったんだけど、
perl script.pl < file の場合はうまくいくけど、
script.pl < file はうまくいきません。
なぜなんでしょうか?
(リダイレクトせず単体では動作します。)
(ActivePerl/WinXP)
308デフォルトの名無しさん:04/10/27 13:29:49
age忘れ
309デフォルトの名無しさん:04/10/27 13:34:50
( ゚Д゚)ポカーン
310デフォルトの名無しさん:04/10/27 13:35:19
type file | script.pl
311307:04/10/27 13:42:40
#!f:/free/perl/bin/perl   #僕の環境です

print $_ while(<>);
312307:04/10/27 13:55:37
script.pl file ○
script.pl < file ×
script.pl ○
type file | script.pl × --*1 error message

perl script.pl file ○
perl script.pl file ○
perl script.pl ○
type file | perl script.pl ○

*1 プロセスが存在しないパイプに書き込もうとしました。
313デフォルトの名無しさん:04/10/27 14:10:11
>>307
cmd.exe の使い方は Windows 板へ。
http://pc5.2ch.net/win/
314307:04/10/27 14:30:21
>>313
AcrivePerlの問題だと思うんだけど,なぜcmd.exeの使い方が原因だと思うのか教えてほしいです
それが分からなければ向こうにも質問できない
315307:04/10/27 14:54:38
ActivePerlの仕様でした。

>>313
レス自体はありがたいが質問の答えやその問題点が分かってない
ならレスは不要。逆に混乱や迷惑になるのでやめてください
逆切れスマソ
316デフォルトの名無しさん:04/10/27 16:46:30
仕様ってどんな仕様だよ
そこまで書いてりゃ逆切れもスルーできるんだがなぁw
317デフォルトの名無しさん:04/10/27 16:56:13
ワラタ、問題点が分かってないのはおまえだっつーの(w
318デフォルトの名無しさん:04/10/27 17:13:53
>>315
逆切れするのは勝手だけど、話を振っといて、
自己解決したらハイサヨナラってのはどうかと思うぞ。

どういう仕様が原因でそうなったかとか解決方法とかを
書いて情報共有してもバチは当たらないと思うがどうよ。
319デフォルトの名無しさん:04/10/27 17:28:33
すみませんが、どなたか「if(-x _)」という条件文の「-x _」の部分の意味を教えて貰えないでしょうか?
320デフォルトの名無しさん:04/10/27 18:00:58
直前に-X(ファイルテスト演算子)またはstat/lstatで調べたファイルが現在の
実行UID/GIDで実行可能なパーミッションのとき真、それ以外は偽。

くわしくはラクダ本の「ファイルテスト演算子」について書いてあるところ
またはperlfunc(1)を参照せよ。

321デフォルトの名無しさん:04/10/27 18:04:22
html画面を出力する際に、
1:DBの更新を行う。(insert,update)
2:DB更新完了後、その旨をhtml画面で表示する
というものを作ったのですが、1のDB更新件数が膨大になるとi更新処理に時間が掛かりすぎnternal server errorで落ちてしまいます。
なにか対策方法はあるのでしょうか?
322デフォルトの名無しさん:04/10/27 18:12:07
なるほど。perlfunc(1)でググってみたところ解かったような気がします。
ありがとうございました。
323デフォルトの名無しさん:04/10/27 18:42:28
ググる?
# perldoc -f -X
がいいんだけど。
324デフォルトの名無しさん:04/10/27 18:43:13
ところでこの「-x」は環境(OS?)に依存して挙動が変わりますね。
Linux環境では単に実行権限があるかどうかを調べてるようなのですが、
Windowsだとexeファイル以外は偽を返すようです。
あるいはWindowsではexeファイル以外は実行権限を持たないように管理されてるのかもしれませんが・・・
325デフォルトの名無しさん:04/10/27 18:44:07
しかしperlやってるやつってバカが多いなww
英文ドキュメントすら読めない>307
知ったかレスで逆切れされてる>313
カスばっか(ププ
326デフォルトの名無しさん:04/10/27 18:46:37
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
327デフォルトの名無しさん:04/10/27 18:47:01
>>323
情けないことにLinux環境とかのドキュメント読むのに慣れてないもので、
そういう便利な機能があることに気がつけなかったです;
ググったところ、最初にperldocの日本語訳されたものが出てきたので助かりましたが。
328デフォルトの名無しさん:04/10/27 18:53:40
     P e r l ス レ は レ ベ ル 低 ぅ ( 失 笑 )
329デフォルトの名無しさん:04/10/27 18:59:52
右翼の俺としてはひまわり最強!!!!!
330デフォルトの名無しさん:04/10/27 21:04:35
かわいそうに、rubyが伸びなくて、八つ当たりしてる奴(w
ruby基地、また、帰ってきたか(プッ

331デフォルトの名無しさん:04/10/27 21:34:59
C++&boost::regex >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
332デフォルトの名無しさん:04/10/27 21:40:02
>>331に続く
>>>>>>>>>>>>>>>>>>>ruby
333デフォルトの名無しさん:04/10/27 21:43:38
煽りは放っておいて淡々マッタリと進行するのが大人の態度
334デフォルトの名無しさん:04/10/27 21:54:10
反論しようにも無理だしなwwwwww
335デフォルトの名無しさん:04/10/27 22:03:31
反論に値する事象でもないからねぇ(哀)

さて。なにやら面白そうなことが始まる悪寒。
Perlコーディング初心者質問スレ Part 38
http://pc5.2ch.net/test/read.cgi/php/1097158988/361-
多分ネタだと思うけれども(w
336デフォルトの名無しさん:04/10/27 22:18:46
その程度もようやらんのか。アホすぎ
337デフォルトの名無しさん:04/10/27 22:31:29
>>335
Ruby 厨ウゼーとか言われそうであれなんだけど、 Ruby だとこんなのができるよ。

% ruby -ropen-uri -e "print open('http://2ch.net/').read"

Perl でもできるとかなり嬉しい悪寒。
338デフォルトの名無しさん:04/10/27 22:36:31
webprogはゴミ溜め。
perlはそのまんまゴミ。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
339デフォルトの名無しさん:04/10/28 01:02:31

が足らなさすぎ
もうちょっとRuby勉強しろ、ぼけ
340デフォルトの名無しさん:04/10/28 06:04:39
python! python! (AAr
341デフォルトの名無しさん:04/10/28 08:14:57
>>337
perl -MLWP::Simple -e "getprint 'http://www.2ch.net' "
342デフォルトの名無しさん:04/10/28 10:47:50
>>341
いや、短く書くコンテストをしたいわけじゃなくて、多態で幸せになれるという話なのですが・・・
343デフォルトの名無しさん:04/10/28 14:17:30
初心者です。perlのTkで円を作るプログラムを作りたいのですが。
キャンバスを一回クリックし、そこを中心としてマウスを動かしして二回目のクリックの
とこまでを半径とする真円を作りたいのですがうまくいきません。楕円はできるのですが。
教えていただければ幸いです。
344デフォルトの名無しさん:04/10/28 16:14:00
>>342
君、プレゼン能力ないね
345デフォルトの名無しさん:04/10/28 17:13:36
>>343
それはPerl/Tk関係ないな、算数を思い出せ。
クリックされた2点間の距離を計算して半径にしろ
346デフォルトの名無しさん:04/10/28 17:18:25
>>344
はい、ないですが、それがどうしたのでしょうか?
347デフォルトの名無しさん:04/10/28 21:52:43
>>342
use LWP::Simple;
my $content = get('http://www.2ch.net');
open my $fh, '<', \$content;

じゃ駄目なのかい?
348デフォルトの名無しさん:04/10/28 22:10:49
GD はいらんな
349デフォルトの名無しさん:04/10/28 22:26:52
https?://で始まるスキームだけをoverrideして欲しいモナー
350デフォルトの名無しさん:04/10/28 22:48:16
それはオーバーライドや多態じゃなくて単にopen関数の仕様だろ。

351デフォルトの名無しさん:04/10/29 00:10:27
>>125
>>136
>>142
この142さんの「思いっきり条件付きだろうが。」とは
どういった状況を指しているんでしょうか?
自分ではOSかfairewallで内側からのportの使用を制限している時ぐらい
しか思い浮かびません。
サーバーをまたいで動作するプログラムの動作条件がどのくらい厳しい物になるのか
知りたいためご教授下さい。
352デフォルトの名無しさん:04/10/29 06:52:29
クロスサイトスクリプティング
でぐぐれ
353デフォルトの名無しさん:04/10/29 11:22:05
ユーザIDとパスワードで認証を行うcgiを作成したのですが
フォームからのパスワードが変数にうまく入っていないようでして
ユーザファイルのパスワードとフォームに入れたパスワードの評価式がうまくいきません。
ユーザファイルのIDとIDフォームのIDの評価はうまくいってます。
原因わかりますでしょうか。
if ($in{'wrt'} ne on)
{
print "<br><br><br><form action=\"$script\" method=\"POST\">\n";
print "<input type=hidden name=wrt value=\"on\">\n";
print "<tr><td align=center><b>ID</b></td><td> <input class=text type=text size=12 name=id></td></tr>\n";
print "<tr><td align=center><b>パスワード</b></td><td><input type=password size=12 maxlength=8 name=pwd></td></tr></table>\n";
print "<br><br><input type=submit value=\" 認証 \"></form>\n";
print "</center></body>\n";
}
else
{
$flag = 0;
open(IN, "$userfile");#パスワードファイルを開く
while ($data=<IN>)
{
($id,$pwd) = split(/,/, $data);#カンマでIDとパスワードを分割
if ($id eq $in{'id'})
{$flag = 1; last;
}
}
close(IN);
#パスワードチェック処理 ##############################ここが正しく評価されません
if($pwd ne $in{'pwd'})
{
&error("パスワードが違います");
}
354デフォルトの名無しさん:04/10/29 12:13:33
>>353
$idをキーとするハッシュに汁。
そのままやるんなら、idとpassが1行に1個しかかけないね。
$data=<IN>が糞。
355デフォルトの名無しさん:04/10/29 12:29:55
>>フォームからのパスワードが変数にうまく入っていないようでして

「ようでして」じゃなくてちゃんと調べろよ。入力パラメタの値を
そのまま表示するぐらい簡単だろ?

それにフォームからのパスワードが変数に入ってないといいながら
肝心の変数にいれるとこを出さないでいれちまった後の処理を
貼ってもしょうがない。

356デフォルトの名無しさん:04/10/29 14:47:19
perlのsystem関数でCのモジュールを呼んでいるのですが
その戻り値として、Cのバッファ(char *)(100文字)を返しているのですが
うまく格納できません。

Cソース抜粋
char *test_buff;
test_buff = malloc(100);
return test_buff;


perlソース抜粋
$buff = system("test.exe");
357デフォルトの名無しさん:04/10/29 14:56:03
そらそうよ
358デフォルトの名無しさん:04/10/29 15:04:22
>>356
Cの方で文字列を標準出力に書き出して、Perlの方からはパイプを使って読め。
359デフォルトの名無しさん:04/10/29 15:10:02
>>356
マルチポストかよ。死ね。
360デフォルトの名無しさん:04/10/29 16:30:45
361348:04/10/29 20:42:17
なーんでGDだけはいらんのだろ?
362デフォルトの名無しさん:04/10/29 20:46:07
>>361
独り言?
363348:04/10/29 20:47:55
>>362
うん。でも心の何処かで助けを求めてる自分が居るような気がする。
364デフォルトの名無しさん:04/10/29 20:58:35
誰か教えてください。
while( $hogehoge =~/正規表現/gm)
{
$get = $&;
}
と言う風に、マッチングした複数行にわたる文字列を取得して
いますが、$hogehogeが巨大なテキストファイル(だいたい500k以上)
になるとループが動きません。この方法ではダメだとか、
ほかにいい方法があればご伝授ください。
365デフォルトの名無しさん:04/10/29 21:02:00
>>363
んなこと言わずにもっと具体的に問題点を書きなよ。
366348:04/10/29 22:21:38
>>365
藻前イイヤツだな
367デフォルトの名無しさん:04/10/29 23:25:37
>>364

マッチすると無限ループするのか
斬新だなぁ
368デフォルトの名無しさん:04/10/29 23:29:41
>>364
正規表現の内容によってはバックトラックがはげしく行われる等の
理由で無限ではないがものすごく時間かかることはあり得るな。

正規表現を具体的にさらせばなにか答えてくれる人がいるかも?


369364:04/10/30 00:07:34
>>367
>>368
同じファイルで、マッチングしない部分を切り取って、
ファイルサイズを小さくした場合、正常にループが動き、
マッチングも思い通り行きますので、無限ループに陥っているわけではないみたいです。
デバッグでも確認しましたが、ループそのものが吹っ飛んでプログラム
自体が強制終了しているようです。ファイルサイズもそんなに大きくないので、
訳が分かりません。ただ、モジュール(*.pm)のサブルーチンに、$dataのような
形で渡しているのが気にはなるのですが、配列にして参照渡ししても事態は
変わりません。
370デフォルトの名無しさん:04/10/30 00:17:21
強制終了となるとメモリ不足とかそっちの関係かもしれないな。
あるいはcpu時間の制限されてるとか...
371デフォルトの名無しさん:04/10/30 01:26:01
改行が入ってるとか
372デフォルトの名無しさん:04/10/30 02:21:04
自動的にデータを収集するプログラムを作りたいと思います。
たとえば、yahoo-movieの興業成績ランキングにリンクされている映画の
題名、出演者などを自動収集したりしたいのですが、Perlでできるのでしょうか?
また、Perlでするのは正しいのでしょうか?また、簡単にできるのでしょうか?
ご教授お願いします。
373デフォルトの名無しさん:04/10/30 02:28:09
問1. 出来る
問2. まぁ正しい
問3. 人による、ある程度Perlが使える人間にとっては簡単

374デフォルトの名無しさん:04/10/30 03:05:21
>>372
Perlの専売特許
375デフォルトの名無しさん:04/10/30 03:06:43
Rubyこそ最適解
376デフォルトの名無しさん:04/10/30 03:22:14
>>366
虫の居所の悪いときなら「チラシの裏に・・・」って言うんだけどね。

>>364
while ($hogehoge =~ /(正規表現)/gm) {
$get = $1;
}
としてみてはいかが?
377デフォルトの名無しさん:04/10/30 11:55:00
>>364
$hogehogeに含まれるマッチする最後の文字列が欲しいんだよね?
/(regex).*?(?!regex)/gm
なんてどうだろ
んで$get = $1

あとregexに関わる特殊変数は使わない方がパフォーマンスはよいです
378364:04/10/30 12:55:07
皆様いろいろありがとうございました。
いろいろやってみましたら、正規表現の記述に問題があり、
動作が不安定になるようです。具体的には、複数行にわたって
start とendではさんでいる間の(.*|\n)+が問題だったようです。
繰り返し数はほとんど無限と思っていましたが、調べてみたら
32766あたりが最大のようです。

379デフォルトの名無しさん:04/10/30 13:29:47
>>378
正直、どんなデータに何をしたいのかとか実際に実装してみたパターンを
晒してもらわないと想像でしか言えないんだけど、
m オプションを付けてるんだから (.*|\n)+ みたいなパターンは要らない気がする。
/(start\n(?:.+?)end\n)/gm
とかでええのでは?

あと、 >>377 の指摘の通り、 $& みたいなのは使っちゃダメだ。
/([^\n]*\n[^\n]*\n)/gm みたいなのででかいテキストのマッチを試してみたけど、
$1 なら一瞬で終わるのが $& を使うと激遅になる。
しかも、コード中の別の箇所で一度でも $& を使うと同様に激遅になる。
$`, $&, $' は死んでも使っちゃダメだ。いや、使ったら死ぬ。
380デフォルトの名無しさん:04/10/30 13:33:13
>>378
なんかregexec.cをみるとREG_INFTYという定数があって、32767っぽいですな。
んで、+,*はそれぞれ{1,REG_INFTY},{0,REG_INFTY}と同じになっているようです。
無限じゃないのか〜。
381デフォルトの名無しさん:04/10/30 13:50:18
>>378
ひょっとしてこれが出たのかな?

Complex regular subexpression recursion limit (%d) exceeded

(W regexp) The regular expression engine uses recursion in complex
situations where backtracking is required. Recursion depth is
limited to 32,766, or perhaps less in architectures where the
stack cannot grow arbitrarily. ("Simple" and "medium" situations
are handled without recursion and are not subject to a limit.)
Try shortening the string under examination; looping in Perl code
(e.g., with while) rather than in the regular expression engine;
or rewriting the regular expression so that it is simpler or
backtracks less.

382デフォルトの名無しさん:04/10/30 14:02:08
おしえてくんでスマヌ。studyって、どんなとき有効?
383364:04/10/30 15:01:35
いろいろお世話になっています。いろいろ試してみましたが、
どうしてもうまく行きません。具体的にデータをだしてみますので
ご教授いただければ助かります。

対象文字列は、
$data = "
>comment1\nhogehoge\n・・・多数行\nhogehoge\n
>comment2\nhogehoge\n・・・多数行\nhogehoge\n
>comment3\nhogehoge\n・・・多数行\nhogehoge\n
>・・・繰り返し
"
の形をしています。ここで、>comment を含む(またいで複数取得する場合あり)
多数のhogehoge\nを取得するために、
while ($data =~ /(^>comment_start((?!>comment_end).*|\n)+)>comment_end/gm ){
$get = $1;
}
と言うようにとっています(377さん,379さんの指摘どおり$1にしました)。
comment_startとcomment_end間が短い場合
(おそらく32776行以下)は、この方法でいきますがそれ以上の場合は
ループが吹っ飛んでいます。ご指摘のとおり、+などが無限ではないためだと
思います。今までは、多数行にわたる場合\nで切った各行を処理して
その結果をつないだりしていたのですが、勉強のために正規表現を使った
方法に切り替えて苦労しています。考え方としては、comment間にある
hogehogeのブロックを1つとして表現できれば良いのかと思っていますが、
そのような正規表現は可能でしょうか。
384デフォルトの名無しさん:04/10/30 15:21:56
>>383
まだよくわかんないけど、その $data を取るならこうかなあ。
/(^>comment\d*\n[\s\S]*?)(?=>comment\d*\n|\z)/gm
385 ◆7CWqH7Oesg :04/10/30 16:29:33
for (/start(.*?)end/gs){
処理;
}
386デフォルトの名無しさん:04/10/30 16:37:26
>>383
32,776については量指定子を大きくしただけでも弾かれてきますね。
$ perl -e '/.{100000}/'
/.{100000}/: Quantifier in {,} bigger than 32766

たぶん、これの絡みで、$hogehogeが13,792行より大きいと
(正規表現は383さんとはちがうんですが)
while ($hogehoge =~ /((?:.*\n)*)/gm) {
  my $get = $1;
  ....
}
で、うちのマシンではSegfaultします。(v5.6.0 built for i386-linux)
行が少なければOKです。
/mオプションでループさせるよりも、/sでいったん欲しい部分を切り出してからの
処理の方がいいかもよ。ちょっとダサイかもしれないけど。
387デフォルトの名無しさん:04/10/30 17:00:42
for (split />comment/, $data)
push @result, $& unless s/正規表現//gs;
}

よくわかっていません、、、
388デフォルトの名無しさん:04/10/30 17:16:08
>>387
やるなら
if ($hogehoge =~ m/>comment1\n(.*)>comment2/s) {
  my @result = split "\n", $1;
  ....
}

forなら
my @result;
@result = split "\n", $1 for ($hogehoge =~ m/>comment1\n(.*)>comment2/s);
389デフォルトの名無しさん:04/10/30 17:29:05
ついでにいうと、間にはさまれるかもしれない >comment* を
取りさった状態で取得したいなら @result と split の間に grepを挟む。
ifの場合でもforの場合でも同じ。

@result = grep { !m/^>comment/ } split("\n", $1 ....
390デフォルトの名無しさん:04/10/30 17:50:00
>>389
隠しファイル以外をゲットしたいときも似たようなことやるよね。
@files = grep !/^\./, readdir DIR;
391デフォルトの名無しさん:04/10/30 18:07:40
>>390
漏れはやらないなあ。
my @files = <*>;
392364:04/10/30 18:09:58
>comment_startで切って、>comment_endで切って、>で切って
つなげ直すしかないのかなあ。
$cs=">comment_start";
$ce=">comment_end";
1行で直接的に書くとこんな風
$get=$cs.(split(/$ce/,(split(/$cs/,$data))[1]))[0].$ce.(split(/>/,(split(/$ce/,(split(/$cs/,$data))[1]))[1]))[0];
一応まともに動くけど、誰かもっと分かりやすいコードに直せませんでしょうか。

393デフォルトの名無しさん:04/10/30 18:10:09
>>391
シェル使うのならそうだね
394デフォルトの名無しさん:04/10/30 18:22:33
>>393
シェル使う?これだとシェルを起動しちゃうんだっけ?
395デフォルトの名無しさん:04/10/30 18:30:06
>>392
いまいちデータの構造がどうなっててどうしたいのか伝わらんのだが
...
>comment_start
>comment1
foo
bar
baz
>comment2
hoge
huga
hage
>comment_end
...
てな構造で $get には >commen_start の次の行から >comment_end の直前行まで欲しいってこと?
396デフォルトの名無しさん:04/10/30 18:33:39
でかいファイルをまとめて読んであれするよりは
もともと行になってんだから行単位に処理した方が
楽かもな。
397デフォルトの名無しさん:04/10/30 18:36:05
>>392
同じ動作であれば下ので充分いけますよ。

print $1 if ($data =~ m/(>comment_begin.*>comment_end[^>]*)>/s);
398デフォルトの名無しさん:04/10/30 18:37:43
>>394
グロブはシェル呼ぶはずだよ。たしか。
399364:04/10/30 18:38:08
>>395 
わかりにくくて、すみません。
>comment_start
foo
bar
baz
>comment2
hoge
huga
hage
>comment_end
hoge
nuke
kuke
と言う風に、>comment +データ領域 単位で取得したいのですが。。
全データが大きいので、正規表現の* とか+が動かない場合があって
苦労しています。


400デフォルトの名無しさん:04/10/30 18:39:31
>>394
手元のラクダ本(2nd edition)には
“グロブを行うときにはサブシェルが起動される。だから、自分でreaddir関数を呼び出して得られたファイル名に対しgrepをする方が速いことが多い。”
と書いてある
まぁ“現在の実装では”と後付けされてはいるが
401397:04/10/30 18:40:09
$get = $1 if ($data =~ m/(>comment_begin.*>comment_end[^>]*)>/s);
か。
402デフォルトの名無しさん:04/10/30 18:44:50
>>399
ますますワカラン・・・w
>comment_start
foo    ← >comment1は無いの?
bar
baz
>comment2
hoge
huga
hage
>comment_end
hoge   ← >comment_start は無いの?
nuke
kuke

何にせよこれがファイルに書いてるデータならwhileで回してフラグ使ってチマチマやるのが正解だと思う
403デフォルトの名無しさん:04/10/30 18:45:10
>>398 >>400
知らんカッター。じゃああんまり使わんようにしよう。
404398:04/10/30 18:48:09
使ってるシェルやプラットフォームに応じて
グロビング表現を対応させるために、
Larryはシェルを呼ぶようにしたんだと思う。多分。
シェル依存にしないでPerlで実装させる手もあったんだろうけどね。
405397:04/10/30 18:55:20
>>364
要は取り出したい部分が comment_start と comment_end に囲まれている
「というだけではなくて」comment_end の後に 1セクションぶら下がってる
って、ことに四苦八苦していると理解していいのか?
406364:04/10/30 18:58:32
>397
$cb=">comment_begin";
$ce=">comment_end";
$get = $1 if($data =~ m/($cb.*$ce[^>]*)>/s);
でうまくいきました。皆様大変ありがとうございました。
while loopを使って内部処理も同時にしようと思ったのが、つまづきの
始まりでした。得られた結果を順番に処理していくことにします。



407デフォルトの名無しさん:04/10/30 18:58:44
なんでそんなに正規表現にこだわるの?
408デフォルトの名無しさん:04/10/30 19:08:48
なんかもうデータ構造見直せとしか言えん・・・
409デフォルトの名無しさん:04/10/30 19:14:55
>>408
マークアップ言語風に start〜end タグで囲まれてるデータじゃなくて
たぶん辞書風に title->content(s) と列挙されているデータなんだよ。
で、contents部分のフィールド数が可変だから行方向にならべるしかない、みたいな。
伝票とか、ヘッダとアイテムで構成される一般的なデータ構造もこの構造とるよ。
まあ、ファイル格納というよりはDB向きという気もするけどね。
410364:04/10/30 19:17:37
>>407
正規表現を使って複数行の取得をして、それができたら
グループ分けで値を取得して、同時に処理も可能だと
楽だなと思った次第です。ごく簡単な正規表現しかしらないので、
今までは、行ごとに区切って、つなげてとやっていたのですが、
今回いろいろ教わりましたので、少しperlのスキルが上達した
感じです。ただ、巨大なファイルでなければ動いていたのですが、
こんなところに落とし穴があったとはという驚きもあります。



411デフォルトの名無しさん:04/10/30 19:26:37
>>409
メールのmbox形式が、このケースの場合近いんじゃないかな?
日付やタイトルで範囲指定して中身を取り出す操作に近い気がする
412デフォルトの名無しさん:04/10/30 19:42:16
>>406 >>410
まあ結局、">comment_begin"〜">comment_end"の組が32767以上あったら破綻する訳だ。
巨大もなにも、何かのログファイルだったりすると当たり前に越えるだろうから、
whileとフラグでチマチマやる方が正解。
413デフォルトの名無しさん:04/10/30 19:47:17
>>412
m//mでやる場合はそうだけどm//sの場合のマッチは1回だけだから
32767の制限にはひっかからないし >>406 のやり方で
ぜんぜんOK何じゃないの?
414デフォルトの名無しさん:04/10/30 21:26:42
cgi-bin.plのダウンロード先、教えてちょんまげ
415デフォルトの名無しさん:04/10/30 22:29:49
そんなの知らんちょんまげ。CPANで検索するよろし。
416デフォルトの名無しさん:04/10/31 11:03:20
日々CSV形式でログが蓄積されるシステムがあったとして、
何らかの検索条件を指定して(例えば●●フィールドの
値が××のレコード)を検索するようなことをやりたいんだけど、
どうやったら速いかな。

ちなみにCSVファイルは1日1ファイル、1ファイル数万行、
1レコード15カラムくらい。
417デフォルトの名無しさん:04/10/31 11:14:37
daemon書いて常駐させてメモリに全部持つ
418デフォルトの名無しさん:04/10/31 12:04:41
>417
無理じゃね?
1レコード15カラムでざっくり200バイトとして、
1ファイル2万行。ってことは4MB。
日々蓄積ってのが期間がわからんけど、1年としたら
1GB余裕で超えるべ。
419デフォルトの名無しさん:04/10/31 12:07:08
たった1GBだろ。
そのへんの検索エンジンが何TBメモリ積んでると思ってるんだ
420デフォルトの名無しさん:04/10/31 12:08:42
書いてませんでしたが、ログの蓄積期間は1年です。
あと動作させるのは普通のPC(Windows2000)で
メモリはよくて256MB、おそらく128MBです。
421デフォルトの名無しさん:04/10/31 12:15:06
>419
いや、書いてないから分からない。
422デフォルトの名無しさん:04/10/31 12:18:05
128MBか、少ないな。
423デフォルトの名無しさん:04/10/31 12:31:51
sql で use dbi
424デフォルトの名無しさん:04/10/31 12:33:17
遅そう
425デフォルトの名無しさん:04/10/31 12:34:06
そもそも速度が重要ならperlとかcsvなんて使うなよ
426デフォルトの名無しさん:04/10/31 12:36:29
>423
レコード数どのくらいいけるの?
427デフォルトの名無しさん:04/10/31 12:36:56
>>425
いやー、多分君は聞かれてないと思うぞ。
428デフォルトの名無しさん:04/10/31 12:45:27
>>426
儂が扱ったのはMysqlで3万件ぐらいだけど、知ってる人のは100万件超えてる。
429デフォルトの名無しさん:04/10/31 12:55:22
儂 ←これなんて読むの?
430デフォルトの名無しさん:04/10/31 12:56:33
オゥレ
431デフォルトの名無しさん:04/10/31 12:57:04
>429
のう
432デフォルトの名無しさん:04/10/31 13:15:25
>>416
速さを求めるならRDBMSに突っ込んだほうが良いかと思われるけど。
お手軽にやるならDBI+DBD::CSVかなぁ。
433デフォルトの名無しさん:04/10/31 13:16:43
わし 0 【▽私/▼儂】

(代)
〔「わたし」の転〕一人称。男性が、目下の者に対して尊大な感じを伴って用いる語。おれ。
「―も年をとった」
〔近世では、主として女性が用いた。
「薄雲はしほと涙ぐみ、―はかやうに落ぶれて路頭にさ迷ひありく事/浄瑠璃・当麻中将姫」〕
434デフォルトの名無しさん:04/10/31 13:18:30
ore
435デフォルトの名無しさん:04/10/31 13:20:31
>>426
約4億
436デフォルトの名無しさん:04/10/31 13:34:21
>435
2000万件くらいから3000件ぐらい選択するのに
どのくらいかかるかな。
437デフォルトの名無しさん:04/10/31 14:10:53
perlでファイルを100コ作る方法を教えてください。
438デフォルトの名無しさん:04/10/31 14:13:53
>>437
100回ファイルを作る動作をすればいいだけじゃないか
439デフォルトの名無しさん:04/10/31 15:25:38
>>438
アフォ?
440デフォルトの名無しさん:04/10/31 16:29:40
>>416
オラクルで2000万件超の業務データ扱ってるけど
インデックス張っておけば単純な検索なら一瞬だよ。
(まあ、索引付けた列のカーディナリにもよるけどね)
CSVをDBMSに転送して、そっちで検索かけたほうが賢いんじゃない?
441デフォルトの名無しさん:04/10/31 16:49:12
まあ、検索アプリにするのなら
データをDBに落としてI/FをDBIあたりで出力をWEBに出すというのがラクです。
ただDB用にメモリ128MBしか充てられないとすれば
追加で何かちょっとしようとしたら途端に辛くなるかもね。
442デフォルトの名無しさん:04/10/31 16:51:44
漢ならヒタスラGrep汁!
安上がり汁!!
443デフォルトの名無しさん:04/10/31 17:41:29
ソケットのコネクションを毎回保ったままにするプログラムを作成したのですが
どのような方法があるでしょうか?
セッションやPersistentを使っても接続は毎回切れてしまいますし
mod_perlで試してみたのですがプロセスがMaxSpareServers分起動され
必ず前回のコネクションが保ったままのプロセスにアクセスされるとは
限らないため期待する動作になりません。

プログラムAとBを作り、Aは常駐してbindしコネクションを保ったままにし
BからAにセッション情報を渡して前回のコネクションを保持するという
方法が一番現実的なのかな
444デフォルトの名無しさん:04/10/31 17:51:23
>>443
そのプログラムAをApacheのモジュールとしてええのでは?
コネクションに番号付けて管理しておき、セッション番号と照らし合わせて
渡してあげる。みたいな。
445デフォルトの名無しさん:04/10/31 18:16:55
>440
サンクス
>441
サンクス
>442
ノーサンクス
446デフォルトの名無しさん:04/10/31 19:48:41
>>437
open F, ">$_" for 1 ..100;
なんてな

ところで
ttp://qa.perl.org/phalanx/distros.html
みんな使ってるかい?
447デフォルトの名無しさん:04/10/31 20:15:45
>>443
DBのコネクションプーリングが目的なら Apache::DBIだな。
他に ttp://sqlrelay.sourceforge.net/ という手もある。
ネトゲーの中継とかなら自分でつくるとかかもな。
448デフォルトの名無しさん:04/11/01 10:33:46
perlのコードから設計書ってつくれないですか?(javadocみたいな)
とにかく設計書のページ数をかせぎたい・・・。
449デフォルトの名無しさん:04/11/01 10:36:39
perldoc
450デフォルトの名無しさん:04/11/01 10:50:49
>>449
ありがとう。・゚・(ノ∀`)・゚・。
さっそくググってみます。
451デフォルトの名無しさん:04/11/01 11:16:10
あらかじめpod埋め込んでないとどうにもならんような。
pod埋め込んでいてperldoc知らないとも思えないし...
452448:04/11/01 11:40:40
うめこんでないやorz
453デフォルトの名無しさん:04/11/01 11:56:58
cgiページからpostでまた別のcgiを呼んでいるのですが
前のcgiで使用したスカラ変数の中身を
呼び出し先でも使いたいのですが方法はありますでしょうか。
454デフォルトの名無しさん:04/11/01 12:58:34
postで送る。
455デフォルトの名無しさん:04/11/01 13:49:23
いろいろありそうだな。
456デフォルトの名無しさん:04/11/01 15:06:21
変数の中身を Storable でシリアライズしたのを form のパラメータとして (ry
457デフォルトの名無しさん:04/11/01 21:16:53
syslogで、現在時刻から五分前までのデータを出力しようとしてます。
perlで普通に先頭行から読んでいるのですが、最終行から逆に読んだり出来ますか?
458デフォルトの名無しさん:04/11/01 22:16:21
tail の結果を読め。
459デフォルトの名無しさん:04/11/01 22:27:22
>>458
???
460デフォルトの名無しさん:04/11/01 22:39:16
A B C 0
D E F 9
....(略)
G H I 2
# 区切り
A B C 3
D E F 4
...(略)
G H I 7
perlで上のようなフォーマットのテキストファイルを開いて(区切りの上と下の文字列で共通の物は同じ物を表し、数字は例)
先頭の文字列が同じ物について引き算を行い(例えばA B Cなら0-3、D E Fなら9-4、G H Iなら2-7)A B Cについてから順に出力したいのですが、
何かいい方法はありませんか?
461デフォルトの名無しさん:04/11/02 00:45:32
>>457
言葉のそのままの意味で逆に読むことはできない。
ファイルが余り大きくないなら全部配列に読み込んで、時刻をみながらpopしていくのが楽。
458氏のようにtailの結果をリバースしてくのもいいかも。
あるいはopenしたあと、seekでラストまで飛んで適当なオフセットで戻ってくとか。
そんなかんじかな。
462デフォルトの名無しさん:04/11/02 04:32:21
cpanを検索してどうも無さそうなんだが、C/C++のヘッダファイルをparseするモジュールって
既存の物があるかな?
463デフォルトの名無しさん:04/11/02 05:54:37
cpp
464デフォルトの名無しさん:04/11/02 06:48:57
>>463
コマンド名なんて聞いてねーよ
465デフォルトの名無しさん:04/11/02 07:31:56
>ヘッダファイルをparseする
どういう意味?/^#include.+?\.h>/でいいじゃん。
466デフォルトの名無しさん:04/11/02 10:53:06
>>462
どういう探し方をしたのか知らんがコレでは無いのか?
http://search.cpan.org/~amichauer/C-Include-1.40/Include.pm
467デフォルトの名無しさん:04/11/02 11:58:36
>>460
my %group;
open TXT, 'text.txt' or die $!;
while(<TXT>){
chomp;
my($str, $num) = /([\sA-Z]+)(\d+)/;
push @{$group{$str}}, $num;
}
close TXT;
foreach(sort keys %group){
print "$_ = ", $group{$_}->[0] - $group{$_}->[1], "\n";
}
468460:04/11/02 15:12:46
>>467
参考になりました。ありがとうございます。
469デフォルトの名無しさん:04/11/02 15:39:08
ある実行体が不定期に吐き出す文字列を
Perl/Tkでリアルタイムに表示させたいと思っています。

Labelウィジェットの-textvariableを利用すればよいかと思って
以下のコードを書いてみましたが、入力した文字列は窓には表示されませんでした。
use Tk;

$result_message = "";
$top = MainWindow->new();
$top->Button( -text => 'start', -command => \&input )->pack();
$top->Label ( -textvariable => \$result_message )->pack();
MainLoop();

sub input {
while (1){
$result_message = <>;
# print $result_message;
}
}

任意の標準入力をbind出来ないかとも思いましたが
僕には見つけられませんでした。
何か良い解決法はないでしょうか?
470デフォルトの名無しさん:04/11/02 17:52:10
>>463 >>465-466
サンクス。「parseする」とだけでは曖昧だった。
やりたかったことは、h2xsのようにマクロと関数宣言が大量にずらずら並んだ
ヘッダファイルをスキャンし、別言語から利用するためのスケルトンを一括作成したかったのだ。
466のC::Includeで簡単にできそうなので助かった。
471デフォルトの名無しさん:04/11/02 19:02:28
cgi実行後、表示されるinput textのフォームにあらかじめ値を代入することは可能でしょうか?
472デフォルトの名無しさん:04/11/02 20:22:52
>>469 Tk::fileevent or Tk::IO
473デフォルトの名無しさん:04/11/03 00:01:38
>>471
可能
474デフォルトの名無しさん:04/11/03 01:54:43
>>471
とりあえず引用符の扱いに気を付けてくれ
475初心者:04/11/03 02:12:27
データのを整えたい

私はperlを学んでいる途中です。
練習で以下の作業をしようとして、できなくて困っています。

perlで[1]を[2]のようにデータを整える作業をしたいと考えています。
「全角同士で挟まれたスペースの削除(例)中 央→中央」と「全角数字と並んでいる

ところに,(カンマ)を挿入する(例) 篠崎11→篠崎,11」の2点の作業をしたいです。
何方か、アドバイスを下さいお願いします。

[1]
中 央1丁目591 281 310 218 2丁目602 315 287 227
2丁目522 256 266 179 大字南篠崎1130 559 571 352
本 町831 396 435 301 花 崎1丁目1459 749 710 604

[2]
中央1丁目,591,281,310,218,2丁目,602,315,287,227
2丁目,522,256,266,179,大字南篠崎,1130,559,571,352
本町,831,396,435,301,花崎1丁目,1459,749,710,604
476デフォルトの名無しさん:04/11/03 02:26:39
>>475
あっちにもコッチにも…。

Perl言語に詳しい人に質問!
http://pc5.2ch.net/test/read.cgi/tech/1037383722/l50

Perlでリクに答えるスクリプトを作るスレ
http://pc5.2ch.net/test/read.cgi/tech/1086143976/l50

マルチはイカンで。
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
477初心者:04/11/03 02:39:38
すいません…知らなくて。
以後、気をつけます。
478デフォルトの名無しさん:04/11/03 03:21:09
下のようになる希ガス

中央,1丁目,591,281,310,218,2丁目,602,315,287,227
,2丁目,522,256,266,179,大字南篠崎,1130,559,571,352
本町,831,396,435,301,花崎,1丁目,1459,749,710,604
479デフォルトの名無しさん:04/11/03 03:31:27
>>477
眠いので適当、しかもjperl限定。
s/(?:(\D+[\D\s]*\D+)\s?(?=\d)|(\d)\s)/$1$2,/g;

日本語の扱い
http://www.din.or.jp/~ohzaki/perl.htm#JP
480479:04/11/03 03:38:16
あー、改行はそのまんまかぁ。
「\s」 → 「\ 」で。
481初心者:04/11/03 04:25:03
>>479
ありがとうございました。
おかげで助かりました。
482デフォルトの名無しさん:04/11/03 09:11:45
ほー、正規表現って面白そうだなぁ
483マイク ◆yrBrqfF1Ew :04/11/03 15:00:25
Perlはハッカーに向いた言語だ。
こんなところにハッカーはいない。
484デフォルトの名無しさん:04/11/03 17:29:16
>>483
正しい意味でのハッカーか、それとも誤用が広まって
正しい意味になりつつあるハッカー(≒クラッカー)か。
485デフォルトの名無しさん:04/11/03 18:34:23
大の大人は華麗にスルー
486457:04/11/03 19:22:24
>>461
ありがとう。
popは使わなかったけど、配列をreserveで裏返した後、foreachに入れて、適当なところで、lastで抜けた。
処理時間が、五分の一になった。ありがとう。
487デフォルトの名無しさん:04/11/03 22:30:58
if(!$in{'bakadesu'})
↑は
if($in{'bakadesu'} ne "")
と同じ意味なのでしょうか?
488デフォルトの名無しさん:04/11/03 22:41:08
微妙に違う
値が 0 も偽
perlでは有名な話
489デフォルトの名無しさん:04/11/03 22:51:50
>>487
$in{'bakadesu'} eq ""
$in{'bakadesu'} == 0
not defined $in{'bakadesu'}
not exists $in{'bakadesu'}
は全て偽
490デフォルトの名無しさん:04/11/03 22:55:30
>>489 が真となる場合に$in{'bakadesu'}は偽
491デフォルトの名無しさん:04/11/03 23:11:12
みんな良く見ろ。!$in{'bakadesu'}と$in{'bakadesu'} ne ''だぞ。
微妙どころかほとんど反対じゃないかと(笑)

492デフォルトの名無しさん:04/11/03 23:26:43
>>487
unless($in{'bakadesu'})なら等価

>>491
? ne だから、逆ではないんでね?
493デフォルトの名無しさん:04/11/04 00:45:08
!''は真
'' ne ''は偽

!'hoge'は偽
'hoge' ne ''は真

!'0'は真
'0' ne ''は真
494デフォルトの名無しさん:04/11/04 01:04:39
おもろいな、もまえら(・∀・)ニヤニヤ
495デフォルトの名無しさん:04/11/04 07:18:51
質問者より回答者の方がレベルが低いスレはここでつか?
496デフォルトの名無しさん:04/11/04 12:16:21
csvファイルを読みこんで配列へ格納するときに、
1個ずつダブルコーテーションで囲んでやりたいのですが、
方法はありますか?

例えば、
csv → 001,002,003 だった場合
@aaa = ("001","002","003") という配列にしたいのです。


@w_aaaを読み込んだcsvとしたとき
foreach $tmp(@w_aaa){
@aaa = split(/,/,$tmp);
}
とやると
(1,2,3)
という配列になってしまって困ってるのです。
497デフォルトの名無しさん:04/11/04 12:29:13
>>496
ん?ちゃんと @aaa = ("001","002","003") になると思うが?
そのあとの @aaa の内容を処理する箇所のやりかたがまずいのでは?
498496:04/11/04 13:42:34
>>497
実際にファイルから読ませたら大丈夫でした。すみません。
ありがとうございました。
499デフォルトの名無しさん:04/11/04 15:40:35
質問です。下記のように外部パッケージ内変数を使用する場合はどうすればい
いのでしょうか? myを省けば動きそうですが、strict付けたままだと怒られるし…。

main.pl
|use strict;
|use mylib;
|print $mylib::foo.'\n";

mylib.pm
|package mylib;
|use strict;
|my $foo="bar";
|1;
500デフォルトの名無しさん:04/11/04 16:20:06
>>499
パッケージグローバルはmyじゃ無くてourじゃ無かったか?
直接いじらせないで取得関数を作るのが正解な気もするが・・・
501デフォルトの名無しさん:04/11/04 18:00:48
>>500
our で正解。
502すみません:04/11/04 18:09:09
質問です。
文字データの中に半角文字が含まれていたらエラーを
返したいのですが、半角文字を検出するにはどのような方法が
あるのでしょうか?
ちなみに、ActivePerl 5.8.4.810を使ってます。
503デフォルトの名無しさん:04/11/04 18:25:57
>>502
情報が足り無すぎる。
エンコードは?Shift_JISかEUC-JPか、はたまたUTF-8か、
メール関係ならISO-2022-JP(JIS)もよく使われる。

半角文字とはASCIIコードにあるアルファベットや数字記号のことなのか?
半角カタカナの事なのか?いや、両方か。

話はこれらの情報がそろってからだ。

504すみません:04/11/04 19:03:12
>>503
情報が少なくてすみません。
エンコードはShift_JISです。
半角文字とはアルファベットも数字記号も
半角カタカナもあらゆる半角全てです。
目的としては『全角文字以外』のものが含まれていたら
エラーとしたいのです。
505デフォルトの名無しさん:04/11/04 20:14:35
>>504
なら
/^(?:[\x81-\x9F\xE0-\xFC][\x40-\xFC])*$/
にマッチするか調べれば良いかな。
あとは、改行を含む場合は
/^(?:[\x81-\x9F\xE0-\xFC][\x40-\xFC]|\n)*$/
とか

文字エンコーディングはこの辺を参考に
ttp://www-cms.phys.s.u-tokyo.ac.jp/~naoki/CIPINTRO/CCGI/kanjicod.html
506すみません:04/11/04 20:35:20
>>505
ありがとうございます!解決しました!
感謝です!!!
507デフォルトの名無しさん:04/11/05 15:14:35
$n = 3 ; # 繰り返す回数
$pat = 'ab' ; # 繰り返すパターン

から、'ababab' を得るスマートな方法はどんなものでしょうか。
508デフォルトの名無しさん:04/11/05 15:35:42
$pat x $n;
509デフォルトの名無しさん:04/11/05 15:49:14
あー、x演算子なんてのがあったのかあ。
見たことあるはずだけど記憶になかった。
ありがとう。
510デフォルトの名無しさん:04/11/05 20:12:09
localtimeの動作がおかしいのです。

1099202399を与えると、2004/10/31 01:59:59を返してくれるのですが、
1加えた1099202400を与えると、2004/10/31 01:00:00と、1時間戻ってしまうのです。

これって何がおかしいんでしょう? 何か有名なバグでしょうか?

ちなみに、レンタルサーバーに入っているperlを使っています。
This is perl, v5.8.3 built for i386-freebsd

---
●テスト用のスクリプト
#!/usr/local/bin/perl

($s,$m,$h,$dd,$mm,$yyyy) = (localtime($ARGV[0]));
$yyyy+=1900; $mm++;

printf( "%s -> %04d/%02d/%02d %02d:%02d:%02d\n", $ARGV[0] , $yyyy , $mm , $dd , $h , $m, $s );
---
●テスト結果
% ./test.pl 1099202399
1099202399 -> 2004/10/31 01:59:59
% ./test.pl 1099202400
1099202400 -> 2004/10/31 01:00:00
---
511デフォルトの名無しさん:04/11/05 20:33:54
>>510
うちでは戻らないけど 10/31 14:59:59 と 15:00:00 になる。タイムゾーン?夏時間?
512デフォルトの名無しさん:04/11/05 20:57:15
>>511
1時間差ってあたりが夏時間ぽいので、localtimeの戻り値の
$isdstをまず確認するのがいいんじゃないかと。

# 0 1 2 3 4 5 6 7 8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime(time);

真なら夏時間になってます。
513デフォルトの名無しさん:04/11/05 21:23:20
文字列"_a\n__b\n__b\n___c\n__b\n_a"を
"(a,(b,b,(c),b),a)"のように置換する関数fooを作りたいのですが、正規表現でつまづきました。
どうやったらいいですか?
sub foo{
 my $a = shift;
 $a =~ s{
  ここの正規表現がわからない!
 }{
  my $b = $&;
  $b=~s/^_//g;
  "(". foo($b) .")";
 }gmex; #ここのオプションも自信ない
}
514510:04/11/05 21:31:25
>>511,512
ありがとうございました。
$isdatをみてみたところ、ご推察のとおり1で夏時間になっていました。

localtimeを使わないで、gmtimeを使うことにします。
515デフォルトの名無しさん:04/11/05 21:53:05
>>513
その形のプログラムでは正規表現をどういじっても","が出てこないと思うのだが(笑)
とりあえず","がないのと改行が残るのに目をつぶれば、

(?:_\w+(?:\n|$))+

でいけると思われ。



516513:04/11/05 23:02:49
>515 thx!
何とかなりそうです。ありがとうございました。
517デフォルトの名無しさん:04/11/05 23:03:34
>>496
で"は付けなくていいの?(w
@aaa = map qq|"$_"|, @aaa;
518デフォルトの名無しさん:04/11/06 00:19:59
>>510-512
このやりとりで初めて「夏時間」の
具体的な部分を理解した漏れは重度のアレだ。
519デフォルトの名無しさん:04/11/06 03:40:37
localtimeを使いたいところがgmtimeで済むようなレンタルサーバってなんだろう?
糞サーバー?



スーパー1シャーシ+井桁よりもスーパーTZシャーシを使う方向で。
520デフォルトの名無しさん:04/11/06 09:31:58
>>518
気にすんな。漏れ (>>511) も当てずっぽうだった(恥)

>>519
>>510 のサーバは海外のか海外に設置してるサーバじゃないのかな?
環境変数 TZ をセットし直せば localtime もうまくいきそうな気もする。
521496:04/11/06 14:58:22
>>517
あ、すみません、(001,002,003)といった配列になってくれればいいんですよ。
(1,2,3)となってしまうのが問題だったわけで。
でも、そうやってダブルコーテを付けることもできるのですね!
今後使えそうなテクです!ありがとうございます!
522デフォルトの名無しさん:04/11/06 21:29:16
>>521
んぢゃ、強引にこうしておく(w
@aaa = map sprintf(qq|"%03d"|,$_), @aaa;
523デフォルトの名無しさん:04/11/07 00:51:47
リストの例えば3番目の要素を取り出すのに
('A', 'B', 'C', 'D')[2] # 'C'を返す
という簡単な記法がありますが、ハッシュみたいなリストで
Key3を取り出す下のような簡単な書き方はないのでしょうか?
('Key1', 1, 'Key2', 2, 'Key3', 3, 'Key4', 4){Key3} # 3を返す
ちゃんとハッシュに入れてからじゃないと駄目なんですか?
524_gunzip:04/11/07 00:55:44
{key1 => 1, key2 => 2, key3 => 3}->{key3}
525523:04/11/07 00:58:51
>>524
そか、リファレンスにすればよいのですね!
即レスサンクス!!
526デフォルトの名無しさん:04/11/07 08:54:15
Net::FTP で、proxy(squid)の通し方ご存じの方、教えて頂けませんか?
527デフォルトの名無しさん:04/11/07 11:26:51
当然マニュアルは隅から隅まで全部読んだんだよな?
528デフォルトの名無しさん:04/11/07 12:41:31
>>521
"001"とせず、001とすると8進数の01として扱われるので注意。
529デフォルトの名無しさん:04/11/07 14:46:07
質問です。
ppmを起動して、install *****(パッケージ名)
と打っても改行されるだけでインストールしてくれないのですが。
どなたか解決策を教えてください。
530デフォルトの名無しさん:04/11/07 14:48:27
エラーメッセージを読んで、それを元に質問し直すなり
googleで検索にかけるなりしたらどうですか。
531529:04/11/07 15:01:58
エラーメッセージも何も出ないんです。
googleで検索してみてもこの症状についての説明を見つけられず・・・・。
探し方が甘いでしょうか?
532デフォルトの名無しさん:04/11/07 15:17:55
ppmはちゃんと起動できてるの?
ppm> というプロンプトが出てる?
ppm> install *** で何も言わずにppm>とプロンプトに帰ってくるのか、それとも帰ってこないのか?
帰ってこないのなら単に時間がかかっているか、それともリポジトリに接続できていないか。
プロキシの設定などを調べる。
のか

かかかか


ぁぁぁぁかかかかか

かかかかか
533529:04/11/07 15:25:37
ppm>というプロンプトに帰ってきません。
20分ほど放置してみましたが何も起こらなかったので、
プロキシの設定などをやり直してみます。
534デフォルトの名無しさん:04/11/07 15:28:58
ファイアウォールの中なのでFTPがpassiveモードじゃないとだめ、とか
そういうのではないのでしょうか?ちがってたらごめんね。
535526:04/11/07 16:49:51
ftp_proxyの通し方ならマニュアルにあるのですが、2回 login をする方法は、suqidには使えないみたいなのです。
536デフォルトの名無しさん:04/11/07 23:40:56
じゃあPerl入れなおしだね
537デフォルトの名無しさん:04/11/08 01:13:56
tie でハッシュに関連付けた DB_File のデータを
untie せずにハッシュの内容をデータファイルに反映させる方法はありましょうか?
538_gunzip:04/11/08 01:18:40
$x->sync()
539デフォルトの名無しさん:04/11/08 01:30:28
$aと$bのどちらの方が大きいかそれとも等しいかprint()するサブルーチンを書け

if ($a < $b) {
print "\$a < \$b\n";
} elsif ($a > $b) {
print "\$a > \$b\n";
} else {
print "\$a = \$b\n";
}
これでいいですか
540デフォルトの名無しさん:04/11/08 01:54:59
良くないと思う理由を書け
541デフォルトの名無しさん:04/11/08 01:57:52
539ではないけど、perl 的にもっと楽に書ける方法あります?
ということが聞きたいのではないかと思ってみる。
542_gunzip:04/11/08 02:03:25
539のままでいいでひょ。

print "\$a ", ('=', '>', '<')[$a <=> $b], " \$b\n";
とか書くことも出来るけど、あまりやらない方が良いだろうね。
543デフォルトの名無しさん:04/11/08 02:09:33
>>539
print "\$a ",('<','=','>')[($a<=>$b)+1]," \$b\n";
544543:04/11/08 02:13:08
かぶったorz
しかも-1の処理がスマート。(|||_|||)ガビーン
545デフォルトの名無しさん:04/11/08 02:43:50
windowsXPでActivePerl5.8.4をいれて
perl/Tkでwindowを出してみたんですがfontをsystemにしても
日本語が化けてしまいます何故でしょう?(Shift Jisで保存してます)
546デフォルトの名無しさん:04/11/08 04:47:42
過去ログを読む暇がないので似た質問があったら本当にごめんなさい。
例えば
客1 口座番号 住所 電話
客2 口座番号 住所 電話
客3 口座番号 住所 電話



というような内容のファイルがあったとして、
それをリストのように読み込みたいのですが、
arrayを使った場合、それぞれの客の住所や電話番号
はどうやって保存すればいいのでしょうか?

学校の課題なのですが、perlは数時間しか授業でしてない
のに、わからないことだらけで困ってます。ファイルを
読むなんてこの課題の中で一番最初のところなのにそこで
つまずくなんてほんともう泣きそうです。

すみません。
547デフォルトの名無しさん:04/11/08 04:51:11
>どうやって保存すれば
保存ってなんだ?
548デフォルトの名無しさん:04/11/08 04:52:08
>>546
学校の友達に聞いた方が早い。
549デフォルトの名無しさん:04/11/08 04:56:30
レスありがとうございます。

保存っていうのは言葉が間違ってたらすみません。
variableの中に入れるというのでしょうか?

クラスには残念ながら連絡をとれる友達はいません。
550デフォルトの名無しさん:04/11/08 04:57:17
あ、549は546です。IDでないのですね。すみません。
551デフォルトの名無しさん:04/11/08 04:57:33
一人で泣いてろ
552_gunzip:04/11/08 05:19:02
読み込んでからどうするのかは知らんけど。

#!/usr/bin/env perl

my @customers = ();

open F, "test.dat" or die $!;
while (<F>) {
    chomp;
    my %profile = ();
    @profile{ qw[name id address phone] } = split / /;
    push(@customers, \%profile);
}
close F;

#なんやかや
foreach my $p (@customers) {
    print "$_\t= $p->{$_}\n" for keys %$p;
    print "-" x 20, "\n";
}
553デフォルトの名無しさん:04/11/08 05:47:02
gunzipさん、ありがとうございます。
さっそく試してみます。とてもうれしいです!!

とりあえず明日になったら教授に話をしにいきます。
ご迷惑をおかけしました。
554デフォルトの名無しさん:04/11/08 20:50:18
>>539
print grep{ eval } ('$a < $b', '$a == $b', '$a > $b');
これで充分。
555デフォルトの名無しさん:04/11/08 22:23:38
$str = 'white cat' ;
$str =~ s/black (dog)|white (cat)|pink (pig)/$1$2$3/ ;

これ、 -w 付けて実行するとマッチしなかったところが、初期化されてない値だゴルァ、と言われますが、
言われない書き方はありますか。
e で一つずつ判定、と言うのはできるだけ無しの方向で。
556デフォルトの名無しさん:04/11/08 22:35:14
my $str = 'white cat';
557デフォルトの名無しさん:04/11/08 23:05:19
>>555
実際初期化されてないんだからどうにもならんと思うが。
no warnings使うか、$1$2$3使わないように書き直すか、と
いったあたりだろう。

後者の例は、

$str =~ s/black (?=dog)|white (?=cat)|pink (?=pig)//;

とか。
558555:04/11/09 00:43:34
>>557
やっぱそうか……
実用上は問題ないようだけど、たまに潔癖症になるのでテッテ的に warning つぶしに躍起になるのです。
559デフォルトの名無しさん:04/11/09 13:43:49
Oct 19 10:13:55 server1 httpd: INTUNIV:ByDate:Start:0.83674100 1098148435:32618
Oct 19 10:13:55 server1 httpd: INTUNIV:ByDate:End :0.95674400 1098148435:32618
Oct 19 10:37:53 server1 httpd: INTUNIV:ByDate:Start:0.35116700 1098149873:32618
Oct 19 10:38:47 server1 httpd: INTUNIV:ByDate:End :0.45024600 1098149927:32618




という書式で書かれているログファイルを、文字列マッチングを利用して

10/19 10:13:55 S:0.83674100 1098148435:32618
10/19 10:13:55 E:0.95674400 1098148435:32618

という表示形式にするにはどのように書けばいいでしょうか?
ものすごい汚い書き方ですが、

if ($line =~ /^([A-z]*)\s([0-9]*)\s([0-9]*:[0-9]*:[0-9]*)\s.*(0\.[0-9]+)\s([0-9:]+)$/ )
 {
  print WRITE "$mon{$1}/$2 $3 $4 $5 $6\n";

という書き方をしたのですが、Start・End の表記がうまくできません。

どなたかご教授お願いいたします。
560デフォルトの名無しさん:04/11/09 14:18:12
>>559
StartとEndのところを(Start|End)で拾って、月と同様に
ハッシュ用意してひけばいいんじゃねーの?
561デフォルトの名無しさん:04/11/09 15:12:33
(Start|End)で拾ったらsubstrで1文字目を切り出す方が楽そうね
562デフォルトの名無しさん:04/11/09 15:39:19
Start/End以外はないことが保証されていて、例えばStopみたいのを間違って
引っ掛ける心配がないのであれば、(S|E)で拾って他のとこ捨てればそのまま
使えますな。

563デフォルトの名無しさん:04/11/09 20:32:09
>>559
$line =~ /^(\w+) (\d+) (\d+:\d+:\d+).+?(S(?:tart:)|E(?:nd:))([\d\.]+) (\d+:\d+)$/
564デフォルトの名無しさん:04/11/09 21:23:11
>>563
(S(?:tart:)|E(?:nd:))とやっても(?:...)の部分が消えるわけではないので、
$4はStartかEndになっちゃうから、(Start:|End:)とやるのとかわらない。
(?=...)のzero-width positive lookーaheadのつもりだったのかな?
これのときはさらにその後にtart:やend:を食うパターンを別途用意
しないとマッチしないよ。
565デフォルトの名無しさん:04/11/09 21:27:03
Etart とか Snd がありえなさそうなら ([SE])(?:tart|nd\s*): とか
566デフォルトの名無しさん:04/11/09 21:28:34
SEXに見える。
567デフォルトの名無しさん:04/11/10 00:50:58
なるべく記述をサボるなら
print "$mon{$1}/$2$3$4\n" if ($line =~ /^(.+?) (.+ )s.+(S|E).+?(:.+)/);

危険だけど。
568デフォルトの名無しさん:04/11/10 10:50:28
569デフォルトの名無しさん:04/11/10 12:41:13
>>555-558
この仕様 (warning 出る) ってどうなんだろ?
選択の中でグループ化を使う (そして $1, $2, ... で参照する) のは推奨できない、
っていうこと?
そりゃ使いづらくね?
570559:04/11/10 15:29:30
皆さんのアドバイスを参考にして作った結果、

$mon{'Jan'} = '01' ;


$mon{'Dec'} = '12' ;
$se{'Start'} = 'S';
$se{'End'} = 'E';
if ($line =~ /^(\w+) (\d+) (\d+:\d+:\d+) (server1 httpd: INTUNIV:ByDate:)(Start|End):(\d+\.\d+) (\d+:\d+)$/ )
 {
  print WRITE "$mon{$1}/$2 $3 $se{$5} $6 $7\n";

のようにしたらとりあえず目的の形式でできるようになりました。

しかし、
(server1 httpd: INTUNIV:ByDate:)
の部分が自分的にスマートじゃないなぁと思いつつも、正規表現で何とかならないと思って
試行錯誤したりしたのですが、結局こんな形になってしまいました。

ログは3種類あって、server1 httpd: INTUNIV: までの部分はどのログも一緒なのですが、
ByDate の部分はログの種類によって変わるのです。
現在のままだとログの種類ごとにスクリプトを書き換えなくちゃいけませんよね…。

ともあれ、皆さんのアドバイスには感謝しております。
ありがとうございました。
571デフォルトの名無しさん:04/11/10 15:48:04
外部コマンドの結果を待たずに実行する簡単な方法はありますか?
以前system関数で
system("cat /etc/passwd"); # waitする
system "cat /etc/passwd"; # waitしない
というような記事を見たことがあるんですが(実際、上は2つともwaitしました)
forkを使えばモウマンタイなんですけど(system関数もしてますし)
1行で簡単に出来るような他の方法がありましたらご教授ください。
572559:04/11/10 15:50:34
さっきのを改良して、

$mon{'Jan'} = '01' ;


$mon{'Dec'} = '12' ;
$se{'Start'} = 'S';
$se{'End'} = 'E';

if ($line =~ /^(\w+) (\d+) (\d+:\d+:\d+) (server1 httpd: INTUNIV:)(\w+) (Start|End) (\d+\.\d+) (\d+:\d+)$/ )
 {
  print WRITE "$mon{$1}/$2 $3 $se{$6} $7 $8\n";


とりあえずこれで落ち着きました。
573デフォルトの名無しさん:04/11/10 15:52:28
>>571
system("hoge &"); じゃダメだっけ?
574デフォルトの名無しさん:04/11/10 16:11:12
>>573
出来ました(/∇\*)
その発想が出てこなかったのがクヤシイ
ありがとうございました。
575デフォルトの名無しさん:04/11/10 19:55:06
テキストベースのデータを1万レコード
持って、プログラムを組んだのですが、テキストなので
キーサーチができず、CPUの使用率が50%ほどになってしまいます。
1万レコードぐらいのデータはやはり、DBでもつべきでしょうか?

576デフォルトの名無しさん:04/11/10 20:33:46
>>575
Windows は知らないけど、 UNIX なら Berkeley DB (DB_File) あたりがお手軽かな。
577545:04/11/10 21:23:31
>>568
そのサイト見ながらやったんだけど化けたんだ
漏れだけなのかな
578デフォルトの名無しさん:04/11/10 22:40:24
>>577
下のコメント部分も読みましたか?
579545:04/11/10 23:23:48
>>568,578
をお!出来ました!
スミマセン読んでませんでした、感謝!
580デフォルトの名無しさん:04/11/11 00:07:16
どなたか教えて下さい。
1 1
1 23
2 32
2 35
2 67
3 4
5 7
5 10
という、下に行くほど左の数字が大きくなるファイルがあるのですが、これを、
1 2
2 3
3 1
4 0
5 2
のような感じで、左の数字が1のものの行数は2行、2のものは3行、3のものは1行と
いうように数えるにはどうしたらよいのでしょうか?
(右の数字は関係ないです。)
581デフォルトの名無しさん :04/11/11 00:07:59
どなたか教えて下さい。
1 1
1 23
2 32
2 35
2 67
3 4
5 7
5 10
という、下に行くほど左の数字が大きくなるファイルがあるのですが、これを、
1 2
2 3
3 1
4 0
5 2
のような感じで、左の数字が1のものの行数は2行、2のものは3行、3のものは1行と
いうように数えるにはどうしたらよいのでしょうか?
(右の数字は関係ないです。)
582デフォルトの名無しさん:04/11/11 00:38:12
while (<>) {
m/^(\d+)/;
$cnt{$1}++;
}
foreach (sort keys %cnt) {
print $_.' '.$cnt{$_}."\n";
}
0件が表示されない?知らん(・_・)
583デフォルトの名無しさん:04/11/11 01:15:23
ハッシュのハッシュをオブジェクトにするためのコンストラクタの書き方がわかりません。
%hash=(
 '001' => { 'name' => 'John', 'age' => '20'},
 '002' => { 'name' => 'Jane', 'age' => '20'},
);
このデータから、001という番号を指定して名前や年齢を持つオブジェクトを作りたく、
my $usr=User->new($hash{'001'});
package User;
sub new{
 my($hash)=@_;
 my $self=$hash;
 bless $self;
 return($self);
}
とやってみたところ、オブジェクトはできたのですが、元のデータが
$hash{'001'} = bless( { (略) } , 'User' );
と書き換わってしまい、困っています。

どなたか妙案をお貸しください。
584デフォルトの名無しさん:04/11/11 01:17:58
0件だしたければ、数えるところはそのままで
表示するところを

use List::Util;
foreach (1..max(keys %cnt)) {
print $_.' '.$cnt{$_}+0."\n";
}

あたりでいいんでね?
585デフォルトの名無しさん:04/11/11 01:20:40
>>583
元のデータをblessしたくなければコピーするしかないと
思われ。

my $self = {%$hash};
586デフォルトの名無しさん:04/11/11 02:01:39
sub new{
 my($hash)=@_;
 my $self=$hash;
 bless $self;
 return($self);
}
そもそも、これおかしくね?
587デフォルトの名無しさん:04/11/11 02:14:05
>>586
別に
588586:04/11/11 02:22:22
第一引数にはパッケージ名が入らないか?
これだとリファレンスじゃないものはbessできんと怒られるんだが
589583:04/11/11 02:28:18
>>585
うまくいきました。デリファレンスしたものがそのまま無名ハッシュに入るんですね。
ありがとうございました。

>>586
直接書いてたら間違えてました。。。
手元のを見たら、
my($class,$hash)=@_;
となってました。
590デフォルトの名無しさん:04/11/11 11:59:40
>>584
ありがとうございます。
でもこれですと、Undefined subroutine &main::max called at blastcount.pl line 14, <> line 32000.
とエラーが出ました。どうすればよいのでしょうか。
591デフォルトの名無しさん:04/11/11 12:06:57
エラーメッセージの意味が分からないの?
592デフォルトの名無しさん:04/11/11 13:10:34
>>591
すみません。わかりません。どう変えたらいいのでしょうか?
593デフォルトの名無しさん:04/11/11 13:16:02
>>590
use List::Util qw(max);
594デフォルトの名無しさん:04/11/11 13:30:52
>>576
サンクスコ
DB化も考えて見ます
595587:04/11/11 16:54:04
>>586
はげしくごめん
596デフォルトの名無しさん:04/11/11 23:09:12
よくコードで、
$A=pop @array;
$B=pop @array;
$C=pop @array;
みたいな処理をやってたりしますが、これを一文でやる方法はありますか?
($A,$B,$C)= ...
みたいな形で。
597_gunzip:04/11/11 23:15:52
($a, $b, $c) = splice @array, 0, 3;
598_gunzip:04/11/11 23:23:48
ごめん。よく読んでなかった。
($a, $b, $c) = reverse splice @array, -3, 3;
かな。
599デフォルトの名無しさん:04/11/11 23:30:52
($a, $b, $c) = map { pop @array } 1..3;
とか。
連投して済まない。
600デフォルトの名無しさん:04/11/11 23:42:46
可読性を考えるとpopが2〜3個ならむしろ小細工しない方がいい気がするが。
あえてするなら>>599かな。
601デフォルトの名無しさん:04/11/11 23:45:16
Perler死ね
602デフォルトの名無しさん:04/11/11 23:47:23
糞言語消えろ
603デフォルトの名無しさん:04/11/11 23:50:22
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Perl
604デフォルトの名無しさん:04/11/12 00:24:39
>>601-603
一つの言語しか使えない素人発見
605デフォルトの名無しさん:04/11/12 00:29:20
Rubyは最高の言語
606デフォルトの名無しさん:04/11/12 01:23:53
はいはい( ´,_ゝ`)プッ
607デフォルトの名無しさん:04/11/12 01:34:45
Larryはもう過去の人。
608デフォルトの名無しさん:04/11/12 08:09:46
長い文字列の途中から=~のマッチング開始させるのってどうすればいいですか
609デフォルトの名無しさん:04/11/12 08:34:11
@INCのパスにJcode.pmがインストールされていない状態でプログラム(/home/hoge/test.pl)直下のabcディレクトリに
Jcode.pmを置きます。
-test.plの内容-
@INC = ('./abc');
use Jcode;
print "$_\n" foreach @INC;
print -e "./abc/Jcode.pm" ? "OK\n" : "NG\n";
print "CURDIR = " . `pwd`;
-------------
この状態でコンソールから実行するとエラーが発生します。エラー内容は
Can't locate Jcode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 ....(略)
といった具合です。
use Jcode;をコメントアウトした結果は
./abc
OK
/home/hoge
です。
@INCを./abcと再定義しているのもかかわらずエラーログでは./abcを読もうとせず
標準のパスを読み込んでる事からして@INCの内容が無視されているっぽいのですが
コンソールからの起動でちゃんと@INCの内容を見てくれるようにするにはどうすればいいでしょうか。
http経由からだとちゃんと@INCのパスを検索してくれます。
610デフォルトの名無しさん:04/11/12 08:49:13
>>608
substr($s, どっか) =~ /ほげほげ/
611609:04/11/12 09:01:27
すいません自己解決しました。

#!/usr/bin/perl
use Jcode;
BEGIN{ unshift(@INC, './abc'); }
だと駄目で

#!/usr/bin/perl
BEGIN{ unshift(@INC, './abc'); }
use Jcode;
だとOKでした。
BEGINはBEGINの方に書くのですね
612デフォルトの名無しさん:04/11/12 09:07:19
>>597-600
ありがとうございます。自分としてはスライスを使って上手くこの辺を
操作する方法がないかなと探してしたのですが、どうも上手くいきません。
@A=(0,1,2);
($a,$b,$c) = ($m=$#A-2, @A[($#A..$m)], $#A-=$m)[1];
613612:04/11/12 09:23:42
すいません分りました。
範囲演算子は左の値が大きくないとダメみたいですねえ。
なんでこんな言語仕様なのかは不明です。
614デフォルトの名無しさん:04/11/12 09:24:07
s/左/右/
615612:04/11/12 09:37:50
612のコードの間違いがもう一つありました。
($m=$#A-2, @A[($#A..$m)], $#A-=$m)[1];

これでは、カッコ内の各式が返す値をまったいらのリストに並べてしまうので、
[1]では、@Aのスライスだけを取得することはできません。

@A=(0,1,2);
(($a,$b,$c)=reverse(@A[($#A-2)..$#A]), $#A-=2);
これが一番現実的だろうと思います。
616デフォルトの名無しさん:04/11/12 10:13:21
>>611
BEGINを先に書かないと間に合わないのは、useは

BEGIN { require Module; import Module LIST; }

と等価なので、BEGIN同士なら先に書いたほうが先に
実行されるからだな。

でもいまどきは@INC直接いじらないでuse lib使うんじゃ
ないかと。やってることはほとんど同じだけど(とマニュアル
にも書いてある)こっちの方が見やすいし。
617デフォルトの名無しさん:04/11/12 15:30:43
a = 2830.53
b = 9823.32
a = 5584.66
b = 8595.54
a = 8568.63
b = 9879.92
a = 4543.45
b = 5258.26

という、aとbの数字がひたすら書かれたファイルを読み込んで、
aの値とその1行下のbの値の差を書き込んでいくにはどんな記述をすればいいでしょう?

上の値をプログラムに通した場合、実行結果を

6992.79 (2830.53 - 9823.32)
3010.88 (8595.54 - 5584.66)
1311.29 (9879.92 - 8568.63)
714.81 (5258.26 - 4543.45)

という感じに出したいのですが・・。
618デフォルトの名無しさん:04/11/12 16:41:09
>>617
use IO::File;
my $fh = new IO::File "data.txt";
my %h;
while(<$fh>) {
 my ($k, $v) = split /\s*=\s*/;
 $h{$k} = $v;
 printf("%f |%f - %f|\n", abs($h{'a'}-$h{'b'}), $h{'a'}, $h{'b'})
  if $k eq 'b';
}
undef $fh;

予想外のフォーマットはまったく考えてません。
619デフォルトの名無しさん:04/11/12 21:19:48
while($dataA = <$fh>){
 $dataB = <$fh>;
}
でいいんじゃねーの
620デフォルトの名無しさん:04/11/12 21:20:09
package check;

sub check_integer($$){
...
}

とやって、

別なとこで、check::check_integer(    );

とやったとき、プロトタイプは有効にならないですか?
やってみたらならなかったので、途方にくれています。
621620:04/11/12 21:54:57
あー、わかったー。
require じゃなくて use 使ってインポートしないと、
プロトタイプ有効になんないのね。
できたできた。
622デフォルトの名無しさん:04/11/12 23:53:23
>>617
多少メモリはつかうが、

undef $/;
open FH, 'data.txt';
$_ = <FH>;
close FH;
print abs($1 - $2) . " ($1 - $2)\n" while (m|a \= (\d+.\d+)\nb \= (\d+.\d+)|sg);
623デフォルトの名無しさん:04/11/13 00:09:23
3行バージョン。

use File::Slurp;
$_ = read_file('data.txt');
print abs($1-$2) . " ($1 - $2)\n" while (/a = (.+?)\nb = (.+?)\n/sg);
624609:04/11/13 00:22:36
>>616さん
>BEGIN { require Module; import Module LIST; }
これ見て全て納得しました。
use はBEGINと同じようにコンパイル時に処理されるとは認識していたのですが
BEGINが一番優先度が高いと勝手に思い込んでいました。
私みたいなおっちょこちょいさんが多いからuse libが作られたのかな。

BEGINNERはBEGINをBEGINの方へ書くのではなくuse lib使えってことですね。
625デフォルトの名無しさん:04/11/13 01:35:31
>>619 が一番賢そうだな
626デフォルトの名無しさん:04/11/13 01:52:34
すいません、Perl56.dllが見つかりません。
とエラーがでます。みてみたらPerl58.dllはありましたが56はなかったです。
どなたかPerl56.dllいただけませんか。
よろしくお願いします。
627626:04/11/13 01:53:16
もしくはダウンロードできるとこはありませんでしょうか。
628デフォルトの名無しさん:04/11/13 11:59:46
それってバージョンアップに失敗したわけじゃないの?
5.8がいいならクリーンインスコしてみそ
629デフォルトの名無しさん:04/11/13 16:18:07
すまねっす!
ファイル名.htmもしくは.htmlの拡張子部分を消そうとして
$path =~ s/(\.htm|\.html)//;
とやらかしたんですがl(小文字のL)が残ってしまうです。
左側にマッチした時点で置換してしまってるだけだというのは分かるんだけど、
「じゃ、どうするべ」
という方針が立たない、、
とりあえず二行に分けて済ませたんですが、
エライ人はこれ、どうやってますか?

つうかスレ違い?正規表現スレは難しすぎて、、、。
630デフォルトの名無しさん:04/11/13 16:23:25
わー!分かったんでいいです。
順序変えればいいだけなのね。
スレ違いスマソ。
631デフォルトの名無しさん:04/11/13 16:26:24
$path=~s/(\.html?)//;
632デフォルトの名無しさん:04/11/13 19:13:39
オブジェクトのリストを保持するオブジェクトを作ろうとしています
リストに新しい要素を加える関数として

sub add{
my $I = shift(@_);

my $add = 1;

foreach my $item ( @{($I->{"list"}} ){
if( $item eq $_[0] ){ $add = 0; }
}

if($add){ @{($I->{"list"}} = (@{($I->{"list"}},$_[0]); }

return $this;
}

の様な物を作りたいのですが、リファレンスの比較はeqと==のどちらですべきなのでしょうか?
それともリファレンス用の比較関数がありますか?
併せて、もっとエレガントな記述方法があれば教えてくださいお願いしますm(__)m

追記
my $x = hoge->new();
$x->add(hoge->new());
みたいな使い方をしたいです
633デフォルトの名無しさん:04/11/13 19:21:56
>>617
while(<>){
  if(m/^a\s*=\s*(\S+)/){
    $a = $1;
  } elsif
  (m/^b\s*=\s*(\S+)/){
    $b = $1;
    print $b - $a,"($b - $a)\n";
  } else {
    die
  }
}
634デフォルトの名無しさん:04/11/13 19:37:55
>>632
コレクションクラスが欲しいってことなのかな?
同じオブジェクトの重複を許すのなら普通に配列にpushすればいいと思う。
重複を許さないなら、そのオブジェクトのアドレスをキーにしてハッシュに入れる。

CPANにも似たようなものはある(Set::Bagとか)。
http://search.cpan.org/modlist/Data_and_Data_Types/Set

同一のオブジェクトかどうかの判定はアドレス同士を文字列として比較 eq。(数値比較 == でもいけるらしい)
比較用のメソッド持ってもいいし、演算子オーバロードするのもよし。
同じクラスのオブジェクトかどうかの判定には ref という関数を使う。
635デフォルトの名無しさん:04/11/13 19:43:45
オブジェクトを new する時に、内部的にシリアルナンバー振っておいて
それを比較してもよい。これだとついでにオブジェクトの生成順もわかる。
あとはハッシュなり配列をblessして
コレクションクラスをつくるだけ(作らなくても良い)。
636デフォルトの名無しさん:04/11/13 20:07:38
>>632
ごく簡単に書けばこんなかんじ。

package Bag; # 重複OK
sub new { bless [] => shift }
sub add
{
my ($self, $obj) = @_;
push @{$self}, $obj;
}

package Set; # 重複NG
sub new { bless {} => shift }
sub add
{
my ($self, $obj) = @_;
$self->{$obj} = $obj unless (exists $self->{$obj});
}
637632:04/11/13 20:27:50
>>634-636
丁寧な有難うございますm(__)m
そういえばハッシュのキーって勝手に重複判定してくれてますね、目から鱗でした。
取り敢えずSetクラスのオブジェクトをメンバ変数に持つ奴を使います。
638デフォルトの名無しさん:04/11/13 20:52:39
perlの本スレってここでよいの?
639デフォルトの名無しさん:04/11/13 21:28:09
>>637
あとで気付いたけど、どうせ$objは参照渡しになるから
unless exists〜のチェックも実質いらないかもね。
ともあれハッシュは便利だよ。
640デフォルトの名無しさん:04/11/13 22:36:29
あー、ハッシュのキーとしてリファレンスは使えないようです
リファレンスを文字列にキャストした値が使われる模様で
my %xx = ();

$x=1;
$y=2;

print ref \$x, "\n";
print ref \$y, "\n";

$xx{\$x}=$x;
$xx{\$y}=$y;

foreach my $key (keys %xx){
print $key,"\n";
print ref $key, "\n";
# print $$key , "\n";
}
のコメントアウトをはずすとなんか怒られます
最近のperlにはスカラー/配列/ハッシュ以外にも型の概念があるのですね
明示的にリファレンスを文字列にキャストするにはどうしたら良いんでしょう
(refではアドレスの情報が落ちます)
641デフォルトの名無しさん:04/11/13 22:58:10
>>640
分かっているとは思うけど、リファレンスのアドレスを「文字列」にしたものをキーとして使います。
つまり Hoge=HASH(0x80f6520)とかという「文字列」をキーとしてつかうわけで
それをデリファレンス(=元のオブジェクトに戻そうとする)しようしても無意味です。
そう言うわけで640のコメントを外すとPerlは怒るのです。

$x = {}; の場合、自動的に $xx{$x}とすれば $xx{"HASH(0x80f6460)"} と等価に(怒られずに)なります。
$x = Hoge->new のようなオブジェクトの場合は $xx{"Hoge=HASH(0x80f6460)"} と等価です。
明示的にキャスト(?)したければ $xx{"$x"} とダブルクォートすれば気分的にはいいかもね。
なお、refは上記の Hoge=..のHogeを返すだけなので、「それは同じクラスのインスタンスか?」
みたいな同族判定に使います。指定したクラスのインスタンスしかこのコレクションにはいれない、
というような処理にも使えます。
642デフォルトの名無しさん:04/11/13 23:03:17
>>640
$xx{\$x}=$x;
$xx{\$y}=$y;
は、エラーも警告も出ずに動くでしょ?
643デフォルトの名無しさん:04/11/13 23:50:03
package hoo;
#use overload
# "+" => \&add;

sub new{
my $class = shift(@_);
my $this = {};
foreach my $element (@_){
$this->{$element} = $element;
}
bless $this, $class;
return $this;
}

sub add{
my $this = shift(@_);
if( ref $_[0] eq ref $this ){
foreach my $element ($_[0]->getlist){
$this->{$element} = $element;
}
}
return $this;
}

package main;
my $z = hoo->new("a","b");
print "$z";
のコメント外すと物凄い勢いで怒られます
644デフォルトの名無しさん:04/11/13 23:54:51
use overload
"+" => \&add,
"\"\"" => \&string;

sub string{
my $this = shift(@_);
return "$this";
}
とかすると再起呼び出しを始める模様です
くそー、ワケワカンナイぜー
645デフォルトの名無しさん:04/11/14 00:14:01
あぁ、確かに。ごめん。
sub string {
my $this = shift;
return overload::StrVal($this);
}
でどうでしょうか?
646643:04/11/14 00:28:32
ををを!、感謝です!!!
647デフォルトの名無しさん:04/11/14 00:40:42
いえいえ。
関係ないけど、$this->{$element} = $element;
の部分は、その使い方であれば
$this->{$element}++ とでもしておくと、出現回数も数えられて
更にPerl的でプラスアルファです(?)。
648デフォルトの名無しさん:04/11/14 18:26:17
ちょっと長くなるかもしれませんがお願いします。

今、
a, b, c
a, c, d
a, e, f
b, a, a
b, c, d
b, d, e
c, a, b
c, b, d
...

こういう3つの文字が並んだデータがありまして、
それぞれ a = b + c, a = c + d .... といった関係が成り立っています。

このとき、aを入力し、b, dと入力すると、

a = b + c
b = a + a
c = b + d

a = c + d
c = b + d

という出力が得られる、という感じにしたいのです。
要は、求める文字を、用意できる文字から、ツリー状に探していきたいということです。

分かりやすく言うと、ドラクエモンスターズの配合を検索する感じです。

いまはローカルで実行して試しているんですが、中々うまくいきません。よろしくお願いします
649648:04/11/14 18:27:15
>>648
すいません、スレを間違えた感じがします
650デフォルトの名無しさん:04/11/14 18:27:41
しぱーん厨襲来の予感
651デフォルトの名無しさん:04/11/14 18:45:27
化学式の合成のツールかなんか作るのかな?
652デフォルトの名無しさん:04/11/14 18:48:24
ドラクエモンスターズの配合を検索する感じのツールを作るんじゃないの?
653648:04/11/14 18:49:15
>>651
インテリ風に言うとそういう感じです。すいません本当はCGIの方に書こうと思ったんですが・・・
どちらにしてもうっとおしそうなので絶縁中の先輩に聞く事にします。
でももし、ミラクルなやり方があったらぜひ教えてください。
654648:04/11/14 19:00:36
>>652
端的に言うとそういうことなんですが、いわばこういったゲームを発端としてでも
実りのある発見が出来たらなと、いうわけなんです。化学にも応用できます。
655デフォルトの名無しさん:04/11/14 19:30:57
つーか、問題定義はこれで十分なのか?
656デフォルトの名無しさん:04/11/14 20:10:40
>>648
b = a + a が結果として出てくるあたり、
いまいち結合法則というか、ルールがよくわからんのだが…
657デフォルトの名無しさん:04/11/14 20:14:57
>>656

同感。
a = b + c
b = a + a
a = b + c
…で無限再帰検索ループに陥る悪寒
658デフォルトの名無しさん:04/11/14 20:21:29
つーか一段階しか辿らないんだろ。
配合ゲームっぽい事書いてるんだからそれくらい分かれよ。
659デフォルトの名無しさん:04/11/14 20:22:12
知るか
660デフォルトの名無しさん:04/11/14 20:23:58
一段階かどうかは知らないが、
同じ結果の配合が何度も出てきても仕方ないから、
検出して止めるんじゃないだろうか?
661デフォルトの名無しさん:04/11/14 20:28:15
こんな感じで突っ込んでって使うだけじゃないの?
$ev{b}{c} = 'a';
$ev{c}{d} = 'a';
662648:04/11/14 20:28:18
b = a + a は思いっきり間違いでした。
a = c + d
   c = b + d  だけでしたね。

ルールは

「a〜zのアルファベットがあって、それぞれがa〜zのうち2つの要素から成り立っている
 また、その2つの要素の組み合わせは一つではない。2つの要素が同じ場合もある。
 その全組み合わせのリストがあらかじめ用意されている。

 今、n個の異なるアルファベットがあり、このn個を用いて、ある一つのアルファベットを作りたい。
 用意されたn個のアルファベットで構成可能な組み合わせを全て求める。
 また、要素を組み合わせる回数は任意だが、多すぎると辛いので10回程度までにする。」


こういう感じだと思います。
用意できるモンスターN種類(N個のアルファベット)から、何回か配合を繰り返して
目標とするモンスターX を作るツリーを作る、という感じです。

@result = (1, a, c, d, 2, c, b, d)
という平たい配列に入れようとしたんですが、どんどん検索を進めていくと、
(1, a, c, d, 2, c, b, d, 3, b, j, k, 3, d, l, m, 2, d, a, f, 3, a, c, d, 3, f, k, j )
などと、何がなんやらわからなくなってしまうのです。

ツリーの深さとしては、5階層くらいまでとめておこうかと思います。
途中、利用可能なデータが表れた場合は、そこは葉になるので、そこまで膨大には
ならない予定です。
663デフォルトの名無しさん:04/11/14 20:30:32
このとき、aを入力し、b, dと入力すると、

a = b + c
b = a + a
c = b + d

a = c + d
c = b + d

という出力が得られる、という感じにしたいのです。
-----------------------------------------
↑そもそもこれが意味フメー、入力が2回に分かれてるから
a = b + d を探したいのかと予想しつつ(さすがにんな単純な話じゃあないと思うが
出力を見たらどうやら違うみたいだし、マジワカンネ
664デフォルトの名無しさん:04/11/14 20:30:56
sendmail.cf のルールに良く似てる
665663:04/11/14 20:31:41
む、遅れた
666デフォルトの名無しさん:04/11/14 20:32:56
なんかどうでもよさげ。
667デフォルトの名無しさん:04/11/14 20:34:41
prologでも使えば?
668デフォルトの名無しさん:04/11/14 20:35:23
prolog重い
669デフォルトの名無しさん:04/11/14 20:37:00
>>668
上の用途程度ならいまどきのCPUで実行すれば気にならない速度だと思われ
670648:04/11/14 20:41:03
ttp://sylphys.ddo.jp/upld2nd/pc/img-box/img20041114204116.gif

図にするとこんな感じです。
a = b + c などのような組み合わせの種類は1500程で、
ツリーの深さによっては多少大きくなってしまうと思います。
671デフォルトの名無しさん:04/11/14 20:45:19
package Node;
sub new($)
{
 my $pkg = shift;
 bless
 {
  l => undef,
  r => undef,
 }, $pkg;
}

1;


$a = new Node();
$a->{l} = …
672デフォルトの名無しさん:04/11/14 20:52:56
sub getLeaves($)
{
 $self = shift;
 my @ret;
 $isleaf = 1;
 if(defined($self->{l})
 {
  push(@ret, $self->{l}->getLeaves());
  $isleaf = 0;
 }

 if(defined($self->{r})
 {
  push(@ret, $self->{r}->getLeaves());
  $isleaf = 0;
 }
 if($isleaf)
 {
  push(@ret, $self);
 }
 return @ret;
}
673デフォルトの名無しさん:04/11/14 20:53:40
それと今回のケースだとNodeにNameがあった方がいいな。
674デフォルトの名無しさん:04/11/14 20:58:18
二分木のデータ構造が知りたかっただけの話なのか?
675デフォルトの名無しさん:04/11/14 21:06:05
そういうのが欲しいならcpanにもっと賢いのが落ちてるんじゃないのか?
676デフォルトの名無しさん:04/11/14 21:07:50
677648:04/11/14 21:11:29
レス有難うございます。頭がこんがらがってきました。
ゆっくり読ませていただきます。
678黒死犬 ◆EgxBlf8nvc :04/11/14 21:21:09
*パターンのフォーマット
[
[アルファベット,要素,要素]...]

# パターンのハッシュ化
my %pattern = ();
for(@pattern) {
 push(@{$pattern{$_->[0]}}, $_->[1], $_->[2]);
}

# ツリー作成
my $root = makeTree('a', 10); # a についての深さ10のツリーを生成

sub makeTree {
 my ($alpha, $depth) = @_;
 my $node = new Node($alpha);
 for(@{$pattern{$alpha}}) {
  $node->{_left} = makeTree($_->[0], $depth - 1);
  $node->{_right} = makeTree($_->[1], $depth - 1);
 }
 return $node;
}

package Node; # 簡単に作れると思うので、割合します

こんか感じでしょうか?試してないので分からないですが。。。
実装するなら、検索にハッシュは使わないほうがいいですね
679黒死犬 ◆EgxBlf8nvc :04/11/14 21:23:20
あ、上のコード、$depth をチェックするの忘れてました
注意して下さい
680デフォルトの名無しさん:04/11/14 21:50:37
さらしあげ
681679:04/11/14 22:08:08
sub makeTree {
 my ($alpha, $depth) = @_;
 my $node = new Node($alpha);
 if(0 < $depth) {
  for(@{$pattern{$alpha}}) {
   push(@{$node->{left}, makeTree($_->[0], $depth - 1));
   push(@{$node->{right}, makeTree($_->[1], $depth - 1));
  }
 }
 return $node;
}

早くお風呂入りたかったのでちゃんと考えないで投稿してました、すみません
682648:04/11/14 22:47:46
すいません、まだ出来ていないのですが、今実際のデータでツリーの数がどのくらいか
計算してみた所、4階層目ですでに1000を超えるような状況になってしまい、
1つの検索を終える為には数百万行ほど、組み合わせリストと照らしあわさなければ
ならないようです。これでは実用が難しそうなので、ちょっと考えてみます。
あとお腹が痛いのでそろそろ寝ます。教えてくださった方、本当に有難うございます。
683デフォルトの名無しさん:04/11/15 12:39:31
二つのファイルを扱うときの質問です。
A
B
C
D
E
F
G
と一つ目のファイルがあって、
A
B
D
E
ともう一つのファイルがあったときに、
上のファイルの文字の中で、下のファイルにも
存在するものを出力する。
(この場合は)
A
B
D
E
のように出力できるようにするにはどんなプログラムを書けばいいのでしょうか?


684683:04/11/15 12:45:01
すみません。質問が変でした。さっきの質問の訂正です。
二つのファイルを扱うときの質問です。
A 1
B 3
C 1
D 3
E 4
F 6
G 1
と一つ目のファイルがあって、
A
B
D
E
ともう一つのファイルがあったときに、
上のファイルのアルファベットの中で、下のファイルにも同じアルファベ
ットが存在するものの行の内容をすべて出力する。
(この場合は)
A 1
B 3
D 3
E 4
のように出力できるようにするにはどんなプログラムを書けばいいのでしょうか?
685683:04/11/15 12:55:09
また、毎回わからなくて困ることがあるので、これも教えていただ
けるとうれしいです。
さっきの(699)は言ってみれば二つ目のファイルを参照して、一つ目のファイル
にもあるものを出力するものですが、

もう一つ聞きたいのが、二つのファイルに共通のものを出力するというものです。
例えば一つ目のファイルが
1 
2
4
で、二つ目のファイルが、
2
3
6
4
だったら
2
4
と出力できるようなプログラムはどうやって書いたらよいのでしょうか。

686デフォルトの名無しさん:04/11/15 13:20:13
open(FILE, "$baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
if (grep(/^$_ /, @baka) { # >>684
# if (grep(/^$_$/, @baka) { # >>685
print $_;
}
}
687デフォルトの名無しさん:04/11/15 13:36:32
もう、この手の宿題には答えるのやめようぜ
688デフォルトの名無しさん:04/11/15 14:11:04
systemでcomm呼ぶのが楽そうだと思った
689683:04/11/15 21:01:54
>686
ありがとうございました。でも、これですと、
if (grep(/^$_ /, @baka)){
のところのif文が働いてくれず、
A 1
B 3
C 1
D 3
E 4
F 6
G 1
と出力されます。どうしたらよいのでしょうか?
690デフォルトの名無しさん:04/11/15 21:05:12
じゃ、それに応じて正規表現変えたらーぁ。
/^$_/
691683:04/11/15 21:17:54
if(grep(/^$_ /, @baka))
というのは、
A 1
B 3
C 1
D 3
E 4
F 6
G 1
の先頭が、@bakaの中身と同じだったらということですよね。このままで
いい気がするのですが、どう変えたらよろしいのでしょうか。
692683:04/11/15 21:59:21
たびたびすみません。
プログラムの意味を間違えて理解していました。
if(grep(/^$_ /, @baka))
というのは、
A 1
B 3
C 1
D 3
E 4
F 6
G 1
という配列@bakaに対して、$_の先頭と同じだったらということですよね。
こう考えて実行しても、まだ、
A
B
D
E
と出力されてしまい、数字がでません。どこを直したらいいのでしょうか?
693デフォルトの名無しさん:04/11/15 22:27:53
>>692

$ptn =join(/\n/,<>);# 対象英字のファイルを入力

while ( <> ){ # 数字付きのデータを入力
print if( /^[$ptn]/ );
}
694686:04/11/15 22:52:18
>>693さんのでいいと思いますが、>>686のが
>>692のようになってしまうわけは、
grep EXPR, LIST
として実行した場合、grep は LIST の値を一つづつ $_ に代入して
EXPR を評価しているからのようです。したがって、変数に代入して
からやればいいわけです。
open(FILE, "$baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
$exp = $_;
if (@match = grep(/^$exp /, @baka) { # >>684
# if (@match = grep(/^$exp$/, @baka) { # >>685
print $match;
}
}


695686:04/11/15 22:56:59
申し訳ない。やってみたら、タイプミスが2つありますた。
open(FILE, "baka.txt") or die "$!\n";
@baka=<FILE>;
close FILE;
while(<>){
($exp = $_) =~ s/\r?\n//; # それとこれも必要。windowsの場合。
if (@match = grep(/^$exp /, @baka)) { # >>684
# if (@match = grep(/^$exp$/, @baka)) { # >>685
print @match;
}
}
696683:04/11/15 23:05:23
>>693
ありがとうございました!
しかもとても簡潔でわかりやすいプログラムで感動しました!
697683:04/11/15 23:17:22
>>695
わざわざ詳しく調べていただいてすみませんでした。
ありがとうございます。
私もgrepについて調べて、自分なりに直してみたのですが、
($exp = $_) =~ s/\r?\n//;の部分が足りなかったみたいです。
これはchompとはちがうのでしょうか?
また、\r?はどういう意味ですか?
調べたら、\rはリターンで、?は前にある文字の0,1回の表現とでてきたのですが...

698686:04/11/15 23:37:30
windows(MS-DOS)の改行は、\r\nでしょ。
unixは、\n、Macは\r。だから、winodwsとunixのに対応してるわけ。
chompは、windowsの場合はだめなんすね。2個文字があるから。
699デフォルトの名無しさん:04/11/15 23:55:01
>>698
ただし、テキストモードで開いてる時点で
文字コードの違いは吸収されているわけだから、
\r?は保険同様ですな・・・時々改行コードの変換に失敗したのか
\r\r\nになってるやつがあるから反対はしないけど。
この場合 s/[\r\n]//g; のほうがいいんじゃないかとも思う。
700デフォルトの名無しさん:04/11/15 23:55:20
>>698
えーっと、ファイルからの入力ならテキストモードで読めば
勝手に\nになってるよ。
701686:04/11/16 00:07:01
>>698, >>699
環境にもよるじゃない。漏れは、
cygwin+perl, v5.8.5 built for cygwin-thread-multi-64int
だけん、shift-jisのファイル読み込むと、s/\r\n//;しないと
うまくいかんです。
702デフォルトの名無しさん:04/11/16 00:30:07
>>701
そういう特殊な環境を基準に初心者に話を進めるのは如何なものかと子一時間(ry
ちなみにクロスプラットフォームで開発することが多い自分はbinmodeしておいて、
s/\r+\n/\n/g; s/\r/\n/g;やs/[\r\n]+$//;にするのが基本になってる。
中途半端に処理するよりはこういう風にやったほうがいいのでは?
703デフォルトの名無しさん:04/11/16 00:36:37
Perl6ってもう出ました?
704デフォルトの名無しさん:04/11/16 00:44:26
まずググることくらいおぼえろや.ちなみに出てねえよ.
705デフォルトの名無しさん:04/11/16 00:51:43
いえ、ググってはみたんですが、いまいちわからなくて・・・。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=10&topic=10035
とかHitしたし・・・。
Parrotって何?状態です。あ、これは調べます。
706デフォルトの名無しさん:04/11/16 00:52:57
707デフォルトの名無しさん:04/11/16 02:33:53
ある処理の反応が悪いので、forkして処理させたところ、
perl in free(): warning: modified (chunk-) pointer
というメッセージが出るようになりました。
これはプログラムがヒープを破壊した、という意味なんでしょうか?
708デフォルトの名無しさん:04/11/16 05:12:25
5.2
5.3
6.2
10.4
0.2
5.6

というデータが書かれたファイルを読み込んで、偶数行の数値とその上の行(奇数行)の数値の
差を求める処理はどうすればいいでしょうか?


[実行結果]
0.1
4.2
5.4

という出力を得たいのです。
709708:04/11/16 05:14:11
>>708の続き

print "読み込むファイル名を入力してください\n";
chomp (my $file_read = <STDIN>);
open READ, "<$file_read" or die $!;

print "\n書き込み先のファイルを指定してください\n";
chomp (my $file_write = <STDIN>);
open WRITE, ">>$file_write";

while($line = <READ>)
 {
 ???? (ここで処理を行いたいのです)
 }


過去ログ見たところ、>>617の質問と似てますね…。
710デフォルトの名無しさん:04/11/16 05:39:03
abs($line - <DATA>)
711デフォルトの名無しさん:04/11/16 05:45:55
<READ>か
712デフォルトの名無しさん:04/11/16 08:13:12
仕事でPerlを使うことになったんだが、Perlっていまだに日本語まともに使えないのね。
Unixで動くんだが、デフォルトのコードセットがSJISで、改行コードがLF。しかもスクリプトは
SJISで書けだと。
713デフォルトの名無しさん:04/11/16 08:19:42
>>712
お前さんは、perlで日本語もまともに使えないのか?

SJISで書けつーのがようわからんが。
714デフォルトの名無しさん:04/11/16 08:22:56
そんな厨には、jperlかperl5.8をお勧めする。
perl5.8は、Encode.pm組み込めば、jperl相当のことができる。
715デフォルトの名無しさん:04/11/16 08:23:41
>>706
それも怪しいなあ、どの道中間コードにするときに展開されるから速さも変らんぞ
716デフォルトの名無しさん:04/11/16 08:52:45
>>714
「まともに」は語弊があったかな。SJISだと「機」とか「表」の問題ね。
これがいやでRubyに逃避してたんだが、いちいちEUCに変換するのめんどいのよ。
717デフォルトの名無しさん:04/11/16 09:29:21
>>716
UNIXやめてWindowsに
718デフォルトの名無しさん:04/11/16 09:33:27
イヤ、別に普通に使えるけど?>「機」とか「表」
719デフォルトの名無しさん:04/11/16 09:45:13
>>718
できね。
use encoding "shift-jis";
while(<DATA>) {
print if /機/;
print if /表/;
}
_END_
機会
表現

720デフォルトの名無しさん:04/11/16 09:46:06
まあSJISで書けと限定されるような仕事は辞退するべきだろうな
721デフォルトの名無しさん:04/11/16 09:52:55
ゴメソ。>>719はでけた。__END__だた。
ただ、別ファイルから読み込むとだめなんですが、どうしたらよいでつか?
722デフォルトの名無しさん:04/11/16 10:23:18
>>721
use encoding 'shift-jis'だけだと、プログラム自体と
STDIN/STDOUTはshift-jisになるが、自分で開いたファイル
まで自動的にshift-jisだと思ってくれるわけではない。

明示的にopenするときに指定してやるか、use openで
デフォルトを変えておけばok。
723デフォルトの名無しさん:04/11/16 10:31:35
>>722
ありがとん。
use encoding "shiftjis";
use open ':encoding(shift-jis)';
で行けますた。shiftjisでもshift-jisでもいいんですねぇ。
""でも''でもいい。イイー
724デフォルトの名無しさん:04/11/16 10:52:58
shiftjisでもshift-jisでもいいが、習慣としてはshift_jisにしとけ。
他の方法・他の言語を使うときにはまらないようにな。
725デフォルトの名無しさん:04/11/16 14:44:31
つい数ヶ月前からperlを学んでいる初心者です。
先ほど、perlベースのプログラムを実行したところエラーが表示されたので
関連した項目を検索していたら下記の文献を見つけたのですが、環境変数の
設定とかを理解できていないので動かない状態です。マイコンピュータ→プロパティ→詳細→環境変数→××のユーザ環境変数→
TMP(編集)。。このあたりをいじればと思っているのですが。。
どなたか教えて頂ければ幸いです。因みにOSはWin2000です。


dfa.pl 内部で起動している dfa が
テンポラリフォルダへアクセスできないようです。
環境変数 TMP で適当な書き込み可能なディレクトリを指定してください。
726デフォルトの名無しさん:04/11/16 15:29:54
ActivePerl 5.8 と Windows で Perl 環境を作っています。
SSL 接続に対応したいので検索したところ、Net::SSLeay という
モジュールを入れればよいとのことだったのですが、ActivePerl 5.8 は
非対応でした。
そこで、Crypt::SSLeay というのがあることを知り、ソースからビルドを
試みたのですが、うまくいきません。

.ppm パッケージからもインストールできるようですが、ネット接続の
関係上、ローカルにバイナリのパッケージ一式があり、そこから
ネット接続ナシでインストールできるのがベストです。

何かご存知の方、いらっしゃいませんでしょうか。
727デフォルトの名無しさん:04/11/16 15:52:58
>>725
TMP="c:\TMP" # 空いてる既にあるディレクトリ
>>726
perllibに置くだけでいいんちゃう。
728デフォルトの名無しさん:04/11/16 16:14:59
>>726
> ActivePerl 5.8 と Windows で Perl 環境を作っています。
> SSL 接続に対応したいので検索したところ、Net::SSLeay という
> モジュールを入れればよいとのことだったのですが、ActivePerl 5.8 は
> 非対応でした。
> そこで、Crypt::SSLeay というのがあることを知り、ソースからビルドを
> 試みたのですが、うまくいきません。

そいつは残念だったね、おれはうまくいったよ。

> .ppm パッケージからもインストールできるようですが、ネット接続の
> 関係上、ローカルにバイナリのパッケージ一式があり、そこから
> ネット接続ナシでインストールできるのがベストです。
> 何かご存知の方、いらっしゃいませんでしょうか。

ppm パッケージからもインストールできるようですが
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
そこまで分かってるなら、そこからパッケージを盗って来ればいいじゃん。


自分のとこでネットに関係なく閉じたいなら、てめぇのとこでコンパイルするこった
10回や100回失敗したくらいで見ず知らずの他人様に泣きつくなってこった
729デフォルトの名無しさん:04/11/16 16:41:38
>>728
必要なファイルを適当なディレクトリに置けばネットワークなくても
ppmのインスコできるよ。この辺参考にドゾー。

ttp://www.ss.iij4u.or.jp/~somali/web/_ppm.html
730デフォルトの名無しさん:04/11/16 16:47:36
>>729
コメントする相手を間違えてるんじゃないの?
731デフォルトの名無しさん:04/11/16 17:28:24
Perl 5.8.4でSJISにない文字(ハートマークとか)を名前に含むファイルを
開くにはどうしたらいいのでしょうか?
${^WIDE_SYSTEM_CALLS}は廃止されてしまったようです。
732726:04/11/16 17:39:49
>>729

ありがとう。たいへん参考になった。
733デフォルトの名無しさん:04/11/16 20:32:49
アクロバットなコードを書いて!
ただ奇抜なだけのもいいけど、これは凄いと唸らせるようなものも歓迎!
734デフォルトの名無しさん:04/11/16 21:41:56
Perl はつまらん
735デフォルトの名無しさん:04/11/16 22:47:21
>>733

print "ぬるぽ";
736デフォルトの名無しさん:04/11/17 00:24:10
>>726
別途OpenSSLとかが必要になるはずですけど
そっちのほうはOKなのでしょうか?
737デフォルトの名無しさん:04/11/17 00:57:25
ファイル処理で、ファイルハンドルから読み込んだ行数を表す変数で『$.』がありますよね。
これを利用してファイルの〜行目の数値から〜行目の数値を足す、というようなことはできますか?
例えば、

4
5
91
84

というファイルに対して、2行目の数値(5)と4行目の数値(84)を足したい、と思ったとき、
あくまでも例えとしての表記で、

$a は $.=2の行の数値;
$b は $.=4の行の数値;
$answer = $a + $b;

というようなニュアンスのことをしたいのですが。
738デフォルトの名無しさん:04/11/17 01:04:55
>>707
>perl in free(): warning: modified (chunk-) pointer

"in free(): warning: modified (chunk-) pointer" でググると分かると思うけど
rubyやらphythonやらdhcpやらbindやらcvs他他でもでるメッセージのようなので
glibcかなんかのバグじゃないのかな? あるいはメモリがイカレてるとか。
739デフォルトの名無しさん:04/11/17 01:07:55
モジュールが使いこなせたらと思っているのですが、
どのモジュールがどんな使い方ができるのか、を全体的に知る方法はないでしょうか。
何かをするときにわざわざ調べるんじゃなくて、知っておきたいのですが。
740デフォルトの名無しさん:04/11/17 01:11:21
>>733
PDFですか?
741デフォルトの名無しさん:04/11/17 01:13:39
>>737
・予めすべての行のデータを格納しておく
・予めすべての行のファイルポインタを格納しておく
・特定行の数値を取り出すサブルーチンを書く
どれでもいいよ
742デフォルトの名無しさん:04/11/17 01:14:33
>>739
ttp://www.cpan.org/modules/00modlist.long.html
をざっとorじっくり眺めれ。
743デフォルトの名無しさん:04/11/17 01:23:23
日本語がいいんですがどこかありませんか。
744デフォルトの名無しさん:04/11/17 01:29:45
>>743
英語くらい多少は読めた方がいいよ。

日本語ならここ。
ttp://perldoc.jp/docs/modules/
ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

745デフォルトの名無しさん:04/11/17 01:46:25
>>737
おれ初心者だけどこんなんダメかな?

#! /usr/bin/perl -w
use strict;
my ($aa, $bb, $sum);

while(<>){
if($. == 2){
$aa = $_;
}
if($. == 4){
$bb = $_;
}
}
$sum = $aa + $bb;
print "$sum\n";
746デフォルトの名無しさん:04/11/17 02:14:36
だれか助けて〜orz
沢山あるJPGデータをWebで一気に表示するというスクリプトをDLしてきたのだけど
表示されないの〜っ
.plをダブルクリックするとHTMLファイルが作成されて、同デレクトリ内のを表示する、はず
HTMLができるとこまではいけてます。
人さまからコピッてきたスクリプトをここでさらしてよいものかわかんない
747737:04/11/17 02:16:03
>>741
ありがとうございます。
@の用に配列に全行の数値を入れて配列番号を指定することで実現できました。

>>745
そんなやり方もあるんですね。
そちらでもやってみようと思います。
ありがとうございます。
748デフォルトの名無しさん:04/11/17 03:02:00
>>746
晒せないならここに来た意味が無いと思うが?
というか、自分で(作る|改造する)ので無ければ、
スレ違いどころか板違いな気もするが
749デフォルトの名無しさん:04/11/17 04:18:42
>>746
Webで表示なら板違い。
WebProg板へ
750746:04/11/17 04:46:53
解決しました!
コピッた時に欠行してただけみたいですorz

webで表示する部分ではなくて、数あるjegファイルを表示するのに
「デレクトリからリストを抜き出す」(かかれてた#)の指示が違ってるのかなと
思ったですよ

おじゃましました
751デフォルトの名無しさん:04/11/17 05:05:33
Expect.pmについての質問はここでしていいですか?
752デフォルトの名無しさん:04/11/17 05:16:18
>>751
とりあえず、ここに質問書け。

誘導は、それからだ。
753デフォルトの名無しさん:04/11/17 05:17:32
あ、じゃあちょっと待ってください!
いま急いで仕上げますんで!
やった!
754デフォルトの名無しさん:04/11/17 05:31:48
#!/usr/bin/perl
use Expect;
@host = ("www.mona.com", "www.giko.com");
$user = "onigiri";
$pass = "neko";
$mail = "2ch\@test.com";
for (@host) {
chomp;
$host = $_;
$exp = new Expect;
$exp->spawn("ssh $user\@$host\n");
$exp->expect(300,
[qr/\(yes\/no\)/ => sub { $self= shift;
$self->send("yes\n");
exp_continue }],
[qr/password:/i => sub { $self = shift;
$self->send("$pass\n");
exp_continue }],
'$'
);
755デフォルトの名無しさん:04/11/17 05:33:12
<続き>

#メール送信
$exp->send("mail $mail\n");
$exp->expect(1,
[ qr/subject:/i => sub { $self = shift;
$self->send("test\n$host\n.\n");
exp_continue; } ],
[ qr// => sub { $self = shift;
$self->send("$host\n.\n");
exp_continue; } ],
[ qr/cc:/i => sub { $self = shift;
$self->send("\n");
exp_continue; } ],
'$ '
);
#ここまで
$exp->send("exit\n");
$exp->expect(300,'$');
}
756デフォルトの名無しさん:04/11/17 05:35:46
一投稿では投稿しきれないので二つに分けました。
複数のマシンにSSHでログインし、メールを送信するスクリプトです。

以上のようなスクリプトだとメールを送信してくれるのは最初のwww.mona.comだけで、
しかも画面上は、一つめのサーバでメールを送信してexitせず、留まってしまってしまっているようです。
「メール送信」から「ここまで」を削ると両方のサーバにログインしてくれるのですが・・・
何が悪いのでしょう。
757デフォルトの名無しさん:04/11/17 06:15:02
multipart/form-dataなデータをファイルの部分とそうで無い部分を
分けて処理したいのですがいい方法は無いでしょうか?

&file_igai_encode(\%form);
exit if $frm{flag};
while (read STDIN, $buffer, 4096) {*ファイル処理}
みたいにフォームの要素の値によってファイル処理を行うか否かをしたいと思っております。
STDINをseek出来れば解決なのですがそれは出来ないようです。
ですのでSTDINをreadlineで「filename="」が出現するまで回して出現したら
それまで読み込んだデータから判別し、OKだったらファイル処理を行う
というようなコードを作ったのですが、例えばSTDINにflagというレコードより
前に「filename="」が出現してしまったらどうしようって事に気づいてしまいました。
何度も検証した結果、STDINに入る順序は一定であるがnameのアルファベット、
サイズ順でもないし法則性が見出せませんでした。

そこで大変不躾な質問だとは存じておりますが
・multipart/form-dataのレコード順序の法則性 (ブラウザ依存っぽい?)
・こういった処理のベターな方法
の二点をご教授頂ければ焼き肉食べに行きます。
758757:04/11/17 06:51:54
ふと頭を冷やしてみると
<form action="hoge.cgi?flag=1" method="POST" enctype="multipart/form-data">
というように$ENV{QUERY_STRING}を使うとか$ENV{PATH_INFO}を使うという手もありますね。
759デフォルトの名無しさん:04/11/17 06:58:52
と思ったけどflagの値が固定かjavascript使わないと意味無いやorz
760デフォルトの名無しさん:04/11/17 07:25:11
ものすごく読む気がしない。
761デフォルトの名無しさん:04/11/17 10:26:28
>>757
なんかわからんけど、CGIモジュール使って
あとはオマカセでいいんでねーの? 勉強か
宿題でどうしても自分でスクラッチから書く
のが条件ならしょうがないが。
762デフォルトの名無しさん:04/11/17 11:09:25
>>754
>$exp->spawn("ssh $user\@$host\n");

expect使ったことないからわかんないけど
同じ$expで複数回spawnしても、そのインスタンスを何かの変数で受けとかないと
最後にspawnしたコマンドへのメッセージ送信になるんじゃないの?
$exp[n] = new Expect; を接続の数だけやった方がいいんじゃないかな。効率悪いのかもしれんが。
間違ってたらスマン。
763デフォルトの名無しさん:04/11/17 11:21:46
なんか new Expect は $obj->spawn(...)と同じ意味らしいね。
だから接続を保存するのは spawnした時点でいいかも。
764デフォルトの名無しさん:04/11/17 12:35:28
>>762
>>763
ありがとうございます!
えーっと?
ということは、new Expectは最初に$exp = new Expecとして一回だけ宣言するだけでよく、
あとは$exp[n] = spawn(...)を必要な数だけ作っておいて
それを後で個別に$exp[n]->expect(...)以下の文だけをつなげていくということですか?

今はちょっと試すことが出来ないので、とりあえず確認だけ。
765デフォルトの名無しさん:04/11/17 12:59:25
>>756
mona.com, giko.com, test.com の管理者にはひとこと入れたんだろうな?

# 予約ドメインの example.com, example.co.jp, example.jp, ... を使えと何度(ry
766デフォルトの名無しさん:04/11/17 13:43:53
>757
$ENV{'CONTENT_TYPE'}
767デフォルトの名無しさん:04/11/17 19:47:45
multipart/form-data なんて思いっきりアプロダじゃん
テキトーに拾ってきて読んでみれば
768757:04/11/17 22:19:54
一度全部STDINを読み込んでから処理すればいいのですがメモリの消費を抑えたいのです。
また、ストリームなのでseekで移動は出来ません。
非filename属性のデータは$FORM{***}につっこみfilename属性のデータは取りあえずどこかのディレクトリ
に書き込んでおくという方法もありますが非filename属性のデータ部分で書き込むファイルのディレクトリ
を判断&setuidするプログラムなのでファイル作成時には既にsetuidされている状態が望ましいのです。
後でchownすればいいのですが処理的に気持ち悪いしスマートな方法は無いかなと思いまして。
該当しそうなテキトーなスクリプトを参考に見てみた感じでは
imgboard.cgi→STDIN全部取得型
CGI.pm→テンポラリディレクトリに書き込み
のような感じで自分の求めている処理ではありませんでした。
処理的に困難であるかとは思ったのですがこの広い世の中誰か実現している人もいるかなと思って投稿した次第です。
769デフォルトの名無しさん:04/11/17 23:02:34
>>768
そういうストリーミングファイル受信に対応しているPerl製CGIを読んだことがあったな・・・
ウェブ管理ツールか何かだった気がするけど・・・
ちょっとハードディスクの中引っ掻き回してくる
770デフォルトの名無しさん:04/11/17 23:17:56
>>768
テンポラリに置いといてあとでchown/chmod/renameで別に
構わんと思うのだが、何が気持ち悪いのだろうか。その
感覚を何とかした方が、無駄な努力をしなくて済みそうな
気がする(笑)
771デフォルトの名無しさん:04/11/18 00:40:36
>>764
>それを後で個別に$exp[n]->expect(...)以下の文だけをつなげていくということですか?
たぶん。試してないけど。。
同一のexpectする内容を何回も書くの嫌だったら、書く場所一つにして同じリファレンス渡してもいいし。
両サイトの反応比較して動作を変えたいとかだと、一工夫必要かもしれないけれどね。
あと$expと@exp(= $exp[n])は違う変数としてレスに書いたから注意してください。
772デフォルトの名無しさん:04/11/18 01:06:05
>>768
MIME::* 系のモジュールをuseするんじゃだめなのかなぁ? (MIME::Decodeとか)
少なくともMultiPartには対応しているよ。なんかよくわからないけどね。
773デフォルトの名無しさん:04/11/18 01:19:04
>>768
クッキー使え
774デフォルトの名無しさん:04/11/18 05:40:02
>>751=>>753=>>754=>>755=>>756です。
帰宅して早速スクリプトを作ってみました。
結論からいうとうまくいきませんでした。

今まで教えて貰ったことをスクリプトにすると下のようになると思うのですが・・・。

このスクリプトでもやはり二つめのサーバには行かず
>>754->>755に投稿したものと同様、一つめのサーバでメールを出してそこで
止まってしまい、「メール送信」から「ここまで」を切り取ると、二つめのサーバ
までログインしてくれて、正常に終了してくれます。

実は$exp=Expectの直下の8行目のfor文で、教えられたことを忠実に処理させようと、
++$iで加算したものを$exp[$i]->spawn(...)としようとすると、
can't call method "spawn" on undefined value...というようなエラー文が
出て終了してしまうので、
苦肉の策として上のようなスクリプトにしました。

何か良い手だてはありませんでしょうか?
775デフォルトの名無しさん:04/11/18 05:42:44
#!/usr/bin/perl
use Expect;
@host = ("www.example.com", "www.example.co.jp");
$user = "mona";
$pass = "giko";
$mail = "test\@example.ne.jp";
$exp = Expect;
for (@host) { push (@exp, $exp->spawn("ssh $user\@$_\n")); }
for (@exp) {
$_->expect(300,
[qr/\(yes\/no\)/ => sub { $self= shift;
$self->send("yes\n"); exp_continue }],
[qr/password:/i => sub { $self = shift;
$self->send("$pass\n"); exp_continue }], '$');
######メール送信######
$_->send("mail $mail\n");
$_->expect(300,
[ qr/subject:/i => sub { $self = shift;
$self->send("TEST\ntest\n.\n");
exp_continue; } ],
[ qr// => sub { $self = shift;
$self->send("test\n.\n"); exp_continue; } ],
[ qr/cc:/i => sub { $self = shift;
$self->send("\n"); exp_continue; } ], '$ ');
######ここまで######
$_->send("exit\n");
$_->expect(300,'$');
$_->close(); }
776デフォルトの名無しさん:04/11/18 07:17:27
Ruby以外の言語は糞
777デフォルトの名無しさん:04/11/18 09:12:03
>>776
そういうこともRubyで書けやパゾ
778デフォルトの名無しさん:04/11/18 10:07:37
>>775
つか、汚すぎて読む気しない
779デフォルトの名無しさん:04/11/18 14:40:17
質問です。
$C/($A+$B)*1000
という計算式の文字列があるとして、これを実際に
計算させて値を得るにはどうしたらいいでしょか?
関数などがあるのでしょうか?
それとも自力で作るしかないですか?
780デフォルトの名無しさん:04/11/18 15:02:44
eval
781デフォルトの名無しさん:04/11/18 15:52:35
>780
ありがとうございます。できました。
782757:04/11/18 23:36:18
>>769
もし見つかりましたら是非名前だけでもお教え下さいませ

>>770
確かにそうなんです。時々、どうせ使わないレシートをその場で捨てられない自分が嫌になります。
ですがファイルの作成を一時でも別のユーザーに作成してchown、renameでは
unixの各種制約を目的のユーザーに課すことが出来ないんですよね。例えばquotaとか。

>>772
今回はMIME系では解決出来なさそうです。情報ありがとうございます。

代替手段もいっぱいあるしおしっこをすると何故ブルブル震えるんだろう程度の
探求心からの質問でしたので今回はタンスの引き出しにしまっておくことにします。ありがとうございました。
783707:04/11/19 00:05:21
>>738
サンクス。色々やってたらOS毎落ちたりするようなので、
メモリかもしれない。
784769:04/11/19 02:02:31
>>782
一日遅れだけど発見。
ttp://hp.vector.co.jp/authors/VA032507/dsp/ja/webftpclient2.htm
lib/ftpcontrol_sub/putfileex.pl
あたりでやってます
785757:04/11/19 06:13:38
>>784
誠にサンクス!!
日曜にでも試してみます
786デフォルトの名無しさん:04/11/19 06:29:22
質問いいですか。
Linux man pagesの英語版日本語版のファイルがあって、
groff方式だから行頭に.SHとなっているのが見出しなので、
NAME
...
名前
...
SYNOPSIS
...
書式
...
みたいなかんじで原文、日本語訳交互に表示させるスクリプトを
でっちあげていたんですが、はまってしまいました。もう朝だし、、、。
よかったらダメなところを指摘してください。
787デフォルトの名無しさん:04/11/19 06:31:49
#!/usr/bin/perl
$count = 0;
$flag = 0;
$jflag = 0;
open(IN,"jman2/acct.2") ||die;
@jline = <IN>;
close(IN);
open(IN,"man2/acct.2") ||die;
while($line = <IN>) {
if(($line =~ /^\.SH/) && ($flag == 0)) {$flag = 1;}
elsif(($line =~ /^\.SH/) && ($flag == 1)) {Jline();}
if($flag == 1) {print $line;}
}
close(IN);
exit(0);
sub Jline {
for(;;) {
if(($jline[$count] =~ /^\.SH/) && ($jflag == 0)) {$jflag = 1;}
elsif(($jline[$count] =~ /^\.SH/) && ($jflag == 1)) {last;}
if($jflag == 1) {print $jline[$count];}
$count++;
}
}
788デフォルトの名無しさん:04/11/19 08:44:06
超初心者な質問です。

telnetモジュールを使用して、リモートコンピュータに接続してから、
・screen起動
・外部プログラム起動
・CTRL-A d で[detached]
という操作をperlで実行したいのです。

色々サイトを回って調べて、telnet接続まではできたのですが、
上記手順の「CTRL-A d で[detached]」で行き詰っております。
CTRL-Aという操作をperlのtelnetモジュールで行うには、
どういう記述をすればよいのでしょうか?

(将来的に、CGIとしてWeb公開したいので板違いかもしれません。)
789788:04/11/19 08:47:56
板違いだったようです。。
申し訳ありませんでした。
790デフォルトの名無しさん:04/11/19 10:04:52
このたび初めてperlを使うのですが、コマンドプロンプトを起動し、ppmと打つと

C:\Documents and Settings\自分の名前>ppm
Fatal error: couldn't find or create config file targets.cfg: Cannot chdir back
to C:/Documents and Settings/自分の名前: No such file or directory 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/Config.pm line 444.
BEGIN failed--compilation aborted at C:/Perl/site/lib/PPM/UI.pm line 1049.
Compilation failed in require at C:\Perl\bin\ppm3-bin line 16.

このような文章がでてきてしまい、インストールすることができませんでした。自分がインストールしようとしているのは
install time-hires
install io-zlib
install win32-api
install http-lite
install getopt-long
なのですが・・・
自分なりにサイトを見てまわりましたが、確信にたどり着けず困り果てています。
どなたかご教授をお願いします。

PCの環境
OS: Windows XP Home Edition
Perl: Active Perl 5.8.3.809
791デフォルトの名無しさん:04/11/19 10:49:59
>>790
「自分の名前」が「加能圭介」だったりして(w
792デフォルトの名無しさん:04/11/19 11:10:56
名前が曾我十郎だったりして(w
793デフォルトの名無しさん:04/11/19 11:33:45
XMLモジュールをCPANでインストールしようとしたのですが、
最後に
Failed Test Status Wstat Total Fail Failed List of Failed
--------------------------------------------------------------------------------
t/01basic.t 2 512 2 2 100.00% 1-2
t/02load_xml.t 2 512 1 1 100.00% 1
t/03simple_compare.t 2 512 2 2 100.00% 1-2
t/04namespaces.t 2 512 4 4 100.00% 1-4
t/05simple_handler.t 2 512 1 1 100.00% 1
t/06pass_to_handler.t 2 512 1 1 100.00% 1
t/07pitest.t 2 512 3 3 100.00% 1-3
Failed 7/7 test scripts, 0.00% okay. 14/14 subtests failed, 0.00% okay.
make: *** [test_dynamic] エラー 2
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force
と出てエラーが出てしまいます。

 XML::XPathを使いたいのですが、どうしたらよいのかさっぱりです。
 アドバイスをお願いします。

OS:Vine 2.6-rc4
Perl: Version 5.6.1

 よろしくです。
794デフォルトの名無しさん:04/11/19 11:51:33
>>793
1)perlを5.8にversion upしてもう一回コンパイルしてみる。
2)http://www.activestate.com/からLinux用のActivePerlをDLして
インストールしてからppmでインストール。

どちらか好きな方をどうぞ。
795デフォルトの名無しさん:04/11/19 12:10:40
>>790
ユーザアカウントに自分の漢字名を使ってその中に、次の漢字の内の一つが入ってるんじゃないの?
―ソЫ\噂浬欺圭構蚕十申曾箪貼能表暴予禄兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭xx

そうだったら、ユーザアカウントに漢字名を使うの止めれ。骸骨人の作った他のソフトのインストールも
時も困ることになるぞ。
796デフォルトの名無しさん:04/11/19 17:13:10
質問します
ファイル操作を行う、バッチシェルを作ろうとおもうのですが、いまさらシェルを勉強するのもあれなんで、
perlでもバッチ処理はできるのでしょうか?
797デフォルトの名無しさん:04/11/19 17:36:32
すみません、質問です。
日本語(EUC)の絡んだ文字列の完全一致の比較(eq)でWindowsとLinuxで結果
が異なって困っています。
Windowsの方だとちゃんと判定してくれるのですが、Linuxでは合っていても
NGとしか返してこないんです。
確認すべきこと、解決策はありますか?

ちなみにそれぞれの環境は
・WindowsXP ActivePerl5.8.4
・Linux(Redhat9) ActivePerl5.8.0
です。

比較させようとしている文字列はそれぞれ異なる変数A,Bで、
A、Bともにファイルからオープンして配列に格納された要素です。
それぞれchompした後、比較してもLinuxでは無理でした。
Linuxマシンへの転送もテキストモードで送ってます。
(一応、全ての組み合わせ※で試しました)
※アスキー、バイナリ、EUC、JIS、無変換
798デフォルトの名無しさん:04/11/19 17:41:10
Linuxのほうで双方の文字列をバイナリダンプしてみれ
799デフォルトの名無しさん:04/11/19 18:12:46
>>791>>792>>795

ユーザー名変更したら解決しました。有り難う御座いました。
ユーザー名には某PCメーカーの『ソ』が含まれておりました……。
800デフォルトの名無しさん:04/11/19 18:31:34
>>799
専有マシンならdisk直下においといたほうがいい。
またいつか、似たような問題でトラブるよ。
801デフォルトの名無しさん:04/11/19 18:48:35
>>800
ハァ?問題の本質が分かってないんじゃない?
802デフォルトの名無しさん:04/11/19 19:13:26
>>801
あんたもそのうちトラブるかもね(w
ばかげた「解決法」をweb上でわんさか見かけるんでレスしたまでのこと。
MSから入った初心者はたいがいひっかかる。
803デフォルトの名無しさん:04/11/19 19:38:20
>>796
それが分からない君は、シェルを今からでも勉強した方がいいと思うぞ
804デフォルトの名無しさん:04/11/19 19:53:26
>>803

どうも、シェルは現役時代数百本作ったことがあります。。
でも、今はすっかり忘れてしまって。。むしろperlの方ができるかな
805デフォルトの名無しさん:04/11/19 20:05:01
>>802
何をノタマッテいるんだか?
単純に漢字の第2バイトの問題だろ。20年以上前からMSが放置してる問題だよ。
806デフォルトの名無しさん:04/11/19 20:08:37
s/シェル/シェルスクリプト/g
当然できます。
807デフォルトの名無しさん:04/11/19 20:32:13
>>804
シェルを数百本も作ったんですか。
808デフォルトの名無しさん:04/11/19 20:41:58
>>793

$LANG=C cpan

とかしてみたら?
makeのエラーが日本語で出てるのがあやしい気がする。
809デフォルトの名無しさん:04/11/19 21:02:17
>>794
1)の方法はPerl 5.8が入っているマシンで試しましたが同じ結果でした。
2)はサーバーのPerlを変える事になるので、他のスクリプトで予期せぬエラーが
出るかもしれないので躊躇っています。
自作のコードばかりなので修正が必要なときは全部自前なのがつらいです。(´∀`;)
アドバイスありがとうございました。

>>808
試してみます。
アドバイスをありがとうございました。
810でこりん:04/11/19 21:53:58
だれか教えていただけないでしょうか?
2進数のバイナリを10進数にしたいのですが
$recode = unpack("C*",$bin) ←これの"C*"とか”N*”ってどうゆう意味
なんですか?
811デフォルトの名無しさん:04/11/19 21:54:57
perldoc -f pack
812デフォルトの名無しさん:04/11/19 23:47:29
スマートな方法あったら教えてください
変数がオブジェクトか否かを調べたいのですがref($var)の結果がHASHでもARRAYでもSCALARでもREFでもGLOBでもないということから判断する以外に方法はありますか?
813デフォルトの名無しさん:04/11/19 23:48:22
814デフォルトの名無しさん:04/11/20 00:04:16
>>812
 >参照が bless されたオブジェクトかどうかを判断するには、
 >次のように書くことができる。
 >print "It's an object\n" if UNIVERSAL::isa($val, 'UNIVERSAL');

http://www.google.co.jp/search?q=cache:jrE4b0pFGsYJ:www.janit.com/TechnoInf/Perl/Perl_OOP/perlobj.html+perl+%E5%A4%89%E6%95%B0+%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja

815デフォルトの名無しさん:04/11/20 00:06:44
>>812
Scalar::Util(5.8より標準)のblessedが正にその用途。

ない・インストールできない場合はこれで

sub UNIVERSAL::__object_class__{ ref($_[0]) }

sub blessed{
local($@);
length(ref($_[0])) ? eval{ $_[0]->__object_class__ } : undef;
}
816デフォルトの名無しさん:04/11/20 01:14:35
>>775
遅レス。Expect調べてみたところ
$_->expect(300,
  [ qr/subject:/i => sub{...} ],
  [ qr// => sub {...} ],
  ...
この手の書き方は、[]の中のパターンを順番にマッチさせていく、という制御というよりは、
パターンにマッチする文字列がどこかで発生したらsub{}を実行するというような、
イベントハンドラ的な書き方みたいだよ。
それから qr//で多分スクリプトがストールしているような気がするのだが、いかがか?
817デフォルトの名無しさん:04/11/20 03:13:26
>>816
ありがとうございます。
読みました。読みましたよ!

>>816さんが仰ってるのはメールを送信する部分ですよね。

それではメールの本文の、何も目印がないものにはどのようにマッチさせればよいのでしょう?
[sample@localhost sample] $ mail test@localhost
Cc: sample@localhost
とした後の本文の何も書いていない部分にマッチさせるのです。
qr/^/とすればよいのかな?

この部分に限らず、全体的な構成を見直すべく、-iオプションを付けてみたり
色々な方法を試しています。

遅レスでも構いません。何かご助言頂けるなら喜んで受けます!
818デフォルトの名無しさん:04/11/20 03:14:23
間違えました
[sample@localhost sample] $ mail test@localhost
Subject: test mail

でした。
819デフォルトの名無しさん:04/11/20 11:45:51
>>814-815
ありがとうございました
820797:04/11/20 14:27:40
797です

>>798
回答ありがとうございます。
しかし、Perlでバイナリダンプの仕方がわかりませんでした。

調べたところ、CSVファイルから読み込んでカンマでsplitして配列と
してその要素の比較を行ったのですが、chompをしても行末の改行が
うまく削除されず(?)、一致しないようでした。
事象は以下のとおりです。

あるファイルaaa.csv(中身は"A,A"で改行あり)とし、
openしてカンマでsplitし、配列@aaaに格納したとします。
すると$aaa[0]=A、$aaa[1]=A となりますよね。
で、lengthをとってみると、$aaa[0]は1で、$aaa[1]は3なんです。
Windows環境で実行するとaaa[1]は2なんですが。

Linuxで$aaa[1]をchompしても、lengthは2となります。
さらに、$aaa[1]をchopすると、ようやくlengthは1となり、
条件式($aaa[0] eq $aaa[1])にもマッチしてくれます。
ちなみにaaa[1]を最初にchopするとlengthは2となり、次にchompをしても
lengthは2のままでした。
aaa[1]には改行のほかにもなにか文字が含まれているということなのでしょうか?
こういう事象ってLinuxでは正常ですか?
つまり、Windowsから転送されてきたファイルの改行を削除するにはchopしてchompする
必要があるのか?ということです。
ちなみにファイルはFFFTPでアスキー・EUCで転送したものです。

長い上に文章力がなく申し訳ないのですが、誰か答えていただけますでしょうか。
821デフォルトの名無しさん:04/11/20 14:45:37
>>820
http://www.rsch.tuis.ac.jp/~mizutani/online/with-pc/textline.html
ここら辺でも、参考にして下さい。
822797:04/11/20 14:50:34
>>821
ありがとうございます。
勉強してきます。
823797:04/11/20 14:56:17
>>821
早速解決しました。ほんとにありがとうございます。
824デフォルトの名無しさん:04/11/20 16:50:24
perlでもバッチ処理はできるのでしょうか?
825でこりん:04/11/20 17:18:35
>>813
ありがとうございますm(__)m
826デフォルトの名無しさん:04/11/20 17:56:38
>>824
perlはバッチ処理のための言語です
827デフォルトの名無しさん:04/11/20 22:05:57
>>826

うそこけ
828デフォルトの名無しさん:04/11/20 22:13:08
Perl>>>>>>>>>>>>Java
829デフォルトの名無しさん:04/11/20 22:34:42
.pl>>>>>>>>>>>>>>.bat
830デフォルトの名無しさん:04/11/20 23:53:47
Perl>>>>>>>>>>>>>>>>>英語
831デフォルトの名無しさん:04/11/21 00:03:06
ドイツ語, フランス語
832デフォルトの名無しさん:04/11/21 00:17:48
Perlのようなもの
833デフォルトの名無しさん:04/11/21 00:19:00
のようなもの
834デフォルトの名無しさん:04/11/21 00:32:48
>>754
会社でデスマ中で返事遅れました。すんまへん。
今までの流れを愚直に書けばこんなかんじになります。
空行待ちは "\n"はOKみたい。

#!/path/to/perl

use Expect;
use strict;
use warnings;

my @hosts = qw(example.com example.jp);
my $user = 'osushi';
my $pass = 'naisho';
my $mail = '[email protected]';

my @exp;
for (my $i = 0; $i <= $#hosts; $i++) {
  $exp[$i] = Expect->spawn("telnet $hosts[$i]");
}

for (my $i = 0; $i <= $#hosts; $i++) {
  $exp[$i]->expect(10, -re, qr/login:/i) ;$exp[$i]->send("$user\n");
  $exp[$i]->expect(10, -re, qr/password:/i) ;$exp[$i]->send("$pass\n");
  $exp[$i]->expect(10, '$') ;$exp[$i]->send("mail $mail\n");
  $exp[$i]->expect(10, -re, qr/subject:/i) ;$exp[$i]->send("TEST\n");
  $exp[$i]->expect(10, "\n") ;$exp[$i]->send("test mail from $hosts[$i]\n");
  $exp[$i]->expect(10, "\n") ;$exp[$i]->send(".\n");
  $exp[$i]->expect(10, -re, qr/Cc:/i) ;$exp[$i]->send("\n");
  $exp[$i]->expect(10, '$') ;$exp[$i]->send("exit\n");
  $exp[$i]->close();
}
835デフォルトの名無しさん:04/11/21 00:34:54
別に同時ログインする必要はないので
コマンド部を分離して整理すると下の感じ。
my @sequences = (
  { expect => qr/login:/i , send => "$user\n" },
  { expect => qr/password:/i, send => "$pass\n" },
  { expect => qr/\$/ , send => "mail $mail\n"},
  { expect => qr/subject:/i , send => "TEST\n" },
  { expect => qr/\n/ , send => "test\n" },
  { expect => qr/\n/ , send => ".\n" },
  { expect => qr/Cc:/i , send => "\n" },
  { expect => qr/\$/ , send => "exit\n" },
);

for my $host (@hosts) {
  my $exp = Expect->spawn("telnet $host");
  $exp->expect($timeout, [ $_->{expect},
          sub{shift->send($_->{send})} ]) for (@sequences);
  $exp->close();
}
836835:04/11/21 00:37:34
ありゃ、空白詰められちまった。
それからtelnetじゃなくてssshだったっけ?
まぁ一緒だよね。
837デフォルトの名無しさん:04/11/21 00:47:52
perlはパッチを作った人の言語です
838デフォルトの名無しさん:04/11/21 00:57:17
expectスレでやれよ
839デフォルトの名無しさん:04/11/21 00:58:59
>>838
あんの?そんなの
840デフォルトの名無しさん:04/11/21 01:13:46
841デフォルトの名無しさん:04/11/21 01:21:34
あるんだ!すげー
(...化石ぢゃん)
842デフォルトの名無しさん:04/11/21 01:23:21
http://piza.2ch.net/tech/kako/993/993573920.html
では、ぬるぽしてもいいんですか?
843デフォルトの名無しさん:04/11/21 04:58:29
4しかない・・・
844デフォルトの名無しさん:04/11/22 10:08:12
845デフォルトの名無しさん:04/11/22 11:04:46
ヒアドキュメント中でリストの区切りを変えようとして

@{[$" = qq{\n} and '']}

のように書いているのですが、
「このクソ虫め。条件分の中で “=” だと? “==” だろ? 田舎へ帰ってママのおっぱいでも吸ってろ」
と警告を受けるのですが、他によい書き方はありますか?

と聞こうとしたところでもう一度考えて

@{[($" = qq{\n}) x 0]}

で警告を受けなくなった。俺はクソ虫からちょっとましなクソ虫に成長した。

と日記に書いておこう。
846デフォルトの名無しさん:04/11/22 11:30:53
ソートについて質問させて下さい。

abcdef の場合は sort @array
123456 の場合は sort { $a <=> $b } @array

と理解しているのですが、

no1 no1_1 no1_1_1 no1_1_2 no1_1_10 no1_2 no1_10 no2 no3 no10

↑のソートが上手く出来ません..
上記のように並べるソートはどのようにすれば良いのでしょうか。
847デフォルトの名無しさん:04/11/22 13:03:47
先頭の文字列が同一だと仮定して。
最初の数字(a)を、取り出す。
もし次にアンダーラインがあれば、’.'ピリオドに変換して(b)とする。
その後に続く数字を(c)を取り出す。
さらに、アンダーラインがあれば、それをスキップして数字を取出して
(c)に連結する。
(a)+(b)+(c)
"1.123"の様なフォーマットに変換すれば良いんじゃないか?

それを、連想配列なり何なりしてソート。
具体的なコードは、自分で考えてくれ。
848デフォルトの名無しさん:04/11/22 18:50:36
>>846
どう並べたいのかによる。単純には sort {$a cmp $b}@array
849デフォルトの名無しさん:04/11/22 21:50:44
>>847
それだと、
no1_11_1 と no1_1_11 の区別がつかない。
850デフォルトの名無しさん:04/11/22 23:25:07
>>846
こんな感じかな?
@array = map $_->[0],
        sort {
          for (my($n,$cmp)=1;; ++$n) {
            $#$a<$n || $#$b<$n and return $#$a<=>$#$b;
            $cmp = $a->[$n]<=>$b->[$n] and return $cmp;
          }
        } map [$_, /(\d+)/g], @array;
851デフォルトの名無しさん:04/11/23 01:50:09
>>846
こんな感じじゃない?
printf "no%*vd ", '_', $_ for sort map{ s/no/v/; s/_/./g; eval } @array;

(この場合、v-stringを使うとラク)
852デフォルトの名無しさん:04/11/23 02:30:42
v-stringとかシラネー
853デフォルトの名無しさん:04/11/23 04:13:25
不恰好だけど俺もでけた
と思ったら>>850とあんま変わらんのか('A`)

@a = qw/no1 no2_2 no1_22 no2 no1_1 no1_2_4/;

@s = map{ $_->[0] }
sort{
for(1 .. (@{$a} > @{$b} ? $#{$a} : $#{$b}) ){ my $s = $a->[$_] <=> $b->[$_]; $s == 0 ? next : last}
$s }
map{ [$_, /(\d+)/g] } @a;

print qq/@a\n@s/;

なんか暗号にしか見えんなw
あとsortって地のブロックで値を返すかreturnしなきゃダメなんだね、勉強になった
854デフォルトの名無しさん:04/11/23 09:34:55
>>853
だめだろ、それ
855デフォルトの名無しさん:04/11/23 11:24:45
どこが?ちゃんと動きましたが・・・
856デフォルトの名無しさん:04/11/23 11:28:36
う、載せるときにテキトーにmyしちゃいました
ゴメンチャイ
sortブロックの初めにmyですね
857デフォルトの名無しさん:04/11/23 11:50:37
>>852
疑似ハッシュと同じく失敗機能の一つ。廃止予定。
http://perldoc.com/perl5.8.4/pod/perl581delta.html#Future-Directions

>>846
my @array = qw(no1_1_1 no3 no1_2 no1_1_2 no10 no1_10 no1_1_10 no1 no2 no1_1);
my $digit = 4; # 数字部分の最大桁数

my @sorted =
  map $_->[1],
  sort { $a->[0] cmp $b->[0] }
  map {
    (my $str = $_) =~ s/(\d+)/ sprintf "%0${digit}d", $1 /eg;
    [ $str, $_ ]
  }
  @array;
858デフォルトの名無しさん:04/11/23 13:14:53
>>857
{ v1.2.3 => 4 } みたいな書き方がNGになっただけじゃないの? なんなら

print 'no', (join '_', unpack 'U*', $_), ' '
   for sort map{ s/no//; pack 'U*', split '_' } @array;

でもよし。packすれば無理にシュワルツする必要なし。短いし。
859デフォルトの名無しさん:04/11/23 14:30:14
Emacs で読める info 形式の manual の最新版はどこから取れますか?
860デフォルトの名無しさん:04/11/23 14:38:04
私のハードディスクから取れます
861デフォルトの名無しさん:04/11/23 14:41:42
>>860
anonymous でも取れますか?
862デフォルトの名無しさん:04/11/23 17:53:39
print "読み込むファイル名を入力してください ( By****3.txt )\n";
print "ファイル名 = ";
chomp (my $file_read = <STDIN>);
-f $file_read or die "\nそんなファイルないです\n\n";
open READ, "<$file_read" or die $!;

# 書き込みを行うファイルについての操作
print "\n書き込み先のファイルを指定してください ( By****4.txt )\n";
print "(ファイルがない場合は新たに作成されます)\n";
print "ファイル名 = ";
chomp (my $file_write = <STDIN>);

# 書き込み先ファイルを追加書き込み型で開く
open WRITE, ">>$file_write";

while (my $line = <READ>)
 {
 print "$line\n"; #配列の中身確認用print
 $value[$value_count] = $line;
 $value_count++;
 }
863862続き:04/11/23 17:54:14
という>>862のソースで、あるファイルを読み込んで、各行を配列の各要素に代入して別ファイルに書き込む、
という作業をしたいのですが、読み込んだ後に各行の行頭に半角スペースが入ってしまいます。

読み込むファイルが

100
200
300

という内容の場合、確認用printで確かめたところ、出力ファイルの内容が

_100
_200
_300

となってしまいます。
(『_』は半角スペースだと思ってください)

なぜでしょうか?
864862続き:04/11/23 17:54:35
という>>862のソースで、あるファイルを読み込んで、各行を配列の各要素に代入して別ファイルに書き込む、
という作業をしたいのですが、読み込んだ後に各行の行頭に半角スペースが入ってしまいます。

読み込むファイルが

100
200
300

という内容の場合、確認用printで確かめたところ、出力ファイルの内容が

_100
_200
_300

となってしまいます。
(『_』は半角スペースだと思ってください)

なぜでしょうか?
865862:04/11/23 17:55:11
二重書き込みすみません…
866デフォルトの名無しさん:04/11/23 19:26:38
>>864
どっかで
print WRITE "@value";
とかやってんだろ。
867862:04/11/24 02:25:02
>>866
回答ありがとうございます。

while (my $line = <READ>)
 {
 print "$line\n"; #配列の中身確認用print
 $value[$value_count] = $line;
 $value_count++;
 }

のすぐ下に確認用として、

print "@value\n";

という行がありました。
この行を削除したら意図した通りに動くようになりました。

配列変数をprint(もしくはファイルへprint) すると
なぜこのような現象が起きるのでしょうか…?
868デフォルトの名無しさん:04/11/24 03:23:38
>>867
原因はクォーテーションの中にあるから。
print @value,"\n";
とか。
ttp://allabout.co.jp/career/cgiperl/closeup/CU20040818A/index3.htm#5
869デフォルトの名無しさん:04/11/24 14:33:18
emacs lisp の cond みたいなのって perl では何になりますか?
870デフォルトの名無しさん:04/11/24 14:43:27
if
871デフォルトの名無しさん:04/11/24 14:59:05
elsifの羅列
872デフォルトの名無しさん:04/11/24 17:54:15
nslookupのlsコマンドでDNSに登録されたホスト一覧を取る場合って、

open(IN, '| nslookup > out.txt');
print IN "ls ドメイン名";
close(IN);

のようにして、一旦out.txtに結果を吐き出す方法しか
思いつきませんでした。
Perlの変数にlsコマンドの実行結果を直接格納する方法ってあるのでしょうか?
873デフォルトの名無しさん:04/11/24 17:58:05
``
874846:04/11/24 18:41:51
皆様、ありがとうございます。
と言うか、全く理解出来てないので、
皆様のコードを参考にして出直して参ります..orz
875デフォルトの名無しさん:04/11/24 19:26:41
>>872
同じプログラムに対して入力も出力もしたいとなると
IPC::Open2。

出力をとりこんでいろいろ加工するんならはじめから
Net::DNSを使ったほうがいいかも。
876デフォルトの名無しさん:04/11/25 06:51:33
>>834->>835
返事が遅れました・・・ごめんなさい!
>>754です。

投稿して頂いたスクリプトを元に改造を施し
満足のいくものを仕上げることができましたよ。

メールの本文入力域を/\n/にマッチさせるためか、>>834さんのスクリプトだ
とメールを送信し終わってプロンプトに戻ってもしばらくはメールの本文を書
いて、「Not such command」などと怒られてしまうので、そこのところを改良
しました。

でも全体としてみるとかなり参考になりました。
ありがとうございます!

以下にできあがったものを載せておきます。

その他にもアドバイスをくださった方々、ありがとうございました!
877デフォルトの名無しさん:04/11/25 06:52:37
#!/usr/bin/perl -w
use Expect;
@host = ("www.sample.com", "www.sample.jp");
$user = "mona";
$pass = "giko";
$mail = "[email protected]";
for (my $i = "0"; $i <= $#host; $i++) {
$exp[$i] = Expect->spawn("ssh -l $user $host[$i]\n");
}
for ($i = "0"; $i <= $#host; $i++) {
$exp[$i]->expect(300,
[ qr/\(yes\/no\)/ => sub { my $self = shift; $self->send("yes\n"); exp_continue; }],
[ qr/password:/i => sub { my $self = shift; $self->send("$pass\n"); exp_continue; }],
'$'
);
$exp[$i]->send("mail $mail\n");
$exp[$i]->expect(50,
[ qr/subject:/i, sub { my $self = shift; $self->send("TEST\n"); exp_continue; }],
"\n"
);
$exp[$i]->send("$host[$i]\n.\n");
$exp[$i]->expect(50,
[ qr/cc:/i, sub { my $self = shift; $self->send("\n"); exp_continue; }],
'$'
);
$exp[$i]->send("exit\n");
$exp[$i]->close();
}
878デフォルトの名無しさん:04/11/25 10:16:17
画像ファイルのヘッダを除去するにはどうすればいいですか?
879デフォルトの名無しさん:04/11/25 10:32:09
すみません、ヘッダというのは、content-type以外の余分な情報の部分です
880デフォルトの名無しさん:04/11/25 11:11:53
>>876
>しばらくはメールの本文を書いて
? うちの機械ではちゃんと動いたんだがね。
たぶんどっかの expectのなかに []を複数書いちゃって
複数文字列待ち状態になってたんじゃないのかな?
881デフォルトの名無しさん:04/11/25 11:44:55
デジカメの画像が000.jpg 001.jpg ... とあって、サムネイルがそれに対応して
s-000.jpg s-001.jpg ... というようにあるので、それの一覧ページを作ろうと
スクリプトを書いたのですが、数字が3桁で扱われません。

for ($i = 000; $i < 256; $i++){
print qq|<a href="$i.jpg"><img src="s-$i.jpg" width="120" height="90" alt="$i.jpg" /></a>|;
}
882878:04/11/25 11:53:47
sprintfでぐぐるといいかも
883878:04/11/25 12:20:52
884881:04/11/25 12:30:41
できました!
878さんありがとうございました!
885872:04/11/25 12:35:57
>>875

やっぱそうなるんですね。
Net::DNSは知らなかったので、ちょっと調べてみます。
ありがとうです。
886デフォルトの名無しさん:04/11/25 23:02:15
perlにて
system"/bin/rm -rf $BackupDIR/*"
みたいな感じでコマンドを実行しているのですが、
標準出力にでるメッセージをプログラムで受け取るにはどうしたらいいのでしょうか?
``でやった方がよい?
887デフォルトの名無しさん:04/11/25 23:38:13
888デフォルトの名無しさん:04/11/26 00:47:51
>>887
サンクス
889デフォルトの名無しさん:04/11/26 09:00:19
文字化けを起こす文字(表や能)を正規表現を使って表\や能\に置換しようとしているのですが上手くいきません。
$str = "表示するべさ";
$str =~ s/\Q表示\E/表\\示/;
これだと上手く動作するようですが、置換対象が"表示"に限られるので、表→表\にしようとして
$str =~ s/\Q表\E/表\\/;
だとエラーになってしまいます。
なんとかなりませんでしょうか?
ちなみにSJISじゃないと駄目だという状況なのでEUCはNGです。
890デフォルトの名無しさん:04/11/26 09:18:13
\x92\x5C
891BlackLightOfStar ◆ifsBJ/KedU :04/11/26 11:28:07
質問です。
〜を任意の文字列(但し、abc,def,ghi,jklというパターンは含まないとし、0文字でもいい。)
として、
abc〜def〜ghi〜def〜ghi〜jkl
とパターンマッチするかどうかを調べるにはどうすればいいのでしょう?
892デフォルトの名無しさん:04/11/26 11:35:07
天気がいいのでちょっとドラクエ買ってきます
893デフォルトの名無しさん:04/11/26 12:13:21
894デフォルトの名無しさん:04/11/26 12:28:50
>>891
my $d = '〜';
my @s = qw(abc def ghi jkl);
my $s = 'abc〜def〜ghi〜def〜ghi〜jkl';

$d =~ /\Q$_\E/ && die "\$d includes '$_'.\n" for @s;

my $p = '(?:' . join('|', map quotemeta, @s) . ')';
print $s =~ /^$p(?:\Q$d\E$p)*\z/ ? '' : 'un', "match.\n";
895BlackLightOfStar ◆ifsBJ/KedU :04/11/26 13:10:23
Re:>894 どうもありがとうございました。これで出来そうです。
896デフォルトの名無しさん:04/11/26 13:24:37
UTF-8で文字が途切れているか判定するにはどうすればいいんでしょうか。
897BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:40:57
Re:>896 文字が途切れているとは何?perlには文字コードを出力する関数があるからそれでなんとかなる?
898デフォルトの名無しさん:04/11/26 15:43:11
さっきまで質問していた人なんかには聞いていませんよ・・・
899BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:43:42
抜粋:
次の例を実行すると [ABC] [65 66 67] [ABC] と表示されます。

$xx = "ABC"; # 文字列としての代入
@yy = unpack("C*", $xx); # 数値の配列に変換
$zz = pack("C*", @yy); # 数値の配列を文字列に変換
print "[$xx] [@yy] [$zz]\n";
900デフォルトの名無しさん:04/11/26 15:43:43
配列の構造体について質問させてください。
いくつでも追加可能な構造体配列が作りたいと思い、
http://www2s.biglobe.ne.jp/~arkadia/cgi/perl_tips.htm
を参考にして、最初、繰り返し push( @$DataArray, \%Data1 ) を使うソースを書いてずっと悩んでいたのですが、
これは配列の要素が、すべて同じリファレンスで構成されているためだと(自分では)納得して、
自分なりにソースを作ってみました。

my (%Data, %Data1, @DataArray, @Name);

%Data0 = ("Name" => "", "Address" => ""); # 構造体定義
@Name = ("Taro", "Hanako", "Ichiro"); # 要素数は可変

foreach (@Name){
%Data = %Data0; # 初期化
$Data{"Name"} = $_;

push( @$DataArray, %Data);
}

配列に入れた(つもりの)ハッシュのリファレンスを使って、
$DataArray->[0]{"Name"} のように使いたいのですが、これも自分の知識では無理でした。
もうどうやればいいのか分かりません。
追加可能な構造体配列を作る方法をどうか教えてください。
901BlackLightOfStar ◆ifsBJ/KedU :04/11/26 15:44:04
Re:>898 お前に何が分かるというのか?
902デフォルトの名無しさん:04/11/26 16:00:37
なんで人をお前呼ばわりするんですか?
903デフォルトの名無しさん:04/11/26 16:04:12
>>900
追加可能な構造体配列というのはなくて、構造体っぽく使うことにした
ハッシュリファレンスを格納する配列(perlの配列ははなから追加可能
なのでことさら追加可能という必要はない)があればいいわけだが、
注意しなくてはいけないのは、ハッシュリファレンスが指すハッシュは
毎回別のものにしなくてはいけないということだ。そのプログラムでは
ループの外で定義された%Dataが毎回使われるので、全部同じ実体に
なってしまう。あとtypoだと思うが、push( @$DataArray, %Data);
はpush( @$DataArray, \%Data);ね。

ということで、%Dataをforeachのループ内で新しく作ればOK.

foreach (@Name){
my %Data = %Data0; # 初期化
$Data{"Name"} = $_;

push( @$DataArray, \%Data);
}

それから、最初の行のmy宣言は中身とほとんどあってないのでちゃんと
直すように。use strictの使用を勧める。

904デフォルトの名無しさん:04/11/26 16:09:09
chaoticのことをchaosicと書いていた奴か。
905デフォルトの名無しさん:04/11/26 16:11:05
>>900
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html

my $DataArray = [];
my @Name = qw(Taro Hanako Ichiro);

push @{$DataArray}, { Name => $_ } for @Name;

my $name = lc $DataArray->[0]{'Name'};
$DataArray->[0]{'Address'} = "$name\@example.com";

print "$_->{'Name'} : $_->{'Address'}\n" for @{$DataArray};
906BlackLightOfStar ◆ifsBJ/KedU :04/11/26 16:32:52
Re:>902,904 逆ギレすんな。
907デフォルトの名無しさん:04/11/26 16:41:20
無礼な人ですね。
908900:04/11/26 16:51:49
>>903
すげーー。 ありがとうございます!!
言われてみれば、そういう使い方ができますね。
ループ内でハッシュを新しく宣言しなおす、という方法はまったく思いつかなかったです。
これならその都度、リファレンスも別のものに変わると言うわけですね。

push( @$DataArray, %Data); はタイプミスじゃなく、敢えてそうしました。
自分のソースでは、\%Data のリファレンスが変わっていないので、\%Data を push しても、
同じリファレンスを渡すだけだと考えまして、ハッシュの中身を配列に全部移した後で
配列の途中(それぞれのハッシュの先頭)へのリファレンスを $DataArray->[n] で
拾おうと思ったんです(無理でしたけど)。

宣言部は、コピペするときになるべくソースを短くしようと思って、use strict とっぱらったんですが、
その過程でミスしてしまったようです。
短くするなら>>905氏くらい短くしろ!と言われそうですが・・・力不足ですみません。

>>905
ありがとうございます。
デリファレンスをいきなり使うパターンですか。
完全に自分の想像外なソースでしたが、サイトを見たり、ソースをいじったりしてだいたい仕組みが掴めました。
シンプルかつ実に面白いソースですね。
909BlackLightOfStar ◆ifsBJ/KedU :04/11/26 17:00:03
Re:>907 逆ギレすんな。
910デフォルトの名無しさん:04/11/26 17:01:23
他のスレでやってください。場違いでしょう。
911デフォルトの名無しさん:04/11/26 17:10:23
>>893
読んで見ました。
$str =~ s/\Q表\\E/表\\\/;
に変更してみたらエラーは出なくても結果は変わらず状態です。
何か解釈がおかしいのでしょうか?

>>890
$str =~ s/\x5C/\\x5C\\x5C/;
ということでしょうか?
こちらも変化無し状態です。

よろしくおねがいします。
912デフォルトの名無しさん:04/11/26 17:38:25
文字化けだって?
文字コードがシフトJISと分かっててなぜ文字化けするかね
913デフォルトの名無しさん:04/11/26 17:38:38
>>896
perldoc EncodeのHandling Malformed Data
914デフォルトの名無しさん:04/11/26 19:22:38
バカking、わざわざ数学板から出張して荒らしてるんじゃねぇよ。
よく書き込んでいる
>お前に何が分かるというのか?
ってのがあるが、お前の事なんか理解できるか、ボケ。
周りに理解してもらう前に自分が周りを理解しろ。
915デフォルトの名無しさん:04/11/26 21:26:27
>>911
\x92\x5C
916デフォルトの名無しさん:04/11/26 21:38:04
「Re:」の使い方を一目見ただけで
こいつの精神の閉塞ぶりがよくわかる
917デフォルトの名無しさん:04/11/26 21:59:34
>>911
$str = "表示"; とした時点で、$strの中身は
95 5C 8E A6 ではなく、95 8E A6 となっている。
「表」ではなくなってしまっているのだから、
「表」だけでどうにかしようってのはムリな話。
$str = '表示'; とするか、
$str = "表\示"; とするか、
use encoding "sjis"; をすべき。
918BlackLightOfStar ◆ifsBJ/KedU :04/11/26 22:29:10
Re:>912 perlではバックスペースでのエスケープを優先するからだろう。こういう場合はシングルクオーテーションが有効だったかな?
919デフォルトの名無しさん:04/11/26 22:35:10
いちいちageんなふぉ
920デフォルトの名無しさん:04/11/26 23:06:36
>>918
独り言ならチラシの裏でやってください。
921デフォルトの名無しさん:04/11/27 00:00:40
「Re:」をレスアンカーの前に置く神経は理解できない、というより歪んでいる。

・電子メールの「Re: 」はコロンの直後に空白がくる4バイト。
・この「Re」は略語ではなく、「〜に関する」という意味の前置詞。

ここまでは些末なことだし、知らない人も多いだろう。

・誰もが知っているとおり、「Re: 」はサブジェクトに添えるものである。
 人名に添えるものではない。

この狂人がメールを使ったことがないとは考えられないから、
「Re:」の由来がメールとは無関係ということはないはず。
922デフォルトの名無しさん:04/11/27 00:02:25
CPANは、一般的には(perl使いの間では)、なんと発音されてますか?
923デフォルトの名無しさん:04/11/27 00:02:42
しーぱん
924デフォルトの名無しさん:04/11/27 00:03:40
>>922
しぱーん
925デフォルトの名無しさん:04/11/27 00:03:58
しーぽん
926デフォルトの名無しさん:04/11/27 00:05:29
>1
>1
<<1
1>>
Re:>1

どれもきもいなぁ。
927デフォルトの名無しさん:04/11/27 00:06:20
すれ違い
928デフォルトの名無しさん:04/11/27 00:10:59
スィ〜ぱん
929 :04/11/27 00:13:47
スィ〜ぴゃぬ
930デフォルトの名無しさん:04/11/27 01:34:28
くぱん
931デフォルトの名無しさん:04/11/27 01:37:37
ぬるぽ
932デフォルトの名無しさん:04/11/27 02:23:17
ガッ!
933デフォルトの名無しさん:04/11/27 02:56:18
あんぱん食いて
934デフォルトの名無しさん:04/11/27 04:49:57
     ___
    /     \     __________
   /   ∧ ∧ \  /
  |     ・ ・   | < 漏れを喰うの?
  |     )●(  |  \__________
  \     ー   ノ
    \____/
935デフォルトの名無しさん:04/11/27 08:20:52
スレ埋めるにはまだ早いだろ…。
936デフォルトの名無しさん:04/11/27 11:16:13
シェルである重い処理をすると2時間 CPU使用率20%

それをperlで作ってバッチ処理をすると 30分 CPU使用率 95%

これって、シェルより早いけどなんでなんでしょうか?
937デフォルトの名無しさん:04/11/27 11:35:32
>>936
処理内容に依存するでしょ。
シェルから実際に起動するコマンドが重ければ重いだろうし、
シェルから大量にコマンド起動してたらその起動の処理自体が重い
(Solaris なんかだと fork(2) が重いので特にネックになりそう) だろうし。
938936:04/11/27 12:16:05
>>937

vmstat でブロックI/Oを見てるけどシェルの場合はたいして
I/Oがでていないのに、CPUが使われていないようにみえる・・
CPU使用率が低いのにELAPSが長いということは、ファイルI/Oが多いはずなのに・・
CPUのディスパッチの優先順位がシェルの場合低い気がする・・
939デフォルトの名無しさん:04/11/27 12:34:35
ひとりごとは他所でおねがいします。
940デフォルトの名無しさん:04/11/27 13:09:36
>>938
だから一体なにが知りたいのかね?
それに既にそれは Perl の話ではなかろう?
941デフォルトの名無しさん:04/11/27 13:18:04
速度が必要ならシェルスクリプトは使うな、
これでいいでしょ。いまはCとシェルしかない時代じゃないんだし。
942デフォルトの名無しさん:04/11/27 14:09:45

釣れないようですね w
943940

せっかく煽ってるんだけら、返事ください
お願いします!