1 :
デフォルトの名無しさん :
03/05/16 11:44 "The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc2.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
過去ログは
>>2-5 あたり
3get
5getか?
/ ̄ ̄ ̄ ̄ ̄ ミ / ,―――─―-ミ / // \| | / ,(・ ) ( ・) ハァ (6 つ | ハァ | ∪__ | | /__/ / /| ∪ /\ ここはム板のほうがかっこいいと思ってる厨房・痴呆専用のスレです WEBプログラム板perlスレ本部に逝くことを押すすめします
CGIしか書けない痴呆は帰れ
8 :
デフォルトの名無しさん :03/05/16 23:37
PerlはCGIじゃないあげ。
10
$i = $a = $b = 0; って使えないのか?
>13 寝ぼけてますた。それで初期化してほかのところでundefな変数を代入してた…
15 :
デフォルトの名無しさん :03/05/18 06:49
すみません、質問です。 csvファイルの一番上から順に1レコード読み込んで、$idと$keycodeが等しければ それぞれ変数に代入する、という検索の部分なのですが、$idが奇数、又は偶数だ と(csvファイルのレコード数が奇数か偶数かによる)検索失敗しまいます。 尚、$data = <IN>;の部分は、手元の本だと$data = $_;になっています。これだと 全く代入されません。 csvファイルに問題は無いと思います。お願いします。 $match = 0; open IN,"log.csv"; while((<IN>)and($match == 0)){ $data = <IN>; chop $data; ($keycode) = split(/\,/,$data); if($keycode == $id){ ($keycode,$flg,$mailadd,$name,$title,$comment) = split(/\,/,$data); $match = 1; } } close IN;
>>15 寝ぼけた香具師ばかりだな。
CGIだろ、webprog逝け。
17 :
デフォルトの名無しさん :03/05/18 09:34
#ふと疑問に思ったのでつが #!/usr/bin/perl use strict; my $test = 10; my $p = ¥$test; &test_p(¥$p); &test_p2(¥$test); &test_g(*test); $test = &test_v($test); sub test_p { $$p = 20; } sub test_p2 { $test = 20; } sub test_g { $test = 20; } sub test_v { my $test = 20; return $test; } より良いperl使いになろうとしたらどれを選択するべきでしょうか?
>>17 4番目の方法においてなぜ引数を渡しているのか分からない。
#!/usr/bin/perl use strict; my $test = 10; my $p = ¥$test; &test_p(¥$p); &test_p2(¥$test); &test_g(*test); $test = &test_v($test); sub test_p { $$p += 10; } sub test_p2 { $test += 10; } sub test_g { $test += 10; } sub test_v { my $test = shift @_; return $test; }
sub test_v { my $test = shift @_; $test += 10; } だた
もうわけわからんな。全部引数渡してる意味ないやん。 修正した4番はともかく、な。
use strict; my $i = 10; my $i_ref = \$i; print join '/', ( plus10($i), plus10(\$i), plus10($i_ref), plus10_g(*i), plus10_g(\$i), plus10_g($i_ref), ); sub plus10 { my $i_ref = ref $_[0] ? $_[0] : \$_[0]; return ${$i_ref} += 10; } sub plus10_g { no strict 'vars'; local *i = ref $_[0] ? $_[0] : \$_[0]; return $i += 10; }
↑ 暗号?
(,,゚Д゚)∩先生質問です (warning: too few iterations for a reliable count) ってエラーどういう意味でつか? ちなみにベンチマークしてました。
26 :
デフォルトの名無しさん :03/05/18 18:20
スレタイトルに「初心者無視!」って付けてほしいよ
↑初心者の為のスレだろ?
29 :
デフォルトの名無しさん :03/05/19 00:19
じゃあ、予め答えを知ってる人のみ質問すること
つまり、知ったかを釣ることを目的としたスレなんですね?
31 :
デフォルトの名無しさん :03/05/19 05:34
そうです。 IDは出ませんので、得意げに答える回答者の 不備をジサクジエーンで容赦なく追求して下さい。
解凍者は元々バグを持っています
34 :
デフォルトの名無しさん :03/05/20 00:15
Win32::APIを使えばPerlからdllを使うことができるらしいのですが、 VBのように使えるdllに制限などあるのでしょうか?
前スレ
>>972 の方
ありがdございました。おかげさまで、結構、先まで進みました。
全然違う話なのですが、エキスプローラだとコピーが出来るんだ
けど、Perlからは扱えない長いフルパスのファイルがあって、若
干困ってます。つうか、あんな深いネストにするなよ!!
37 :
デフォルトの名無しさん :03/05/20 10:52
モジュールでファイルの読み書きをさせているのですが 使っているファイルハンドルが同じなもので 同時に2つのファイルを書き込むことが出来ません。 複数のファイルを扱える様にするにはどうしたら 良いのか教えてください、お願いします。 ちなみにIO::Fileを使ってもFHは同じなのかダメでした。 Sample.pm package Sample; sub new { $class = shift; $file = shift; $self = {LIST=>[]}; bress $self,$class; open(FH,'+<'.$file); push($self->{'LIST'},$_) while <FH>; return $self; } sub sample { my $self = shift; unshift(@{$self->{'LIST'}},pop(@{$self->{'LIST'}})); } sub regist { my $self = shift; truncate(FH,0); seek(FH,0,0); print FH $_ for @{$self->{'LIST'}}; close(FH); } use Sample; $s1 = new Sample('./s1.dat'); $s2 = new Sample('./s2.dat'); $s1->sample(); $s2->sample(); $s1->regist(); $s2->regist();
>>37 use Symbol; して gensym
40 :
デフォルトの名無しさん :03/05/20 13:02
ファイルかディレクトリかを判断するにはどうすれば?
ファイルテスト演算子にある。
>>44 ふぁいるてすとえんざんし?
ぐぐります。
その後で逝ってきます。
46 :
デフォルトの名無しさん :03/05/20 13:37
この判定条件の意味が分かりません。 教えてください。 $output = "a\\b"; if( $output =~ /\\$/ ) { $output .= "\\"; }
>46 正規表現
>>47 助かりました。
もうひとつ聞きたいのですが、
この判定条件の$はどのような意味があるのでしょうか?
>>49 末尾を表す。
っていうか、ちゃんと勉強しろよ・・・
正規表現勉強してるなら、^.*$ この辺は分かって当然だろ・・・?
>>50 すいませんね。勉強不足で。
なにせ、まだ1週間しか勉強していないものですから。
とりあえず助かりました。
ありがとうございます。
52 :
デフォルトの名無しさん :03/05/20 14:12
Perl/Tkの質問はここでいいでしょうか? メインウィンドウを画面の中央に配置したいのですが リファレンスを読んでもやり方がわからず。可能でしょうか? まずはオライリーの本でも買って読んでみようかな。
53 :
デフォルトの名無しさん :03/05/20 14:21
すみません、初心者の質問答えてやってください。 Perlによる普通の掲示板でログの先頭行のタイトルだけを 取るにはどういう構文にすればいいんでしょうか?
普通の掲示板って何?
>>54 webに使う2ch見たいな掲示板です。
すみません,今すれ違いだと気づきました。
お騒がせ致しました。
56 :
デフォルトの名無しさん :03/05/20 14:59
>>51 ちったぁ勉強するなり調べるなりしろよ。
聞けば解決的な考えでは一歩も前に進まんぞ。
前に見た正規表現で、 (.+)* ←これは何を意味してるのですか?
(任意の文字の1回以上の繰り返し)の0回以上の繰り返し これでわかる?使い道は良くわからないけど。 Perl/Tk使ってる人いませんか〜?
>>58 Perl/Tkねぇ〜・・・。
日本語通らねーし。
GUI使うなら、それ用の言語へ移行した方がよい。
>>59 Win用のActivePerlなら日本語通ってますよ。
移行してもいいんだけど標準モジュールなので便利なんです…
Perl/Tkは最近のお気に入り Perlで本格的にGUIが作れるのは嬉しい ただノウハウがないせいか、希望の画面になかなかならない いいGUIビルダが欲しい
63 :
デフォルトの名無しさん :03/05/20 20:33
マウスとか使わずにGUIを設計するのは明らかに間違いだな
Tk用のGUI設計鶴なかったっけ?
>>58 何でもマッチする。
>>Perl/Tk
もれはガンガン使っている。
日本語が通らないのは我慢。
>>63 マウスを使ってGUI設計するのには限界がある。
Perl/Tkの日本語パッチあるよ 今携帯だからURL貼れないけど 少なくともSolarisでは問題なかった
68 :
デフォルトの名無しさん :03/05/21 15:32
Graphvizのperlモジュールは素晴らしいな。perlだから、日本語通るし(通る っていうか、使おうと思えば使える程度だけど)。
71 :
デフォルトの名無しさん :03/05/22 10:01
INIファイルを読み書きするモジュールを探しているんですけど、 CPAN SEARCHで「ini」で検索するといろいろ出てきます。 定番があればそれを使いたいのですが。
>>71 Config::IniFiles -
Config::Simple
Config::Tiny
このあたりかなぁ。
ざっと見た感じIniFileがフル装備、
Simpleは他のフォーマットもサポートしてる汎用性重視、
Tinyは最低限の実装といった感じだろうか。
# 三つともインターフェイスが全く異なるというのが痛いぞ…。
""と''の差はメタ文字の表示の仕方以外にもありますか?
74 :
デフォルトの名無しさん :03/05/22 20:03
変数をメタ文字と捕えないならある
75 :
デフォルトの名無しさん :03/05/22 22:35
罵倒されるのを覚悟で質問します スクリプトのコメント部分にこういう記述がしてあるのがあります # $Id ??? 22:22:22 Ext $ そのスクリプトのバージョンと最終更新日を意味しているのは わかるんですが、この$Id $にはどういう意味があるのでしょうか こういう風に書いておくとなにかと便利なことがあるのでしょうか ググッてもヒットしなかったので質問させていただきます
>>75 それはRCSやCVSといったバージョン管理ツールにがファイルに埋め込む情報だよ。
だからPerlにとっては何ら意味を持たない。気にしなくていいよ。
77 :
デフォルトの名無しさん :03/05/22 22:50
>>76 そうですか、今のところCVSで管理するようなものは
書いてないので安心しました。
どうもありがとうございます
>>72 ありがとうございます。
やっぱり、Configシリーズですよね。
Config::IniFiles使ってみようかな。
80 :
デフォルトの名無しさん :03/05/23 20:44
だれかWin32::APIの詳しい使い方教えてくれ! ・・・と思ったら、今月号のハッカージャパンの 1コーナーで解説してくれてたので買いました。
そんなのをテキストにしたくないな
82 :
ズボラー :03/05/23 22:35
ズボラーズラ。 二次元配列の要素数の取り出し方がいまいちよくわからんアフォズラ。 一次元だと $rigid = @array; もしくは $rigid = $#array+1;(どっちがいいのかわからんが。。。) で取り出せるんだが、 @array_all = (@array_one,@array_two,@array_three); の場合で、array[0]の配列数を取り出したいとき、 @array_all[0]は$arry_one[0]が取り出されてしまうズラ。 かといって$#array_all[0]は実行エラーになるズラ。 また、一次元目の要素数を自由に取り出したいズラ。 今回の例なら なんちゃらarray_allなんちゃら=3;としたいズラ。 どうすりゃいいズラ。ウズラ。
一行レスならともかく 質問するなら普通の日本語使ってくれよ。 読みづらくてかなわん。
>>82 @array_all = (\@array_one, \@array_two, \@array_three);
$array_one_count = @{$array_all[0]};
だな。大体Perlで二次元配列なんてどこで教わったんだ?
85 :
ズボラー :03/05/23 23:06
84さんどうも。 やっぱ連想配列でやるのが普通ですかね。。。
どこが連想配列なのか
perl記述のスタンダードがわからんヅラ。 配列の要素数にしても、他にも色々あるにしても $rigid = @array; $rigid = $#array+1; とりあえず上記の二つがあるヅラ。 84さんが >大体Perlで二次元配列なんてどこで教わったんだ? といってたんで、Perlって二次元配列とか スタンダードじゃないんだーとか思ったヅラ。 そうするとスタンダードなのは連想配列かと。。。 そう思ったヅラ。ウヅラ。
$res[87] =~ s/ヅラ//g;
>>88 それだと最後の行が
> そう思った。ウ。
となり意味不明になってしまうよ。
>>89 でも全体的にはヅラとった方が読みやすいから。
92 :
デフォルトの名無しさん :03/05/24 01:55
next if ($. == 87)
>>87 「要素数」が欲しいんだろ? そのものが一発で取れるのに、
何故わざわざ 1 足さなきゃいけないような値を使うんだ?
一番素直なコードを書いときゃいいんだよ。
94 :
デフォルトの名無しさん :03/05/24 02:23
どなたか、詳しい方教えてください。 aaa "bbb ccc" ddd "eee fff" ggg という文字列があったとします これをスペースを区切りとする単語ごとにわけるとする ただし""で囲まれている部分は一単語としてあつかうものとする ような場合、スマートにコーディングしようとした場合どう書けばよろしいですか。 期待している出力結果は aaa "bbb ccc" ddd "eee fff" ggg です
95 :
サンプルです :03/05/24 02:23
>>94 my $str = 'aaa "bbb ccc" ddd "eee fff" ggg';
push @str, $1 while $str =~ /([^ "]+|"[^"]*?")/g;
print join '/', @str;
>>96 なるほど
勉強になります。
ありがとうございました
>>52 遅レスだが。
win32環境ならこんな感じかな。
use Tk;
use Win32::API;
$GetSystemMetrics = new Win32::API('user32', 'GetSystemMetrics', 'N', 'N');
$cxscreen = $GetSystemMetrics->Call(0); #SM_CXSCREEN
$cyscreen = $GetSystemMetrics->Call(1); #SM_CYSCREEN
$top = MainWindow->new();
Centering(0,int($cxscreen/2),int($cyscreen/2));
$top->bind( "<Double-1>", [\&Centering,, 0, 0] );
MainLoop();
sub Centering {
my ($event, $width, $height) = @_;
$width = $top->width if !$width;
$height = $top->height if !$height;
my $x = int(($cxscreen - $width)/2);
my $y = int(($cyscreen - $height)/2);
my $geo = $width .'x'. $height .'+'. $x .'+'. $y;
$top->geometry($geo);
}
100 :
デフォルトの名無しさん :03/05/24 18:34
de Perl6はどうなったんだコラ?
101 :
デフォルトの名無しさん :03/05/24 19:06
2001年に中日ドラゴンズに10億円という巨額の金額で入団した川崎憲次郎。
しかし彼は入団してから2年間、1軍のマウンドで1球も投げていない。 怪我は治っているが、2軍での投球も拒否。
最近では自宅での休養(サボリ)を続けているという。
ちなみにヤクルトの伊藤選手も同じような状況であるが、本人からの要望で給料の8〜9割を返還している。 一方川崎憲次郎はビタ1文も返してはいない。
もちろん税金等の問題があり、そんな単純ではないが1本10円のワクチンを10億円で買うならば1億人の人口が救えるのだ。
食料に困っている1億人の人たちにうまい棒を買ってあげられるのだ。
必死に生きて餓死していく人たちの前で川崎憲次郎は優雅な生活を楽しんでいる。
こんなことは許されない。皆もオールスターのファン投票で川崎憲次郎に投票し、出場させるのだ!!
5月23日の中間発表ではセリーグの先発2位につけている!!
投票は6月22日まで!!
https://allstar.sanyo.co.jp/vote/ 中日・川崎憲次郎、依然先見えず…
http://www.zakzak.co.jp/spo/s-2003_02/s2003021502.html
102 :
デフォルトの名無しさん :03/05/24 19:25
すんませんperl56.dllってなんでしょうか どこかでDLするものなんですか?
perlDBIでODBCを使用する場合、ファイルDSNは使えないんですか?
>>102 どういう物を作りたいのかイメージが分からないけど
RCSとかCVSを利用するためのモジュールは色々あるよ
そうじゃなくて、履歴管理を自分で実装したいって事?
うぃんどうずの話は別スレの方が良いんじゃ無いかと思う今日この頃
106 :
デフォルトの名無しさん :03/05/25 16:36
配列操作関数で、ハッシュで使える delete が使えないのですが、 何かいい方法はありませんか? ※とりあえずこんなsubroutineを代用としてみましたが。 sub deletefromarray { my($n,@a) = @_; my(@ra); for(my($i)=0;@a;$i++){ $_ = shift @a; ($i == $n) && next; push @ra, $_; } @ra; }
外部コマンドの入力も出力の両方をperlから入出色させるにはどうすればよいのですか? open(INOUT, "| cat |");とかやると Can't open bidirectional pipe といわれてしまいます。
108 :
デフォルトの名無しさん :03/05/25 17:05
Perlクックブック読もうね。はい次のひとー。
>>105 Window&Perlでスレ立てるほど人がいるかな?
個人的にはこの話題をどんどん語ってほしいけど。
>>106 splice
>>107 わざと実装してないみたいな事がらくだ本に書いてある。
どうしても使いたいならIPC::Open2
>>110 この話題ってどの話題? いや、別に煽りじゃないんだが
Win&Perlって、結局はインストールが出来ないとか、モジュールの使い方を知らない ってレベルが多いような気がする
112 :
デフォルトの名無しさん :03/05/25 21:19
ActivePerlではパッケージのインストールはppmをつかうけどcygwinでは何つかうの?
114 :
デフォルトの名無しさん :03/05/25 23:57
最近perlにハマり初めて、ちょっとしたメール関係のプログラムを組んでいます。
開発環境はWindowsXP標準のPerlです。
pop3からメールを受信して、本文を"$count","list"という名前の添付ファイルを"$count.lst"として保存するプログラムを組みたいと思っています。
ttp://www.din.or.jp/~bigstone/cgilab/guide/pop3.html のpop3.pmを利用して作りました。
添付ファイルは、
$file = $pop3->attach(list);
で得られるファイルに保存されると言う事なので
$list=join('',"$count",'.lst');
$source = $pop3->attach(list);
rename ("$source","$list");
としましたが、ファイル名が変更されません。わかる方、解決方法教えて下さい。ソースは次レス。
※ホスト名など環境に合わせる必要があります。
115 :
デフォルトの名無しさん :03/05/25 23:58
# 現在のメール数と総サイズを得る my($mail, $size) = $pop3->stat(); # メール取得件数 my $retr = 0;
116 :
デフォルトの名無しさん :03/05/26 00:00
117 :
デフォルトの名無しさん :03/05/26 00:00
あら・・・。本文が長すぎてソース書き込めない(>_<)
118 :
デフォルトの名無しさん :03/05/26 00:02
>>114 のURLのサンプルプログラム以下の部分に追加しました。
# 必要なら添付データ情報の処理を行う
%attach = $pop3->attach();
if(keys %attach > 0){
# 添付データがある場合の処理
$list=join('',"$count",'.lst');
$source = $pop3->attach(list);
rename ("$source","$list");
}
$countには数字が入ってます。
open( IN, "hoge |") とやった場合に、 hoge コマンドの終了コードを得るには どうすればいいのでしょうか。
>>113 >perl -MCPAN -e 'shell'
でやってるけど、今のところ問題無いよ
>>114-115 自己完結しました(^^;一晩おいて、翌日考え直すと直る事って良くありますよね。
pop3.qmがロックをかけているからrename出来ないのかとかいろいろ深読みして
ましたが、単純にパスの指定がおかしかったようです。
× rename ("$source","$list");
○ rename ("$mail_dir/$source","$mail_dir/$list);
コンパイラ有るんであればcpanでいいと思うけど、 ppmの方が楽なんだなぁ・・・
125 :
デフォルトの名無しさん :03/05/26 19:01
Linux板とかそっちの方がいいのかも知れませんが、わかる方教えて下さい。 10分毎に起動するプログラムを作りたいと思っています。 そこで、 while(1){ system('perl prgram.pl'); sleep 600; } というプログラムを組みましたが、&オプションで起動してもログアウトすると 終了されてしまいます。 何かいい方法はないでしょうか? SunOS 5.6のサーバに置こうとしています。
127 :
デフォルトの名無しさん :03/05/26 19:21
>>126 思いっきりそれで行けそうでした。
Thanks!
PerlとDelphi比べたらどっちが上ですか?
129 :
デフォルトの名無しさん :03/05/26 19:40
>>123 Cygwin 版の gcc をそのまま使うんじゃなくて、
cl とか bcc とか持ってきて cpan の設定ファイルいじればいい。
131 :
デフォルトの名無しさん :03/05/26 22:56
125です。
>>129 ほんとは、crontab設定すべきなんでしょうけどPermissionのせいかうまく
設定出来ませんでした。
自鯖じゃないから、cronは無理かも知れません・・・。
132 :
デフォルトの名無しさん :03/05/27 03:11
あと10秒 と表示して同じ場所に数字をどんどん減らして表示するのはどうやりますか? 数字を減らす事は出来ますが、同じ場所に表示させる方法がわかりません。
133 :
bloom :03/05/27 03:13
$|=1; for ($i=10;$i;--$i) {printf "%2d\b\b", $i; sleep 1}
>>134 ありがとうございます。\bを使うのですね。
でも1から1000までのように桁数が増える場合はどうするのでしょう?
137 :
デフォルトの名無しさん :03/05/27 06:11
Perlってもう終りなんですか?
>>134 そーゆのって、sleepできっかり1秒になるもんなの??
処理自体の時間の考慮って言うか、そうゆうのが必要だから
sleepはどうかと思ってたんだけど…。今まで。
>>135 表示した桁数分だけ\bで戻してスペースで消せばいい。
$|=1
$n=0
for ($i=10;print("\b \b" x $n), $i;--$i) {print $i; $n = length($i); sleep 1}
>>138 用とによるだろうなぁ。132はそんなに精度が必要とも思えなかったんで。
現時刻と最初の時刻からsleepする時間を補正すればできると思うが、
perlでgettimeofday()呼ぶのってどうすんだっけ。
# 最近はrubyに移ってしまったので、実はあんまり覚えてない。
なるほど。出力した文字の長さを保持してその分を消せばいいんですね。 参考になりました。ありがとうございます。 元々sleepするだけのところをsleepの残り時間がわかるようにしたかっただけで 時間の精度は特に考えてないです。
141 :
デフォルトの名無しさん :03/05/27 16:01
Perl2exe買ったヒトいる? あれはPerl/TKで作ったヤツもコンパイルできるのか? TKごとスタンドアローンアプリになるのか?ならないよな。
142 :
デフォルトの名無しさん :03/05/27 16:03
>>140 ああ、なるほど。
それだけの目的か。
Perl2exeは全部まとめてコンパイルされるよ。
use Tk;
これ宣言したのをコンパイルしたら実行ファイルが1.5MBになる。酷すぎる。
でも、実はperl2exeなんぞ使わなくてもperlにBと言うモジュールコンパイラがついてるらしいんだな。
使ったことないけど。
perl2exeは無料で使いつづけてます、俺。
144 :
デフォルトの名無しさん :03/05/27 17:47
>>132 C言語のエスケープ・シーケンスみたいなことがPerlでできればいいのにね。
145 :
デフォルトの名無しさん :03/05/27 20:13
あらかじめ登録しておいたディレクトリに移動できるという簡単なツール をPerl4の時代(Win95)に作ったんですが、XPでひさびさに使ってみたら ディレクトリが移動してくれません。chdirという関数を使ってるんですが 調べてみると「作業用のディレクトリ」を変更する・・・とかかれてあります。 作業用のディレクトリに移動する関数とか別に用意されたんでしょうか? あるいは純粋にディレクトリ移動できる関数とかご存知でしたら教えていただきたいです。
146 :
デフォルトの名無しさん :03/05/27 21:19
perlの置換で連想配列の配列($a{$b}[$c]のような)を使用する場合 $hoge =~ s/$array{$foo}[$bar]/$array{$foo}[$hogehoge]/ 上記の方法では、うまく置換されません。 $や[が正規表現上問題があるのはわかりますが、 どこに入れればうまくいくのかわかりません。 もしご存知の方がいらっしゃったら教えてください。
147 :
デフォルトの名無しさん :03/05/27 21:59
Working directoryを作業用ディレクトリと訳しただけじゃないか
>>146 その例だと問題なく置換してしまうけど?
$foo = 'foo';
$array{$foo}[$bar = 1] = 'bar';
$array{$foo}[$baz = 2] = 'baz';
($hoge = 'foobar3baz') =~ s/$array{$foo}[$bar][123]/$array{$foo}[$baz]/;
print "$hoge\n"; # bazfoobar3baz
($hoge = 'foobar3baz') =~ s/${array{$foo}[$bar]}[123]/$array{$foo}[$baz]/;
print "$hoge\n"; # foobazbaz
149 :
デフォルトの名無しさん :03/05/28 01:07
コマンドラインから実行する一行スクリプトを作っています。 SQL を作るために、別ファイルから読み込んだ文字列を '' の中に埋め込む、 という処理をしたいのですが、-e の中なのでシングルクオートを使えません。 perl -n -e 'printf("INSERT INTO url (url) VALUES ('%s');", $_);' source.txt 何か良い方法はないでしょうか?
150 :
デフォルトの名無しさん :03/05/28 01:15
Perl仕事で使える?
151 :
デフォルトの名無しさん :03/05/28 01:16
Perlって趣味でしょ?
>>150 さっきVBスレでも聞いていなかったか?
仕事で使いたいならC++かJavaやりなよ。他の人のことはいい。
>>150 仕事で使ってるUNIX環境だと、
C++:コンパイル環境無し
Java:同じく
シェル:処理遅い
って感じでPerl使ってるんだけどさ。
まぁ、別にCでも良いんだけど。
CGIだと未だにPerlってイメージがあるからね。
スキルアップちゅうか、経験になるかな?程度で使ってるな。
まぁ、プログラムの仕様でPerl使えって言われりゃPerlを使うわけで...
154 :
デフォルトの名無しさん :03/05/28 02:02
仕事で、というのが個人レベルの問題解決なのか、 グループ内に配布して使うのか、 社内で正式リリースするのか、 それどころかクライアントに渡すのか、 で全然変わってくる罠。
>>149 への自己レスです。
アスキーコードでシングルクオートを指定してやることで解決できました。
$ perl -n -l -e 'printf("INSERT INTO uniq_uri (uri) VALUES(\x27%s\x27);\n", $_);' source.txt
>>149 シェルの話なのでバックスラッシュ(\)でquoteするのが普通だけど、
$ perldoc -f q
$ perldoc perlop
という手もある。
>>144 Perlのエスケープ・シーケンスはCよりも多いぞ。Cには\eなんてない。
>>145 親プロセスのpwdを変えようとしてるんなら、単独では不可能。
ディレクトリ名を出力して親プロセスでそれを読んでcdするしかない。
>>149 ごめん、この場合qはぜんぜんダメですね。
>>159 確かに、q// を使っても qq// を使っても、
出力にシングルクオートが出てこないんですよね。
シェルに消されてるのでしょうか?
$ perl -n -l -e 'printf(qq/INSERT INTO uniq_uri (uri) VALUES('%s');\n/, $_);' source.txt
INSERT INTO uniq_uri (uri) VALUES(
http://www.example.com );
バックスラッシュ付けると bash の文法エラーになっちゃうし。
$ perl -n -l -e 'printf(qq/INSERT INTO uniq_uri (uri) VALUES(\'%s\');\n/, $_);' source.txt
bash: syntax error near unexpected token `;'
環境は以下の通りです。
$ bash --version
GNU bash, version 2.04.0(1)-release (i386-turbo-linux-gnu)
Copyright 1999 Free Software Foundation, Inc.
$ perl --version
This is perl, version 5.005_03 built for i386-linux
(以下略)
161 :
>>143 :03/05/28 11:25
perl2exeの件ありがと、1.5Mかぁ、けっこう惨いね。 しかも高いし。
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
新種の山崎登場につきage
164 :
デフォルトの名無しさん :03/05/29 10:40
Rubyでいうところの 配列の初期化 a=Array.new(100,0) ===演算子 a===[1,2,3] のようなものはありますか?
>>164 Rubyは知らんが
@a = (100,0);
@a = (1,2,3);
が期待しているそれかな?
>>164 >>165 Array.new( 100, 0 ) ってのは a[0] から a[99] を確保して 0 を入れておくってやつだとしたら
ない。
foreach( 0..99 ) { a[$_] = 0; }
とやるしかない。
あとそれから親切にも Ruby のサイト回って === とかいう演算子について調べたが、
Perlには残念ながら似たような機能はない。
一個一個条件文を書くしかない。
ついでにいうが switch - case
もないからこれも一つ一つ
if( ... ) {
} elsif( ... ) {
} elsif( ... ) {
} else {
}
と書くしかない。
一緒に質問。 Perl のスレッド機能が使いたいので、 Cygwin で「コンパイルして」インストールしてみたら perl -MCPAN -e shell が使えなくなった。 正確に言えば起動はするのだが install Bundle::CPAN ってコマンドを打ち込んだときに CPAN: Storable loaded ok Going to read /home/kikyosha/.cpan/sources/authors/01mailrc.txt.gz /home/kikyosha/.cpan/sources/authors/01mailrc.txt.gz: No such file or directory Going to read /home/kikyosha/.cpan/sources/modules/02packages.details.txt.gz /home/kikyosha/.cpan/sources/modules/02packages.details.txt.gz: No such file or directory というエラーが出て氏ぬ。 ところが ls で /home/kikyosha/.cpan 以下を確認するとファイルは全て存在する。 また、Sun OS にも自分でコンパイルして Perl をインスコしたが、 こちらの CPAN は正常に動作する。 チェックすべき点を教えて頂きたく候。
>>164 my @array = (0) x 100;
でも、初期化って必要なん? modperlとかならいりそうやけど・・・
>>171 99.5%のPerlユーザは初期値はどうでもいいと思っているけど、
0.4%のユーザは初期値に1を、
0.1%のユーザは初期値に3.1415をキボンヌしているという統計があります。
>>169 テストしたら正常に動いた!
紙!
でも、俺は変数の型宣言とか初期値とかあんま好きくない。
ましてやスクリプトなのになんでそんな事を…。
て言うかperlで宣言とかしたら重くなる。いらん処理増える。
>>173 perlだといきなり $a[10]+=1 とかしても動くからな。
rubyはnilと0は区別するから。
>>164 配列を確保するだけでよいなら、
$#a = 100;
それだと101個確保しないか。
えーと。win98。ActivePerlの5.8使用。 open(FILE,">test.txt" close(FILE); なぜかファイルが生成されませんでした。 あれれれれ。失敗したのかな? 失敗だとしたら、目印のために強制終了させよう。 で、以下のように書く。 if(open(FILE,">test.txt")){ print FILE "あああ\n"; close(FILE); }else{ exit; } プログラムは強制終了される事なく普通に進行。 でも…。ファイルが生成されてない。 あれれ。もしかして、この記述では実行ファイルと同じ場所には出来ないで、他の場所に出来るのかな? と思い、 「スタート -> 検索 -> ファイルやフォルダ」 の技を使いC:の中を標的とし、test.txtを検索。 でも、そんなファイル存在しなかった。 なんでやねん。 このコンピュータは明らかに私を馬鹿にしています。 許せません。 …と言うか誰か馬鹿な俺に教えて下さい。
>>177 > あれれ。もしかして、この記述では実行ファイルと同じ場所には出来ないで、他の場所に出来るのかな?
カレントディレクトリって知ってる?
今やり直した所、超誤爆してました。 思いっきりファイル名を書き間違えてました。 ごめんなさい。 消滅してきます。
180 :
デフォルトの名無しさん :03/05/29 20:16
perl2exe V6.00 持ってる人いる? わけがあって欲しいでした。
181 :
デフォルトの名無しさん :03/05/29 21:36
↑7.0.0じゃなくて?
182 :
デフォルトの名無しさん :03/05/29 22:19
>>174 perl にもundefあるじゃないか。
上手くやってくれるけどな
185 :
デフォルトの名無しさん :03/05/30 14:25
>>182 作者にメールしてみるとか。
こうゆうことでメールするのって迷惑なのかな?
すいません GD::Graphモジュールを使用したくて 動作確認のため簡単なプログラムを走らせてみると、 Can't call method "plot" on an underfined value at ./test.pl line ***. となってしまいます。 なにが 起きてるのか教えて下さい。 お願いします。
あ それと対処法も・・・
>>187 > なにが 起きてるのか教えて下さい。 お願いします。
エラー。
>>188 > あ それと対処法も・・・
デバッグ。
Can't call method "plot" on an underfined value at ./test.pl line ***. ^^^^^^^^^^ undefined の間違えでは? 「./test.pl の *** 行にある未定義値では"plot"というメソッドは呼び出せない」 だから、new していないとか…
newに失敗したらundefを返すなんてよくあること。 # 個人的にはdieしてほしいけど。
>>190 >>191 あ そういうエラーなんですね。
インストに苦労したから、GD::Graph自体がおかしいのかと思ってました。
プログラムもう一度見直してきます。
ありがとうございました。
ハッシュから、ランダムに要素を選びたいのですが、重み付けも行いたいのです $hash{1} = 50; $hash{2} = 30; $hash{3} = 20; とあった場合に、大体 50%, 30%, 20% の確率で選ばれるように(randなので厳密にはなりませんが) @array = ((1) x 50, (2) x 30, (3) x 20); $array[rand(@array)]; では流石に効率が悪いので ( 1000種類 × 100回 くらい なので、配列生成はちょっと...) なにかスマートな or Perl的なやり方ないでしょうか。
$a = int rand 10; $a = ( $a < 5 )?1: ($a < 8)?2: 3;
>>193 スマートでもないしあんまりperl的でもないけど。
もうちょっと考えたらperl的なの思いつきそうだけど、
今から出かけなきゃいけないのでパス。
forの所はsort使って一発でできそうな気がする。
$hash{1} = 50;
$hash{2} = 30;
$hash{3} = 20;
map {$i+=$hash{$_}} keys(%hash);
$j = int(rand($i));
for (keys(%hash)) {
if (($j -= $hash{$_}) < 0) {
$answer = $_;
last
};
}
print "$answer\n";
>>193 @weight = (25, 25, 150);
foreach (@weight) { $all += $_ }
until ( $weight[$key = int(rand(@weight))] > rand($all) ) {}
print $key;
>>197 そのやり方よりこっちの方が速いとおもわれ
$max = 0;
@weight = (25, 25, 150);
map { $max = $_ if $_ > $max } @weight;
until ( $weight[$key = int(rand(@weight))] > rand($max) ) {}
print $key;
@weight = (25, 25, 150); foreach (@weight) { $max = $_ if $_ > $max }; until ( $weight[$key = int(rand(@weight))] > rand($max) ) {} print $key; 要素の和じゃなくて、要素の最大値で十分だった。迂闊。
時すでに遅しか(死 ところで foreach と map って優劣ある?
割合を考えるだけでよかったのですね。
>>194 みたいに範囲のインデックスで上手くやる方法考えて詰まってました
ありがとうございました。
m/^([0-9])([0-9])$([0-9])/; if($3 == ($1 + $2)){ #大成功 } __END__ 2 + 0 = 2。 でした。
>>202 m/^(\d)(\d)(\d)$/;
$3 == $1 + $2 and die;
ガ━━━(゚д゚;)━━━ン!! $ の付ける場所間違って覚えてた。
205 :
デフォルトの名無しさん :03/06/01 21:56
perlのサブルーチンをツリー表示してくれるような ソフトを知っている方いましたら、教えて下さいな!
ActivePerlのTk.pmでGUIやっている人いますか ? 最近ちょっと作るものがあったのでやっているのですが、 これすごい落ちます。Cならメモリ管理関係で何かミスがあるのかと疑いますが、 Perlなので原因不明です。 もし、Tk使っている方がいましたら、よく落ちるのは普通なのか 漏れのプログラムがおかしいのか、漏れのPC(Windows)がおかしいのか助言頼みます。 落ちるタイミングは、日本語を一気に読み込んで表示する際です。 Shift_Jisなので得に問題ないと思いますが、ここで8割落ちます。 2割は落ちなくて正常に動くのでますます意味が分かりません。 WindowsXP, ActivePerl5.8.0です。
>>205 エディタでそういうのを使うとか・・・
まぁ、自分で作ってる場合ですけど・・・
>>206 日本語一気に読みこんだ事ないから分からない。
出来ればその読み込む時の記述を見せてもらいたいものだ。
また、読み込む文字列とやらは常に同じ物か?
途中正規表現にかけていないか?
などなど。条件によっては落ちる。
>>205 実行中のプログラムがルーチンを認識して出力すると言う事?
テキスト状態の時のサブルーチンをエディタなどが認識できると言う事?
後者ならperlエディタってのがある。
>>205 エディタでツリー表示してくれる物探してるなら・・・・
PerlEdeitを・・・・と言う人が多いようだが、
JmEditの方が、まだ俺は使えると思う。
そうじゃなく、ただルーチンの一覧を出力したいなら、
Perlでも作れる。 勉強がてら作ってみるとよい。
perl質問箱に書き込みがなくて寂しい。。。(正確には面白くない、つまらない) だから勝手になんか書きます。 どうしても返信したい人も勝手になんか書いてください。 perlの乱数について。読みたくない人は飛ばしてください。 乱数はけっこう使う。 ゲームを作っていると、必ず乱数が必要になるし、CGIだと、ランダムにメッセージを表示することもある。 だけど、perl標準の乱数を使うと効率が悪い。一般的にプログラムから出てくる乱数は擬似乱数と呼ぶ。 だが、実際の所は乱数に擬似もクソもない。何が出てくるか「分からなければ乱数」だ。 乱数には、性能の良さもある。現実でもプログラムでも同じ。 トランプを全然シャッフルしないと、1/52で何が出てくるか分からないけど、乱数の性能は悪すぎる。 多分連続した数字が連発する。 でも、52枚全部引いた時点でちゃんとなるから「1/52%」になる。 だから「1/52%」と言ってもダメなのと良いのがある。 上記までのこれ。長かったけど、前置き。 調べた。perl/Tkをwinで動かし、乱数の出方を。効率の良い出しかたとか、統計取った。 かなり面白い結果が出てきたから書く事にする。 でも、2ちゃんねるは連続投稿してると規制がかかるから、イキナリレス出来なくなるかもしれない。
まず、けっこう本を読んだけど、どの本もrand関数の説明がちょっと適当すぎる。 オライリーのプログラミングperlにいたっては、気に入らなければモジュールを使ってください。 と書いてある。 で、本には必ずsrand(乱数の初期化)は最初の1回きりで良いよ。 って書いてあるけど、場合によってはそれじゃ効率が悪い事が分かった。 ところで、rand関数では、絶対にやっちゃいけない事がある。これは本に書いてあったのではなくて、自分で解析した結果だ。 srand後の「1発目」の乱数を乱数だと信じて使ったらとんでもない事になる。 解析結果を書いても良いのだけど、実際動かしてみてほしい。 そのほうが面白いと思うから。 $no = 0; while(srand($no)){ print rand(255) . "\n"; $no ++; last if(255 < $no); } ※↑今、普通に書いていったのでホントに動くかは分からない。 256回、初期化後「1発目の」乱数を出すはずだ。(初期値を1づつ変えながら) あと、数字は適当に変えたりすれば結果も変わる。
多分、イチイチ動かした人なんて居ないと思うけど、 動かした人はこれは乱数じゃないな、と思ったはず。 ほとんど全部同じような数字になる。で、ちょっとづつ増えていく(小数点未満で増えていく)。 だから、intで整数に直してやったら全部同じ数字になる。 「初期化のしかたが悪い」これはもっともな意見だと思うけど、あながちそうでもない。 初期化の数字が「一つずつ」ズレて行った所で、さほど問題にはならない。 一般的に初期化に「time」とか「$$」とかを使うのは、起動毎に似通った事にならないのが目的であって、 1回しか起動しないのならsrand(255);とか、明示的に書いてやっても問題ない。 で、疑問なのは「2発目」の数字はどうなるのか。 $no = 0; while(srand($no)){ rand; print rand(255) . "\n"; $no ++; last if(255 < $no); } 今度は、1発目の数字を捨てて、2発目の乱数を取得する。
「2発目」の数字は、見事にばらけた。 「1発目」の数字が綺麗に順番に並んでいたのに対して、2発目は全く予測がつかない。 これは「3発目」の数字を取得しても「2発目と」同じ事だった。 つまり「2発目以降」から乱数と呼べそうな物が出てくるのである。 「1発目」に関しては、初期化を「srand($$ ^ time)」とかしても、 およそ乱数の範囲は限られ、そして小数点を切り捨てる(intする)とある程度数字が似かよる。 多分「1発目」は使うべきではない。 プログラム内では「rand」を使うと暗黙の内にsrandされるらしい。(←たしか5.5あたりから) だからsrandは書かない事を勧めているような本が多い。 だが、やはり見える形(明示的)でsrandしたほうが良いに決まっているし、今回の解析で分かった通り、 sarndの直後に、 rand; と書いて「一発目」を切り捨ててやる必要性がある。 暗黙にsrandされたのでは切捨てられない。 本当はまだたくさん面白い結果が出たのだけど、字を書くのは疲れるし、 キーボードが苦手で遅いのでまた今度。 あとでか、また明日くらいに。
LinuxのPerlだと1回目でもかなりバラけた値になった。 同じ種で混ぜた乱数は同じタイミングで同じ値になる。 srandして次の1っ発目のrandで毎回違った値が欲しいからtime( )とプロセスIDのANDで 種を決めているんじゃない? 個人的に srand($$);で問題ないように思える。timeを入れるのは、再起動なんかして 同じプロセスID時に全く同じ数を出してしまうからいれてるんじゃないかな ? 逆に、毎回同じ乱数を発生させたいときはsrand(255)など値を指定すれば、 全く同じタイミングで同じ乱数が発生するからID生成なんかに使えると。 アア、すみません、あまり意味が分かりません。
>>206 >LinuxのPerlだと1回目でもかなりバラけた値になった。
ええと、俺の環境はActivePerlの5.8です。
俺の解析結果(の一部)を書きます。
0:0.59375
1:0.640625
2:0.703125
3:0.75
4:0.796875
5:0.84375
6:0.90625
7:0.953125
8:1
9:1.0625
10:1.109375
左側が初期値の数。
右が「1発目」で出た乱数の数。
乱数の最大値は「512」で設定(決して「2」とかじゃないです)
綺麗に順番に並びました。こりゃ乱数じゃないですね。
「2発目以降」はこのような現象は見られず、まともに出てきます。
出来れば
>>206 の解析結果も知りたい所です。
って言うか、perlなら必ず同じ解析結果(数字)並ぶのかと思ってたよ…。
>同じ種で混ぜた乱数は同じタイミングで同じ値になる。
あと、こりゃ当たり前っすよ。w
ちなみに、初期値は0~512までで、 それぞれの「1発目」を出してみました。 randの最大値は512です。 つまり、最大値が512の乱数を「一つづつ」初期値を変えながら「512」個出しました。 それについての解析結果はこのようになりました。 0:8 1:20 2:19 3:20 4:20 5:19 6:20 7:19 8:20 9:20 10:19 11:20 12:19 13:20 14:20 15:19 16:20 17:19 18:20 19:20 20:19 21:20 22:19 23:20 24:20 25:19 26:14
ええと、
左側が、int(小数点切り捨て)した時の数字で、
右側が、その数字が出た数です。
つまり、int(rand(255))で「255回」一発目を求めた時、
26と言う数字は14回出たわけですね。
最大値が255に設定されてるにも関わらず、
0-26までの乱数しか発生しなかったのは
>>215 で書いたように、
1発目が「必ず順番で」出てくるからです。
なんか頭痛がしてきた... とりあえず、man srandしろ
今度はまた別の解析結果について。文でアルゴリズムを書いたら頭痛とか言われたので記述で書く。 $no = 0; while(srand($no)){ rand; print rand(255) . "\n"; $no ++; last if(255 < $no); } この記述はさっきも書いたけど、まだ本当の(?)乱数とは違う。 (これは2発目を取得するヤツ) これはどんな結果が返って来るのかと言うと、 整数に直した(int)場合、0~255まで「ほぼ全て」返ってくる。 つまり、超バラけて同じ数字が返って来ない(きにくい)ってヤツだ。 トランプを一枚づつ引いて行くにに似ている。 しかも、連番では出なかった。やはり超バラけている。 これは「本当の効率のよい乱数」ではないけど、かなり使い道がある。 CGIなどでランダムメッセージなどを表示するのに超都合が良い。 次に何が出るのか分からない上に、重複がほとんどないのだ。
もし、上記を通常の書籍が勧めるように srand($$ ^ time); rand; #書籍には書いてないが1発目は捨てる。 $no = 0; while(1){ rand; print rand(255) . "\n"; $no ++; last if(255 < $no); } などとやってしまうと、ランダムメッセージ的には重複の連続で、 しかも出てこないものはイツまで経っても出てこないというかなり効率の悪い結果になる事がわかった。 だが、統計を取ったところ、こちらのほうが自然的な乱数に近い。
なんか、これだけ書いておいてどうでも良くなってきました。 本当はもっとイロイロなパターンを出せるプログラムを作成した上で、 様々な角度から統計を取るプログラムも作りました。 と言う事でもっと多くの発見があったのだけど、やめます。 見てて面白かったとか、興味があったとか、ちょっと変わった人(?)が居たらレス下さい。 続き書きます。 Ps,解析はまだ続けています。解析プログラムもまだ作っています。
やっぱ ActivePerl はショボイんだなという事がわかって 勉強になりました サンクス!
とりあえず 210 には Perl 5.005 以降を使用して srand を使わないことをおすすめする。
>>224 ちょ、ちょい。
perlの種類によってrandのアルゴリズムが違うの!?
標準関数の内部処理は全部同じだと思いこんでたよ…。
それと、出来ればそちらの環境と結果を書いてほしいな。
めんどうでしたらいいけど。
>>225 いえ、ランダムの解析を楽しんでる(?)だけですから…。
あと、5.8の結果ですヨ。
折角だから、続き書いて欲しいんだけど・・・。
>210=226 じゃあ、書いといておこう 動かしたスクリプト $no = 0; while(srand($no)){ print int(rand(255)) . "\n"; $no ++; last if(255 < $no); } 結果は次
229 の続き 二箇所で試して両方とも全く同じ結果だった。 最初の十行のみ perl -v の結果 This is perl, v5.6.1 built for i386-linux This is perl, v5.8.0 built for i86pc-solaris 動かした結果 43 10 232 199 166 133 100 67 34
version 5.005_03 built for i86pc-solaris もあったので、 試してみますた 最初の十行のみね 0 131 7 138 14 145 21 152 28 159
>>228 ええと、どうゆうのがお好みで?
取り敢えず適当に書きます。
引数の指定なしで
rand();
とやった場合、1未満の小数点出ます。
よく本などでこれを多いに活用してるプログラムを見ますが、
俺の解析結果によるとこの小数はかなり使いにくいと出ました。
その理由っというのは、
*最後の2桁が必ず75か25になる。
*さらに一つの理由としては、桁数が安定しないのでなんか使いにくい。
*小数点未満は、いかなる方法で出しても数字がかたよりやすい(←ちょっとこれはもう1回解析入れてみます。具体的に書けるように)
これら上記の事は、最大値を100とかの整数にしても同じです。
俺は乱数は必ず大きめの数にして、intしてから使うべきだと学びました。
でも、環境によって標準関数の仕様が違うらしいって話が出てきたので、
そっちを先に調査したいと思います。
悪しからず。
>232 すまんが、それも俺の環境ではそんな結果にならんぞ、、。
>>229-231 あ、ありがとうございます。
明らかにrandの仕様が違いますね…。
ActivePerlはショボイのか…
俺も勉強になりました。
う〜ん。 ここまで仕様が違うと解析する気なくなって来た…。 解析しても意味ないじゃん。。。 あやうく「これがperlのランダムですよ」ってサイトに文章書く所だった。 危ない危ない。 そんな訳で、プログラミングperlに Math::TrullyRandom と言うモジュールが紹介されていたので、次解析する時はこれ使ってみようかと思います。 モジュール使えば性能良いし、多分仕様も同じになると思うから。 でも、めんどうになってきたのでしばらく解析はやめる。 そんなわけで役に立たない迷惑なレスを書き続けてしまいました。 ごめんなさい。
>>232 それが perl が rand について詳しく書いてない理由。
自分の ActivePerl で以下のコードを実行すると、まあまあ再現できた。
ちなみにこういうのを線形合同法って呼ぶ。
srand($_), print rand() . "\t" . (6*$_+76+int($_ * 0.535)) / 2**16 . "\n" for (0..7);
結果:
0.00115966796875 0.00115966796875
0.001251220703125 0.001251220703125
0.001373291015625 0.0013580322265625
0.00146484375 0.0014495849609375
0.001556396484375 0.001556396484375
0.00164794921875 0.00164794921875
0.00177001953125 0.0017547607421875
0.001861572265625 0.0018463134765625
というかperlのrandはlibcのrand呼んでるだけだから 激しく実装依存なのだが。 無駄な努力ごくろうさん
読んだ。 線形合同法の場合、一発目は捨てるって言ってたけど二発目も捨てる必要あるよ。 一発目と二発目を捨てて、初めて線形合同法が意図する乱数が生まれる。といった覚えがある。
>207 >209 どうもありがとうございました。 えぇ〜〜っと、言葉が足りなかったですね。 サブルーチンを呼出し順でツリー表示してくれるのを 探してたんです。 イメージとしては + sub1 | + sub2 + sub3 + sub4 みたいな? やっぱりないのかなぁ〜。作るしかないか(×_×;)
>>236 おおお!
最初記述の意味が全く分からなかったけど、
perlが生成するrandと全く同じ処理を作ったわけですね。
(6*$_+76+int($_ * 0.535)) / 2**16
でも、なにがなんの数字だか分からなかったり。。。
この辺は自分で調べてみます。
う〜ん…。ちゃんと乱数生成のアルゴリズムを勉強してから解析。
それからここに来れば良かったカモ。
>まあまあ再現できた
出力部を見ると完璧に見えるのですが…。
>>237 あら。。ご愁傷様、俺。
>>239 そうでしたか、アルゴリズムの名前も教えてもらった事だし、検索してみます。
じゃあ、多大に失礼しました。
>>240 実行時にどういう順で呼び出されたか? なら、perl debuggerとかでダンプしてちょいと手を加えれば出来るけど。
呼ばれる可能性のツリーを期待してるなら俺には出来ん、スマソ
243 :
デフォルトの名無しさん :03/06/03 20:16
perlでhttpのプロクシ経由でhttpsのURLにアクセスするにはどうしたらいいですか?
こんなこと調べて何か解析してる気になってる
>>210 はリアル中学生ですかね?
まぁがんがれ
246 :
デフォルトの名無しさん :03/06/04 13:47
>>244 オメェーの方がつまんねぇ。何様のつもりだ?(w
>>244 source読む、ってことを知らないんだろ。ほっといてやれ
なんか微妙に必死なヤツがいるな(w
250 :
デフォルトの名無しさん :03/06/04 18:47
>>210 :| 現 な 闘 i::::::::::::::::::::::::::::::
:::::::::::.ゝ 実 き わ ノ::::::::::::::::::::::::::::
:::::::::::/ と。 ゃ イ:::::::::::::::::::::::::::::
\_ ,,-'
――--、..,ヽ__ _,,-''
:::::::,-‐、,‐、ヽ. )ノ ∠_::::::::
:::::_|/ 。|。ヽ|-i、 ,-、ヽ|:::::::::
/. ` ' ● ' ニ 、 |・ | |, -、::
ニ __l___ノ ゚r ー' 6 |::
/ ̄ _ | i i '-
|( ̄`' )/ / ,.. ヽ 、
`ー---―' / '(__ ) ,/ニニニ
251 :
デフォルトの名無しさん :03/06/04 19:00
あらら。 俺が検索不足の話してしまったせいで荒れて(?)しまって…。 話しの内容的にはperlのrandではなく線形合同法の結果になってしまったようですが。 ついでですので線形合同法、その他アルゴリズムのランダム性の特徴は、 いつか気が向いた時にでも続けて調べてみようかと思います。あ、どうでもいいですね、こんな話。 今回のコトはここに書き込んだおかげで面白いレスを複数いただく事が出来ました。 特に動作環境の依存や、アルゴリズム(線形合同法)の計算法などの報告を貰って有意義に時間を使うことが出来ました。 210から続けて大量に書き込んでしまったので目には止まるかと思いますが、 好みの内容じゃないと感じた人はスルーしてやって下さいませ。 それじゃ、今度こそ失礼しようかと思います。
windows/activeperl環境で、 画像解析のために、jpg/gif/png画像を読み込んで、 ピクセルサイズや、ピクセル単位でのrgb情報の取得を行いたいのですが、 GD.pm ver2.0以上ではgifが読み込めないし、GD.pmの旧バージョンはactiveperl5.6以上で呼び出すと 落ちてしまうのですが、他にそういったことが可能なモジュール等はあるのでしょうか?
まぁ、ソース読むのも面倒くさいし、 いい暇つぶしになったからいいや。
>>210 Perlを勉強中の漏れにとってはかなり面白かった。
これからも話題を提供してください。
210の能書きなんてPerlの勉強と何の関係もないじゃん。
210の自演ウザー
>>210 rand について調べる以前に、
$no = 0;
while(srand($no)){
print int(rand(255)) . "\n";
$no ++;
last if(255 < $no);
}
から、例えば
for (my $no = 0; $no <= 255; $no++) {
srand $no;
print int rand 255, "\n";
}
という感じに書けるようになって欲しい。
上じゃわかりにくくてしょうがない。
もっとPerl的に行きたい foreach my $no(0 .. 255){ srand $no; print int rand 255, "\n"; }
既に 210はどうでもいいわけだが foreach my $no(0 .. 255){ ← これのコストってどんくらいなんだろね 極端な話 foreach my $no (0 .. 65535) はやりたくないよね クリティカルな場面ならベンチでも取るが、普段はどうでもいいし、256位なら大した事も無いだろうし 感覚的に、どれくらいまでならリストでやる? > all
262 :
デフォルトの名無しさん :03/06/05 17:26
($n = 0; $n < 255; $n++) と $n(0 .. 255) にコストの違いってあるの?
コストが気になるところでPerl使うのはいかがなものか。
手を動かしてるといたという点では
>>210 は感心できる。
use Benchmark;
$N = 10000;
timethese $coount, { a => \&a, b => \&b, c => \&c, d => \&d , e => \&e };
sub a { my $i; for ($i = 0;$i < $N;++$i) {} }
sub b { my $i; 1 while (++$i < $N) }
sub c { my $i; ++$i for (1 .. $N) }
sub d { for (1 .. $N) { 1 } }
sub e { 1 for (1 .. $N) }
a: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 173.51/s (n=549)
b: 4 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 212.83/s (n=680)
c: 4 wallclock secs ( 3.20 usr + 0.00 sys = 3.20 CPU) @ 209.70/s (n=670)
d: 4 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 306.12/s (n=975)
e: 4 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 267.18/s (n=840)
理由は説明しきれないので、後は任せた。
265 :
デフォルトの名無しさん :03/06/05 22:55
なんか、レベルの高い会話の所恐縮なのですが・・・。 $subj="[回覧板 No.123]タイトル" という文字列から、123だけを抜き取って$countに入れたいんですけどスマートな方法が思い浮かびません。 無茶するなら、 #"[回覧版 "と"No.123…"に分割 @temp=split(/\s/,$subj); #"No.123…"を"No."と"123]…"に分割 @temp=split(/\./,@temp[1]); #"123]…"を"123"と"]…"に分割 @temp=split(/\]/,@temp[1]); #結果の取得 $count=@temp[0]; で出来そうですが、スマートじゃないですよね(;´Д`) せっかくperlなんで正規表現使ってドカン!と一発で出来ないでしょうか?
>>265 $subj =~ /No\.(\d+)/;
$count = $1;
$subj =~ /^\[回覧板 No\.(\d+)\].*$/; の方が確実だけど
>>265 $subj =~ /(\d+)/;
$count = $1;
もう少しで結婚できたのに・・・。
($subj) =~ /(\d)/g;
+が抜けた
>>269-270 できないんだけど・・・?
$ perl -e '$subj = "abc 123 efg"; ($subj) =~ /(\d+)/g; print $subj;'
abc 123 efg
print $subj ではなく、 print $1 $ perl -e '"abc 123 efg" =~ /(\d+)/ and print $1' 123
>>271 ああねぼけてる。ごめん。
($count) = ($subj =~ /(\d+)/g);
274 :
デフォルトの名無しさん :03/06/06 00:01
jperlのスクリプトをperl5.8で動かせると聞きました。 いろいろ調べましたがどうしてもわかりません。 どなたか教えてくれませんか。 ちなみに使用OSはredhat8.0でつ。
できたー。 ありがとー。
276 :
デフォルトの名無しさん :03/06/06 00:41
ファイルtext.txtの最後の行を変数$lastにいれるには open(F,"text.txt"); while(<F>){ $last=$&; } close(); しかないですか?text.txtは行数が多いので時間がかかります。 最後の行から逆に一行ずつ読み込む関数というのはありますか?
277 :
デフォルトの名無しさん :03/06/06 00:45
質問があるのですが、誰かいますか??
278 :
デフォルトの名無しさん :03/06/06 00:47
>>265 見てないと思うが、上の方にある
$subj =~ /^\[回覧板 No\.(\d+)\].*$/;
の方がいいとおもうぞ。
($count) = ($subj =~ /(\d+)/g);
にすると、タイトルに数字が入るとそれも取得してしまうよ。
close(F);だ・・・
tailを使う
>>278 同意。
というか、
($count) = ($subj =~ /(\d+)/g);
これだと $count にはマッチしても 1 しか代入されないんじゃないか?
>>278 正規表現、今日手をつけたばかりなので詳しい事はわかりませんが、今回その
手法は使えないかな?
メールのサブジェクトを見て「[回覧板 No.dd]…」だったら回覧板宛のレスだと判断。
サーバーの保存された該当番号の回覧板ファイルを参照して、メール本文を追記。
もし、それ意外のタイトルだったら新規の回覧板(回覧板本文の意)として認識する
様に作っています。
よって、$subjはメールから取り出すのでそれ自体はいじれません。
$subj="[回覧板 No.30]タイトル123";
if ($subj=~/\[回覧板\sNo\.(\d+)\]/){
$subj=~/(\d+)/;
$count=$1;
print "$1\n";
}else{
#新規の場合の処理
}
としました。ちゃんと30が帰ってきましたよ(^-^)v
>>283 それなら大丈夫かな。
$subj =~ /(\d+)/g
のように、グローバルマッチのオプションがついてると微妙ですが、、、
>>276 行数にもよるが
open (F, "text.txt");
@afo = <F>;
$line_num = $#afo; #これでトータルの行数-1を$line_numに代入される
print @afo[$line_num]; #多分これがファイルの最終行
最後の行から読み出す方法ってreverseを使う以外になんかあったっけ?
pop
seekで末尾からある程度のブロック後ろに移動したあと、 変数に代入していく、とかはダメかね。 1行の長さがある程度事前にわからないとダメだけど、 改行が見つからなかったら、今度はその2倍戻るとか。 open(FILE,"dekai.txt"); my $last; my $offset = 1024; TAIL: { my $i; seek(FILE, -$offset, 2); until(eof) { $i++; $last = <FILE>; } if ($i == 1) { $offset *= 2; redo TAIL } } close(FILE); うーん、やってみたものの、大して早くないかも知らん(−−; まぁ276のでいいと思うのですが。ちょっと思いついたので書いてみますた。
mmap
tailはどういうアルゴリズムなんだろう?
後ろから前に向かって一文字ずつ読み、改行文字の数を数えればいいのでは。
293 :
デフォルトの名無しさん :03/06/06 13:11
Perl で作るのでまずここで聞かせてください。 ユリウス日を求める式みたいなのを教えてください。 入力はシステムクロックではなく年月日時分秒の数値です。 実は既にいろいろ見つけていますが、人によって係数などが違うので 何か正しそうなやつの例を1ついただければそれでいいです。
補足 1年の最初から何日目とかいうやつじゃなくて 紀元前4713年から何日目ってやつです。
>>292 fseekとfgetcを組み合わせて。
効率が悪いなら最初に行数を調べるという手もある。
>>296 あああ、そういうモジュールがあるんですね。
どうもモジュールは嫌いなので忘れてました。
そちらを見てみることにします。
どうもありがとうございました。
>>297 > 効率が悪いなら最初に行数を調べるという手もある。
行数を調べること自体効率悪そうだが。
>>297 死ぬほど遅そう。
seek ができるくらいなら mmap 使ったほうがいい。
メモリに展開するくらいなら標準でいくらでもできるか。でもファイルがでかいと・・・
open(FILE,$ARGV[1]) or die "failed"; $list=<FILE>; close(FILE); $i=$#list-9; if($i<0){ $i=0; } while($i<=$#list){ print $list[$i++]; }
open(FILE,$ARGV[0]) or die "failed"; @list=<FILE>; こうだ
# こんなのどうよ? my $line = 1; my @line = (); open(F,"file"); while(<F>) { push(@line, $_); shift(@line) while @line > $line; } close(F); # shift,unshift,push,pop はウンコな位遅い気もするが。
>>307 >>309 なら、少し簡単にしたものを。元のPerlメモのよりは速い。
(自分で組んだルーチンではこれに勝てなかった。)
結局、binmodeとかseek(,,0)とかがかなり影響を与えている模様。
open(FILE, "< $file");
binmode(FILE);
$pos = (-s FILE);
while (!$last_line && $pos--) {
seek(FILE, $pos, 0);
read(FILE, $buf, 1);
$buf .= $buf_tmp;
($buf_tmp, $last_line) = $buf =~ /[^\x0D\x0A]*\x0D?\x0A?/g;
}
close(FILE);
return $last_line;
まずどういうのを正しいとするか決めろよ
ミス スマソ
0とヌル文字列とundef 以外は正しい。
美しいものは正しい さて諸君、美しいを定義したまえ
私は美しい
その前に定義を定義しようよ
再帰を定義しようぜ!
斎木しげる
322 :
デフォルトの名無しさん :03/06/07 10:31
サブルーチンの最初でmyで変数宣言みたいなことするのって 効率悪いですか?
sub answer {
my $res_number = shift;
print("それって普通じゃないか?$res_number\n");
}
&answer("
>>322 ");
324 :
デフォルトの名無しさん :03/06/07 10:43
>>324 myの処理は宣言無しと同じか、それより速いと思ったが。
use strict;マンセー。
それは局所化の宣言だから。
早くなる。
変数は使われるたびに自分がドコに所属してるのか記述をさかのぼって調べるけど、
myの場合さかのぼる量が極端に少なくなる。
by.173
>>322 初めて使われる時にmyするのが普通。
宣言したあと、使われる前にリターンされたら宣言自体がいらん処理になる。
もし、リターンのあとにmyなら、そんな変数自体もともとなかった。って方向で落ちつく。
ソースいじってるうちに、 使ってからmyになりそうだ
328 :
デフォルトの名無しさん :03/06/07 17:50
329 :
デフォルトの名無しさん :03/06/07 19:46
330 :
デフォルトの名無しさん :03/06/08 18:41
神さま教えてください。 以下のサブルーチンの処理中、必ずdieしてしまいます。 DBへアクセスする際の書式が変な気がするのですが…よく分かりません。 sub new { my ($pkg, $loc) = @_; my $d = {}; tie (%{$d->{dicc}}, 'DB_File', $loc, $DB_File::O_RD, 0644, $DB_BTREE) || die "diccionary->new: error opening database\n"; return bless $d, $pkg; } Perlのバージョンは5.6.1、 DB_Fileモジュールのバージョンは1.806、 Berkeley DBのバージョンはここでは1系列です。
diccionary
>>330 $DB_File::O_RDが怪しい。
open定数はO_RDONLY O_WRONLY O_RDWR で、これらは変数ではないので"$"をつける必要はないよ。
334 :
デフォルトの名無しさん :03/06/08 23:23
Net::DNS の質問です。 以下のコマンドと同じように、ROOT SERVER に問い合わせて、 jp ドメインの権威を持つサーバを検索したい場合には、どう いうメソッドを使うのでしょう? dig @a.root-servers.net -t NS -c IN jp Net::DNS::Resolver の nameserver メソッドに a.root-servers.net をセットしてから query してみても何も返って来ませんでした。
335 :
デフォルトの名無しさん :03/06/08 23:57
Perlのいいデバッガっていうか irbみたいにちょっとコマンドラインでテストするのに使いやすいのないですか? 今はperl -de使ってるんですけど
>>335 Devel::ptkdbがけっこう面白いよ。まだバグだらけだけど。
>>333 Thxです。
そこを疑って自分でもO_RDONLYなどに書き換えてみたのですが、
必ずdieしてしまう挙動に変わりはありませんでした。
確かに今DB_Fileのperldoc等を見てもopen定数に"$"をつけろとかはどこにも書いてありませんが、
このスクリプトが書かれたのはPerlが5.005とかの時代らしいので
DB_Fileのopen定数の書き方も違ってきてるのかもとか思ってます。
338 :
デフォルトの名無しさん :03/06/09 08:13
or or or or
オアオアうるさいな
340 :
デフォルトの名無しさん :03/06/09 08:31
orだよor。||じゃないんだよ。マニュアルと同じ書き方しなさいってこった。
>>337 $locが正しいファイル名で正しいパーミッションかどうかを確認する。
あと-wスイッチの元で動かしてみる。
…ああそういえば、読み込み専用では開く事は出来なかった気がするから、
O_RDWRにしてみて。
>>340 このケースでは無関係
´−`)。oO( O_CREAT|O_RDWR でいけたなんてオチだとヤだな…。)
||がいいな。他言語に慣れるとorは読みにくい。 俺のソースは癖ありすぎてだめぽ。
345 :
デフォルトの名無しさん :03/06/09 21:34
>>343 そのファイルハンドルはどうやって生成したんでしょうか。
>>344 他言語とか言っているが実はCとそれに似せたC++、Java、C#だけのことしか言っていない罠。
実は世界が狭いのだよ。
PerlもCの構文をまねたものなんだから||の方があっていると思う。
優先順位
いちいち()をつけるくらいならorのほうが数倍いい。
>>345 適当な相対パスから生成しました。
求めたいのは絶対パスです。
>>343 > この日本語 perl texinfo は、基本的に perl 4.0 パッチレベル 19 のオンラインマニュアルを
> 日本語訳し、そのセクション分けに対応したノードに分割したものです。
おそらく、そのページでいうアドレスというのはCでいうところのポインターのことだと思われ。
それはさておき、「ファイルハンドルからパスを求める」というのは
open IN, '../foo/hoge.txt' or die;
したときに、IN から '../foo/hoge.txt' を求めたいということ?
>>350 ファイルハンドルはファイルとは無関係な場合があるので、パスは格納されていない。
openのときに使ったファイル名を保存しておくしかないよ。
優先順位もそうだけど、orの方が「さもなければ」って直感的に読めるから好き。 open() or die; 開け。さもなければ氏ね。
(同じ動作なら)どっちでもいいと思って使ってる漏れはボツでしょうか?
>>341 >>342 Thxです。
ファイル名とパーミッションも問題なく、
open定数をO_RDWRやO_CREAT|O_RDWRに書き換えても変わらず。
単独で動かすといろいろ面倒なので-wオプションは試してません。
"$DB_File::"があってもなくても同じようにdieするので、
この部分は問題でもなんでもないってことなのでしょうか。
とりあえずハッシュにデータ蓄えるだけのミニマルなスクリプトを書いて、
もし動かなかったら環境の再構築を考えてみます。
もしくは開発元に問い合わせ。
>>354 同じじゃないもん。
局面においては同じような挙動を示すけど、それって混乱の元じゃない?
同じ動作をする場合の時って意味ね。 でも、orを使うことが多いかな。 極力||は使わないようにしてる。 記述自体を文字リテラルとして扱うとき $aaa = q| #記述 |; って普段書くから。
$a or= $b って使えたっけ?
$ perl -e "$a or= $b" syntax error at -e line 1, near "or=" Execution of -e aborted due to compilation errors.
>>355 いや、99%君の書き方が悪いから上手く行かないんだと思うよ。
>単独で動かすといろいろ面倒なので-wオプションは試してません。
「試してません」って…苦労したくないなら-wオプションは使うべき。
>"$DB_File::"があってもなくても同じようにdieするので、
"$DB_File::"が何を意味するのか分かって書いてる?
多分、何かを勘違いしてるよ。
とりあえずソース見せて。
ほっときゃいいじゃん。-w使わない
>>330 の自業自得だし。
メールをマルチパート分割して 添付ファイルと本文を抜き出す処理を工作しております。 MIME::Perser を使うとできそうなんですが この他にも何かラクチンな方法があればご助言くださいませませ。
当方、WinXP, ActivePerl5.6.1です。 次のスクリプトを実行しても、ホスト名を得たいのですが、改行しか得られません。 これって、DNSに問い合わせができてないのでしょうか? print scalar(gethostbyaddr(pack("C4", split /\./), 2)), "\n" while (<DATA>); __END__ 210.81.150.5
>362 munpack
365 :
デフォルトの名無しさん :03/06/12 00:59
まだ
>>350 はいるかー?
上の方にあがっていたスレを見てわかったぞ。
use POSIX;してPOSIX::getcwd();で得られるもの(現在の作業ディレクトリ)と相対パスをくっつければいいんだ。
開いた後にchdirしていたらそれだけではうまくゆかないけど。
いや、Cwdモジュールを使えばいいか。
367 :
デフォルトの名無しさん :03/06/12 18:11
スカラー変数(文字列)のサイズを知るにはどうすれば良いですか?
length($a);
369 :
デフォルトの名無しさん :03/06/12 18:26
>>368 長さじゃねーよ馬鹿
サイズを知りたいんだよ。
length($a)*2
372 :
デフォルトの名無しさん :03/06/12 18:54
質問が悪かったです。 スカラー変数の大きさ(バイト)を知りたいです。
ん?スカラー波でてる人?
375 :
デフォルトの名無しさん :03/06/12 19:09
>>373 C言語のsizeofみたいなものか?
そんなものないよ。
376 :
デフォルトの名無しさん :03/06/12 19:39
Perlのプログラム実行時間を計るのには、どうしたらいいですか??
time
use Benchmark;
stopwatch
>>376 プログラムの一行目に
$start=time();
最後に
$goal=time();
print $goal-$start;
とかけ。
>>375 そうです。
どうすればいいんでしょう?
こんにちは!誰か教えていただきたいんですけど、 私perlを使ってCGIで掲示板作りたいんです。まだ 初心者です。でも、最近カウンターの作り方は覚えました。 掲示板作りたいんですけど、いまいち検索かけても 掲示板の作り方とか見つけられないんです。本を買っても いいんですけどお金かかりますし。。。。 いいサイトを知ってる方がいましたら是非是非教えてください!
minibbsのソースでも見てろ
そうだね、人のスクリプト見て色々いじりながら理解していって、 それから作るのがいいと思うよ
perl入門書でスタンダードなのがありましたらお教えください。
386 :
デフォルトの名無しさん :03/06/13 00:53
>>381 ないのは必要ないから。
いったいどんなことに使うんだよ。
>>381 バイナリでもいじるの?それなら pack,unpack 。
388 :
デフォルトの名無しさん :03/06/13 00:58
perlのクラス間(継承関係はなし)のやりとりって可能ですか? C++だとfriendとかあったと思うけど(勉強したの昔だから忘れた)
>>388 C++のfriendにあたるものなら、ない。というか、必要ないよ。
Perlでは基本的にメンバのアクセス制限は存在しないから。
プロトタイプ宣言した再帰関数って作れるの? なんかよくプロトタイプが確定する前に呼ぶなやゴルァって Perlタンに怒られうんだが
何故試さない? #!/usr/local/bin/perl use strict 'vars'; sub main::a($); main::a(0); sub main::a($){ my($c)=@_; print "($c)\n"; (10 < $c) && return 0; main::a($c+1); }
392 :
デフォルトの名無しさん :03/06/17 20:25
配列の中身をランダムに入れ替える方法を教えてくだそい
sub fisher_yates_shuffle { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i, $j] = @$array[$j, $i]; } } fisher_yates_shufftle( \@array ); クックブックから
リア厨のころからずっとこのアルゴリズムだな ポケコンでトランプゲームとか作るの
use List::Util qw/shuffle/; my @a = (1..10); @a = shuffle @a;
@after = map { $_->[0] } sort { $a->[1] <=> $b->[1] } map { [ $_, rand] } @before;
配列の中をランダムでいれかえる。 foreach($aaa[int(rand(@aaa))];){ push @bbb, $_; } 全然動作確認してないけどこれはどうだ!? コンパクトな感じ。でもループんとこが怪しいような…。 ランダムで抜き取る時は日頃から $bbb = $aaa[int(rand(@aaa))]; こう書いてます。
駄目な気がする
397でsplice使えばいけそうだなぁ。それはそれで微妙そうだけど。
400 :
デフォルトの名無しさん :03/06/17 23:48
ちょっとした疑問なんですが、 連想配列ってなんで hash って言うんですか? ハッシュドビーフの hash ですよね。 切ってゴチャゴチャにするという。
連想配列が配列と紛らわしいからハッシュに名前が変わったらしいです。
>>400 「ハッシュテーブル」という古典的構造を使ってるから。
flock()について勉強している者です。 前々スレ554氏の 「openしてからflockまでの間によそのプロセスが開けちゃわない?」 という言葉が気になって気になって眠れません。 開けても読み込みがまだなら大丈夫なのか、この隙には割り込めないようになっているのか、 1行くらいの隙間は諦めるしかないのか、どうなんでしょうか?
554がおかしい。 開いても書き込み(又はファイルサイズをゼロにする)がまだなら大丈夫。
そうなのですか・・どうもありがとうございます。 しかし、openしてからflockまでの間によそのプロセスがopenできてしまうと言う事は、 そのプロセスで何かやってもよそのプロセスによってファイルへの書き込みが 上書きされてしまうような事になるように思います。 と言う事は、アクセスの集中による入力蹴られはflockでは防げないと考えて良いのでしょうか?
> そのプロセスで何かやってもよそのプロセスによってファイルへの書き込みが > 上書きされてしまうような事になるように思います。 上書きしなければよい。
そもそもflockは(そのファイルを扱う)他のプロセス全てがflockすることが前提。 その条件なしでは、タイミングも何もない。
多分理解しますた。 後は自分で実験して頑張ってみます。 どうもありがとうございました。
ところで、このスレ(前スレも)まとめてるサイトとかってありますかね なにかと世話になってるんで、無いならママーリと作ろうかと思って
>>409 ママーリという言葉が謎だが、やるならがんがれ。
411 :
デフォルトの名無しさん :03/06/19 05:30
ハッシュの読み出しに使っている反復子を保存しておくことって出来るんでしょうか。 sub AAA { my $a=shift; while (($key,$val)=each %hoge) { if ($val=~/$a/) { # $valの一部に$keyが含まれていたら &AAA($key); : } } } みたいな再帰関数があるのですが、反復子を共有するので再帰になりません。 でかいハッシュなので、それだけの為にコピーしたくもありませんし。
412 :
デフォルトの名無しさん :03/06/19 06:02
携帯電話からメールを出すとweb上に掲載される掲示板を作ったのですが、 iモードの絵文字を使うと 〓 が出てしまいます。 ちゃんと絵文字を表示する良い方法はないでしょうか? ちなみに、携帯からPC宛にメールを出しても 〓 が出ますよね? これと同じで仕方ないことなのでしょうか?
>>405 もう
>>407 で分かったのかもしれないけど、flock は open や write を
排他するのではなく、(他プロセスの) flock を排他するもの。
他人が書けなくなる(=write がエラーするとか)、ではないことに注意
>>412 Docomoの絵文字はDocomoでないと無理。代替画像でも用意すれば?
ケータイの絵文字を画像に置換したらよい。 Docomoとかauとかのサイト見たら 絵文字画像があるので、その辺を参考にしながら手書きすれば?
416 :
デフォルトの名無しさん :03/06/19 19:57
HTTP-Liteをインストしようとしてるのですが、 .ppdがあるフォルダに移動して、 ppm install http-liteとやると error installing package 'http-lite':could not locate a PPD file for package http-lite ↑のエラーがでます。なにが原因なのでしょうか?
>>413 一応それは分かっているつもりですた。
仮にhage.txtに「はげ」と書かれていたとして、
以下のスクリプトを2回ほぼ同時に実行した場合、
open(FILE, "+< hage.txt"); # ←A
flock(FILE, 2); # ←B
$txt = <FILE>; # ←C
$txt = $txt."ほげ";
truncate(FILE, 0);
seek(FILE, 0, 0);
print FILE $count;
close(FILE); # ←D
早い方のプロセスのAとBの間で遅い方のプロセスがhage.txtをopenしたとすると、
flockのために遅い方のプロセスがCを実行するのは1回目のプロセスがDまで行った後となるはずですが、
その時に$txtに入るのは「はげ」なのか「はげほげ」なのか?
遅い方のプロセスが終わった時にhage.txtに入っているのは「はげほげ」なのか「はげほげほげ」なのか?
>>405 で言いたかったのはこのような事ですた。
でももういいんです。 だってウチのMacPerlったらflock()使えなかったんだもの(鬱氏 長文スマソ。お騒がせしますた。逝ってきます…
419 :
デフォルトの名無しさん :03/06/19 21:14
コマンドでperl hoge.cgiだと正常に動作するが(perl -wc hoge.cgiでsyntax OK) web上からだとforbiddenになってしまうけど、 一番考えられる原因はどこよ。
パーミッション
421 :
デフォルトの名無しさん :03/06/19 21:16
>>420 すまん。書き忘れた。
パーミッションぐらいで質問しないよ。
httpd の設定。
パーミッション
多分パーミッション
425 :
デフォルトの名無しさん :03/06/19 21:54
頭がパー以下略
>>419 デーモンの設定な気がするが...
cgiファイル置いてるディレクトリにCGIの実行権限はある?
って言うかCGI関連はスレ違いじゃなかったっけ?
>>426 なるほど〜、リファレンスですか。
まったく考えていませんでした。
ありがとうございました。
>>429 今見たら
sub AAA {
my $a=shift;
while (my ($key,$val)=each %hoge) {
if ($val=~/$a/) { # $valの一部に$keyが含まれていたら
&AAA($key);
:
}
}
}
のような気もせんではないけど・・・・
>>430 そうでした…。
プログラム例を書き写す際に欠落しました。スマソ。
漏れすごいあほ。 "abcde"という文字列があるとき、 それぞれの文字の前にある決まった文字列を入れる場合はどうするの? 例えば"AHO"を付加したい場合 "AHOaAHObAHOcAHOdAHOe"になって欲しいのーーん。ノンノン!
433 :
デフォルトの名無しさん :03/06/21 15:03
434 :
デフォルトの名無しさん :03/06/21 15:07
>>432 my @splited_chars = split('', "abcde");
my $result;
map { $result .= "AHO$_"; } @splited_chars;
print "$result\n";
>432 s/(.)/AHO$1/g
かぶらないようにまわりくどいほうほうをかいたんだ。 せいきひょうげんをしらなかったわけじゃないぞ。 フォルゴレはつよいんだ。みてろよー。
漏れも、434のかきかたするなぅ・・・ それ以前にアスキーコードでしかつかえんね・・・コレ(w
>>434 ,435,437
マジ愛してる
とりあえず漏れのレベルに合わせて435のやつでいくよ!いっちゃうよ!
$1ってのがわからんかった。lvが$1上がった気分。
>>438 は レベルが $1 あがった!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>438
map { $result .= "AHO$_"; } @splited_chars; はmapの使い方として推奨されてない気が。 434だったら、 join "" => map { "AHO", $_ } split('', "abcde"); な感じでFA。
>>437 perlはunicodeもサポートしてますが(w
Unicode以外のコードもあるのを忘れとるよ〜
>>442 そのためのEncodeモジュールじゃないの?
といってもEncode::JPは変換がおかしいけど。
漏れも split をしたら、join でつなげたくなるな join "AHO", split( //, "abcdef") って感じ。もうひとつ、行頭に "AHO"がいるが。
445 :
デフォルトの名無しさん :03/06/22 20:11
すみません。 複数の検索エンジンにワードを投げて、その結果をまとめてから出力する、 というcgiを書いています。 $URL{$key[$num]}に検索エンジンのアドレスとと検索ワードを付け加えたURLを格納して、 `wget $URL{$key[$num]}`や $html = `w3m -dump_source $URL{$key[$num]}` などのようにして、検索エンジンにワードを投げた後に出力するhtmlを取得しようと思ったのですが どうしても上手くいきません。 どなたか、解決方法をご教授してください…(;´д`)
「どうしても上手くいきません」で解決方法がわかる人は宇宙人です。
あ、どもすみませんでした。Web板逝ってきます。
地球が宇宙にある以上、地球人も宇宙人です
もしかしたら、地球は宇宙じゃないのかもしれないよ。もしかしたらね。
× 地球 IS-A 宇宙 ○ 宇宙 HAS-A 地球
以下のアルファベットのAからZまでの中から「BCD」を開始位置、「TUV」を終了位置とし、 その間の文字列の抜き出しと、その文字数を調べる問題なのですが、どうもうまくいきません。 まだ勉強したてなので、どなたか教えてください。 $str="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $x=index($str,BCD); $y=index($str,TUV); print 'BCD開始位置=',"$x"; print 'TUV終了位置=',"$y"; @data=split(//,$str); $result=scalar(@data); print "$result"; exit;
>452 宿題は自分でやれ。
>453 宿題ではないですが、これを解きたいんです。 >454 ありがとうございます。 splitではなく、spliceという意味でしょうか?
>452 文字列の抜き出し=substr 文字数を調べる=$y-$x 自分で考えなきゃ問題解いた事にはならないだろ。
>456さん 頂いたヒントを元にやってみました。 時間はかかりましたが、なんとか出来上がりました。 ありがとうございました。 str="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $x=index($str,BCD); $y=index($str,TUV); print 'BCD開始位置:',"$x\n"; print 'TUV開始位置:',"$y\n"; $len=length($str); $kouho= substr($str,$x,$y+1); print '結果=',"$kouho"; exit;
$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $str =~ s/(\w|\W)+(BCD)(\w+|\W+)(TUV)(\w|\W)+/$2$3$4/; $len=length($str); print "str:$str\n"; print "length:$len\n"; exit;
perlでは論理シフトと算術シフトってどう区別されてるんでしょうか?
$ perl -Minteger -e "print(-8 >> 3)" -1 となるから算術シフト?
461 :
デフォルトの名無しさん :03/06/25 01:14
Windowsでperl -Dができるperlパッケージってないですか? ActivePerlのFTPとかにおちてないかなぁ
無いだろ。自分でコンパイル汁
>>459 ここらへんは、perlにしては珍しく変数の型がそのまま使われる。
と言う事で、一応perlでもなんの変数なのか認識しとく必要がある。
余談だけど、型はしっかり意識して使っといたほうが良いヨ。
数字に対して「文字列比較演算」とかしたら、
内部で文字型に変換されて、比較して、その後また数字型に直す。
なんて言うようなクソ作業が始まるから。
464 :
デフォルトの名無しさん :03/06/25 21:28
while なんかで大き目のファイルをぐりぐりパーズするスクリプトは while の部分を eval {} で囲んだ方が効率が良いらしいのですが、 本当でしょうか? また、本当なら何故効率が良くなるのか教えていただけないでしょうか?
>>463 内部実装を意識した方がいいというのは同意だけど、意識しすぎるのは無意味だと思うな。
型を意識する必要がないのはPerlの利点の一つだし、
単に比較演算程度なら、一旦数値が文字列化されれば
あとは数値として使おうが、文字列として使おうが、値を変更しない限り変換が行われる事はないからね。
>>464 そんなこと、聞いた事ないな。
それとも正規表現のコンパイルに時間がかかる、ってことかなぁ…。
# こういうケース
my $pattern = "foo";
while(<>){
if(/$pattern/){
# ...
}
}
eval() すると早いってのはこのこと。
パターンが何種類もある場合は、確かに考慮に値するほど変わることもある。
$pattern = "foo";
eval <<'CODE';
while(<>){
if(/$pattern/o){ # o - コンパイルを一度しかしない
# ...
}
}
CODE
パターンに定数を使える(oオプション使用を含む)のなら、わざわざeval()する意味はないけどね。
配列の中身(文字列)が全て同一かどうかを「スマートに」判別する方法って ないでしょうか? 最初の要素を保持してループを回し、異なる要素が出てきたら 同一でないと判断するのはPerlっぽくない(他に手段がある)気がするので。
どこが違っているかを見るなら、grepという手もあるが、 単に同一かどうかだけでいいのなら、 "@array1" eq "@array2"を評価しては?
>>467 すみません、ちょっと書き方がまずかったようです。
二つの配列をマッチングさせるのではなく、一つの配列の中にある
全ての要素が同一かどうかを見たいのです。
また、配列の中身が何なのかはとりあえず考えません。
(タブ区切りの文字列をループ内で分割しながら処理するので)
grepを使えば・・・というのは良いヒントになりましたが、場合によっては
メモリを喰いそうですね。
自分でももうちょっと考えてみます。ありがとうございました。
470 :
デフォルトの名無しさん :03/06/26 15:21
よく携帯サイトにある、オリジナル待ち受け画像作成プログラムみたいなのを 作りたいと思っています。例えば、背景色を選びロボットの頭、胴体、手、足の 各パーツ画像を選んで「画像作成」ボタンを押すことで、選んだすべてのパーツが 合体して表示される、といったものです。 perlよりほかの言語のほうが適しているのかもしれませんが、いろいろ調べても よく分からなかったので、多少は分かるperlスレで質問しました。 スレ違いであれば別スレに誘導していただけると助かります。 よろしくお願いします。
おまいさんは何が聞きたいんだ
472 :
デフォルトの名無しさん :03/06/26 15:35
すいません。 こういうプログラムはperlで作成することが可能かどうかをお聞きしたいです。 もしできるなら、その作成例などがあるサイトを紹介していただければありがたいです。
そういうのをperlでやることになったら鬱だ
>>470 まず、プログラムの実行環境から整理して書け。
めっちゃ意味分からん。
476 :
470,472 :03/06/26 16:14
>>474 ありがとうございました。行ってみます。
>>467 my @array1 = (123, 456, 789);
my @array2 = ("123 456", 789);
(つД`)
>>477 @array1 == @array2;
"@array1" eq "@array2";
じゃあこう。
2つとも通過でOK。
って質問主の要望に沿ってないし。
2つ(以上)の jpeg 画像ファイルを入力とし、 横に連結した1つの jpeg 画像ファイルを出力するプログラムを書け。 また、指定した位置に連結できるようにもせよ。 どなたか作っていただけませんか?
>479 偉そうにマルチポストか。死ね。
>>479 マジレスしてもいいの?
じゃ、PerlMagic使えば〜
>>482 やめろ。続きが想像できる。
「PerlMagicって何ですか?必死で調べましたが分かりませんでした。教えてください」
「インストールってどうすればいいんですか?」
「インストールでなんかエラーが出たんですが、どうすればいいんですか?」
以下略
>>465 答えていただきありがとうございます。
自分もそんなことしているのは cgi-lib.pl でしか見たことないです。
でも、 cgi-lib.pl は eval の始まりの辺りにコメントで
# for efficiency, compile multipart code only if needed
と書いてあるんですよね。
それから検索したらオライリーの目次みたいなのがヒットして
5.5 evalによる実行効率の向上 という内容があるわけですが
http://www.oreilly.co.jp/BOOK/adperl/contents.htm この本は持ってないし、効率のために eval を使っているものをあまり見つけられないので
実際のところはどうなのかなと思ったわけです。
で、効率にかかわるのは正規表現が関係する時ですか?
よくわからないのでとりあえずヒットした本をどこかで探して読んでみます。
どうもありがとうございました。
>>484 なるほど、やはり正規表現関連の事だと思うよ。
でもeval()は使い方を誤ると劇的に遅くなる事があるので、注意したほうがいい。
>>509 @C/C++の宿題やらせてください。9代目
#!/usr/local/bin/perl
use GD;
$file1 = "test2.jpeg";
$file2 = "test1.jpeg";
open (IMG,$file1);
$image1 = newFromJpeg GD::Image(IMG);
close(IMG);
open (IMG,$file2);
$image2 = newFromJpeg GD::Image(IMG);
close(IMG);
($w1, $h1) = $image1->getBounds();
($w2, $h2) = $image2->getBounds();
$width = $w1 + $w2;
$height = ($h1>$h2)?$h1:$h2;
my $target = new GD::Image($width, $height);
$target->copy($image1, 0, 0, 0, 0, $w1, $h1);
$target->copy($image2, $w1, 0, 0, 0, $w2, $h2);
print "content-type:image/jpeg\n\n";
print $target->jpeg;
ごめんなさい、これもスレ違いだったか...
ばっかでーぇ。
>>484-485 適当な記憶で書くけど、ループは繰り返されるたびに再コンパイルされていて、
ループ自体をevalから実行させると1回しかコンパイルされないので良い。
ってオライリーに書いてあった気がする。
俺はループの中でやむなくeval連発するプログラム作った事あるけどね…。
490 :
デフォルトの名無しさん :03/06/28 16:16
再コンパイルされるってのは正規表現のことで 処理自体には関係ないよね。
積んどいた「オブジェクト指向Perlマスターコース」というのを今見てるが、 訳も悪いが誤植もひどい・・・ と思ったら、本家本も誤植が多いのね。
>>492 どうせしょうもない話しかしてないじゃん
>>490 >465の最後のケースならevalのたびにパーズから必要。
>>491 洩れはPerlネットワークプログラミング読んでるんだけど、
これも誤植ひどいよ。
ピアソンエデュケーションって。。。
次スレからは「質問箱」ってスレタイを変えて 「情報交換」とでもしないかい? 本一冊読んでりゃしないような質問と回答ばかりじゃつまらない。
しかし、そういう質問スレは依然として需要はあるので、 質問箱のスレも立ててくれ。 つまりトータルで見ると、情報交換のスレをお前が別に立てれ。
Perlの情報交換のスレなんかいらない。 間違いなくCGIの話題が溢れ返る。
教えたがり体質の人は常に一定数いるので、 適当に新陳代謝していってくれ コテハンとか名乗らなくていいから
>>499 みたいのに限って、まともな回答なんて書いたことないんだよな。
自意識過剰なんだよ、役立たずのくせにw
やーい、ハゲ、インポ
えー、困りますよー。
2ちゃんでPerlの質問に答えられる天才は
>>499 様しかいないんですからー。
( ´,_ゝ`)プッ
おっと。 さらにもましてスレが下らない方向に進んでるぞー。 Q&Aのはまだましだぞー。
505 :
デフォルトの名無しさん :03/06/29 20:15
文字列中で演算結果を出力する方法を教えて下さい。 $a=1; $b=2; print "$a+$b=",$a+$b; を print "$a+$b=($a+$b)"; のような書き方で同じ出力を出したいのです。
>>505 $a=1;
$b=2;
$c=$a+$b;
print "$a+$b=$c";
>>505 my $a = 1;
my $b = 2;
print "$a+$b=@{[$a+$b]}";
こんな感じ?
>>505 Perlクックブックの第一章に同じようなネタがあったけど、
会社に置いてあるので、自宅から2CHに繋げている今は答えられない。
誰かPerlクックブック手元にある香具師いたら見て、変わりに答えておくれ。
>510 ありがとうございます。 小数も平気みたいですね。 自分には原理がまだ良くわかってないんですが。
$_="1/2.69**3"; print "$_=@{[eval($_)]}"; こんなんも出来るんか。
510なら${\( )} でよくないですか? まぁ@の方が拡張性あるとは思うケドね。
どう違うの?
$[\( )}や${\do{ }}のほうが@{[ ]}より若干高速だし、メモリも少なくてすむ。 まぁ、単純なものならsprintfでいいと思うけどね。
${\( )}の\ってなんで必要なんだろう。
なんでprint "$a+$b=",$a+$b;やprint "$a+$b=".($a+$b)を嫌がるんだろう さっぱり分からない。
ヒアドキュメントとか。
>>517 ${} の中身を(スカラー)リファレンスにするため。
あ、デリファレンスの${}なわけか。産休
普通にこう $a=1;$b=2; printf ("\$a + \$b = %d",$a+$b);
""の中の変数が勝手に中身に置き換わって不思議〜、 というのを式でやりたいだけなのでは
どういうデメリットがあるから何を避けたいのか、 というのが質問からさっぱり読み取れない
おじいちゃんの遺言なので。
そういうのをやってみたいだけじゃない?実用性はともかく。 みんなで質問者の知的好奇心を満たしてあげようじゃないの。
式が不定で実行時にevalする必要があるならともかく、 最初から決まってるなら、それを文字列の中に入れる メリットは無い、というかフィロソフィーがおかしい
>>528 もしそうなら隔離板のWebProg板で聞いてほしいな。
このスレが6になるのとperlが6になるの どっちが早いのですか?
実はこっちが隔離板
>529 真の正解は print "1+2=3"; だと言いたいのだね。
"Perlクックブック"という本がこのスレではよく出てきますが、 その本は丸っきりの初心者向けでは無いようなので質問します。 Perlをまったく知らない状況から勉強しようとして本を買うなら、 最初歩としてはどの本が良いのですか? なるべく分かりやすく、飽きにくいものをお願いします。
>>528 rubyではできるからperlではどうなのかと思ったとか
a=1
b=2
print "a+b=#{a+b}"
確かに、変数を中身に変換してくれる機能がありながら、 それが不十分である為にprintfに切り替えたり、 予め別変数に書き出しておいたり、という作業が入るのは 言語としてちっとも完備していない でもそれがperl
確かに不十分かもしれんが、リファレンス使えりゃ問題無い
>>510 my $a = 1;
my $b = 2;
print "$a+$b=${\($a+$b)}\n";
こっちのほうが
>>536 に近いかな。
540 :
デフォルトの名無しさん :03/07/02 01:23
なんで /^.*$/ が文字列全体にマッチしないんだ〜〜?
541 :
デフォルトの名無しさん :03/07/02 01:27
というか、 ^ と $ を同時に指定できない理由はあるのでしょうか?
意味不明、同時に指定できるだろ?
>>540 取り敢えず . は改行にはマッチしない。
なお、「.*」の場合、最長マッチなので ^ と $ は全然いらない。
そもそも、この記述を使いたい意味が全く分からない。
> ^ と $ を同時に指定できない理由はあるのでしょうか?
同時に指定できる。
取り敢えず、正規表現の動作を理解してから出直して。
ああ、書き忘れたけど、 m/^.*$/ これは !(m/\n/) これとほぼ同義。
>>544 ダウソ。DOS改行の場合とか・・・。mいらんよ。
俺はふつー m 付けます。 デミリタの定義を目視出来るからね。 perlの改行(\n)は、システムにおいて意味合いが変わってくるのでDOSだからどーこーなる事はありません。
547 :
デフォルトの名無しさん :03/07/02 20:24
$cmd = FileHandle->new( "|command" ); print( $cmd "hogehogehoge" ); ... でコマンドにパイプでデータを流し込んでコマンドの実行結果を得るには どうしたらいいですか?
>>546 CSVファイルの中身がそのスクリプトを動かしているシステムに合った改行コードとは限らない。
今回の場合は決めてあるのかもしらんけど。
>>548 別のスレと激しく勘違いした
_| ̄|○
>>547 IPC::Open2/IPC::Open3を使う。
ただしいとも簡単にデッドロックしてしまうため、素人にはお勧めできない、
というようなことがドキュメントに書いてあるので注意されたし。
小数点以下第2位までの数値を得たいのですがどのようにすればいいでしょうか? a=12.34567
初手からperlでない
>>551 int(($a/100)+0.05)*100で出るかな? 適当だけど。
>>553 誤爆。四捨五入じゃないのか。'sprintf'を使えば?
>>553 解決しました。
ありがとうございました。
print sprintf('%.2f', $a);
557 :
デフォルトの名無しさん :03/07/04 03:45
Windows2000 ActivePerl5.8 ですが setsockopt(SOCKET,SOL_SOCKET,SO_RCVTIMEO,30)が成功しません
>557 あーそうですか。 報告ありがとうございます。
>557 乙〜
560 :
デフォルトの名無しさん :03/07/04 10:24
win環境でperl使ってポーリングしたいと思ってるんだけど、 一般的な方法ってありますかね? ユーザーが意図してポーリングの開始、終了を制御できるようにしたいんですが。。。 サービスとして実行させようにもアプリケーションじゃないとだめそうだし。。。 どなたかいい方法知ってる方いらっしゃいませんか??
何をポーリングするんだ?
油田
鼻の穴
ケツ拭くといつも赤い
ストライク
ポーリングって、燃焼系〜燃焼系〜アミノ式、のアレ?
指ぱっちん
自分の質問のせいで荒れてしまってスイマセンでした。
気にするな。
荒れてない。 なんとなくネタスレになっただけ。
572 :
デフォルトの名無しさん :03/07/06 19:50
perlのCPANを使うときの最初に設定をするでしょ? そのときの地域選択のときに候補が上がってこないんだけど、どうしたらいいの?? 数字を入れても起こられるからまぢわからんです。
573 :
デフォルトの名無しさん :03/07/07 01:48
実効ユーザーID実効グループIDを表示させるCGIはどうするの?
574 :
デフォルトの名無しさん :03/07/07 01:49
すいますぇん。板違いでした。
質問です。当方あまりperlについて詳しくないので初心者でも分かるよう ご教授いただけるとありがたいです。 トップページがCGI(top.cgi)でそこにアクセスするとURLを変えないまま 実際はA.shtmlを表示させています。 そのA.shtmlにはSSI式カウンタが設置してあります。 普通にA.shtmlを表示させればカウンタは表示できるんですが top.cgiからアクセスしてもカウンタが表示されないで困ってます。 ○A.shtml→SSIカウンタ=見える ×top.cgi(A.shtml)→SSIカウンタ=見えない そのSSI式カウンタの設定では相対パス絶対パスも全て試しましたが 表示されません。なにか表示できる方法はありますでしょうか? そこから先に進めず困っています。よろしくお願いします。
Perl関係ないし
>>576 すいません・・このような質問はWEB制作板とかのほうがいいんでしょうか
はい。
579 :
デフォルトの名無しさん :03/07/07 06:50
perlで階層化されたデータ構造って作れますか? 例えばHTMLのエレメントの構造の様なものを記憶しておきたいんですが。 (HTMLを読みたいというわけではない) ・・・ぶっちゃけた話、LISPのS式(そのものじゃなくても良い)を perlでも扱えないかと。
>>579 アルゴリズムの問題じゃない。
lispでできてPerlにできないことなんてないでしょ。
この場合は、フラグ処理が適切と思われ。
開始タグと終了タグの個数を差し引きして、階層を作る。
582 :
デフォルトの名無しさん :03/07/07 13:50
Windows2000 ActivePerl5.8.0を使用しています。 -Vオプションで設定を見ると 「usethreads=undef」となっているのですが、 これを有効にする方法はありますでしょうか?
>>582 Perl のソース拾ってきてコンパイルし直し。
584 :
デフォルトの名無しさん :03/07/07 18:13
>>579 [$a,[$b,[$c,[$d,]]]]ってのはどう?
scalar( %hoge )の返り値は何?
まだ良くわかっていませんが、多分
>>581 さんのリンクの
perlref の仕組みで大丈夫っぽいです。
厳密にリスト構造を似せる必要はないので。
流し読みした感じでは、perlobjというのでもよさそうです。 ありがとうございました。
[sub{},[sub{},[sub{},[sub{},undef]]]]; LISPしっかり使ったこと無いので何ともいえないけど・・・ [     &{sub {         my ($data,$data2);         my $func;         $func=sub{         };         return $func;     }},undef     ] ]; クロジャー組み合わせたりもできるし・・・ どんな使い方できるかは分からないけど面白いことできるかも。
>>588   じゃなくて が正式な(後ろにセミコロン)。
Janeだと正式な書き方しないとそのまま表示されてしまうので
591 :
デフォルトの名無しさん :03/07/08 00:37
perlスクリプトで認証サイトの画像をダウンロードしたいのですが
とってきた画像ファイルの上にヘッダ情報がテキストで入ってしますのです。
こいつを取り除く手っ取り早い方法おしえて下さいお願いします。
#!/usr/bin/perl
use LWP::UserAgent;
$url = "
http://aaa/aaa.jpg ";
$id = "namae";
$passwd = "password";
$ua = LWP::UserAgent->new;
$req =
HTTP::Request- >new(GET => "$url");
$req->authorization_basic("$id", "$passwd");
print $ua->request($req)->as_string;
s/as_string/content/
593 :
デフォルトの名無しさん :03/07/08 00:55
592さん かたじけない!
594 :
デフォルトの名無しさん :03/07/09 10:47
WindowsでPerlやる場合、 cygwinの使うのとwin用の使うのの利点、欠点教えて
ActivePerlのほうがいいよ。 ppmでモジュール管理が楽。
windowsのインターフェースがなぁ。command.comとか cmd.exeとか使いにくいから、cygwinの方がイイ! ま、簡単なことやるなら、copalなんか使う手もあるが。
>>595 「ppmモジュールねぇよ」
って怒られること多くない?
どうせ perl -MCPAN すりゃ同じだし
system()とか`` 考えるなら、断然cygwinだな
Cygwinの方がいいだろ
system() になにか違いがあるんですか?
>>599 偉い人じゃないから、system()自体の違いは知らんけど
Windowsだったら system('echo hoge'); とか @list=`ls`; とかできないじゃん
両方イレトケ bash上でActivePerl使うのが楽 どっちかでしかコンパイルできないmoduleもあるし
両方入れてるが、PATHとかで無駄にはまる時あって初心者にはオススメできない 分かってるならいいんだけどね
PATHは優先順位さえ覚えておけば問題ないんじゃないの? オレッチはCygwin入れるときPerlは入れないでActivePerl入れてる。
凝ったことをしたいなら、linuxを入れる winからperlを便利に使いたいだけならActivePerl
cygwinからActivePerlが最強。
ActivePerlのが気楽だし、個人でCGI作る程度ならそっちのがいいかと。 UNIXコマンドを使うようならcygwin...ってかUNIXいれろ、と。
perlを比較しているのにbashが便利wwwとか言ってる椰子は香具師
椰子は香具師 椰子は香具師 椰子は香具師 椰子は香具師 椰子は香具師
純粋にどう勘違いしていたのか気になる > 椰子は香具師
610 :
デフォルトの名無しさん :03/07/09 21:54
perlってなんてよむんですか?
ピィール
ぺるる
ピロリだろ。初心者を騙すなよ。
>>609 俺の予想: 彼は「香具師」をいわゆる「厨房」の意味と思っており、
「ヤツ」の変化の歴史を知らなかった。
ありえない: 実はネタである。
こうぐしでも変換できるし、なんか香ばしい輩の ことだと思っちゃったんだろうなあ
ピーナスだよ
618 :
デフォルトの名無しさん :03/07/10 04:22
掲示板作りたいんですが、Activeperl5.8って無料なのですか?英語わけわからない。 後、ダウソする時のメアド記入欄ってちゃんとしたメール記入した方がいいのですか? なんか怖い
>>618 英語がわからない人がプログラミングをするとこは法律で禁じられています。
>>607 が大アフォということで決着。
Perlを使う環境がPerlそのものと並んで重要なことくらい
分からない
>>607 は・・・
大事だけど。でもそれはperlの比較じゃないよね?
どーでもいいけど、そろそろコーティングやアルゴリズムの質問が見たくなった。
最後言わしてくれ。
>>623 、話の発端は、ActivePerlとcygwinPerlのどっち
入れたほうがいいでつか、っていう質問だっただろ。
そもそもPerlの比較じゃなかったんよ。漏れ、粘着?
> 英語嫁ないならどうせそのうち挫折するだろ エラーメッセージをコピペして 「どういう意味なんでしょうか……」
お前らも英語わかんないくせにーwwwwwwwwwwwww
分かんないけど、自分で調べるよ。
>>626 エラーメッセージコピペするのは質問者として非常に正しい。
ダメな質問者は 「何かエラーが出て動かない」 としか言わない。
>>629 そのまえにエラーメッセージでググッてみるとなお良い。
perlでgetaddrinfo関数って使えないの?
>>632 サンクス
やっぱそれか
ppmないからな〜winVC6でコンパイルできるのかしら
634 :
デフォルトの名無しさん :03/07/11 14:48
マシン構成: Win2000 ActivePerl 5.8.0 これでマルチスレッドを組むことは可能ですか??
635 :
デフォルトの名無しさん :03/07/11 19:06
リソースファイルを編集するスクリプトを書いています。 「\」が長すぎる行をコンソール上で見やすくするために、行の末尾に、次の行に 続くの意味で使われいます。 例) aaa = bbb , \ zzz = ddd → aaa = bbb , zzz = ddd と同じ意味。 これをうまく処理するためには、どんな感じにするのがよいでしょうか。
{ local $/ = undef; $text = <STDIN> ; } $text =~ s/\\\n//gd ; 私はこんなのとか、$/ = " \n" ; とかしか思いつかないのですが、 もうちょっと軽い感じにできないかと。
まぁまぁ、636見りゃやりたい事は分かろう 日本語意味分かんないから放置するけどな
なんかsearch.cpan.orgの色が変わってるけど、どうしたんだろう。
>>641 あれま。見落としてた。
色の権利か〜。面白い事考えるなぁ(笑
643 :
デフォルトの名無しさん :03/07/14 10:24
※code-A for(@array) { /deleted/ && 配列からその要素を取り除く } という処理をしたいのですが、 splice で配列のoffsetを指定する必要があるので ※code-B for(my($i=0);$i<scalar(@array);$i++) { $array[$i] =~ /deleted/ && splice(@array, $i--, 1); }} こういうながったらしい書き方になってしまいます。 cod-he-A のような書き方でやれないでしょうか?
code-B で閉じ括弧二重タイプしてしまいました。
for(@array) { /deleted/ && push(@new, $_) } ちょっとせこいケド。
あぁ、除くのか。 && を or にしといてください(´Д`;)
@array = grep { not /deleted/ } @array 何度もすいませんw
for(@array) { } @array = grep{!/deleted/} @array; はダメ?
かぶった(´Д`)
o000O (⌒⌒) ヽ ( (_) O000o (⌒⌒) ) / (_/
activePerl5.8.0を使っている者です。 並列処理(Thread)を使いたいのですが、どなたか使われた方いらっしゃいませんか? 簡単なサンプルソースを見せていただきたいのですが。。。 初期化すらままならない状態でして。。。
駄目だろ、普通。
動かなくは無いけど、スレッドのリリース処理が上手く出来ない状態。
#!perl use threads; use threads::shared; use Win32; my $global : shared =0; sub Func { my ($tmp)=@_; my $tmp2="0".$tmp; $tmp2=~s/(..)/$1/; $tmp*=100; foreach(0..10) { { lock($global); $global.=$tmp2.'::'.($tmp*$_)."\n"; } Win32::Sleep($tmp); } } @t=(); foreach(0..10){ $t[$_]=threads->new(\&Func,$_); } foreach(0..10){ $t[$_]->join; } #print "exit $global\n"; print $global;
テスト用のものの域出てないけど基本的に全ての変数はスレッドローカルになり my $name : sheard; でスレッド間で共有する変数は作る。 制限としてリファレンスとかが使えなかった気がする。 これ以上知りたかったら自分で調べるか実験するかしてくれい。 まあほかに試した人いたら聞きたいけど。
shared
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
>>654 ありがとうございます。
サンプルソースをベースにもう少し調べてみようと思います。
何かわかれば報告いたします。
perlを1からやりたいんですけど、エディッタってメモ帳とかでいいんですか? それとも専用のエディッタが必要ですか?
>>659 メモ帳でもイイ!
専用のエディタがあればもっとイイ鴨
とどのつまりは自分自身が使いやすいほうを選ば吉
>>660 ありがとうございます!
とりあえず、ワードパットでやってみます。
無理っぽかったらフリーソフト・・・。
限界が来たら専用エディッタ買ってみます
Win->xyzzy以外ありえない Unix->vi,emcas
>>661 ワードパッドはどうかと思うがな……。
フリーソフトの開発環境なら「Perlを始めよう!」とか「Copal」があるな。
まぁ最終的にはテキストエディタに落ち着くわけだが、
これから始めるんであれば試しに使ってもいいと思う。
E(G) = ω1 ∪ ω2
ワードパッド使うくらいならとりあえず秀丸にしとけ
>>666 秀丸はシェアウェアだから、『とりあえず』で選べるものではない。
...とか言ってみるtest。
いまどき秀丸をすすめてる奴って何を根拠にすすめてるの?
秀丸はシェアウエアだが警告無視すればお金払わずに使えるとか誰かがいってなかった と言ってみるテスト。
学生とかフリーウェアの作者なら無料とかなかったか?
672 :
デフォルトの名無しさん :03/07/16 12:06
age
673 :
デフォルトの名無しさん :03/07/16 12:16
>>671 要登録
Perl用強調表示などもあるので選択肢の一つとしてはアリだと思うが…
そんなことよりエディタを制御するスクリプトがPerl風のエディタない?
ActivePerl5.8.0なんですが、Win32::APIライブラリを使えば 全てのWin32APIが使えるんですか??
>>674 というよりは、DLL内の関数を呼び出すモノ。
Win32:;APIの使い方は解っても、APIの仕様がわからないと使いにくかったりするんだけど そこらへんの解説をしてる所って殆ど無いね・・・
Iriaというダウンロード用のツールが独自のAPIを持ってて、 うまくすると多分perlから使えるんだけど、 どうやればいいのか判らない
678 :
デフォルトの名無しさん :03/07/16 16:18
$c = [\ 'c']; この¥ってなんですか?
680 :
デフォルトの名無しさん :03/07/16 16:35
> この¥ってなんですか? リファレンスを求める演算子 $ref=\'c'; print "$$ref\n";
681 :
デフォルトの名無しさん :03/07/16 16:51
難しいねえ
掲示板なんかで、引用符「>」「>」から先の文字の色を変えるにはどうしたらいいですか?
>>684 Perlのコーディングと関係ないよ。
正規表現スレで聞いてみたら?
>>676 Win32APIの仕様ならMSDN見るしかあるまい。Perlの範疇を超えている。
>>677 Iriaは忘れたがIrvineは doc\api.txt というファイルに仕様が書いてあるな。
まぁ、ActiveXなんだが。
perlappで実行ファイルにコンパイルしたいのですが やり方が分かりません どなたか解説お願いします
レベルが低すぎて笑えるw
もう次刷れたてんなよ
>>1
Win32::APIの話なんかは別にレベル低くないと思うんだが。 まぁAPIに限れば、スレ違いかも知らんケド。 さて、APIリファならASCIIの『Win32API オフィシャルリファレンス』がオススメでつ。
696 :
デフォルトの名無しさん :03/07/19 15:08
教えてください. 自分の3Dソフトのオブジェクトをパイソンスクリプトでなく Perlで一括操作したいと考えています. 3Dに限らずソフトSDKを使って,Perlを実装する話などの 書籍・HP等ございましたら,ご紹介願えないませんでしょうか. よろしくお願い致します.
>>696 man perlxs perlxstut
>697さん 該当3DソフトようのPerlインタフェースPlug-inモジュールを 作るってことでしょうか?
考えてみると,Perlのデータ型と3DソフトのSDK(C++)の データ型を正しい受け渡しと3Dソフト側のオブジェクトの 生成・廃棄を自分でやっているだけですよね...多分
700 :
デフォルトの名無しさん :03/07/19 16:06
702 :
デフォルトの名無しさん :03/07/20 01:20
Win32::APIについて先月号のハッカージャパンの 大人のスクリプト講座で詳しく説明してたな。 俺はそれだけの理由で買った。
ハッカージャパンか 面白そうだな
立ち読みしてきたけど何も載ってなかった。 って、先月号かよ_| ̄|○ 先月までは何やら色々やってたみたいね。
ごめん今見たら5月号だから先々月号だね。
PC書籍の専門店は割とバックナンバー置いてるから 諦めずにGO で、どんな内容?
perlで書いたスクリプトをコンパイルするにはどうしたら。。 perlcc使ってみたら Note(probably hermless)No library found for 'kernel32.lib' とかいうのが10行くらい出て さらに 'cl'ゆーコマンドはありまへん とMS-DOSが抜かすわけだが。。 D以下にインスコしたのがいけなかったのか??
Win32::APIのVer0.40を使った 「Susieのプラグインを使った、画像をBMPに変換するコンバーター」 の作り方とかが載ってます。
このスレ読んでると頭痛がして来る。 インターネットは義務教育が終わってから、とか規制してくれないかなー…
おお。結構使えそう。
>>708 perl filenameとしてくださいね^^;
714 :
デフォルトの名無しさん :03/07/22 14:28
system関数と`(バッククォーテーション)の違いを教えてください。
715 :
デフォルトの名無しさん :03/07/22 14:44
しばらく見ないうちに白痴化している……
>>709 ほほー、なかなか面白そうだな。
そのうちバックナンバー探してみるか。
>>714 $sys=system('ls');
print $sys;
$back=`ls`;
pritnt $back;
やってみそ。
718 :
デフォルトの名無しさん :03/07/22 20:14
'ls' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
722 :
デフォルトの名無しさん :03/07/22 23:08
jpegやGIFの画像を受け付けるCGIで、uploadされてきたファイルを 適正なサイズにリサイズして格納したいと思っています。 これは不要に大きなファイルを送られてサーバが圧迫されるのを 防ぎたいのですが、調べたら利用中のサーバにGDがインストールされて いましたので、これでできるのかも、と自前のテストサーバにも、 GD1.19をインストールしました。(サーバはGD1.18です) そもそもGDでこんな事は可能なんでしょうか。 またそんなGDの使い方があるサイトとかありませんか?
調べてからインストールしろ。
727 :
デフォルトの名無しさん :03/07/22 23:57
マルチポストで申し訳ありません。こちらのほうが適切かと思いカキコしました。 行の折り返しに挑戦しています。 format や Text::Wrap を使ってみましたが 文字化けして上手くいきません。 解決方法がありましたら教えて下さい。 参考になるサイトがありましたらよろしくお願いします。
>>726 CGIはCGIだよ。gdはライブラリ。
GDはGD.pmって言ってperのモジュール。
でperlで書いたCGIスクリプトでGD.pm経由であんな事がしたい、
って事ですが、ここはもっと話題が限定的なんですね。
了解しました。
>>726 この場合、「CGIについての質問」ではないと思うのだが?
背景として説明してるだけでしょ。
ここはム板だし、スレの流れをCGIに向かわせないために
ここではCGIという単語は一切出さない方が良い。
>>722 の質問でもCGIに言及せずに書ける。
722がスレ違いじゃなくても、それに釣られてスレ違いの質問が増えてくるだろ。
>>731 もういいよ、そっとしといてやるから気にすんなよ。
フォントデータらしきファイルがあるので、 解析しようと思って、bmpファイルに変換したいけど、 bmpのデータ構造が少し厄介なので、 そのへんを面倒見てくれるモジュールはありますか?
>>730 「夏」ということで、過剰反応する香具師がどんどん増えるので、、
735 :
デフォルトの名無しさん :03/07/23 16:29
質問なんすけど。 全角文字・半角文字の文字数をカウントする関数を作ったんですが local($s) = @_; local($l) = length($s); $s =~ s/[\x81-\x9f\xe0-\xfc].//g; local($zl) = ($l-length($s))/2; ($l-$zl*2,$zl); ↑こんなやつ 引数の文字列のなかに半角文字が入ってないにも関わらず 半角文字が検出されるようなパターンが発生するかどうか知りたいです。 アフォっぽい質問ですがよろしくおねがいします。
737 :
デフォルトの名無しさん :03/07/23 19:37
よければ教えてください。 chompを使ってテキストの改行を取るコードを書いて、 以前はきちんと動いていたのですが、 別サーバーでやったら、改行が取れなくなりました。 もとのテキストは、自分で編集したテキストファイルです。 perlは5です。 理由がわかる方はいらっしゃるでしょうか? もし、ここではしていけない質問だったらすいません…。
ま、CGIという文字列にマッチした瞬間に顔真っ赤にさせて
必死になってる
>>726 みたいな香具師はお前が出てけよ。な?
>>737 s/\x0D\x0A|\x0D|\x0A//g;
もしくは
chompを二回やるとか。
737です 739さん、ありがとうございます! できました。 以前はきちんと動いていたので、理由がわからず困っていました。 とても助かりました。 「chompを二回」も試してみたのですが、こちらはダメでした。 ともあれ、ありがとうございました。
741 :
デフォルトの名無しさん :03/07/24 01:35
Perl6はParrotというVM上で動くとの話だけど、 そのParrotを作るのに手間取ってなかなかPerl6開発が進まないんだよね? わざわざ新しいVM作らないでJavaのVMで動くようにすればいいのに。 そうすれば携帯とかもっと色々なプラットフォームでPerlが動くと 思うんだけどどうよ?
>>741 確かに便利だな
しかし、そうするとPerlじゃなくてJavaを使う罠
>>742 既存のPerlリソースがJavaVM上で動いたり、Perlソースから
Javaオブジェクトが使えたりするのは、有意義かもな。
Apache-BSF
http://jakarta.apache.org/bsf/ スクリプト言語とJavaBeansのインターフェイスを簡単に作れる
基盤は、IBMがApacheに寄贈してくれている。誰か作ってみそ。
>>741 Jythonつかえヴぉケ てめーが考えるようなことはすでにPerl6以前にやってんの JPLっていうのんで結局開発はとまった PerlはCISCにのっとったOP命令が多い言語 JavaはRISCにのっとったOPが少ない言語 このふたつをまぜこむのは大変なの てかparrot<−>JVMはある ぐぐれや夏厨が あげんな 責任もって このスレ削除してこい
なんか全角記号を使ってる時点でかなり厨っぽいな
たぶん上司に同じような口調で怒られて 自分でもどなってみたくなったんだろ
Perlでアラームを短くプッって鳴らすにはどうすればいいの?
短いアラームのwavファイルをsystemで鳴らす
print "( ´,_ゝ`)プッ";
print "\a"; これで鳴る
\aではプーになってしまいます。そこをプッにしたいのですけど、 どうやったらいいのでしょうか?
いちいちウィンドウを出さずに、音だけ鳴らして 終了してくれるwindowsアプリを紹介して下さい
>753 板違い過ぎ
外部アプリ使わなくてもwindows標準でそういう機能無かったっけ 普通にアラーム鳴らす時に自分が使ってる奴
サウンド関係はマザーボードについてるブザーしかないですが、 wavファイルでも大丈夫でしょうか?
,.、 .,r.、
,! ヽ ,:' ゙;.
! ゙, | }.
゙; i_i ,/ ,.、 .,r.、
,r' `ヽ、 ,! ヽ,:' ゙;.
,i" _, ._ ゙; ! ゙;; }
!. ・ ・ ,!. ゙; ii ,/
ゝ_ x ,::'' ,r' `ヽ、
(^ン''`'''''''''''''' 0∞o。 i" _, _ ゙;
`"! ( ::) ∧ !. ・ ・ ,! ←
>>747 ゙'ンーr-‐-'") / < >ゝ_= x _::'
(__ノ (_,ノ ∨ /`''''''''(⌒';’∵∴;;゙
(⌒ヾ;;, `ソ :‘
゙゙`ヽ、、、__,,ノ゙
もうプ〜で我慢します。
あのぷーの長さは誰が決めてるんだ? 鳴ってる以上、普通にドライバがあってどっかに 指令出してるんだろうけど。
フロップーのギコギコ音で我慢しる。 open("A:\\GIKOGIKO") while(1);
Win32::APIを使って再生してみるってのはどうよ。 ……って、Windows限定でいいんだっけ?
それならWin32::Soundでよくないか?
perlスクリプトってWindowsのサービスとして登録して、 開始とか終了とかできちゃう?無理?
>>766 exeなんかをサービスとして動かす方法があったような気がした。
win系の板で聞いた方がよさげ。
770 :
デフォルトの名無しさん :03/07/26 17:46
ファイルをオープンできなかったときメッセージを表示するには これでいいんですか? $file_open_flg = open(IN,"<datafile.csv"); @lines = <IN>; close(IN); if($file_open_flg==undefine){ print "ファイルをオープンできません"; }
771 :
デフォルトの名無しさん :03/07/26 17:47
>>770 無条件に読み込んでいるようですが、なんのために戻り値を受けているんですか?
>>770
#TYPE1
if(!open(FILE,"file0.txt")){
print "NO\n";
#exit
}else{
print "OK\n";}
#TYPE2
open(FILE,"file0.txt") || die print "NO\n";
あいかわらずレヴェルの低いスレだ
泣きそうだ
>>1 を10000回惨殺したい
ていのうどもはphp板に引っ込んでろ
そうやっていちいちテンポラリの変数の名前を 考える労力を使わないのがperl風
>>774 >あいかわらずレヴェルの低いスレだ。泣きそうだ
ワロタ。
でも、まぁ、良いんじゃない。
良くわかってなくても取り合えず動いちゃうのがPerlで、
そこが魅力でもあるんだから。
770もガンガレな。
#TYPE2 open(FILE,"file0.txt") or die $!;
eval { open(FILE,"datafile.csv") || die($!); @lines=<FILE>; close(FILE); }; if($@) { die($@); }
低レベルなのに、なぜか、CとPerlで同じ、すごい簡単なプログラムを書いて どっちが楽か考えてみるべ。という話になりました。 何でもいいんですが、半径入れたら面積でるとか、全部半角にするとか いや、ちょっとこれはいくら何でも簡単すぎるか、、。 どんなプログラム書くことにしましょう。 もちろんPerlに有利な(汗)
アルゴリズムの部分では、Cもperlも変わらないような Lispとかまで行くと違ってくるけど perlはCから面倒な部分を極力取り払った感じ
>>779 こういうのを作らせるのが一番Perlらしさが出るんじゃないかな。
perl -ne '/(if|while|for|switch|case)\b/ && print' hoge.cpp
正規表現の部分は色々変えて。
正規表現とハッシュだろうな。
/⌒ヽ / ´_ゝ`)時間的に、ここ通らないと行けないので、通りますよ・・・ | / | /| | // | | U .U
こいつの顔、まるで死神だな。まさか、死出の旅へ。
>perl -ne '/(if|while|for|switch|case)\b/ && print' hoge.cpp これって何をやろうとしてるの?
egrep '(if|while|for|switch|case)\b' hoge.cpp と同じ。
787 :
デフォルトの名無しさん :03/07/29 21:56
質問です。 現在OSはWIndows98SEで、AcrivePerl5.8 をインストールして Perlが正常に動作いたしました。 ところがopen関数で外部ファイルを読み込もうとすると失敗してしまいます。 具体的な例だと、 $pepfile = 'proteinseq.log'; open(PROTEINFILE,$pepfile); $protein = <PROTEINFILE>; print "$protein\n"; をMS-DOSで実行すると readline() on closed filehandle PROTEINFILE at script/4-5.pl line 11. となってしまいます。 ファイル名は間違っていません。 なぜ開けないのでしょうか? ちなみに、これにHTMLのヘッダーをつけてCGIとしてブラウザで実行すると proteinseq.logをちゃんと読み込んでくれました。
788 :
ぼるじょあ ◆yEbBEcuFOU :03/07/29 21:58
>>787 とりあえずopenの戻り値は必ずチェックしろ
789 :
デフォルトの名無しさん :03/07/29 22:01
↑ line 11とは$protein = <PROTEINFILE>;の部分にあたります
>>788 ごめんなさい。初心者でして、戻り値のチェックとはどういうことですか?
791 :
ぼるじょあ ◆yEbBEcuFOU :03/07/29 22:06
>>790 うーん・・・
open(PROTEINFILE,$pepfile);
print $!;
とやってみな。多分それで原因が分かる。
unless (open(PROTEINFILE,$pepfile)){ print "ファイル $pepfile は開けませんでした。"; exit; } としてチェックを入れるとやはり ファイル $pepfile は開けませんでした。 が実行されてしまいます。 ファイル名は絶対に間違っていません。 このファイルとスクリプトは同じディレクトリにあるのですが、 ディレクトリの指定の仕方がまちがっているのでしょうか?
>>791 ありがとうございます
#!/usr/bin/perl -w
$pepfile = '/proteinseq';
open(PROTEINFILE,$pepfile);
print $!;
$protein = <PROTEINFILE>;
print "$protein\n";
exit;
を実行したら
readline() on closed filehandle PROTEINFILE at script/4-5.pl line 8.
Use of uninitialized value in concatenation (.) or string at script/4-5.pl line
9.
No such file or directory
となりました。やはりディレクトリの指定法が間違ってるような気がするのですが
795 :
ぼるじょあ ◆yEbBEcuFOU :03/07/29 22:13
>>794 今度はなんでルートディレクトリからの絶対パスになっているんだ?
>>795 ごめんなさい。間違えました。
でも/つけてもつけなくても同じようです。
797 :
ぼるじょあ ◆yEbBEcuFOU :03/07/29 22:15
>>796 ファイル名も変わっているんだけど・・・・
アルェー
お! 絶対パスで指定したらできました! やはりパスの指定がおかしかったのですね。 でも相対パスではどうやるのでしょうかね・・・? いろいろご迷惑おかけしました。 ありがとうございました。 >>ぼるじょあさん
proteinseq.logってファイルは存在するのか? そんざいしてないファイルを読み込もうとしても、、、 あと なんで $pepfile = "proteinseq.log"; じゃないんだ?
>>797 ,800
proteinseqとproteinse.logを用意していたのです。
説明不足申し訳ありませんでした。
起動した時のカレントがどこかだな
>>802 そのようですね。perl.exeが置いてある位置からの相対パスだったようです・・・
違うフォルダにスクリプトファイルも読み込みファイルも置いてあったので
805 :
デフォルトの名無しさん :03/07/29 22:32
スクリプトと同じディレクトリじゃないのか!?
>>803 use Cwd;
print cwd(),"\n";
これで表示されるものがスクリプトのある場所とは異なる?
おっと、Perlを呼んだときにいるディレクトリだ(^_^;)
>>803 perl.exeとは別のフォルダにスクリプトと読み込みファイルが置いてあるという意味です。
両ファイルは同じフォルダです。
perl.exeがある場所が C:\Perl\bin
両ファイルは C:\Perl\bin\script
に置いてました。
>>808 実行するときに
C:\> perl C:\Perl\bin\script\protein.pl
とかやったんでしょ?
スクリプトのある場所に移動してからやらないとね。
810 :
デフォルトの名無しさん :03/07/29 22:41
>>1 Perlの奥深さについて皆で語り合い、追求してまいりましょう。
ヽ(・ω・)/ ズコー
\(.\ ノ
まあ、$LOGDIR = "/log" みたいに頭の方で定義して、 絶対パスで指定するのが結局楽だな
普通はperlのフォルダにpathを通して、実行はスクリプトのあるフォルダから やるもんじゃないのか?
/⌒ヽ / ´_ゝ`)時間的に、ここ通らないと行けないので、通りますよ・・・ | / | /| | // | | U .U
DES3で暗号化した文字列をファイルに書き込んで 復号化しようと読み込むと途中までしか読めないのは何が悪いんでしょうか? ちなみにどこまで読めてるのかなーとprintしてみるとピーとかビープ音が出ます。
>>891 コード晒せ
何のモジュールつかってるのか書けよ
2度使いまわすファイルなどは
書き込み用にopenしたファイルは必ずcloseしたあと
もういっかい読み込みようにopenするんだよ
てかopenしたらcloseすること
>>820 use DES::TripleDES;
open ( FILE_IN ,"< $file_in" ) ;
open ( FILE_OUT ,"> $file_out" ) ;
my $des = new TripleDES;
while ( $line= <FILE_IN> ){
print $line;
$content = $content.$line;
}
close ( FILE_IN );
#Encode
if ( $transaction == 1 ){
print FILE_OUT $des->encrypt3 ( $content, $pass );
}
#Decode
elsif( $transaction == 2 ){
print FILE_OUT $des->decrypt3 ( $content, $pass );
}
close ( FILE_OUT );
DESはCPANから拾ってきたやつです。
http://search.cpan.org/author/JLISHEV/WebTools-1.27/lib/modules/additionals/TripleDES.pm
>>891 そんなプログラム書いてると、FBIにマークされるぞ
これじゃだめか?ActivePerlだが #!C:/perl58/bin/perl5.8.0.exe #use DES::TripleDES;#(UNIXの場合) use Crypt::TripleDES;#(ActivePerl/ppmの場合) open(FILE,$ARGV[0]); read(FILE,$plaintext,-s $ARGV[0]); $passphrase="enigma"; my $des = new Crypt::TripleDES; my $cyphertext = $des->encrypt3 ( $plaintext, $passphrase ); my $plaintext = $des->decrypt3 ( $cyphertext, $passphrase ); print $plaintext
open(FILE,$ARGV[0]);#$ARGV[0]は最初の引数 $ARGV[0]にファイル名を入れる read(FILE,$plaintext,-s $ARGV[0]); #-s でファイルのサイズの取得、$plaintextにバッファを詰める >>ピーとかビープ音 うーんこれはもっとプログラムの勉強しようC言語とかアスキーコードとか
>>822 え?輸出制限はもうなくなったのでは?
>>824 それなら出来るんですけど一回ファイルに書き出して
それを読み込むと途中までしか読めないんです^^;
普通のファイルだと読めているので暗号化した文字列の問題なんでしょうか?
>>825 readで読んでも同じところで切れてしまいます。
C言語とかアスキーコードとかの勉強をするとビープ音が分かるようになるんですか?
binmode
>>827 解決、有難うございます。
ところでTripleDESって勝手に使っちゃいけないんですか?
バレなければいいんじゃない?
830 :
デフォルトの名無しさん :03/08/01 00:39
すみません、思いっきり初歩的な質問ですが2点ご教授願います。 $| = 1; これはどういう意味でしょう? print (pack 'H*', $1); これも意味が分かりません。 H*は16進数文字列 (上位ビットが先)、だと思うのですが、$1は1文字??? Pascalでのプログラミングは慣れているのですが、Perlは初めてなので どなたか教えてください。
831 :
デフォルトの名無しさん :03/08/01 00:43
>>830 $| = 1;
現在selectされている(初めはSTDOUT)をバッファリング無しに設定する。
$|=1;
$i=10;
while($i--){print '>'; sleep(1);}
これを$|の値が0の時と比べてみると違いが分かるかも。
832 :
デフォルトの名無しさん :03/08/01 00:44
×されている ○されている出力チャネル
すみません、830です。もう一つだけご教授願います。 my $data_format = 'Lff'; my $data_length = 20; syswrite FILE, $data, $data_length; この$data_formatの形式を教えてください。 解説しているサイトへのリンクだけでも結構です。
$data_format使ってないじゃん
>>835 man perlfunc で pack TEMPLATE のところ見れ。
つーかそれ以前にperlのマニュアルひととおり読め。
>>836 思いっきりお馬鹿な質問の書き方してスマソ。
引用をとちってました。使っているのは
my $data = (pack $data_format, $time, $a, $b);
です。
>>837 だよな。本来だったら回線切って逝ってこなきゃいけないよな。
これだけ聞いたらもうご迷惑は書けないのでスマソ。
ぐぐってもローパスフィルターしか出て来ないんですよ。
>>838 ゴメン。今「はじめてのperl」の到着待ちっす。
ごめん。分かった。 符号無しLongと単精度浮動小数点のことだったみたい。 回線切って逝ってくる。
841 :
デフォルトの名無しさん :03/08/01 13:43
age
(^^)
844 :
デフォルトの名無しさん :03/08/03 17:17
WindowsでPerlを使ってシリアル通信をしたいんですけど、 (具体的には携帯電話のメモリ読み書きなど) どうやればいいんでしょうか?
ドライバとモジュールを用意して、ファイルのように読み書き
open(AUX,">AUX"); select AUX; print "ATD110\n";
>>845 ドライバというのはシリアルケーブルのドライバのことでしょうか?
モジュールとはPerlモジュールですか?
>>847 AUXというのはシリアルケーブルにつながれた携帯電話を示すのでしょうか?
>>847 →
>>846 でした。
print "ATD110\n";
というのは110番に電話をかけるということかな?(w
読み書きする方法を確立するのはperl以前の話だし、 読み出した後のデータフォーマットの扱いは 既にperlの話ではないし
>>844 まずググったのか?CPANでモジュールの検索をしたのか?と小一時間.........(ry
851 :
デフォルトの名無しさん :03/08/04 12:18
>>851 CPANにWin32-SerialPortというモジュールがある。
それをインストールして試せ。 インストールの仕方を聞くなんて野暮はすんなよ。
そのドキュメント読んで使い方を理解しろ。 英語は苦手なんて泣き言はいうなよ。
成功を祈る。
つかレス読んでると通信自体が分かってないようだが。Perl以前の問題だな。
>>853 >Perl以前の問題だな。
ホー、コンピュータ全般に通じてらっしゃる方は言うことが違う
×言うこと ○仰ること はい、もう一度
>>854 「でばいすふぁいる」ってしってまちゅか?
>>855 ご指摘感謝、謝々。 では、改めて
ホェー、コンピュータ全般に通じてらっしゃる方はホザクことが違う
コンピュータ全般以前に、目的と手段の区別が付いてない。
>>854 何言ってんだ?通信路さえ確保できればあとは言語に関係ないだろう。
逆切れすると誰も答えてくれなくなるよ。
>>859 これは、これは。全知全能のカビ様。
あバレな私めをお救いくだざいましぇ(ケケケ
>>859 お偉いさんの発言だね。うふ。
素人がカラスの時の苦労がわくぁんねぇだろな。
なんかバカがくやしがってるな。(ケケケ
南下、歯応江のないスレ 馬鹿は馬鹿なりに頭いいと思い込んでるんだろな
>>863 >>6
PerlはWEBプログラム言語かよ・・・狂ってるな
PerlはShellScriptの代わりだよ。 今時WebProg板にスレがあるのがおかしい。後方互換のためにあるようなもんだ。
まあ、ここは隔離スレなんだがな
>>852 了解です。Win32::SerialPort使うことにしました。
ActivePerlではPPMに対応してないみたいですが、
見た感じPurePerlなのでそのまま使おうかと思います。
英語は何とか翻訳しつつできると思いますが、
>>853 の言うとおりシリアル通信についてほとんど知識がないので
まだ使いこなせないかも・・・
869 :
デフォルトの名無しさん :03/08/05 16:32
( ^▽^)<女の子理解してよ〜♪(ボエー
>>868 Win32-SerialPortはWin32-APIを使ってシリアル通信関係のAPIをPerlで
使えるようにしたモジュール。->要インストール、Win32-API
だから、「Windows RS232C API」とか「Windows シリアル通信 API」などを
キーワードにしてググればperl以外でのAPIの使用例がヒットするはず。
参考になると思う。 ガンガレ!
874 :
デフォルトの名無しさん :03/08/06 09:10
>>870 ありがとう、がんばります!
といいたいところだけど、理解してないから聞いてんだけどなぁ。
つーか使ってるんじゃなくて使おうと思ってるだけだけど。
まあ、それはいいとして「perl 名前空間」というキーワードでぐぐってみたらExporterの使い方に問題があたかもしれない。
上記URLサンプル
@EXPORT = qw(Tashizan);
私的改訂版
@EXPORT = qw(tashizan);
数字の文字列があるとして(可変長) それを初めてある数字が出てくる場所から文字列の最後までに切り詰めるにはどうすれば? 例) 123456789というのを 初めて5が出てくるところから最後までの 56789に切り詰める(置換する) s/(5\d+)$/$1/ とやったら全部まるまるマッチしてしまう・・・
置換対象の数字ですが 「初めて」の数字が先頭に来ることもありますし、最後の1文字(1桁目)だけになることもあるし 文字列に複数回出現することもあります
s/(\d*)5/5/なんてどうよ
s/(5\d+)/$1/ じゃだめ?
>>876 ちなみにそれ、「全部まるまるマッチしている」わけじゃないよ。
マッチしているのは"56789"の部分だけ。
"123456789"の中の"56789"を"56789"に置き換えた結果が
元の文字列と何も変わらないのは当然のことだよ。
$1をなにかに代入
>>876 $num = 123456789;
$num = substr $num, index($num, '5');
置換でやるなら $num =~ s/^.*?(?=5)//;
$num = s/^[^5]*//;
>>880 あ、そうですね・・・(゚д゚;)
皆さんしょーもない勘違いに付き合って下さってどうもです
886 :
デフォルトの名無しさん :03/08/06 17:38
「Perlについての質問箱 4箱目」スレをどうしても見たいんですけど どうしたらいいですか?
888 :
デフォルトの名無しさん :03/08/06 17:40
Perl5のコードをPerl6の文法で記述することができる プラグマってありましたっけ?
悪質ないたずらはやめてください
>>886 2ちゃんねるプラスという雑誌に書いてあるIDとパスを(ry
PerlはXMLデータの送受信ってできるんかな? HTTP(S)のPOSTで。(CGI)
>>894 できるよ。
> HTTP(S)のPOSTで。(CGI)
あっそ。(・∀・)カエレ
897 :
デフォルトの名無しさん :03/08/06 23:23
ファイルをカレントディレクトリ以外に作るとき、 open(FILE, ">c:\\dir\\file.txt"); と書けば作れますか? chdirを使わないとダメですかねぇ? まぁ自分で書いてみればいいんですけど…。
>まぁ自分で書いてみればいいんですけど…。 分かってんならやれ
899 :
デフォルトの名無しさん :03/08/07 00:02
釣れた
900 :
デフォルトの名無しさん :03/08/07 00:04
釣れた
901 :
デフォルトの名無しさん :03/08/07 00:58
釣れた
釣られちゃった
/V\ /◎;;;,;,,,,ヽ _ ム::::(,,゚Д゚)::| < (ry ヽツ.(ノ:::::::::.:::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
904 :
デフォルトの名無しさん :03/08/07 02:18
釣れた
HTMLファイルを読んで解析するCPANにあるモジュールの定番って 何でしょうか? 例えば、 <font size="+2" color="red">大きな赤い文字</font> だと、タグ名=font、size="+2"、color="red"、値=大きな赤い文字 みたいに取り出すイメージです。
>>905 perlをインストールしても、モジュールは何がインストールされていて
どういう事ができるか、ドキュメントを読みもしない香具師がこういう
クソな質問をする。
>>906 まぁ落ち着け。
>>905 は定番を聞いてるだけなんだからいいじゃないか。
それぐらい答えてあげようよ。
>>905 定番なんか聞いてどうすんだ。自分の使いやすい奴を使えばいい。
>>905 HTML::Parserだべ。解析するHTMLはutf8に変換した方が吉。
package FontParser;
use strict;
use HTML::Parser;
use base qw (HTML::Parser);
sub start {
my( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
if ($tagname eq 'font') {
$self->{font}++;
for my $key (@$attrseq) {
my $value = $attr->{$key};
print "$key: $value\n";
}
}
}
sub text {
my($self, $origtext, $is_cdata) = @_;
print "text:$origtext\n" if $self->{font};
}
sub end {
my( $self, $tagname, $origtext ) = @_;
$self->{font} ='';
}
1;
use FontParser;
my $str = '<font size="+2" color="red">大きな赤い文字</font>';
$p = new FontParser;
$p->parse($str);
>>909 s/$self->{font} ='';/$self->{font} ='' if ($tagname eq 'font');/
911 :
デフォルトの名無しさん :03/08/07 18:28
perlまたはphpで、次のようなプログラムを作りたいと考えています。 スクリプトを置いているサーバーから、別のサーバーにおいてあるphpで書かれた ファイルを実行したときに出力されるHTMLソースをコピーし、スクリプトを置いてある サーバーに保存する。 どういう方法があるかお願いします。
>>911 ブラウザで〜.phpや〜.cgiにアクセスして表示されたページをファイルに保存する
これと同じ働きをするプログラムを組めばいい
つーかPerl|php以前の話だな・・・
915 :
デフォルトの名無しさん :03/08/07 18:50
>>913 いや、だからperlで〜.phpや〜.cgiにアクセスする方法を知りたいんですが。
ヒント LWP あとはググれ じゃーな
919 :
デフォルトの名無しさん :03/08/07 18:55
>>916-918 ありがとうございます。LPWは入っているようなので、試してみたらできました。
・・・意外と簡単なんですね・・・
おい、俺はLWPぐらい知ってるっての^^;
おまえらケコーンしすぎだろ
素朴な疑問なんだけどCGIは一切作らないけど、 perlを頻繁に使ってるって人はこの板にどのくらいいるの? 出来ればOSの種類とかも教えてくれると面白いカモ。
ちなみに俺はCGIのperlだったから。 で、案外perlはやるなってコトでwinでもTk入れて遊びで動かしたりしてる。 unix系は持ってないし。
漏れは、cgiもつくるけど、データコンバータなどを作ったりして重宝しとる。 あと、他にもやってるが素性がバレるでな(w
cgiは作ったことないけど、各種テキスト処理とか、 ネットワーク絡みとか、何でもやらせてる。 バイナリも扱う。 モジュールは殆ど使ってない。 昔ならCで書いてたのを、より楽な言語でやってるだけ。
4のころはいろいろツールを作るのに使ってたよ。 5で挫折した。
俺も>924みたいな感じ。 簡単に組めるし文字列にも強いからちょっとしたデータコンバータに便利だな。
データコンバータってなんですか?
データをコンバートするプログラム
INCMのプラグイン作成とか
>>922 漏れがそうだよ。翻訳をやっていて、辞書のデータをコンバートするために
覚えた。その後もユーザ管理とかデータ処理などに使っている。
特定用途のシェアウェアがごろごろしてるのを見ると、 簡単なperlくらい必須科目にしたくなるな
必須科目にしても使わない人のほうが多そうだから、あれじゃないかな。 CGI以外ではプログラマのための言語って匂いがするなぁ。。 自作実行、みたいな。 そうでもない?
名前に変な数字入った。気にしないでくれ。
ネタニマジレ(ry
Perlのサクッと作ってサクッと実行できる感覚が止められない。 これでGUIもサクッとできたら(俺の中では)完璧だなぁ。 (Tkはかっちょ悪いので使いたくないです)
>938 = MZ-80K しか使ったことない。
>>909 ありがとうございました。
そのモジュール、スレッド対応Perlでは動かなかった...
>>940 > そのモジュール、スレッド対応Perlでは動かなかった...
HTML::Parserがスレッドセーフじゃないってことか?信じられんな。
HTML-Parser-3.28のソース眺めたけど、無問題と思えるのだが。
オイ、オマイ等の中で分かる香具師いらっしゃいますか?
system("find data/ -type f -atime +1 -exec rm {} \\;"); このようにして1日更新のないファイルを削除するようにしているのですが XREAというレンタルサーバーでは動いてくれません。 なにか回避方法はないでしょうか?
945 :
デフォルトの名無しさん :03/08/11 15:35
open(FH,"+>data.dat"); $line = <FH>; print $line; てやってもdata.datの内容が表示されないんだけどなんでですか? data.datには文字列が一行だけ入ってます。
open した時点で内容が消されるから
/ ̄ ̄ ̄ ̄ ̄ ミ / ,―――─―-ミ / // \| | / ,(・ ) ( ・) ハァ (6 つ | ハァ | ∪__ | | /__/ / /| ∪ /\ 夏厨だから
スレッドセーフじゃないモジュールをスレッドで使用するのに 何か回避策はありますか?
950 :
(・∀・)ニヤニヤ ◆IuDnGO5LnY :03/08/11 21:38
Rubyでライブラリをセルフテストする方法として if $0 == __FILE__ xxx end ってのがありますが、Perlで同等のことはできませんか? Perlにはちゃんとテスト用の機構があるのは知ってますが、 ・require/use等で使われたときは実行されず、 ・直接起動したときだけ実行される ・Perl4でも動作する記法 を知りたいのです。 よろしくおながいします。
>>942 5.005_03なのですが、Can't load ..... Parser.so
DynaLoader.pmでPL_stack_max(だったかな)でundefinedうんぬんて出てきました。
Perlのバージョンが悪いのかな。
Parser.pmはバージョン3.08でした。
>>950 もともとPerlで使われてた手法だろ。
CPANモジュールのAlgorithm::Diffってちゃんと動く? 少なくとも俺の環境では正しい結果を返さないんだが。
954 :
デフォルトの名無しさん :03/08/12 01:00
なにやっても動かぬ。
そうですか。
そんなわけあるか。 ドキュメントにある a x b y c z p d q a b c a x b y c z でさえ a x b y c z p d q a b c a x b y c z になっちゃうんだぜ?
へー・・
違う違う、こうだこうだ。 a x b y c z p d q a b c a x b y c z
ほー・・・
960 :
デフォルトの名無しさん :03/08/12 01:16
ハッカ飴って人は、ただ単にメルフレ募集の人だね。 寂しそう。
上手くいかないな。 じゃあ、こう。.は空白だと思ってくれ。 a.......x.b.y.c.z.p.d.q a.b.c.a.x.b.y.c.z サンプルスクリプトも載せようか? 俺はググってもこの話が見つからないことが不思議でしょうがないんだ。 何か教えてくれるなら、労力は惜しまないぞ。
>>960 俺のポリシーだ。
それにここに書き込む話じゃない。
963 :
デフォルトの名無しさん :03/08/12 01:27
以上、使えぬデシャバリさんですた。 ここ、スレッドあぼーんするかな。
夏。
965 :
デフォルトの名無しさん :03/08/12 01:33
966 :
デフォルトの名無しさん :03/08/12 01:35
∧_∧ ( ´Д`) <みなさーん、お茶が入りましたよ〜 / \ | l l | ..,. ., ., | | | _|。.:_::゜。-.;.:゜。:.:;。 ヽ \_ .。'゚/ `。:、`;゜:;.::.。:.:。 /\_ン∩ソ\ ::..゜:: ゚。:.:.::.。.。:. . / /`ー'ー'\ \ ゜: ::..゜:: ゚。:.:.:,。:.:. 〈 く / / ::..゜:: ゚。:.:.:,.:.:.:。:.:, . \ L ./ / _::..゜:: ゚。:.:.:,.:.:,.:.:.:, 〉 ) ( .::旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦. (_,ノ .`ー'旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦旦.
968 :
2バイト文字に対応したカレントディレクトリを取得するには? :03/08/12 12:44
getcwd()で、カレントディレクトリ名を得る時、 カレントパス名に、文字化けする40種の文字列 (「表」「能」等、所謂「\」コードを含む文字列) があると、正しく処理されないのですが… Windows のActive State Perlで、 例えばカレントが C:\表示\ である場合、 use Cwd; print getcwd(); の結果は C:/・示 となります。 どうしたら回避できるでしょう? (2バイト文字を含むカレントパスを正しく得られるgetcwd 等はないのでしょうか?) (EUCで書いても同じです。jperlはNGです)
>>968 $path=`cd`;
`はバッククォート。
971 :
2バイト文字に対応したカレントディレクトリを取得するには? :03/08/12 13:16
>>969 ごめんなさい。perlappに内包したいので、
例え標準関数でも外部プログラムは使わず、
perlの中だけで済ませたいのですが…
何か方法はないでしょうか?
>>968 use Cwd;
use File::Spec;
my $cwd = getcwd();
$cwd = File::Spec->canonpath($cwd);
print $cwd;
>>972 自分で書いておいてなんだが、いいのか、これで?(w
なんかやばそうな気が。
Cwd の _os2_cwd と _win32_cwd で \ を / に置換してるのが原因で、 File::Spec(File::Spec::Win32) の canonpath で / を \ に戻してるわけだから、 とりあえずWin32環境では問題なさそう。 他の環境も大丈夫だとは思う。
975 :
デフォルトの名無しさん :03/08/12 15:54
WindowsでPerlによるGUIアプリを組むのにVBのように簡単に作りたいんですが、
探してたらこんなの見つけました(既出だったらごめん)。
http://www.bahnhof.se/~johanl/perl/Loft/ ただこれはソフトもマニュアルも英語なんですよね。
別に英語でもなんとか使えると思いますが、
二本のPerl界の発展のためにソフト・マニュアルのの日本語化を
してくれるような素敵な香具師はいらっしゃいませんか?
(By 日本のPerl界を憂うもの)
ActivePerl ver6まだ〜?
>>977 それ言われると思った。
残念ながら英語に関してはあまり得意ではないので、
誰か英語得意な方にお願いしたいなと思っております。
diffの件なんだけどさー、Rubyのalgorithm/diffもCygwinのdiffも同じようになるんだが、おかしいよな? ググっても相変わらずこの話は見つからないし。ホント謎だよ。 例1 テキスト1: abc テキスト2: ababc 結果1 ab[ab]c (テキスト1のbc間にabを追加しろ) 例2 テキスト1: a b c テキスト2: a b a b c 結果2 a b [a] [b] c (テキスト1の3行目にa、次の行にbを追加しろ)
>>974 ActivePerl build 805 +WindowsXPでは駄目。
ActivePerlはMS-WindowsでShift-JISが
使われているということを無視してる。
>>979 >残念ながら英語に関してはあまり得意ではない
得意になればいいじゃん
>>974 / 全てを \ に置き換えてもダメだろう。
シフトJISについて調べて、置き換えるべき / だけを置き換えないと。
シフトJISだから、第1バイトを探すのは簡単。
use Cwd;
$cwd = getcwd();
のあとで、$cwd =~ s%(シフトJISの第1バイトにあうパターン)/%\1\\%g;
>>982 いや〜誰かにやって欲しいなぁ。
ホント他力本願なんだけど・・・
もう少しでこのスレも6箱目に突入ですなぁ。
(しみじみと)
>>971 getcwd()だって内部でcdコマンド使ってるんじゃない?
986 :
デフォルトの名無しさん :03/08/12 17:13
Cで使えるPerlライブラリみたいのってありませんか?
987 :
2バイト文字に対応したカレントディレクトリを取得するには? :03/08/12 17:17
>>972 で無事解決しました。感謝ですm(__)m
canonpathというの自体初めて知りました。。
書き込み入れる前にも色々調べはしたんですけど…
こういうのって、何を参考に調べれば良いんでしょう?
>>983 シフトJISなら2バイト文字で /(0x2F) が出てくることはないし、
Windowsじゃファイル名に / も使えないから、元々含まれてる
ことはないと判断して単純に全置換でいいと思ったんだけど……なんか抜けてる?
あ、それとも / 区切りのパスを得るために、ってこと?
989 :
デフォルトの名無しさん :03/08/12 18:21
「\x9A」という16進数のデータを「\x9A」という文字列データに 変換したいのですがどうすればいいでしょうか?
クオテーション間違えている上にだめじゃん。 $ch = char(0x9A);
>>988 そうか。
全部置き換えて良かったのか。
994 :
(・∀・;)ニヤニヤ ◆IuDnGO5LnY :03/08/12 20:08
>>952 そうなんですか?
そうすると、Rubyの↓を
if $0 == __FILE__
xxx
end
Perlに直すにはどうすればいいんでしょう。
if ($0 eq ??) {
xxx;
}
??の部分が分かりません。。
$ perl -e 'print __FILE__, "\n"' -e
996 :
デフォルトの名無しさん :03/08/12 20:23
次スレは?
>>995 えっ、えっ、・・・なんだかものすごい勘違いをしていたようです。
if ($0 eq __FILE__) {
xxx;
}
これでいいのれすね。ありがとうございました。
んでは、逝ってきます★
998 :
デフォルトの名無しさん :03/08/12 20:40
1000000000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。