1 :
Mr. Moonlight :
02/12/30 08:51 "The duct tape of the Internet"こと、 Perlについての質問箱です "There's more than one way to do it"ということで Perlの奥深さについて皆で語り合い、追求してまいりましょう。 CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
2 :
Mr. Moonlight :02/12/30 08:51
3 :
Mr. Moonlight :02/12/30 08:52
4 :
Mr. Moonlight :02/12/30 08:52
>>1 さん、ぉっヵι〜
今回のテンプレートはなかなか格好いいかも:-)
my $str; $str<<__EOM__; あいうえお かきくけこ さしすせそ __EOM__ print $str; (このソースはエラーが出ます) こんな感じで、複数行を変数に直接代入する方法ってありませんでしたか? あったような気がするんですが、思い出せないので…
自己解決しました。 $html = <<__EOM__; でOKでした。
>>6 実は
$str = "あいうえお
かきくけこ
さしすせそ"
printf("%s\n", $str);
なんてことも可能。
>>8 本当だ、それだけで代入できました。
エラー出ないのが不思議ですね。
>>9 >エラー出ない
他の言語では普通アウトだから奇異かもしれないね。
ヒアドキュメント演算子はぶっちゃけ「“〜”」を
指定文字列でオーバーライドするものだと思えばいい。
なので逆にオーバーライド“しない”
>>8 の例も可能な仕様かと。
余談だがこんなのもアリ。読み難いコードになるだけだが…。
print <<EOF; print <<EOF; print <<EOF; # 改行前なら何個でも定義可
abc
EOF
def
EOF
ghi
EOF
__END__
>>10 print <<EOF,<<EOF,<<EOF
abc
EOF
def
EOF
ghi
EOF
これでも行けるよ
12 :
デフォルトの名無しさん :02/12/31 17:17
とりあえずageとこうぜ
けれど見る間に埋もれていく…。大晦日なのに…。
>>11 もちろん、カンマ区切りのが一般解。
この場合はセミコロンで区切ったマルチステートメントでも効果が生きるって
意味も持たせたかったので冗長化して見たんですよぅ。出来心ですぅ(;;
(カンマ演算子区切りだと1つの式になるけど、マルチなら複数の独立した式だし)
14 :
デフォルトの名無しさん :02/12/31 19:00
がんがれー ageeeeeeee!!!!
二次元配列で、一次元目のインデックスが同一の要素の個数は、どうやって取得したらいいのでしょうか。
>>15 たとえば $#{$array[$n]} とか scalar(@{$array[$n]}) とか。
変数の文字列の中に入っている\nを、解釈させつつ実行する方法ってありますか? 例えば $string = "国語辞典\n英和辞典"; print "$string"; とすると、出力は「国語辞典\n英和辞典」となってしまうわけですが、 \nで改行させるにはどうすればいいんでしょうか?
「解釈させつつ実行」→「解釈させつつ出力」でした。
>>17 > $string = "国語辞典\n英和辞典";
この時点で改行が入ってるはずだが。
私も改行されるものと期待して組んだのですが・・。 実際の状況はちょっと違っていて、\nを含んだ文章が書かれているファイルから、 各行を配列に読み込んで改行文字取り除いて、別のファイルに出力した結果が「国語辞典\n英和辞典」なんです。 もうちょっと考えてみます。
$string = '国語辞典\n英和辞典'; print eval qq("$string");
あありがとうございます。最初ので混乱させてしまってすいませんでした。
>>22 元文字列中にダブルクウォートがあるとヤバイ事態になる気がするんですが…?
元文字列がSJIS/JIS7でなければ、
$str =~ s/\\n/\n/g;
で、充分に通常の用途では事足りると思う。
evalを使うなら「"」と、変換に無関係な「\」は要エスケープだと思う。
ただしSJISの場合はnの前の\が、漢字コードの2バイト目でない事を確認する必要あり。
(\\nはリテラルな\nである、といったエスケープ定義も必要になったりすると面倒だが)
>>24 おっしゃる通りっす。迂闊
$string = '国語辞典\n英和辞典';
print eval qq( qq($string) );
とか悪あがきしてみるテスツ
26 :
デフォルトの名無しさん :03/01/03 11:08
質問します。教えてください。 1.XHTML遵守の、ネストしたリストタグを簡単に作れるモジュールに心当たりがあったら教えてください。 2.CVSを使うための、あるいは、簡易CVSとして使えるモジュールに心当たりががあったら教えてください。 3.POE::Component::IRCの日本語訳が存在するか否かを教えてください。
28 :
デフォルトの名無しさん :03/01/03 14:09
29 :
デフォルトの名無しさん :03/01/03 15:55
モジュールって、モジュールを使う *.pl と同じフォルダにおいても使えるよね? あと、HOGE::FUGAってモジュールで、ファイル名がFUGA.pmでCPANにあったりするけど そのままのファイル名でuseするだけで使えるの? requireしてから? さっぱりだよ
30 :
デフォルトの名無しさん :03/01/03 17:14
@INCに .加える
31 :
デフォルトの名無しさん :03/01/03 18:31
NetServer::GenericとNet::Serverってどういう関係ですか? サーバーアプリを作りたいので適用なモジュールを探しています。
32 :
デフォルトの名無しさん :03/01/03 19:46
PerlCE(PerlIDE)のインストールについての質問です。 WEBサイトの「PerlCEInstall-PerlCEのPocketPC2002へのインストール例。」 を参照しながら、PerlCEをCEマシンにインストールしてみました。 手順の一番最後のPerlIDEの設定のところで、PerlIDEを起動しようとすると 「PerlIDE(またはいずれかの構成ファイル)が見つかりません。 パスとファイル名が正しく、必要なライブラリが使用可能であることを 確認してください。」 とメッセージが出てしまい、それから先に進めません。 CEマシンはシグマリオンUです。 考えられる原因と対応を教えていただけると助かります。 (手順については、注意深く何度もやり直してみましたが、結果は同じでした。) 尚、celib.dll,Perl for WinCE,PerlIDEはmips-hpc-wce211用を解凍利用しました。 また、perl56.dll,cediallogs.dll,msvcrt.dllもwindowsディレクトリにコピー済です。 cereg.exeを利用しましたが、バッチファイルでのパスの設定にも、ミスは無く、 原因が分かりません。ひょっとして、シグマリオンUは、windowsce3.0ですが、2.11は 動かないということでしょうか? Perl for WinCEはクリックすると動きますので、 それも違うような気がするのですが。よろしくお願いします。
#
>>29 #ファイルの配置。
#ModuleTest.pl
#HOGE
#HOGE/FUGA.pm
#in ModuleTest.pl
use lib qw(.); #カレントディレクトリをモジュール検索パスに追加。
use HOGE::FUGA; #requireしてimportするのと同じ。これで使えるYO!
34 :
デフォルトの名無しさん :03/01/03 23:30
>>32 PerlICE(IDE)便利そうですね?
WinCE以外、つまりWin2kでも動作するIDE環境ありませんか?
コマンドプロンプトとエディターの往復にうんざりしていたところです。
>>34 Win2KならMeadow+Cygwinを使うとPerlのIDEになるよー。
>29 CPANに登録済みなら、CPAN.pm(perl -MCPAN -e shell) でインストールする。 (ActivePerlなら ppm) 独自のライブラリの場合は@INCの指すところに格納するか、 use FindBin; use lib $FindBin::Bi
>36 スマソ。訂正&追加。 呼び出すperlソース(?)と同じ場所に置くなら、 use FindBin; use lib $FindBin::Bin (perl クックブックより)
>>33 >>36 >>37 サンクスコ。
鯖を変えたけど、モジュールのインスコを禁止されているわけなんだ。
そのモジュール自身も他のを読んでいるし、
徹底的にガムバッテみるよ。
39 :
デフォルトの名無しさん :03/01/05 19:31
とあるPerlプログラムから外部のPerlプログラムファイルを呼んでいます。 外部プログラムはCGIモジュールを使ってパラメーターを受け取っています。 外部プログラムは、コマンドラインからは perl /home/.../gaibu_hoge.pl parameter=3\&second=abc のようにやって、パラメーターを受け取ることに成功しています。 しかし、親プログラムから $cmd = 'perl /home/.../gaibu_hoge.pl parameter=3\&second=abc |'; open(IN, $cmd); while (<IN>) { ... } close(IN); とやった場合、動作はしているのですが、 なぜかパラメーターが渡せていません。\を取っても同じでした。 原因すらわからないような状態ですが、 このような状況を解決する方法を知っている方はおられますでしょうか。
>>39 パスとパラメータを ? でつなげば良いと思う。
$cmd = 'perl /home/.../gaibu_hoge.pl?parameter=3\&second=abc |';
>>40 それだと、? で繋げた分全てをPerlプログラムのパスだと認識するようで、
コマンドライン上でも親プログラムからの呼び出しでも、
動作すらしなくなりました。
ごめんなさい。
>>41 わからん、hoge.pl をサブルーチン化して require してはだめですか?
こちらも色々粘ってみましたが、駄目でした。
>>42 ありがとうございます。ヒントになりました。
一応、わかりやすさを重視して、
hoge.pl の中身をモジュール化して、
hoge.pl と親プログラムの両方から呼び出すことにします。
お手数お掛けしました。
ありがとうございました。
>>39 呼出側の親プログラムがApache等から起動されたCGI環境下で
動いている場合はその子プログラムもCGI環境内、ってことになる。
この場合、CGI.pmは環境変数などをチェックした結果
“コマンドラインからの起動ではない”と判断するかも。
>>40 がアウトになる理由は、open関数内で
起動されるシェルで'?'が処理されるから。
>>44 おお! 解説ありがとうございます!
今はちょっと忙しいのですが、暇があれば
CGI.pm を hack してみて、中身を確認してみようと思います。
46 :
デフォルトの名無しさん :03/01/06 14:51
3箱目乙です。 「表」のように2バイト目に「5C」のコードが使われている文字を shift-jisで扱うと、文字化けしたりエラーになったりするので、 それを防ぐために $str=~s/表/表\/; のように文字の後ろに「\」を付けたいのですがこれもエラーになります。 どのようにすればいいでしょうか?
条件演算子で質問です。 $a = 1; $b = 2; $c = 3; $a ? ($b = 3) : ($c = 2); print $a,$b,$c; これだと133と表示されますが、 $a = 1; $b = 2; $c = 3; $a ? $b = 3 : $c = 2; print $a,$b,$c; これだと123と表示されてしまいます。 これって演算子の優先順位の問題なのでしょうか。 よくわからないので識者の方の解説をお願いします。
>>48 $str=~s/表/表\/;
だとエラーになりますね。
$str=~s/表\/表\\\/g;
でOKでした。自己解決ですいません。
50 :
デフォルトの名無しさん :03/01/06 15:34
なぜ '/'にコダワルのだろう……
51 :
デフォルトの名無しさん :03/01/06 16:38
>>47 ?:は3項演算子。
$b = 3は式。式全体は無視され、先頭に立ってる$b(項)が評価される。
($b = 3)は式を()で括っているから項、よって中の式が評価される。
52 :
デフォルトの名無しさん :03/01/06 16:52
現在XMLDBのXindiceをPerlで操作(検索・挿入・更新・削除)する方法を模索しています。 いろいろ探っては見たのですがなかなか解決には至っていません。 どなたか有効な情報をお持ちの方はいらっしゃいませんか? 本当に困っているのでアドバイスをいただけると大変ありがたいです。 よろしくお願いします!!
夜露死苦
54 :
デフォルトの名無しさん :03/01/07 01:06
PerlでWindowsの印刷関連機能を使いたいのですが可能でしょうか?
>>51 ちょっと誤解を招く表現だな。>…式全体は無視され…
$a = 1; $b = 2; $c = 5;
$a ? $b = $B = 3 : $c = 4; print $a,$b,$B,$c; # 1435
$a = 0; $b = 2; $c = 5;
$a ? $b = $B = 3 : $c = 4; print $a,$b,$B,$c; # 024
条件演算子 ?: は2番目と3番目のオペランドが有効な左辺値
且つ同じコンテキストなら、それ自身が左辺値に成り得る。
つまり上の例だと ($a ? $b = $B = 3 : $c) = 4; で、$a の
真偽によって $b か $c に 4 が代入される。
56 :
デフォルトの名無しさん :03/01/07 03:44
$^H ってなんなの? 特別な変数?
57 :
デフォルトの名無しさん :03/01/07 04:10
myとlocalの違いをおしえて
58 :
デフォルトの名無しさん :03/01/07 04:34
Perlとperlの違いをおしえて
59 :
デフォルトの名無しさん :03/01/07 05:14
早くおしえて!!
>>57 ダイナミックスコープ(local)とレキシカルスコープ(my)
localは同名のグローバル変数を一時的に退避し、
局所変数として別途変数を作成する。そこから呼ばれた
ルーチンにおいてもそのlocal指定された変数は有効。
myはC,C++,Javaなどの関数内ローカル変数と同じ。
そこから呼ばれたルーチンには、その変数は見えない。
Perlのメインルーチンがmainというパッケージに収まって
いることを考えると全ての変数はデフォルトでlocal変数と
見ることができる。
ただしこれらは変数名シンボルに対するスコープであって、
メモリ上のオブジェクトはそれとは別に参照カウントに
よって維持管理されている。だからC,C++ではご法度と
されている、ローカル変数のポインタ(Perlではリファレンス)
を関数の戻り値に使うようなことは、Perlでは何も問題がない。
要はあれです。C,C++のようなスタックを使ったレキシカルスコープの 実現は、JavaやPerlにはないということです。C#/.netにはあるとも 聞くけどどうなんだろう。
62 :
デフォルトの名無しさん :03/01/07 05:48
>>56 strict.pm 読め。
>>58 「Perl」は言語としての Perl を指す。
「perl」は Perl インタプリタのバイナリを指す。
…というのが何かに載っていた気が。
レキシカル変数と言えば { my $foo; sub sub_a { $foo使う } sub sub_b { $foo使う } } みたいにして、複数の関数にまたがるスタティック変数(C的表現)が使えるね 特定の関数からのみ参照可能なグローバル変数(嘘臭い)と言った方が直感的かな
>64 C言語のauto変数もそうなんだけど、「ブロックの先頭で宣言」なのに なぜかあんまりやらないんだよなー。キモチワルイからかな。 いるところだけブロックで囲ったほうが見通しはいいしリソースも節約できて最適化も 期待できていいような気がするんだけど。 「関数の先頭」って思い込んでいる香具師が多いのよね〜。
サブルーチン外で定義されたmy変数は、そのファイルに
結び付けられた固有の変数になります。まさにレキシカル。
(ファイル全体が無名ブロックで囲まれてるのと同義)
#main.pl
my $a = 123; require "sub.pl";
__END__
#sub.pl
print '$a は', ( defined $a ) ? '定義済' : '未定義'; 1;
__END__
逆に、同一ファイル中でこういう定義はできない。
package FOO; my $a;
package BAR; my $a; # ここで2重宣言警告発生
__END__
>>64 の例は、実は上記に沿った動作なので
次のように書くと意味が違ってくるよ。
sub main{
my $foo;
sub sub_a { $foo使う }
sub sub_b { $foo使う }
}
my $foo;
sub_a、sub_b で使われる$fooは、sub main 内の
my $foo ではなくて、mainの外で my宣言された $foo だったり。
>>66 下の例は分かるけど、実際そんな使い方するの?
普通、サブルーチン内で定義したサブルーチンを、そのサブルーチン外から呼ぶことはしないものだと思ってたし。
(main で定義された sub_a, sub_b をmain外から呼ばない)
# サブルーチンの動的生成とかは除いて
もし、そうするなら グローバル変数(use vars) をlocal 宣言すると思うんだけど。
純粋な疑問、意味分かんないや。
# もしかして、単にダメな例?
>>68 サブルーチン内ローカルサブルーチン定義が必要な場合、
Perlでは無名サブルーチン定義にしないとだめです。
>>64 の下の例では、sub_a、sub_b は思い切りグローバルなんだわ(^^;
つまり“一般常識として”内部関数に直接触らない自主規制は可能だが、
インタプリンタ実行レベルでは規制されていない。
完全にローカルなサブルーチンを作成使用するには、こうするしかない。
sub hoge{
my $foo;
my $sub_a = sub { $foo; };
my $sub_b = sub { $foo; };
&$sub_a();
&$sub_b();
}
#このサブルーチンリファレンスを定義ブロック外に
#漏らすと、$foo はクロージャ変数(不揮発領域)になる。
ペルージャ
>>69 了解っす。
main() の中から sub_a() を呼べば、ちゃんと sub main{}なレキシカルスコープの$foo が渡されるけど、
($fooがそう評価されない例で)わざわざ外から呼ぶのは何故?
と疑問に思ったんです(^^;
> つまり“一般常識として”内部関数に直接触らない自主規制は可能だが、
> インタプリンタ実行レベルでは規制されていない。
Perlのこういうところが好き :)
「立ち入り禁止の札」ってヤツですね。
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/ 1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27 鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
も こ そ も お 人 世 ど こ お 断
! | l l ヾ(::::: ヽ〉ヽ)ヽ `l ミ ー .、 | | {レヽ〈:::~``'' ´ ソ |! l } ミ. ミ ト レヽ,;:::''''`':;|;il~,. -‐' ル )ノl / ミ ノr^,ヾ ! ゝ l;ュ=≡{., (;;,(ニ===、-.l! li /ソ ;;)|./ `!;ェ‐・オ ""'''< `・ーz'ー'~ |/ フ;;i |! <重くなるのはなあ・・・ |:'""`')' ^ヽ;` ̄,. -‐'^ i|;;;;ノ/\ー-、-.,_ !;:.. .:;i| ;, ~、´ ,/ |,..ノ; \ ゝ ヽ``)、.,_ ``ヽ(__,,,,...) \_,,..-' |;;; |〉 トli ヽ |::::::::J..,,_ ^ヽ, : 1, ;!;: /l、 ) | ヽ::r,―--一' . , il/::: :: / ! ; / .//'i`ー-'´; ' ;. ',/;;;::::: .:::::∧ } ヽイ / / L.;_';_._,`.ノ
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
記念かきこ
78 :
デフォルトの名無しさん :03/01/10 02:15
Net-Server(Net::Server - Extensible, general Perl server engine) の使いかた教えてください。
>>78 %perldoc Net::Server
----
# インチキECHOサーバ、文字列を大文字にして返す
package NetServerTest;
use Net::Server;
@ISA = qw(Net::Server);
$port = 10000;
NetServerTest->run(port=>$port);
exit;
sub process_request {
while(<STDIN>){ print uc $_; }
}
1;
----
Net::Server を継承して、適当なメソッドをオーバーライドすれば良いみたい
運営側の監視も必要になるのね。 こりゃ大変だわ。
名誉毀損の書きこみがあったと認識し、または認識しえたとき。 てか、日本語も読めないのに良く掲示板利用してるな。
名誉毀損の書きこみがあったと認識し、または認識しえたとき。 てか、日本語も読めないのに良く掲示板利用してるな。
名誉毀損の書きこみがあったと認識し、または認識しえたとき。 てか、日本語も読めないのに良く掲示板利用してるな。
ひろゆきの放任主義もどうかしてる。
俺らも人のこと言えないが年末年始に2ちゃんねるって恥ずかしくない?>アンチの皆さん
ゲロ出そうになった。
記録されようがなんだろうがマンコとかき続けるぞ!!
某スレでも見てきたのかもしれませんが、今更レスするあなたがとても滑稽でなりません。
国境を越えた各国警察の合同捜査により 逮捕
複数行の文章をクリップボードにコピーするスクリプトを書いてるんですが、実行後にペーストしてみると改行が変になります。 use Win32::Clipboard; @lines = ("aaa", "bbb", "ccc"); foreach (@lines){ $clip .= "$_\n"; } Win32::Clipboard::Empty(); Win32::Clipboard::Set($clip); print Win32::Clipboard::Get(); コマンドプロンプトで$clipを出力してみると期待通りなんですが・・。 どうすればいいんでしょうか?
変になるってどう変になるのよ(;´Д`) Windows環境なんだったら、改行コードが違うんでねぇの? \r\n にしてみたら?
改行の部分は「・」みたいな文字が表示されます・・。 \r\nにしたら解決しました。ワーイ ありがとうございます。
ひろゆき君。 メルマガまってるよ。
そーいえば。 スクリプトをBATファイルに埋め込んで(perldoc.bat見たいにね) 実行させたとき、エディタの改行設定をLFにしてたもんだから cmd.exe/command.comがトチ狂ったことがあった。
2ちゃんねるのオランダ引越しまだぁ〜
IP取得でも匿名は匿名なんじゃないかと思っているけど違う? 通常なら他人に知られないんじゃないの?
>>98 もし鯖管理者以外に知られるとしたらプライバシー漏洩だけどね。
逆に、Apacheのアクセスログすら取ってなかったいままでのほうが、
運営管理責任とわれかねないヘタレっぷりなんだけど?(^_^;
#仮に内部ハッキングされてもサパーリ気付かなかったはず<証拠がないから
だから検察に証拠提出能力がないって責められたんと違う?
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
set NULLnul>l &>gt>..gthosting-x.commandnull>>gt.gtgt get oldres.-num get few make IP >renew.
その通りっす。それに加えて民団や層化はある意味法治されてねーからな。
名前:ひろゆき ◆3SHRUNYAXA [] 投稿日:03/01/08 17:52 ID:rLfxQ17l > >荒らしとか犯罪のためなの? > そす。 ヲチ板のいくつかのスレなどには、名誉毀損などで確実に刑法に抵触する行為、 つまり犯罪行為が溢れているが、まだ放置するのか? 事件化した場合、削除権者も、幇助に問われる可能性もあるが? なぜ、あそこにトマトを導入しないのか?
自由と無秩序のはき違え・・・か。 ただ、差別の非差別による差別やタブーに付いて、一般人が気軽に話せる 場所がなくなるのは勿体無い気もするなぁ。
アルファベットを順番に変数名にしたいのですが… $code = x41; と、してASCIIと対応させてアルファベットを取得するのでしょうか? 全然上手くいきません(;´д`)
>>105 $code = ord( 'A' ); # 0x41が入る
$code = chr( 0x41 ); # 文字'A'が入る
この二つの関数を覚えれば恐らく目的に適うでしょう。
けど大量に捌くのならpack/unpackを使うのが能率的。
@uchar = unpack( "C*", 'ABCD' ); # Cのunsigned char配列の代用
$string = pack( "C*", @uchar ); # 上記の逆動作
他にはハッシュ/リストを使うテーブル引きの手も。
@ord{"\0".."\xFF"} = (0..0xFF); print $ord{"A"}, "\n";
@chr[0..0xFF] = ("\0".."\xFF"); print $chr[0x41], "\n";
106続き; もし「連続するアルファベット名の変数名」を一括初期化 したいとかそーいうお望みだとアレなので、 { no strict; my @name = "A".."Z"; #変数名 my @code = 0x41..0x5A; #初期値(数値) for my $n ( @name ) { eval sprintf( "$%s=%s;", $n, shift @code ); } print $A; 普通やらないケド。
>>108 eval sprintf( "$%s=%s;", $n, shift @code );
変数の値での変数名は・・・
${$n} = shift @code;
とするのが一般的かな。・・・蛇足でごめん。。
他人を中傷して楽しんでるって… ゴミだね、あんた。 人間の。
当然含まれるかと思われ。
$line = "abcabc2"; $line =~ s/abcabc([0-9])/ffffff$1/; ・・・・・@ するとffffff2 が結果として出ますが この文字列置換の部分を $src = abcabc([0-9]); $dest = ffffff\$1; $line =~ s/$src/$dest/; のように変数として動的に扱いたいのですがヤッパリ無理でしょうか? 変数生成時には$1が評価されないので文字列として$destに格納して @と等価の処理をしたいのですが(´・ω・`)
>>112 $line = 'abcabc2';
$src = 'abcabc';
$dest = 'ffffff';
$line =~ s/$src([0-9])/$dest$1/o;
print $line;
>ffffff2
・・・??
>>113 レスどうもです。
$line =~ s/$src([0-9])/$dest$1/o;
のように書いてしまうと ([0-9]) $1の部分は固定になりますよね?
ここも動的にしたいのです。
>>114 なるほど。。
eval(sprintf("\$line =~ s/%s/%s/o",$src, $dest));
eval "\$line =~ s/$src/$dest/"; 蛇足にも1つ。。
>>114-117 まさに、コレです、期待通りの処理を行うことが出来ました
ありがとうございました。
以前に、この世に匿名なんてものはありません
なんでこんな殺伐としてるんでつか?
121 :
デフォルトの名無しさん :03/01/12 01:54
age
バガンっっ!!!!!ズサッ ガッ ギュィィ ゴッググモッッ雨雨 グモッチュチュイチュイチュイーーーーーーーーーーーーーーーーーーーんチュイチュイチュイチュイ――ン 罵ッゴんばっこんばっ婆ッゴんばぎゅブギュ罵ぎゅぎゅきゅ ぼごんぼごんぼごんぼごん 跋扈ン跋扈ン跋扈ンバッカンバッカン馬鹿馬鹿婆きゅうううーー ギュ気ギュ気ギュ気いい疑義一ギいいっ ギュぎゅうぎゅううう ぶじゅぶじゅぶじゅ ききっーーぃ きい ゴットン となって、ミンチ轢肉になって成仏してしまったそうです。 尚、貨物はフルパワー・全快で走行していた長い編成だったので、凄まじい勢い で轢断・繊断(物性物理学の運動エネルギー・車輪とレールの轢断機により)され 15歳の中3は、肉片と化したそうです。 お気の毒ですが、この肉片は荼毘に附して、灰にし、土に帰します。あしからず ご了承くだされい。
ああ
多重配列で、ある要素内に含まれる要素の個数を取得するにはどうすればいいんですか? 具体的には次のような感じです。 ---------------- @array = ( [x,x,x,x...], [x,x,x,x...], ←この行に含まれる要素の個数を取得したい [x,x,x,x...]); --------------------- print @array[1];とかやると、要素の数ではなくて参照が表示されるんで、 もうひとひねり必要なのかと... おねがいします
>>124 print scalar(@{$array[1]});
こうかな?
ニュー速発富山県警行きのキラー
21 は凄い男だな。感動した。
すみません。ここにいる皆様、神に質問したいのですが Perlをexeにコンパイルする方法ってどうやるのでしょうか 知り合いにお願いされたのですが、わからなくて・・・
>>128 perl2exeというプログラムで出来たような・・・
>>128 実行ファイル化するには、
perlcc -o hello -o hello.pl
詳細は perldoc perlcc で。
>>125 うまく表示できました。ありがとうございます。
自分なりに解説書やインターネットで調べてはいたのですが、
どうも多重配列って評判が良くない&説明が少ないようでした。
(「要するにハッシュ使え」というオチが多い)
はっきりした理由は解りませんが....。またよろしくです。
132 :
デフォルトの名無しさん :03/01/12 19:15
>>128 Perl2exe
PerlApp(PDK)
Perlcc
133 :
デフォルトの名無しさん :03/01/12 19:17
PerlccはWin32でコンパイル成功しませんでした。 VC++でも駄目だった。 また、どの方法も実行速度は速くならないようです。
そりゃ Perl 自体元々 C で書かれてるんだし。 計算がメインのプログラムなら早くなるかもね。
fusianasan
そんなに法律に頼りたいならインターネットアクセス自体を免許制にすれば?
倉庫番 ★=BG ★=夜勤 ★なのね。。
138 :
デフォルトの名無しさん :03/01/13 01:33
use Socket と use IO::Socketの違いを教えてください
139 :
デフォルトの名無しさん :03/01/13 03:46
>>138 同じだと強弁してみようとすれば、おのずと違いはわかります。
>>131 >自分なりに解説書やインターネットで調べてはいたのですが、
>どうも多重配列って評判が良くない&説明が少ないようでした。
思考せよ! 思考せよ!!
win2000のコマンドプロンプト上でperl実行中に 音を出すのにはどうすればいいんでしょうか? いわゆる単純なBEEP音程度でも鳴らせられればと 思ったのですがそれらしき機能が見つけられずに悩んでます。
142 :
デフォルトの名無しさん :03/01/13 07:18
print "\x07";
143 :
デフォルトの名無しさん :03/01/13 07:28
Win32::Sound
>>142 お答えありがとうございます。
・・・・・・・・ちょっと、自分の知識の無さが情けなくなってきました・・・・・・・・
一から勉強しなおします。
(^^)
print "\t\b\b";
147 :
デフォルトの名無しさん :03/01/13 21:21
Windowsでプリンターを扱うモジュールってありませんか? Win32::Printerとかないかなぁ。
148 :
デフォルトの名無しさん :03/01/14 00:42
149 :
デフォルトの名無しさん :03/01/14 02:16
>>148 勘違いはしてないけど、上部の[DOWNLOAD]のtarファイルなら、readme も
ついているはずだし、そっちをダウンロードしたほうがいいとおもうよ
150 :
デフォルトの名無しさん :03/01/14 02:20
>>147 wxPerl経由だとWin32ネイティブで印刷出来るらしいよ。
ActivePerlのWin32モジュールに印刷関係見当たらないですね?
ぼくも知りたいので、見つけたら教えてね。
>>149 はい、そっちの[DOWNLOAD]から落としてきました。
でも中にはreadmeなくて…。
>>148 今 手元に無いんでファイル名忘れたんだが
ActivePerlには、専用のパッケージマネージャが付いてるはず
ActivePerlインストールしたディレクトリ探してみれ
(apm だか ppm だか、そんな名前だったような気が)
それ起動して
>install
HTTP::Lite ってやりゃ、自動的に入れてくれるよ(多分
もしかしたら
perl -MCPAN -e 'install
HTTP::Lite '
も使えるかもしれない
153 :
デフォルトの名無しさん :03/01/14 06:52
>>148 ppm2 install HHTP-Lite
詳しくはactiveperl 5.8.0 Build804 をインストールした
ディレクトリのhtml/index.htmlを開き、ActivePerl FAQの
Using PPMを読め。
英語がわからんなどと泣き言はいうなよ。
154 :
デフォルトの名無しさん :03/01/14 06:55
>>153 おッっと、チョンボ
s/HHTP/HTTP/
チョンボ ふるっ
いつも使ってるが、何か?
↑いつもちょんぼしてる奴
そういえば、麻雀プログラムのスレってあったっけ? ネットワーク対戦プログラムならコードが小さく収まるし 他にも応用がきくと思うんだが。
>>152 ,153
助言ありがとうございました。
ppmコマンドプロンプトで
ppm> install Lite.pm
って打ってたので出来ませんでした。正しくは
ppm> install HTTP-Lite
ヘルプ読んだら一発…。お恥ずかしい限りです。
160 :
デフォルトの名無しさん :03/01/14 17:57
MCrypt-0.92を使っていますが、mcrypt_ecb関数で 暗号を復号時にうまく変換ができません。 どうも変数に入っているバイナリデータ(\0を含む)の 受け渡しがうまくいってないようなのです。 サブルーチンへバイナリデータを受け渡すいい方法って ないでしょうか? # それともどうしようもないのかねぇ・・・
161 :
デフォルトの名無しさん :03/01/14 18:20
$name = system( hostname ) 画面に表示される方を変数に入れたいのですが・・・
しばらくぶりにこのスレ覗いたけど、まだ荒らし常駐してんのか。
163 :
デフォルトの名無しさん :03/01/14 19:27
>>160 ここでボヤクより、駄目な場合をテストスクリプトにして
MCryptの作者に直接メールした方が早いんではないかい?
>>161 $name = qx( hostname );
>>163 うーむ。やはりそうですね。
メールしてみまッス
166 :
デフォルトの名無しさん :03/01/15 14:09
画面から入力した文字でログのgrepをかけるスクリプトを書きたいと考えています。 変数でgrepするスクリプトを書いてみましたがうまくいきません。 どうすればいいでしょうか?
>>166 どう書いてどう動かないのか。
やる気はございますでしょうか?
166です 初心者ですみません
>>167 さま
@logにログを入れた後
$a=<>;
@output = grep /$a/,@log;
と言うような感じで@outputに出力しようと考えていました
>>168 別段問題ない気がするんだけどな。……あー。
chomp $a;っていれたらいいんでないかしらん。
>>167 それイイ!! 禿しくワラタ。
>>168 >>169 のとおりですが、パターンの中が変数じゃないと困るけど、1回代入したら変更なし、という
時は、後ろに /pattern/o とつけてやると少し速くなりますYO。
(^^)
LWP::UserAgentで requestしたあとで print $res->content; とやると、何故か改行一つが改行二つになってしまいます。 なんで?
173 :
デフォルトの名無しさん :03/01/16 05:00
>>172 OSの名前くらい書け。
MS-WindowsならLF->CRLFになるからCRLF->CRCRLFになる。
174 :
デフォルトの名無しさん :03/01/16 13:10
コマンドラインオプションを認識するようなコードを書きたいんだけど for ( @ARGV ){ if( $_ =~ m/-test/ ){ print "TEST MODE\n"; } } これよりもスマートに行けるかな?
176 :
デフォルトの名無しさん :03/01/18 04:16
LWP を使ったユーザエージェントに wget -k とおなじことをやらせるには どうしたらいいですか? 読みにいったページ内のアンカータグとイメージタグのURLを 絶対パスに変換して保存させたいんです。 (URLを抽出するなら変換するメソッドもURL::URIあたりに 用意されてるみたいなんですが。)
179 :
デフォルトの名無しさん :03/01/19 01:11
Win32環境でイベント(ファイルシステムからディレクトリとファイルを削除した際)を常時監視するスクリプト作りたいのですが どのモジュール使えばいいのでしょうか?
180 :
デフォルトの名無しさん :03/01/19 01:55
>>179 Win32::EventLog
ファイルを監視出来るのかは知らない。
Win32モジュールはWindowsでしか動作しない。
ActivePerl(Build633)のインストーラが、%Path%中で指定している環境変数を 勝手に展開しちゃう件はガイシュツでつか? かなり糞な不具合だと思うんだけど。
↑意味不明
>>182 分かり難くてスマソ。環境変数「Path」が、元々は、
「%SystemRoot%\system32;%SystemRoot%;・・・」
と環境変数を使って値が設定されているのに、ActivePerlのインストーラが
Perlのパスを追加するときに、既存の値の中の環境変数を展開しちゃって、
「X:\Perl\bin\;C:\WINNT\system32;C:\WINNT;・・・」
と設定しちゃう。
build62xの頃のインストーラは問題無かったハズだけど、何故にあとから
こんなバグ組み込んじゃったんだろ。
馬具とはいえんだろ。仕様の変更か、お宅がOSを変更したかだな。 インストールの中では、環境変数とかPathの設定をさせないようにして 後で自分の趣味に合わせて勝手に設定したらどうよ。 俺はいつもそうしてる。
>>184 >馬具とはいえんだろ。仕様の変更か、お宅がOSを変更したかだな。
OS変更してません。Win2000で再現可能です。
もし仕様変更としても、こんなアホな仕様にする必要性が理解できません。
つーか単純に、環境変数展開の考慮漏れでしょ。
>インストールの中では、環境変数とかPathの設定をさせないようにして
>後で自分の趣味に合わせて勝手に設定したらどうよ。
そりゃーこの現象に気が付いていれば、インストール後に直してやるなり対応は
可能だけど、気が付かない人はまずいでしょ。
ちなみに
>>184 は、これまでにこの現象、知ってましたか?
>>185 環境変数の
%SystemRoot%\system32〜
が
?:\windows\system32〜
に置き換わるって言っているのか?
同じくBuild633でwinXP環境だけど全然置き換わっていないぞ。。
今試しにインストールしてみたけど確かにそうなるね。なんかキモいなコレ。 でもま、バグなんだろうけど%SystemRoot%なんて 実際のトコ変わることなどなさそうだし、 あまり神経質に気にしなくてもよさそうな気がするよ。
>>186 XPでつか。こんど検証してみます。
>>187 >でもま、バグなんだろうけど%SystemRoot%なんて
>実際のトコ変わることなどなさそうだし、
>あまり神経質に気にしなくてもよさそうな気がするよ。
まあね。
でも%SystemRoot%以外の環境変数も展開されるし、気をつけないとまずいかなと。
客先の既存環境に導入するようなケースもあり得るだろうし。
>>186 WinXP Proクリーンインストールしてサービスパック等は入れない状態で
試してみたけど、Win2000と同様に展開された値になりました。
>>189 ?
ActivePerlをインストしてあるXP2台と殆どなにも入れていないXPで
環境パスはなにも変わっていないよ
形勢不利と見るや知ったような事を言う
>>184 がいるスレはここでつか?
お祭りだ、ワーイワーイ。
ここは英語が分からない馬鹿がブー垂れるスレですか? 氏寝予、おめー
195 :
デフォルトの名無しさん :03/01/20 22:14
ageちゃったスマソ。
197 :
デフォルトの名無しさん :03/01/20 23:01
Perl6はいつになったらできるんだコラ!あぁ?
198 :
デフォルトの名無しさん :03/01/21 03:28
use と require の違いをおしえて
199 :
デフォルトの名無しさん :03/01/21 03:57
use vars qw($VERSION); $VERSION = 1.00; ってどういうこうかがあるんですか?
>>198 require は実行時に検査される。
useはコンパイル時に検査される。
--
print "hoge";
require Hoge::Fuga;
--
だと、 "hoge" が出力された後に エラー(Hoge/Fuga.pm がねぇよ)を吐くけど
use にした場合は、実行する前にHoge::Fugaがチェックされて、
無い場合は実行されない(hogeも出ない)
更に use は import() を自動的に呼ぶ
嘘臭い説明するとこんな感じ。
更にインチキな説明をすると
「Perlモジュールとして作られ物(.pm) はuse そうじゃないなら require」
>>199 そのスクリプト(モジュール)のバージョン設定だよ
201 :
デフォルトの名無しさん :03/01/21 08:08
対象の「/hogehoge」ディレクトリの全ての「*.txt」ファイルに ある処理をあてるにはどういう流れですれば良いでしょう? 今までは "perl -i.bak script /hogehoge/*.txt" とかやって いたんですが、流石にちゃんとした検索がしたくなったので・・・
>>201 UNIX なら find を組み合わせた方が UNIX 的で美しいですが。
いかがでしょう?
find /hogehoge -name "*.txt" -exec cmd.pl {} \;
203 :
デフォルトの名無しさん :03/01/21 19:43
acitiveperl dev kit をアンインストしたらデバッガが起動しなくなりました C:\>perl -d -e '0' Unable to connect to remote host: 127.0.0.1:2000 Compilation failed in require. main::BEGIN() called at C:/Perl/lib/perl5db.pl line 0 eval {...} called at C:/Perl/lib/perl5db.pl line 0 BEGIN failed--compilation aborted. たすけてやってください
>>201 glob() 多少手が込んだ事やるなら File::Find
205 :
デフォルトの名無しさん :03/01/22 15:03
perl5.8のデバッガ ポインタが実行行を示してくれないんですが。 激しく使えません。
206 :
デフォルトの名無しさん :03/01/22 15:05
207 :
デフォルトの名無しさん :03/01/22 18:34
>201 opendir(DIR,"."); @d=readdir(DIR); closedir(DIR); for(@d){print("$_\n")if($_=~/\.txt$/);} これで如何?
208 :
デフォルトの名無しさん :03/01/23 01:20
今、多人数参加型のオンラインゲームを作ろうと思っています。 ステータスなどの管理を「ユーザー名.dat」などのように、 ユーザー個別のファイルで行いたく、新規登録時にファイルを作成させたいのですが とほほなどを見ても、それらしきコマンドが見あたらず、困っています。 mkdirはディレクトリだし・・・ こういうときはどうすれば良いのでしょう?
知識が足りないということに気付いて、 ネット上の資料だけで安くあげるのではなく、きちんとした参考書を買う。
open(OUT,">ユーザー名.dat"); のように'>'のようにリダイレクトを使う リダイレクトは他にも'>>','<','+<'等あるので調べてみそ
>209 趣味でやるには高すぎるっす(;´Д⊂ >210 それで出来たんですね! 存在しないファイルはエラーになるって思いこんでました。(つД⊂) 有難う御座いました!
うーむ。趣味に金をかけずに何に金をかけるんだろうか。
つか、その程度のレベルでオンラインゲーム作ろうと思うのが偉いな がんがってくれ 皮肉じゃなくて高い目標を持つのはいい事だよ
つか、その程度のレベルでオンラインゲーム作ろうと思うのが偉いな がんがってくれ 皮肉だよ高過ぎる目標は挫折の元だよ
PGPのフィリップ・ジマーマンって、 最初はプログラミングのことは全くわからないタダのオサーンで、 いろんな人にプログラミングのこと聞きまくって勉強してPGP作ったらしいね。 目標が高いのはいいんだけど、ほんとうに真剣に打ち込める目標でナイトね。
(^^)
>212 他の趣味にお金かけますよw >213 ども! がんがります! >214 ・・・( ´・ω・) >215 ジマーマン(・∀・)イイ!! 久々に出会った、やってて楽しい作業なので まだしばらくは大丈夫です!
嘘だ馬鹿 皮肉に決まってんだろ
∧∧ /⌒ヽ) i三 ∪ 〜三 | (/~∪ 三三 三三 三三
嘘だよ。皮肉じゃないよ。 高い目標を持つのはとても良いことだよ。 ただ一気に目標に向かうのはダメで、 その目標に達するために何が必要か細分化する必要がある。 まずは、その細分化された問題を解決する小さなプログラムを作ってみてはいかが? それができてからだんだん大きくしていけば良いよ。 がんばれ!
221 :
デフォルトの名無しさん :03/01/24 23:22
default.txt(何万行もあるものです)の内容を一行ずつ読み込み a.txt、b.txt、c.txt、d.txt、e.txt の内容と照らし合わせ。default.txtの内容に合致する *.txtにカウントを1ずつ増やす、というのを高速に行う にはどうしたらよいでしょうか? forkで子プロセスを生んで並列に処理すればいいのでしょうか。。 とは言ってみたものの、へっぽこなのでわかりません。。 どうかご教示下さい。お願いしますっ
a-e.txt の内容で defalut.txt に grep かければ。
∧ ∧ ヽ( ´∀`)ノ >220 今はただ足下を固めるばかり♪ へノ / 構想の一割にもキテナイ♪ ε ノ がんがるよ! >
>>223 玉袋が冷えすぎると魔王が蘇えるから気をつけてね。
それがあの人の遺言だから。あまり無下に扱って欲しくない。
たましい。その。
225 :
デフォルトの名無しさん :03/01/26 07:16
open(IN, a) とかのINってなに?
>>225 ファイルハンドル。
INって名前の(ファイル専用の)変数に、"a" が入ってると思えばいいよ
open(IN,'a.txt')
$data = <IN>;
close(IN);
'a.txt'の別名と考えると分かりやすいかもしれない
てかドキュメント嫁
227 :
デフォルトの名無しさん :03/01/26 23:43
超初心者です。 perlでwindowsのアプリケーションとかを動かすように作れますか??
良ければ作り方か、 なんか良いHPほ教えていただけませんでしょうか??
>>229 最初からそう言えば?もったいぶってないでさ。
system
パイプ
ある文字列を含まないものにマッチする正規表現 (?:(?!foo).)* 含まないものにマッチするってどういう意味? マッチさせて含んでいたら、非0を返せばいいんじゃないの? そういうのとはちがうんか?
あるperlプログラムから、かなり処理に時間のかかる、別のperlプログラムを起動したいのですが、 system関数ではwaitしてしまうし、exec関数では元プログラムが終了してしまいます。 返り値は必要としてないので、一方的に起動させるだけということはできないのでしょうか?
234 :
デフォルトの名無しさん :03/01/27 07:51
フォークしろ
forkって自分の複製をつくるものじゃないの? forkしたあとに子プロセス側からsystemを呼べってこと?
パイプの処理で、 a.pl: open(TEST, "|b.pl"); print open 'test'; close(TEST) b.pl: while($line=<STDIN>) { printf"$line"; } としても何も表示されません。 パイプのデータの受け渡しが間違ってると思うのですが、 ぐぐっても分かりません。どうすればいいのでしょうか。 環境はwindows2000+ActivePerl最新版です
>>234-235 forkで子プロセスからexec or systemしろと言うことですね。
有難うございます。無事できました。
ActivePerl では、fork 使わなくとも(使えなくても)
system( 1, "command ..." );
とやるとバックグラウンドプロセスを立ち上げ可能。
先頭の引数が1なのがミソ。
UNIX で system( "command ... &" ) とやるのとほぼ一緒。
>>236 open(TEST, "|b.pl");
print open 'test'; # <== これは何?
close(TEST)
○ print TEST 'test';
>>232 それだけだったら、あんまり意味無いけど
否定条件で組み合わせると役に立つ
例えば、HTML読み込んで
<a HREF="〜">
の部分だけ取り出したいとき
(普通はまぁ リンク文字列 </a> も取り出すだろうけど)
/<a.*?>/ # ここで言明使っても良いけど
で出来るが、<a NAME="〜"> みたいに、NAMEを含んでいるタグは要らない場合
/<a(:?(!?NAME=".*?").)*?>/
ってやると
<a HREF="〜"> はマッチするが、<a NAME="〜"> はマッチしない。
寝惚け頭でかいてるが、何とか察してくれ
# ついでに↑の正規表現間違ってるような気がするから当てにしないでくれ
>>238 すいません、書き込みミスでした。
正しくしても、標準入力から読み込んでも空になります。
b.plは動きはするのですが。
activeperlではうまくパイプが働かないのでしょうかね。
>>239 >それだけだったら、あんまり意味無いけど
めっちゃ意味あるだろ・・・
>>241 (?:(?!foo).)*
すまん、正規表現あんまり詳しくないんでこれに驚くほどの意味は有ると思えん
それこそ !~ /foo/ でいいじゃねぇかと思う。
否定言明だけで意味ある例解説キボンヌ
243 :
デフォルトの名無しさん :03/01/27 11:58
-d スイッチのデバッガでステップ実行中に途中の行を無視して(その行は実行しない) 次の行へ移る、なんてことは無理?
>>242 おいおい、、(?:(?!foo).)* ≠ !~ /foo/ 全然違うYO
>>240 >正しくしても、標準入力から読み込んでも空になります。
ああ、そういうこと…。
Cygwin 環境下でちょっと試したが、確かにundefになるね。
最初はバッファフラッシュをやってないからだと思ったのだが
select( (select(TEST), $| = 1)[0] );
それとも少し違うようだし。
cat を対象コマンドにするとちゃんとパイプ内容が渡ってるのが確認できる。
#実際 fly.exe とか sendmail.exe がちゃんと動かせるんだし(^^;
そもそも素でSTDINから読めばコマンドライン入力待ちになるのだから、
パイプ先の b.plで <STDIN>がundefを受け取ってくるのが何故なんだろう。
#らくだ本に関連項目あった気がする。IPC::Open2 の出番かもしれない。
>>243 実行前にコメントアウトしとくのはだめなの?
ブレークポイントで任意の位置で中断することはできるけど、
リスタートはその位置か、ファイル先頭からしかできなかった記憶。
あー。これで逝けたYO! open(TEST, "| perl b.pl"); # <== ちゃんとコマンド名で叩く select( (select(TEST), $| = 1)[0] ); print TEST "test\n"; close(TEST); きちんと perl.exe 経由で起動すればパイプ繋がるわ。 #! 行に頼るとダメっぽい…。
239はアフォだな・・・ってことは232もアフォなのね
>>245 なるほどコメントアウトするしかないですか。
わりと長めのトレースの途中でコメントアウトしなきゃいけない行に
気付いたときになんとか出来ないだろうかって思ったもので。
ありがとうございます。地道にやってみます。
249 :
デフォルトの名無しさん :03/01/27 16:18
はじめて質問します。 数値を出力する時に3桁毎に「,」をつけたくてC言語だと setlocale(LC_ALL, ""); printf("%'d\n",123456789); とすることで、「123,456,789」の出力結果が得られますが perlだと use POSIX "locale_h"; setlocale(LC_ALL, ""); printf "%'10d\n", 123456789); としても、「'10d」としか表示されません。 何か方法は無いでしょうか。
>>244 >>247 >239でも>232でもないが
何となく全く同じではないというのは分かるんだが、
こんな時に使うという解説キボンヌ
>>249 どんな方法でも構わないのなら、
正規表現でも出来る。
やり方書いてなかった。 例えばこんなの $_= 1234567890; () while s/^(\d+)(\d\d\d)/$1,$2/; print; > 1,234,567,890
>>253 しょーもない指摘するくらいなら自分で書け!
my $a = 1234567890.1234;
1 while $a =~ s/^([^\.\D]+)(\d{3})/\1,\2/;
print $a; # > 1,234,567,890.1234
アフォが4人・・・っと
>>254 =252自作自演でつた。
・・・アフォだな。
253=255=256=257=258
必死だなw
まぁ、モチツケー ところで、なんか面白そうなモジュール無いかい? 便利なのでもいいし、遊び甲斐があるのでも良いし
>>260 図星のときはヘタに言い返さないこと。さらに馬鹿に見えるよ(w
と言うことは図星なのかw
254も俺じゃないんだが。 何故わざわざ変数名省略したのに戻す必要がある? まぁいいや。
>>246 どうもわざわざ有難うございますた。
無事できました。
>229 ActivePerlのヘルプを見る。GUIしたければperl/Tk。他のWinアプリを制御したければ Win32::OLE。 「perlの小技」でぐぐってみ。
>>249 すんません
むずかしすぎてわかりません
もうすこしwかりやすくおねがい
「何かキーが押されたら終了」ということがやりたいのですが、 getc()ではEnterを押さなくてはなりません。 どうすれば、ワンキーで終了できるのか、教えてくれだワン。
271 :
デフォルトの名無しさん :03/01/28 18:07
サブルーチンで読み込んだデータを配列に格納してメインに 戻しているのですが,値が入っていないようなんです. サブルーチンの中でprintさせるとちゃんと値が入っているのですが。 どなたかご教授を。 @xx=&DatRead($setdir1,$file); for $i ( 0 .. $#xx ) { print "xx=\t [ @{$xx[$i]} ],\n"; } sub DatRead{ local @xx; open(list,"$fn") while($line=<list>){ chomp($line); # 改行記号を削除 ($dmy,@x)= split(/\s+/,$line); # 先頭にDMYを入れて読み込む push @xx,[@x]; undef @x; } @xx; close(list); } # END OF SUB
272 :
bloom :03/01/28 18:16
>>271 close(list);
@xx;
} # END OF SUB
>>250 >>251 >>253 ありがとうございます。返事遅れてすみません。
要するに、文字列置換する以外無いということですね。
perlのprintfって、sprintfを呼び出して更にC言語の
sprintf(3)を呼び出しているのかと思っていたのですが
違うようですね。(ソースは難解なので追いきれません)
それではC言語で以下のような場合は、perlだとどうすればいいのですか?
printf("%'015.3f\n", 1234567.89);
001,234,567,890
宜しく御願いします。
275 :
デフォルトの名無しさん :03/01/29 11:13
Perlでサーバーのロード状況が把握できれば、 すいているときに重い処理を許可するという分岐ができると思いますが、 ロード状況の把握方法の説明がある場所ってどこかありますか。
>>274 print f015_3(-1234567.89);
sub f015_3 {
$_ = sprintf '%015.3f', shift;
/^[-+]?\d\d\d\d+/g or return $_;
for ($i = pos($_) - 3, $j = /^[-+]/; $i > $j; $i -= 3) {
substr($_, $i, 0) = ',';
}
# s/\G([-+]?)0+,/$1/g;
return $_;
}
# see also
http://www.din.or.jp/~ohzaki/perl.htm#NumberWithComma
>>275 $load = (split(" ",`w`))[適当]
くらいしか思いつかん。
モジュール探せばあるかも
>>273 レスが遅れましたが、ありがとうございます。
たった2行置き換えるだけで直るなんて.....。
(でもなんでだろう?)
>>278 return (@xx);
で明示的に戻り値示せば混乱しなくなると思うよ
>>278 closeとかの関数も「値の評価」がされるんだよ。
>>279 >>280 >>281 重ね重ねありがとうございます。
サブルーチンで配列の受け渡しをすることに成功して
プログラムもすっきり作れるようになりました。
(いままではメインのなかに何個もループを作っていました)
100G以上のデータに処理を駆けて整形する作業をしているのですが
こういう知識は必須ですね。御陰で残業が減りそうです。
>>282 でかいデータなら、配列じゃなくて配列へのリファレンスを渡すが吉
上手く説明できないのですが、 sub _routine { my $self = { a = 'value1', b = 'value2', c = '', d = 'value4', }; return <<_EOF; key1: $self->{a} key2: $self->{b} key3: $self->{c} key4: $self->{d} _EOF } こんな感じのサブルーチンがあったとします。 key3: $self->{c} の部分は空なので return の中に含ませたくないのです。 key1: value1 key2: value2 key3: key4: value4 このように表示させるのではなく、 key1: value1 key2: value2 key4: value4 このようにしたいのですが、なにか良い方法はございませんでしょうか。 return の中で if 文とかが使えれば問題ないのですが..
>>284 文字列で返すんじゃなくてハッシュ使え
データがあるヤツだけ、return用のハッシュにコピーすれ
>>284 sub _routine {
my $self = {
a => 'value1',
b => 'value2',
c => '',
d => 'value4',
};
my $rv = '';
$rv .= "$_: $self->{$_}\n" for sort grep length $self->{$_}, keys %$self;
return $rv;
}
print _routine();
< my $rv = ''; < $rv .= "$_: $self->{$_}\n" for sort grep length $self->{$_}, keys %$self; < return $rv; > return join '', map "$_: $self->{$_}\n", sort grep length $self->{$_}, keys %$self;
>>285 言葉足らずで申し訳ありません。
>>286 氏のコードの通り、
print _routine();
として呼び出したいのです。
>>286 ありがとうございます。とてつもなく勉強になりました。大感謝です。
>>287 > return join '', map "$_: $self->{$_}\n", sort grep length $self->{$_}, keys %$self;
ぁぁ、、これですコレ、私の求めていたものは。
美しすぎて失禁しそうでつ。(嬉泣
289 :
デフォルトの名無しさん :03/01/30 22:18
Perlのモジュールについてもここでいいのでしょうか? Win32:APIを使っているのですが、メモリハンドルが返り値としてある APIをCallで呼び出すと一般保護違反で止まってしまいます。 ドキュメントには特に動くサンプルも、動かない旨も書いていないようです もし知っている方いらっしゃったら教えてください
289です。 ハンドルの値は、Pにして $xx="\x0" x4;なんていう値を最初にいれておけば 動くようになりました。 でも、メモリハンドルの内容をどうやってPerlに渡したらいいのかわかりま せん。RelMemoryCopyではないようだし…。 コールバックもこの調子なら動きそうなのですが、こちらももしご存知の方 いましたら教えてください。
>>290 $data=対象の配列;$len=適当な長さ; とした場合、
my $data2=unpack("L",$data);
$MLock = new Win32::API("kernel32","LocalLock", [N],N);
$MUnlk = new Win32::API("kernel32","LocalUnlock",[N],N);
$MFree = new Win32::API("kernel32","LocalFree",[N],N);
$Mcpy = new Win32::API("kernel32","RtlMoveMemory", [P,N,N]);
$dataout= $MLock->Call($data2);
$Mcpy->Call($output,$data2,$len);
$MUnlk->Call($data2);$MFree->Call($data2);
で$outputに入る
コードの方はやってみたことないから、わからない。すまそ。
あるディレクトリの中をグロブしようと思い、 my $files = [<$hoge->{DIRNAME}/*>]; とかしてみたのですが、サックリとエラーになります。 これってなにか良い方法は無いモノでしょうか。 と、これを書いている最中に思い出しましたが glob() なんてモンがあったようななかったような。。。
スレ汚し失礼致しました。 自己解決しましたので、一応ご報告を。 my $files = [glob("$hoge->{DIRNAME}/*")];
$dirname = "c:\Program Files"; opendir($dirname); みたく、スペースのあるディレクトリを認識したいのですが $dirname = "\"c:\Program Files\""; opendir($dirname); 等やてみてもだめぽです、perlではスペースのあるディクトリ名 は使えない罠でしょうか?
>296 シングルクヲートでいけるんじゃない?
>>296 $dirname = "c:\Program Files";
opendir(DIR, $dirname);
readdir(DIR);
......
スペースのせいでだめぽではない罠。
>>296 for ('C:\Program Files', "C:/Program Files/", "C:\\PROGRA~1\\") {
opendir DIR, $_ or die;
$num = @files = readdir DIR;
print "$num\n";
closedir DIR;
}
print 'successed.';
>>296 "c:\\Program Files";
---^^---
>298でもたまたまいけるのは\PがPと解釈されるからで 普通は>300のようにすべき
302 :
デフォルトの名無しさん :03/02/03 07:45
ここ(
ttp://www.area-s.com/ )で配布されている、
NarrationBBSというのがものすごく気に入って自分のサイトに
設置しようと思い、CGIについて理解しようとネットを駆け巡り
5時間が過ぎました。CGIについては全くの初心者ですが、
一通りの設置の流れや、やらなければならないことは理解した
つもりです。で、いまだにCGIをちゃんと使えるようになって
いないのですが、どなたか助けていただけませんでしょうか。
現在の進行状態としては、プロバイダー(地域のCATVでCGI利用可確認済み)確認、
目的のCGIのダウンロード、プロバイダーに指定された内容の「.htaccess.txt」
ファイルの転送、パスの変更後CGIファイルの転送とパーミッションの設定、
ホームページのトップからCGIへのリンクを作成。
と、こんな感じなんですが、リンクをクリックすると、ダウンロードしますか?の
確認メッセージがでてきてしまい、CGIを動作させられません。
プロバイダーのCGIに関する説明は極めて少なく、以下のとおりです。 他に何か必要な情報がありましたら指摘お願いします。あと、質問なのですが 以下のプロバからの注意事項に書いてある、転送するときのパーミッションを 644にしろというのは、.htaccess.txtファイルのパーミッションを変更しろと いうことでいいのでしょうか?.cgiや.datファイルのパーミッションは、配布元の 設置の説明に書いてあったものにしたのですが。 【CGIプログラムの利用にあたって】 CGIファイルの拡張子は「.cgi」として下さい。 まず、弊社がご提供している「public_html」ディレクトリの中に「.htaccess」と いう名前のテキストファイルを転送する必要があります。 ※Windowsをお使いの方の場合、OSの制限により「ピリオド(.)」で始まるファイル名を 付けられないため、仮に適当な名前を付けてファイル転送し、転送先のファイルの名前を 「.htaccess」に変更して下さい。 テキストファイルの内容は以下のように記述して下さい。 # .htaccess AddHandler cgi-script .cgi 転送するときにパーミッションを「644」にして下さい。
朝早くからありがとうございました。そちらの板で聞いてみます。
>>303 Windows userか?標準添付されているftp.exeでプロバイダの
自分のディレクトリにアクセスしてchmodでファイルの
パーミッションを644に変えればいい。
というのは、ちょっとかったるい。
307 :
デフォルトの名無しさん :03/02/03 08:27
win user です。ホームページビルダー使ってます。ftpはビルダーに ついているFTPソフトを使っています。転送形態もちゃんとテキストモードに なっていることを確認しました。パーミッションの変え方はFTPソフト上で 右クリでファイル指定してかえるだけなので簡単なんです。 ・・・で、なんでリンクをはるとDLされるようになってしまうんだろう。 しかも「開く」選択してみたら、cgiファイルの内容が丸見え。どうすれば・・・
スクリプトファイルに実行属性はついていますか?
心の狭い香具師だな。畳の上で死ねないよ
願い下げだ。
>>309 ML で顕著だが、答えが簡単な質問には回答者がうようよと涌く。
すみません、302ですが、誘導先のスレでどなたか回答願えませんでしょうか?
>>313 311 :デフォルトの名無しさん :03/02/03 12:36
願い下げだ。
315 :
デフォルトの名無しさん :03/02/04 17:52
質問なのですが、abcと3つの項目がありそれぞれの組み合わせ a-b a-c b-c と表示させるにはどうすればよいでしょうか? @abc配列にいれて、 @abc[i]-@abc[i-1] とループさせるとa-b b-c となってa-cができません うまく表現できないのですが、どうかお願いします
>>315 こんなんでどうですかね。
@abc = ('a', 'b', 'c');
foreach $i (0 .. ($#abc-1)) {
foreach $j (1 .. $#abc) {
print "$abc[$i]-$abc[$j]\n" unless ($i eq $j);
}
}
>>309-314 邪魔です。こういうスレには質問と回答以外無用に願います。
>>316 4つの時ちゃんと動かないよ
foreach $i (0 .. ($#abc-1)) {
foreach $j (1 .. $#abc) {
print "$abc[$i]-$abc[$j]\n" unless ($i >= $j);
}
}
普通$j = $i+1じゃない? @abc = qw(a b c d e); for $i (0 .. $#abc-1) { for $j ($i+1 .. $#abc) { print "$abc[$i]-$abc[$j]\n"; } }
316は >309-314 邪魔です。こういうスレには質問と回答以外無用に願います。 だけが言いたかったんだろ。コードは付け足し 要するにバッカァ? my @abc = ('a', 'b', 'c', 'd', 'e'); for my $i (0 .. $#abc-1) { for my $j ($i+1 .. $#abc) { print "$abc[$i]-$abc[$j]\n" ; } }
一発で答え出るより、2,3ステップでコード改良される方が良いな 見てて面白い
321 :
デフォルトの名無しさん :03/02/04 23:41
こういう文字列 $str = "1#a2#BC10#0123456789" を ("a", "BC", "0123456789") というふうに(長さ0 . '#' . 文字列0 . 長さ1 . # ...)配列にたたきこみたい のですが、 /^(\d)\1$/ が二つの同じ数値から成る行にマッチすることから類推して $str =~ s/^(\d+)#(.{\1})//; としてみたのですが、$2は切り出したい文字列にマッチしてくれません。 今はsubstr()でやっていますが、そうするしかないのでしょうか。
確かに316はDQNだ。数値をeqで比較している。 だが319は318を写してるだけだし、インデントもできないDQN。 DQN同士でどんぐりの背比べ。 おっと、また316に怒られちまうぜ (藁)
インデントって、全角空白のことを言ってるのか…?
>>321 $_ = my $str = '1#a2#BC10#0123456789';
my @str = ();
s/^(.{$1})//, push @str, $1 while s/^(\d+)#//;
print "$str => (@str)";
データ構造が糞だとコードも糞にならざるを得ない好例か。
>>315 a-b と b-a を同一視するなら
my(@item, $item, @pear) = qw(a b c d e);
push @pear, map "${item}-$_", @item while $item = shift @item;
print join "\n", @pear;
>>324 > データ構造が糞だとコードも糞にならざるを得ない
あんた良い事言うな
いつか使わせてもらうよ
>>315 外部モジュールOKならば、(冗長過ぎるけど)こんなふうに
すれば、さらに汎用性が得られるよ。
use Algorithm::Permute; # CPANからDL
my(@abc) = qw(a b c);
my $p = new Algorithm::Permute([@abc]);
my %some_hash;
while (my(@res) = $p->next) {
$some_hash{join('-', @res[0..1])}++;
# a-b/b-aを同じに扱う場合はsortしてしまう
#$some_hash{join('-', sort @res[0..1])}++;
}
print key %some_hash, "\n";
>>327 自己レス。
> print key %some_hash, "\n";
「keys」が正解だね。あと、print出力の見た目も悪いな。
329 :
デフォルトの名無しさん :03/02/05 08:00
perlでhttpGETでファイルをDLしているときに DL速度を制限するにはどうすればいいんでしょう?
お返事遅れましたが、ありがとうございました。 まだperl始めたばかりですが、これを参考に精進いたします。
よつかった、四つ勝った。でも、それでも、良い子は 316=322のアホウの真似はしちゃあ、いけないよ。
>>329 実験しておらず、かなり不安なんですが。
まず、TCPクライアントとして実装、TCPウィンドウ・サイズを
小さく設定する。
$win_size = 1024; # or some values
setsockopt(SOCK,SO_SOCKET,SO_RCVBUF,pack("I",$win_size));
そして、SOCKETハンドルの読み込みループ内で、あえて
sleepしてしまう。
(でも、ここでウィンドウ・サイズが動的に変動してくれるかな…)
while(<SOCKET>) {
sleep(1) if $some_condition;
}
もっときれいな方法あるかな?>ALL
>>331 316と一緒にしないでくれ。
その恥ずかしい文章もなんとかしてくれ。
>>321 長さが決まってるならsubstr()よりもunpack()の方が速い(と思う)。
my $str = '1#a2#BC10#0123456789';
my $buf;
my @str = ();
while ($str =~ s/^(\d+)#//){
($buf, $str) = unpack("A$1 A*", $str);
push(@str, $buf);
}
print "@str";
でも
>>324 の言うとおりデータ構造は悪いと思う・・・
>>321 > $str = "1#a2#BC10#0123456789"
10年以上前に設計された基幹システムとの
インターフェース開発を、
今回、321さんが任されてるのかな。
こういうデータ構造を見ると、
そんな気がします…
>>321 大きなファイルを GET するのか、大量のファイルを GET するかにもよるけど、
その方法でOKだと思う。ただ、ウィンドウサイズをいじる必要があるような
場合には、別の方法(QoS API とか dummynet とか)を使う方がいい。ウィンド
ウサイズを直にいじっても、うまく帯域を制御するのは難しいから。
基本的にはこんな感じ。(Time::HiRes はインストールしてあると仮定。)
ウィンドウサイズをいじるのなら、コメント部を外す。
#require 'sys/types.ph';
#require 'sys/socket.ph';
use Time::HiRes usleep;
use IO::Socket;
$s = IO::Socket::INET->new(PeerAddr=>"some.host.com",
PeerPort=>"80",
Proto=>"tcp");
die $@ if !defined($s);
$s->print("GET / HTTP/1.0\r\n\r\n");
#$s->sockopt(&SO_RCVBUF,8192);
while ($s->read($line, 8192) > 0) {
print $line;
usleep(100*1000);
}
$s->close();
で、今度は質問なんですが、perl-5.8.0 で perl -e 'use encoding "iso-2022-jp"; scalar(<>);' とやるとセグメントエラーもしくはバスエラーが発生する(FreeBSD と Linux で確認)理由が分かる人居ますか?バックトレースを取ると Perl_sv_recode_to_utf8() で無限再帰しているらしいんですが。 あと、perl-5.8.0 で入力エンコーディングの自動判別をする方法はありますか?
>>336 補足ありがとう。
>>338 > あと、perl-5.8.0 で入力エンコーディングの自動判別をする方法
Encode::Guessモジュールはどうかな?
あくまで「判別」までしかできないようだけど。
use Encode::Guess;
my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/);
ref($enc) or die "Can't guess: $enc"; # trap error this way
print $enc->name, "\n";
>>338 >>339 自己レスです。
もし、変換まで必要ならば、Encodeモジュールのfrom_to()を
組み合せるといいね。
>>336 >while ($s->read($line, 8192) > 0) {
これだと相手が細切れに送ってくる場合、抜ける可能性あり。
>>338 >perl -e 'use encoding "iso-2022-jp"; scalar(<>);'
Jcode MLで聞いた方が早い。
>>339 ありがとう。それが欲しかったんです。
# perljp, Encode, Encode::JP あたりのドキュメントに書いておいて欲しかった。。
>>341 ええっ。IO::Socket の read は fread() による実装なので
> while ($s->read($line, 8192) > 0) {
これで問題ないと思っていたのですが、抜けが出ますでしょうか。これまでに
上の実装で何GBも転送してきて、特に問題が起きたことは無かったのですが…。
\@って何でしょう? @はわかるんですけど
>>343 配列へのリファレンス
man perlref あたりを参考に
>>342 スマソ、HTTP/1.0なら問題はない。
HTTP/1.1では抜けが起こる。RFC2616
>>345 えーと、まだちょっとよく分からないのですが、HTTP/1.1 の Persistent
Connection まわりの話でしょうか? 確かに HTTP/1.1 の場合は
Connection: close
ヘッダを送らないとまずいと思います。(もっとも、Connection ヘッダを入れ
なくてもサーバのタイムアウト後 fread() が最後の断片を返すので、抜けは
まず発生しないと思いますが。)
>>346 RFC 2616
3.6.1 Chunked Transfer Coding
> All HTTP/1.1 applications MUST be able to receive and decode the
> "chunked" transfer-coding, and MUST ignore chunk-extension extensions
> they do not understand.
>>347 ありがとう。「MUST」とは知りませんでした。
349 :
デフォルトの名無しさん :03/02/07 22:02
BerkeleyDBモジュールをばりばり使っているサンプル ってなにかありませんか?
350 :
デフォルトの名無しさん :03/02/08 01:19
HTML::Parserで<title>〜</title>の中のテキストを 取り出すのにスマートなやり方ありませんか?
$html=~m{<title>(.*?)</title>}i みたいに正規表現の方が簡単なんだけど、 今回はHTML::Parserでやる方法が知りたいです。
352 :
デフォルトの名無しさん :03/02/08 04:34
perl でマルチスレッドなプログラミングは出来ますか? たとえば、ファイルを読みながら入力を待つような感じのやつを
353 :
デフォルトの名無しさん :03/02/08 05:30
use HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse_file('a.html'); my $title = ($tree->find_by_tag_name('title'))[0]->as_text;
>>350 use HTML::TokeParser;
$p = HTML::TokeParser->new(shift||"index.html");
if ($p->get_tag("title")) {
my $title = $p->get_trimmed_text;
print "Title: $title\n";
}
356 :
デフォルトの名無しさん :03/02/08 17:20
>>355 あまりよく知らないんだったら、黙っている方がマシだと思う。
一つしかマッチするのがないと判っている場合でも grepを使う時は @temp と配列に格納しないといけないのでしょうか 引っ張り出したデータを続けて処理する時に if(@temp[0] = としているのですが、なんとなく不格好な気がして…
>>357 @temp[0] なんて書き方じゃ動かんと思うぞ、ついでに ==じゃないのかね
それは良いとして
$temp = $temp[0]; とか
$temp = (grep 〜〜〜)[0];
ではダメかい?
>358 ありゃ、@temp[ ]ってダメなんですねΣ(゚д゚;) 普通に動いてた(なぜだっ)ので全然気づかなかったです 全部書き直さないと…あちゃぱー >$temp = (grep 〜〜〜)[0]; これを使わせていただきます(ー人ー)
>>359 @temp[...] は「スライス」という奴で、配列の一部を返します。
基本的に、@temp[0] と $temp[0] は同じ物を表します。
(後者の方が速いけど。)
たとえば、以下のような場合には違いが生じてきます。
@temp[3,4,5] => ($temp[3], $temp[4], $temp[5])
$temp[3,4,5] => $temp[5]
スマソ、@と$の単純な書き間違いだと思って突っ込んだんだが スライスと解釈されて動いちゃうのね
>>361 あれほど魔法的動作が多いperlに関して、ためしもせずに思い込みだけで
難癖つけるほど頭が固くエゴ剥き出しの心を持つ359は、perlはやめたほうが
いいと思う。
>359は>357なのでして…いや、どうでもいいんですが。 もっとどうでもいいことに、=>208だったりもするのです。
>>349 >>356 「man BerkeleyDB とすれば、例文たくさん載ってるけど、
これだけでは不足かな?」と言おうとしました。
表現がなってなかったね、ごめんね。
>>324 >>334 ありがとうございます、参考になりますた。
>>335 これ、CVSupのcheckoutsファイルの一部なんですよ。
CVSのメタファイルをcheckoutsファイルから掘り出すスクリプトを
組んでいたんです。
366 :
デフォルトの名無しさん :03/02/09 01:40
webprogのスレに出て短だけど、変数宣言って続けて書く時は()でくくらないと 有効にならないって本と?
Perlに変数宣言はありません。
>>364 あまりよく知らないんだったら、黙っているのが良いと思う。
>>366 my $a,$b
だと$aだけがmyになるから
my ($a,$b)
としろってことかな。
>>366 $a = 1;
&f;
print $a;
sub f() {
my ($hoge, $a);
$a = 2;
}
これだと1がでる。
my の後の括弧を外すと2が出る
371 :
デフォルトの名無しさん :03/02/10 00:14
マルチスレッドできないの?パールって? ダメジャン。うんこすぎ。
373 :
デフォルトの名無しさん :03/02/10 02:32
放って置けよ
375 :
デフォルトの名無しさん :03/02/10 13:21
ソースを見付けて来て改造する
378 :
デフォルトの名無しさん :03/02/10 16:35
cgiとして使用するとしてソースサイズとサーバの 負荷に因果関係はありますでしょうか? たとえば入出力を同程度とし、20Kのソースと 200Kのソースではかなりの違いがあるのでしょうか?
でかいソースの方がロードに時間はかかるな。若干。 一番サーバに負荷をかけるコードを教えてやろうか? #!/usr/bin/perl 0 while 1;
すいません、アホな質問かも知れないですが <img src="〜"> や <body background="〜">のようなHTMLタグの img や body を大文字に直す正規表現を書きたいのですが、 tr/<[a-z]+?\s/<[A-Z]+?\s/i; このように書いてみたのですがうまくいきません。 どの辺りが間違っているのか教えて頂けないでしょうか?
1 trが正規表現を受け付けると思っているところ 2 置換文字列にも正規表現を使うと思っているところ
調べもせずに2chで聞けばいいと思っているところ s/<[A-Z]+/lc($&)/egi;
s/(<\w+)/\U\1/g;
4.タグを大文字に直そうとしているところ 5.目的は知らんがCGI板向けの香りがする事
あらゆる意味で阿保だな
387 :
デフォルトの名無しさん :03/02/11 07:52
ファイルを拡張子で判断したいとき $kakuchousi = `zip|bin|jpg|exe`; $filename ~= /^[a-zA-Z0-9_-]+\.($kakuchousi)$/ とやるしかないのでしょうか? $kakuchousi変数を配列にしたいのですが。 @kakuchousi = ('zip', 'bin', .... )としたほうが他にもつかえそうだし。
拡張子を切り出してから調べれば?
>>387 File::Basename モジュールを使ってみたらどうだい
うpろだでも作るのかな
すみません。超初心者なんですが宿題の課題で read(STDIN, $str,$ENV{"CONTENT_LENGTH"}); という行の意味が知りたいんですが。特にCONTENT_LENGTH の部分の役割を教えていただけませんでしょうか。 あつかましいのですが宜しくお願いします。
と・・CGIについてだったんですが ぐぐったらありました。すみませんでした。
>>392 CONTENT_LENGTHはデータの長さですよ
1行が200KB以上の場合、どのように処理すればいいのでしょうか? while (<IN>)ってやると、データがでかいって文句を言われてしまいます。
read(FILEHANDLE,SCALAR,LENGTH,OFFSET) を使うといいんでない? データがでかいって文句言われることってあるんですね。 $buf = <IN> とかで、まとめて読んでもいいのでは?
↑160というのは、うそです。クッキー君でした。ごめんなさい。
>>398 ありがとうございます。readでできました。
ところで、このreadのLENGTHってどれぐらいまで大きくできるんでしょう?
環境に依存するのかな?
自分で調べてここに報告汁
402 :
デフォルトの名無しさん :03/02/14 17:11
ええと、Perlからwindowsのパス付きの共有フォルダにアクセスしたいんですが、、、 パス付きでも、実行マシンから既にアクセスしていたり(パスワードを入力済み) 実行マシンと同じID/PASSだったりすると特別めんどくさいことはないんでsuga open FILE,"\\IPアドレスとかマシン名\xxxxx"; で開けますよね。 ただ、上記の条件をみたなさな、単純にパスワードが付いてるマシンの共有フォルダに アクセスする場合、スクリプト側では、ID/PASSはもちろんしってるんですが どうすれば開けるんでしょうか?
補足ですが、、、条件がちょっとあります。 まず考えついた方法として 「ネットワークドライブに割り当てる」 って方法がありますよね。 これだと、異なるユーザーでアクセスって設定がありますし。 ただ、これだとアクセス先がHDDとか無視してもドライブレターがA-Zのの26個が限界ですから 却下です。 あと、クライアント側のPCはwindowsです。 Linux系にしてsmbmountでマウントする〜 ってのも却下です。。。 わがままですいませんが、なにかID、パスワードを指定してファイルにアクセスするような モジュールがあるんじゃないかと夢想してます。。。 ないですかねぇ、、、CPAN探ってみたんですが、みつけられませんでした
>>402 お前、
「ネットワークドライブ上のあるパスを開きたいんですがパスがかかってて開けません。
どうやったらこのパスのパスを入力してそのパスを開けるのでしょうか?」
とか言う文章書けるだろ。
>>404 すいませんー。。。
PATHとPASSで区別すればよかったですね。。。
ドライブ名割り当てないで net use \\host\share /persistent:yes しときゃ いいんでないの?
Win32::NetResource でとりあえず解決しそうです。。。 ありがとう御座いました
>136 :134 :03/02/14 19:54 ID:aS0shCzv
>
>>135 >そのヒントから
>Win32::NetResource
>にたどりつきました。。。ありがとうございます。
一言逝って置く、もうくんな
409 :
デフォルトの名無しさん :03/02/15 10:33
LWPモジュールで以下のようにHTTPをリクエストしているのですが、
MIMEとかのヘッダー情報を知る方法ってあります?
#HTTPリクエスト
$ua=new LWP::UserAgent;
$ua->agent($user_agent);
$ua->timeout($timeout);
$req=new
HTTP::Request ('GET',$url);
$res=$ua->request($req);
if($res->is_error)
{
print("エラー\n");
exit;
}
HTTPレスポンスのヘッダ(というか全文)なら $res->as_string 特定のヘッダなら $res->header("Content-Type")
kimura君、マルチポストはご法度だぜ
412 :
デフォルトの名無しさん :03/02/15 17:37
rubyから乗り換えようかと真剣に考えてる。 オブジェクト指向というのは、古くからのブログラマには正直つらい みんなどう?
413 :
デフォルトの名無しさん :03/02/15 17:40
それと、1つ聞きたいんだが、perlは次々と機能を拡張して来てるみたいだけど、 本当のコアとなる基礎の部分というのはあるんだろうか? つまり、方言(あるのか?)やらバージョンの違いを越えてどこでも安心してつ かえる部分という意味である。 例えば、シェルスクリプトなら/bin/shみたいなイメージだ
んん、Rubyからの乗り換え?それは珍しい。逆ならよく聞くけど。 私的にはRubyの「なんでもオブジェクト」ってのは便利だと思う。 でもライブラリの数はPerlが圧倒してるから、 Perlの方がすぐに色々なことができるってのはあるかもね。
>412 Rubyはどうだかしらんが、 Perlの場合「やり方は何通りもある」なので、それに納得できるかどうか。 時々正解が複数あることにガマンできない人がいるんだよねー。
>>413 今広く使われていると思われる1999年リリースのv5.005_03を基本に考えれば
最新版でも問題なく動くはずだよ。
方言は…そうだなぁ、コンパイル時のオプションでスレッドがあったりなかったり、
Unix用の関数はWindowsのPerlでは動かない物も多かったりするので、注意が必要かも。
あと日本語の扱いがオリジナルPerlとJperlでは異なるのがやや問題かなぁ。
でもまぁ演算子の優先順位や数値リテラルの書式がコロコロ変わったりはしないから、
その点Rubyよりは安定してるといえると思う。
417 :
デフォルトの名無しさん :03/02/15 20:20
コーディングポリシーを決めるコストってあるじゃない。 先にCをやってたからいつもC風に書いてるけど。
>>410 $res->header("Content-Type")
でできました。
ありがとうございました。
>>417 俺もC風に書くことを心がけてる。
例えば・・・
print "あいうえお";
ではなく
print("あいうえお");
と書くようにしたり。
>>412 > rubyから乗り換えようかと真剣に考えてる。
> オブジェクト指向というのは、古くからのブログラマには正直つらい
自分も古株のつもりだけど、オブジェクト指向が無いと逆につらい。
Perl で 1000 行を超えるようなスクリプトを書く場合、データ構造
とそのデータへのアクセサの定義にいつも苦労する。(あなたとは逆
で、そろそろ ruby も使うかなと考えていたり。)
>>413 Perl はバージョン 4 から 5 に変わる時に大きな変化があったけど、
その後は大体上位互換な形で開発さている。現在、Unix 上で バージョ
ン 5.005_03, 5.6.1, 5.8.0, Windows 上で 5.6.1 を同時に使ってい
るけれど、特に違いを意識せずに使える。(5.8.0 の Unicode 対応機
能を使うと 5.6.1 等で動かなくなるといったことはあるが、逆はない。)
>>417 どちらかというと、他人のソースを読む時の方が苦労するような。
>>423 5.6から5.8に移行したときunicodeがらみの処理の変更でひどい目にあったけどなあ。
>>418 Ruby1.7からリテラルに対する単項マイナス演算子の扱いが変わって、
例えば「-2**2」という式は1.6と1.7じゃ結果が違うらしい。
まぁ、些細なことだけどね。
>>425 5.6 の Unicode 処理機能を使おうとは思わなかった。
5.8 でもまだちょっとおかしなところがある。
日本語・Unicode 関連は Jcode.pm 中心にまったりとやってます。
> 431=409=kimura あっちでもレス付いてるぞ。お礼しなくていいのか?(藁
rubyからの乗り換えについて、 いろいろとご回答くださり感謝します. perlは全然さわったことがなかったのですが、 perlの非オブジェクト部分に限定するような感じで 使いはじめてみたいと思います. ありがとうございました.
kimura必死だな
kimura、まだあっちでレスして呉れた方にお礼しないのか? (いろんな意味で)小さいな。
すまんが、このスレしか見てない俺には関係無い事だ kimuraとやらと一緒に余所行っちゃくれんかね?
439 :
デフォルトの名無しさん :03/02/18 16:40
初心者です。助けてください ある文字列に対して 半角の数字(10〜149)が出てきたらそれに対応した全角1文字の外字に変換したいのですが。 ・上記以外の数字(1ケタや4ケタ以上)は全角に変換。 ・数字以外の記号も全角に変換。 ・入ってくる文字列はsjis こんなの考えました。(動作確認済) しかし上司に「ハッシュは遅いから他の方法にしろ。外字の文字コードは順番に並んでるんだから…」と言われました… どうやって良いか全然分かりません。ヒントだけでもお願いします。
続きです。 my %henkan = ( '1' => "\x82\x4f", : #1から9までは全角文字への変換 '10' => "\xf4\x59", '11' => "\xf4\x5A", : '149' => "\xf4\xE5", ); my $str = "半角の数字を含んでいるかもしれない文字列"; $string =~ s/(\D|^)(\d{1})(\D|$)/$1$henkan{$2}$3/sg; $string = Jcode->new($string,'sjis')->tr($from1,$to1)->h2z->sjis; while ( $string =~ /(\D|^)(\d{3,})(\D|$)/sg ) { if ( $2 > 149 ){ my $temp = Jcode->new($2,'sjis')->tr($from2,$to2)->h2z->sjis; $string =~ s/(\D|^)(\d{3,})(\D|$)/$1$temp$3/sg; } else { $string =~ s/(\D|^)(\d{3})(\D|$)/$1$henkan{$2}$3/sg; } } $string =~ s/(\D|^)(\d{2,3})(\D|$)/$1$henkan{$2}$3/sg; print $string; ※from1は半角記号(数字以外全て)、to1は全角記号(数字以外全て) ※from2は半角数字、to2は全角数字
>>439 正直、引き算と足し算だと思うんですが。
>>441 その具体的やり方ってラクダ本見ても良くわからないのですが…
"\xf4\x59"
の文字を
"\xf4\x5A"
にするにはどういう計算をすればよいのですか?
my $a = "\xf4\x59" + "\x01";
ではエラーになりました。。。(ノД‘)
>>439 my @henkan = map { "\x82" . chr } 79..88;
push @henkan, map { "\xf4" . chr } 89..229;
my $i = 0;
my %henkan = map { $i++, $_ } @henkan;
my $str = "半角の数字を含んでいるかもしれない文字列";
# 配列で変換
$str =~ s/(?<!\d)(\d+)(?!\d)/$henkan[$1]/gs;
# ハッシュで変換
$str =~ s/(?<!\d)(\d+)(?!\d)/$henkan{$1}/gs;
どの程度差があるかベンチマークとってみれ。
>>439 へたに関数使うよりハッシュの方が速いことが多い。
>>439 pack("n", unpack("n", "\xf4\x59")+1) -> "\xf4\x5a"
ちなみに、ハッシュは理論的に言えば非常に速いし、perl のハッシュ実装も
決して遅くない。君の上司が何かを誤解しているか、君と上司の間に誤解があ
るか、どちらかだと思う。
関数コールする時ハッシュるし。 あとは、パターンマッチを使わなくてすむなら 使わない方が早かったりするし。
皆さんありがとうございます。 上司は頭は切れるのですが自分の好みに合うコーディングじゃないとダメみたい なんです。 まあ能力では全然かなわないから従うしか無いんですけど。 できたら明日結果報告します。
>>447 その上司にハッシュを使わずに書いてもらって、ハッシュで書いたのとベンチ
マークして比べてみろよ。
>>448 恥をかかせることが、
>>439 の今後の生活にとって正しいのか
どうかは、微妙ですな。頭の切れる上司とやらが、分別のある
大人であることを祈ろう。
役職者には、たまにとんでもないのがいるからね。
まあ、インデックス参照や数値演算のみで処理できるのなら、 それに越したことはないでしょう。
>>450 数値計算が一回入ると、ハッシュの方が速くなることが多い。
>>439 の例で言えば
$str =~ s/(?<!\d)(\d\d|1[0-4]\d)(?!\d)/"\xf4" . chr(0x4f + $2)/ge;
とするより、ハッシュを使って
$str =~ s/(?<!\d)(\d\d|1[0-4]\d)(?!\d)/$convTable{$1}/gs;
とする方が速い。
どのみち Jcode.pm の h2z ではハッシュを使いまくってるし、ここだけハッシュを
回避する理由はない。コードの最適化は、コード全体を見てからしないと…。
perlのハッシュ使いだすと怠惰になるから・・ という教育的配慮じゃなかろうか。
>>452 Perlerは無精であれ、と言われてるのに、いやな教育的配慮だなぁそれ(笑
>>453 同意。ならそもそもPerlを使うな、といいたい。
脳タリンな上司持つと平は大変だな
>>453 >>454 同意なんだが、新人にものぐさ度Maxの言語を最初に習得させるというのは
あんまり気がすすまない。
皆さんのアイデアを色々使わせて頂いてこんな感じに仕上がりました。
(上司にはまだ見せていませんが'while'を使うのも良くなかったみたいです)
my $string = "半角の数字を含んでいるかもしれない文字列";
#数字以外の半角文字を全角に
$string = Jcode->new($str,'sjis')->tr($from1,$to1)->h2z->sjis;
#外字が'47' => "\xf4\x7E",'48' => "\xf4\x80",
#で"\xf4\x7F"が無いのでまず'47'までを変換
$string =~ s/(?<!\d)([1-3]\d|4[0-7])(?!\d)/"\xf4".chr(0x59 + ( $1 - 10 ))/sge;
#'48'以降を変換
$string =~ s/(?<!\d)(4[89]|[5-9]\d|1[0-4]\d)(?!\d)/"\xf4".chr(0x80 + ( $1 - 48 ))/sge;
#残りの半角数字を全角に
$string =~ s/(\d+)/Jcode->new($1,'sjis')->tr($from2,$to2)->h2z->sjis/sge;
print $string;
'47'までと'48'以降の処理が分かれてしまったのですが何とか1発で済ます方法は無いでしょうか?
あとベンチマークの取り方がイマイチわかりません。
http://www2u.biglobe.ne.jp/~MAS/perl/waza/bench.html に書いてある方法でやってみたのですがうまく行きません。
アドバイスお願いします。
458 :
デフォルトの名無しさん :03/02/19 15:00
こんな感じでベンチマークとってみました。 my $t0 = new Benchmark; #それぞれの処理を書く。 my $t1 = new Benchmark; my $td = timediff($t1, $t0); print "the code took:",timestr($td),"\n"; すると最初の方法では the code took: 0 wallclock secs ( 0.07 usr + 0.01 sys = 0.08 CPU) 書き直した方法では the code took: 0 wallclock secs ( 0.06 usr + 0.00 sys = 0.06 CPU) で速くなりました。 これで見せてみよう… 大丈夫かなぁ。。
460 :
デフォルトの名無しさん :03/02/19 18:57
標準入力から文字列を読んで、標準出力に出力するスクリプトがあって そのスクリプトを別のスクリプトから起動して、その結果を受け取りたいんですが とりあえず今は $str = `cat $input | hoge.pl`; としています。 ただ、この場合メタ文字が含まれた場合よろしくないので 別の方法にしたいのです。 いったんファイルに書き出して $str = `hoge.pl < $file`; は、すでにボツにされた。 何か良い方法はないでしょうか? hoge.plを呼ばずに素直に同等なスクリプト書けばすむ話だけど それは駄目らしい・・・
>>460 > $str = `cat $input | hoge.pl`;
すでに$inputというファイルにデータがあるなら
> いったんファイルに書き出して
という必要はないだろう。
$str = `hoge.pl < '$input'`;
あるいは
open(HOGE, "|") || {
open(STDIN, $input) || die;
exec("hoge.pl");
}
>>460 普通は
open(IN, "cat $input | hoge.pl |")
だけど、メタキャラクタが気になっているということは、ひょっとして
$input はファイル名ではなくデータそのもの?つまり、
open(IN, "echo $input |hoge.pl |")
と本当はやりたくて、かつ $input 中のメタキャラクタが問題になっている?
ならば、pipe + fork か IPC::Open2 を使うべきだけど、あなたのレベルだと
少し苦しいかも。
×$str = `cat $input | hoge.pl`; ○$str = `echo $input | hoge.pl`; でした。すみません。 肝心なところでミスを・・・ >462 ということで、すみません、それです。 確かに、pipe+forkはやったことがないので苦しいかと思いますが 勉強したいので。。
>>463 とりあえずperldoc openを欲嫁
my $pid = fork; if (!defined($pid)) { # fork 失敗 die "fork: $!"; } elsif ($pid > 0) { # 親プロセス close(I1); close(O2); print O1 $input; close(O1); @result = <I2>; close(I2); } else { # 子プロセス close(O1); close(I2); open(STDIN, "<&I1"); close(I1); open(STDOUT, ">&O2"); close(O2); exec("hoge.pl") || die "exec: hoge.pl: $!"; } # @result に hoge.pl からの出力が入っている。
467 :
デフォルトの名無しさん :03/02/20 00:16
複数の人に登録してもらうので登録番号をつけるようにしようと思うのですが、 (当然登録された順に0,1,2,・・・のように) $lno = $lines[$#lines] +1; のようにすると0,1,2,・・・のように保存されていきます。 ここまではいいのですが、登録してもらった後に、ランダムで2人を選んで対戦させ、 勝った人を先頭にもってきます。 問題が起こるのは1番最近に(登録番号が1番大きい)が対戦で勝った場合リストの先頭にいってしまうので、 次に登録した人の番号がダブってしまいます。 例)先頭から8,3,2,1,5,4,6,7で登録すると8になってダブル。 ダブらないようにするにはどうしたら良いのでしょうか?
469 :
デフォルトの名無しさん :03/02/20 01:03
$lno = $#lines +1; にしたらでキターーーーー!!
>>468 返信ありがとな。
470 :
デフォルトの名無しさん :03/02/20 01:08
471 :
デフォルトの名無しさん :03/02/20 01:18
LSDって何? バトルロイヤルの改造やってます。
Limited Slip Diff
>464 ラクダ本は読んでいるんですけど、読み足りてないようです >465 ありがとうございます。 理解するのに時間がかかりそうなので よく読んでからまたきます。
>>457 を見せました。色々文句言われました。"\d"は使わず"[0-9]"を使えとか…(--#;;
それは良いのですが
$string =~ s/(?<![0-9])([1-3][0-9]|4[0-7])(?![0-9])/"\xf4".chr(0x59 + ( $1 - 10 ))/sge;
$string =~ s/(?<![0-9])(4[89]|[5-9][0-9]|1[0-4][0-9])(?![0-9])/"\xf4".chr(0x80 + ( $1 - 48 ))/sge;
「この部分を47までと48以降で分けてサブルーチンにしろ。/gは遅くなるからダメ」と言われました。頭の中は?が飛んでます。
結局数字部分を見つけるのにはマッチングさせないといけないし、その部分を置き換えるのは置換しか無いのではないでしょうか?
どういう方法があるのか見当も付きません。
とりあえずperlクックブックを見て研究中です。
perl6って、いつ出るの?
馬鹿な上司は自分のチンポのでかさを示すために "\d"は使わず"[0-9]"を使え、とか言うもんさ。 "[0-9]"を使ってたら"\d"を使えと言うだろな。 /gが駄目ならwhileで廻せ。まあ、適当にあしらって おけばいいんだよ。 潰れないように、ガンバ
> "\d"は使わず"[0-9]"を使えとか perl 以外でも使える正規表現を優先して使わせようと思っているのかもね。 >「この部分を47までと48以降で分けてサブルーチンにしろ。 $string =~ s/(?<![0-9])([1-3][0-9]|4[0-7])(?![0-9])/&sub1($1)/sge; $string =~ s/(?<![0-9])(4[89]|[5-9][0-9]|1[0-4][0-9])(?![0-9])/&sub2($1)/sge; とでもしろってことでしょう。 $string =~ s/(?<![0-9])(1[0-4][0-9]|[1-9][0-9])(?![0-9])/"\xf4" . chr(0x4f + $1 + ($1 >= 0x30))/sge; の方が速いと思うが。 > /gは遅くなるからダメ」と言われました。頭の中は?が飛んでます。 その上司本当に Perl 知ってるのかな? 複数個所の in-place replace をす るなら /g が一番速いんだが。他にも while で回す、split+map を使う等い ろいろ方法はあるけど、特殊な条件下でないと /g より速くなることはない。 なんというか、聞いていて不安だ。
>>474 の件ですが、
こんな方法を考えました。
$string =~ s/(?<![0-9])([1-9][0-9]|1[0-4][0-9])(?![0-9])/sub($1)/seg;
sub sub{
my $num = shift;
my $ren;
switch: {
if ( $num <= 47 ) {
$ren = "\xf4".chr(0x59 + ( $num - 10 ));
last switch;
}
if ( $num >= 48 ) {
$ren = "\xf4".chr(0x80 + ( $num - 48 ));
last switch;
}
}
return $ren;
}
でも元の方が速い… 全然見当違いなのかなぁ。
>>477 さん
ありがとうございます。
>$string =~ s/(?<![0-9])(1[0-4][0-9]|[1-9][0-9])(?![0-9])/"\xf4" . chr(0x4f + $1 + ($1 >= 0x30))/sge;
の"chr(0x4f + $1 + ($1 >= 0x30))"の部分の処理の意味を教えて下さい。そのまま走らせると文字化けしました。
あと、「/gを使うな」というのは僕の勘違いかもしれません。スイマセン。
479 :
bloom :03/02/20 17:37
480 :
デフォルトの名無しさん :03/02/20 19:42
変数$aと$bにバイナリデータが入ってるとして 同じかどうかを調べるには、 if($a==$b){〜} と if($a eq $b){〜} とどちらがいいんでしょうか?
>>480 $a==$b はダメじゃない?
$a="0" $b="00" でも真になるよ。
>>481 じゃあ、
if($a eq $b){〜}
でいいのかな?(バイナリデータは文字列扱い?)
>>478 やはり素直にハッシュを使うべきだと思うがな。
my %conv;
@conv{ 0..149 } = (
map("\x82" . chr, 79..88),
map("\xf4" . chr, 89..126, 128..229),
);
$string = Jcode->new($string, 'sjis')->tr($from1, $to1)->h2z->sjis;
$string =~ s/(?<![0-9])((?:1[0-4]?|[2-9])?[0-9])(?![0-9])/$conv{$1}/g;
$string =~ s/([0-9])/$conv{$1}/g;
これだけで済む事を、やれ条件分岐だサブルーチンだとコード
増やすのは馬鹿げてるし、無駄に重たくなるだけかと。
/g ではなく /e を使うなという事なら分からんでもない。
あとベンチ取る時は CPU time が最低 5 秒以上かかるように
試行回数増やさないと有用な数字が出ないよ。
485 :
デフォルトの名無しさん :03/02/21 00:04
$a = $lines[$tai]; $b = $lines[$tais]; open(DB,"$logfile"); seek(DB,0,0);@lines = <DB>; close(DB); foreach $lines (@lines){ ($lno, $lname, $lsakusya, $lhomepage, $llif, $lpow, $ldef, $lspe, $ldate, $lip, $licon, $lwin, $lsyu, $ltotal) = split(/<>/,$lines); $ltotal++; $lines = "$lno<>$lname<>$lsakusya<>$lhomepage<>$llif<>$lpow<>$ldef<>$lspe<>$ldate<>$lip<>$licon<>$lwin<>$lsyu<>$ltotal<>\n"; } この時、$ltotal++;と言う処理を$lines[$tai]と$lines[$tais]にだけ行いたいのですが、どうしたら良いのでしょうか?
>>439 >chr(0x4f + $1 + ($1 >= 0x30)) の意味
($1 >= 0x30) は $1 が 0x30 以上なら 1、そうでなければ 0 になる。つまり、
$1 < 0x30 -> chr(0x4f+$1)
$1 >= 0x30 -> chr(0x50+$1)
という意味。(慣れると三項演算子よりも読みやすくなるけど、あまり濫用し
ない方がいい。)
というか、elsif を覚える方が先決のような気がしてきた…。
487 :
デフォルトの名無しさん :03/02/21 11:04
>>484 さん
ありがとうございます。
そうですよね。私も最初はそう思ったんですが…
でも色々新しいことの勉強もできたんで良かったです。
>>486 さん
その方法を少し改造して
#$1が48以上だったら1を足す
$string =~ s/(?<![0-9])([1-9][0-9]|1[0-4][0-9])(?![0-9])/"\xf4" . chr(0x59 + ( $1 - 10 ) + ( $1 >= 48 ))/sge;
これでファイナルアンサーだろうと思って見せたら【( $1 >= 48 )】の部分を見て
「何だこれは?」と言うので説明したら
「これだと“1”が帰ってくるんじゃない!“true”が返ってくるんだよ!」と怒られたので
( $1 >= 48?1:0 )
に直しました。
これが今までベンチマークとった中では最速でした。
これで上司も満足?してくれたと思います。
皆さんありがとうございました。
「オレならこうするね」っていう意見もあれば勉強したいのでお願いします。
>>488 > 「これだと“1”が帰ってくるんじゃない!“true”が返ってくるんだよ!」と怒られたので
(゚Д゚)ハァ?
> これが今までベンチマークとった中では最速でした。
三項演算子使った方が速かったってこと?
失礼しますた。 $1 >= 48?1:0 よりも $1 >= 48 のほうが速かったです。 でもダメって言われたんですよ(涙)
まぁ
>>488 で、その上司がPerlをまったく分かってないということだけははっ
きりしたわけだ。
/ .:.:. / ̄ \ _,,,,-‐'''" \, へ、 / .:.:/ /\.:.: / ヽ /.:.:.:,‐'" 〈.:.:.:.:\.:.:.: /.:.:___,,,,-‐ __.:.:_,,,,-‐.:.: `、,,_ _,,,-''" |\.:.:.`''/_..-'/,,-‐''"∠..,,,,,,/_,,,,-‐ __ ヽ、 --‐'' |,ィ'⌒゙ヽiイ´ // , " ̄`ヽi! /// .: ヽ、`ヽ、 .:. 〈 (~< レ '´ ' ..,,_('ッ ゙i!/'´ //|.:.: \ _,,,-''.:. .:.:.\ ` ,,、、´゜、、、 __,,,,.../ ::|.:.:|.:.: | --‐''.:.:.:.:/:: .:.:.:.:./´`T ,,_(ッ,ノ /.:.: / :/|.: / .:.:.:.:.:.:/.:.:.:.:.:./:::/ /~⌒ヽ、-/゙//| :/|/ |/ 从___人/(____ ---‐-、____,、-‐< /⌒゙ヽ ヽ> / |/ |/ __)`-ー-' ;;;;;;;;;;;;;;;;;;;;;;;;;;;ヾ、'、 /‐-、_ 〉 / , ' > ;;;;;;;;;;;;;;;;;,,,,-‐'''"\\__\ `ヽ-、;_/ ,,-'' \ trueって  ̄ ̄^i;;;;;;;;;;`-;;;;;;;) \ノ::::´`ヽ、 ,, - "ヽ、 ) な に !? ::::::::::::::|;;;;;;;;;;;;;;;∠-‐'''"`-、:.:.:.:.: `''''".:.:.:.:.:. '、 ∠ ::::::::::::::::\;;;;;;;;;/::::\|;;;|;;;ヽ、:.:.:.:.:.:.:∧.:.:.:.:.:. ', 〕 \::::::::::::::::|;;;;;/::::::::::::/;;;/;;;;;;;;|.:.:.:.:.:. / |.:.:|\: i / :::::\:::::::::::`‐'::::::::::::/;;;/;;;;;;;;;/.:.:.:.:/ // |: /  ̄ ̄)/W⌒\(~~∨⌒ヽ
確実に数値として有効な値が欲しいときは冗長だが expr ? 1 : 0 とするべきでは。
<で確実に1か0が得られることは仕様なわけだが。
>>494 そうだね。warningsが有効になっていると警告を出す、
という点が気にならなければ、もちろんそれでも構わない。
496 :
デフォルトの名無しさん :03/02/22 22:13
思わずperlの仕様を調べてしまった > true
Programming Perl 3rd Ed. page 100. Relational Operators (> >= < <=) These operators return 1 for true and "" for false.
498 :
デフォルトの名無しさん :03/02/24 14:49
Perl/Tk関連のスレって、どこにありますか?
499 :
デフォルトの名無しさん :03/02/24 18:55
print "hogehoge\n"; これの出力先を別ターミナルにしたいのですが どのようにすればよいでしょうか?
500 :
デフォルトの名無しさん :03/02/24 19:13
Perl内から実行したコマンドの出力を受け、それが改行を含む文字列のリストの場合、 例えば($a = `find ./ -name a`)の様なとき、 このリストを一行ずつ読み込んで変数に代入するにはどうしたらいいですか?
>>500 @a = `find ./ -name a`
>>499 open(TTY, ">/dev/ttyxx")
print TTY "hogehoge\n";
ttyxxの部分は適宜調べる
503 :
デフォルトの名無しさん :03/02/24 19:49
>>501 2行目を取り出すにはどうすればいいの?
っと思ったけど、@は配列だったね。失礼しました。
サンクス
>>501
>>502 うわ、そんな簡単な事だったんですね…
さっそく試してみます。
混乱してましたが、すっきりしましたありがとう♪
506 :
デフォルトの名無しさん :03/02/24 20:38
`cat hoge.txt > hoge` という文が処理されないのですがどうしたらいいですか? 0バイトのhogeが作成されるだけで終わります。 perlが標準出力をトラップしてるのでしょうか?
>>506 何の問題もなくhogeが作成されるが。
何か激しく勘違いしてないか?ディスプレイが溶けるほどソースをよく見ろ。
hoge.txtが空なんだろ
$ENV{PATH}?
510 :
デフォルトの名無しさん :03/02/24 22:17
よく調べたら、chompし忘れてて、 cat hoge.txt > hoge になってた様です。 ありがとうございました。
…バッククォートの中身をchompし忘れって… それはつまり、クラックし放題ですか?
>>511 -rwx------なのにどうやってクラックするんでしょうか
chompするってことは変数をバッククォートで括ってるんでしょ。 てーことは、変数の値によっては妙な権限でコマンドが動作するんでない? いや、変数が外部から一切操作されないなら問題ないけど。 む、書いてる内に大きなお世話という気がしてきた。
>>511 の書き方だと、chompすれば安全であるかのような誤解が生まれないか心配。
515 :
デフォルトの名無しさん :03/02/25 13:24
正規表現の置換処理内で関数の返値を使いたいんですが可能ですか? $_ = "Public Const AAA = 32"; m@=\s*([0-9a-fA-F].*)@; $v = hex($1); s@(=\s*)[0-9a-fA-F].*@\1$v@; # $_ = Public Const AAA = 20 というようなことを s@(=\s*)([0-9a-fA-F].*)@\1hex(\2)@; というような感じにしたいのですが…
eオプション
てか、
>>506 が嘘書いてんじゃん
`cat hoge.txt > hoge`
じゃなくて
`cat $file > hoge`
だったんだろ? 人に聞くときは勝手に脳内展開するなよな
518 :
デフォルトの名無しさん :03/02/25 14:23
メタ文字 意味 . 任意の一文字 + 直前のパターンを一回以上繰り返す ? 直前のパターンが0回または1回現れる さてここでなぜ m/.+?/ が、最短マッチになるのか論理的に説明してください!
>>516 ヒントありがとうございます。
早速
s@(=\s*)([0-9a-fA-F].*)@\1hex(\2)@e;
としてみましたが、なんか \1 や \2 が展開される前に
評価されてしまっているようで、\1 や \2 が 1 や 2 の
参照と見なされてエラーが出るようです。
$& だと展開するみたいなんですが。
s/(=\s*)([0-9a-fA-F]+)/$1.hex($2)/e;
>>518 ?の意味が違うだろ。お前はCの*も混同してるだろ?
523 :
デフォルトの名無しさん :03/02/25 16:19
Perlに限ったことではないですが、コンソールプログラムなどで、進捗状況を一行に"#"のグラフで表現する手法がありますよね? こういうのってどうやれば出来るんですか? print文で制御コードを吐けばできるんですか? ↓こんなの ############### [50%]
524 :
デフォルトの名無しさん :03/02/25 16:38
>>521 はぁ?おまえ何いってんだよ
違うんだったら?の意味書いておけよ
>518 量指定子の直後の?は最短マッチを表す、って言う仕様になったから。
526 :
デフォルトの名無しさん :03/02/25 17:09
>>525 結局仕様ってわけね
anyway レスサンクス
528 :
デフォルトの名無しさん :03/02/25 20:58
初歩的な質問で申し訳ないのですが while(<>) { split; print "$_[1]\n"; } のような場合 splitの結果が@_ に入ると whileで読まれた$_は上書きされるのでしょうか? 上手く伝えられないのですが… それとも、$_ と $_[1] は共存?できるのでしょうか?
$_と@_は違うでしょ(@_@)
530 :
デフォルトの名無しさん :03/02/25 21:01
早速のレスありがとうございます。 では、@_ の内容をみる場合の $_[1] と $_ とは 全く別なんですね?
あぅ。どっ…どっちなんでしょう。(汗
そのくらい試してみろよ
>>533 実は、試してはみたんですが
@_ の内容をみるのに $_[1] や @_[1] みたいなのでも
動くので、一体どれが正しいのか…分からなくなってきて
検索で調べても、なかなか答えがないので
質問させて頂きました。
ご容赦を
>>535 Perlの解説本全く見ずにやってるってこと?
>>536 普段は技術評論社のPerlの本を見ていますが
現在、手許になくて、解決に困っていました。
>>535 (゚Д゚)ハァ?
自分でほとんど書いてるじゃん。
>>528 $ perl -e 'while(<>) {split;print "\@_: $_[1]\n";print "\$_: $_\n";}'
abc def
@_: def
$_: abc def
540 :
デフォルトの名無しさん :03/02/26 05:31
prelでプリンタに出力したいのですが、 open ( PR, ">PRN" ); open ( IN, "<print_this_text.txt") ; while ( <IN> ){ print PR "$_"; } print PR "\014"; close ( PR ); close ( IN ); とすると「プリンタと通信ができない状態です」とエラーが出てしまいます。 どのようにしたらいいのでしょうか?
>>540 とりあえず type print_this_text.txt > prn でうまくいくことは確認した上で、
perl -v の出力と Windows のバージョンを書け。
>>527 できました。ありがとう。
でも"\r"だと、Macで動かした場合、改行してしまわないんですか?
Macで使わないからどうでもいいけど....
544 :
デフォルトの名無しさん :03/02/26 14:04
ソフトキーボードのようなものを作成しようと思うんですが ブラウザのアドレス入力欄に文字を表示させるには どうしたらいいでしょうか?
>>543 OS Xだと大丈夫なんじゃないかなぁ。使ったことないからわからんけど。
546 :
デフォルトの名無しさん :03/02/26 16:29
んん
547 :
デフォルトの名無しさん :03/02/26 17:11
>>541 type print_this_text.txt > prn
とすると何も反応しません。
プリンタの設定がおかしいのでしょうか・・・。
プリンタはcanon BJ F610 (BJRSTR)です。
OSはwindowsXP,perlのバージョンは5.005_03です。
>>539 ありがとうございます。
@_[1] は、配列の1要素だけスライスしたもの…ですね。
言われてみれば、そうですね。(鬱
550 :
デフォルトの名無しさん :03/02/26 20:22
551 :
デフォルトの名無しさん :03/02/26 22:32
次のperlスクリプトの間違いを示せ。(制限時間1分) #!/usr/bin/perl $datafile = "count.dat"; open DATAFILE, "+<$datafile"; flock(DATAFILE, 2); seek DATAFILE, 0, 0; $count = <DATAFILE>; $count++; printf("%4d", $count); seek DATAFILE, 0, 0; print DATAFILE "$countn"; flock(DATAFILE, 8); close(DATAFILE); exit;
flock(DATAFILE, 8); は不要。 close が始末してくれる。
> print DATAFILE "$countn"; "$count"; か "$count\n"; の間違いじゃないか?
厳密に言ったらlockの仕方がおかしいんじゃないか? openしてからflockまでの間によそのプロセスが開けちゃわない?
555 :
デフォルトの名無しさん :03/02/27 02:41
質問させてください。 mainパッケージ内で、testというパッケージをuseして呼び出したとしたら、 mainパッケージないで仕込んだ乱数の種は、testパッケージ内でも有効でしょうか? testパッケージ内でも、乱数の種を仕込む必要があるのでしょうか? よろしくお願いします。
556 :
デフォルトの名無しさん :03/02/27 12:25
>555 乱数の種をどうやって保持するのかによる。 testパッケージからは main::hogeでmainパッケージのを参照できる。 逆もしかり。もちろん参照する時点で定義されている必要がある。
いや、要するにsrandしたらそれが有効なのかどうか、ってことだろ? 有効だったはず。
558 :
デフォルトの名無しさん :03/02/27 12:57
>>554 じゃあ flock してから open しろとでも?
O_EXLOCK つけて sysopen
560 :
デフォルトの名無しさん :03/02/27 19:21
あの、ものすごく単純な質問ですみません。 テキストファイル中の、<>で囲まれた数字だけを 決まった数だけ増やすには、どうしたらいいのでしょうか? テキストファイルの中に、ところどころ<>で囲まれた半角数字があります。 1行の中に複数存在する場合もあります。 数字はすべて整数で、1〜999999の範囲にあります。 <239>書籍<9384>音響<5732> <543>小動物<392448>家具 といった感じのデータになります。 ここで、「<>内の数値をすべて20増やす」ということがしたいのです。 思い切り1行くらいで書けるような気もするのですが、 私にはうまく作ることができませんでした(1行じゃなくても)。 すみませんが、お力をお借りできませんでしょうか。
>>560 こんな感じかな?
$filename = "hoge.txt";
open(FH, "+<$filename") or die;
read(FH, $buf, (stat(FH))[7]);
$buf =~ s/<(\d+)>/'<'.($1 + 20).'>'/esg;
seek(FH, 0, 0);
print FH $buf;
close(FH);
>>560 これからもperlを使うつもりがあるなら、
まず本買って読んだほうがいいと思うよ。
一行はおろか複数行でも書けないというのは、
perlが全然わからないと言ってるのと同じように聞こえる。
うわっ!
そんなすぐに書けるものですか……しかもスマ〜ト!!
ありがとうございます……。
タダ働きさせてしまってすみません。
>>562 おっしゃる通りです。
動物の絵の書いた本を読み漁ってみたのですが、
独学のせいか、アタマのせいか、どうもうまくいかず……。
それで、うまく作ることはできなかったんですけど、
途中まで作ることはできたんですよ。
だけど、「文字を順に読む」→「"<"を見つける」→「数字記録状態にする」
→「次の数字を記録する」→「">"が出たら、数字記録状態をやめる」→……
っていう風に、グダグダになってしまい……。
エディタか、OSか、っていう長大なプログラムになってしまいました。
はやく
>>561 みたいにカッコよく書けるようになりたいです。
>563 正規表現を極めるべし。
565 :
デフォルトの名無しさん :03/02/27 21:31
>>563 そういう力技もアルゴリズムの勉強になって
いいことだと思うよ。
でもperlは楽なことは楽にできるようにっていうのが趣旨だから
どちらがいいかはわからないけど
perlって言うより正規表現のおかげと言ったほうがいいけどね。
567 :
デフォルトの名無しさん :03/02/28 01:20
>>561 のプログラムは、正直怖いです。
みなさんこういうのを普段から使っているんですか?
気にしすぎですか?
>>567 怖いって言うのは、元ファイルに直に上書きしてるから?
>>523 >進捗状況を一行に"#"のグラフで表現する手法がありますよね?
>こういうのってどうやれば出来るんですか?
これでどうでしょ?
$end = 12;
$count=1;
for(1..$end){
local $|=1;
sleep 1;
printf "[%-${end}s] %3d%", "#" x $count, $count/$end*100;
if ($count < $end){
print "\r";
} else {
print "\n";
}
$count++;
}
・・・って、とっくに答え出てましたねトホホーイ。
perlでgif,jpeg,png,bmpなどの画像のサムネイルを吐くスクリプトが組みたいです。 どっかに参考になるとこないですかね? そのものズバリを配布してるページでも教えてくださったらうれしいです。 スレ違いor板違いだったら誘導してくださるとありがたいです、、、sage
>>561 $ perl -i~ -pe 's/<(\d+)/"<".($1+20).">"/eg' hoge.txt
sオプションはいるんか?
>>573 ありがとうございます。
インターネットを一生懸命検索していたので、ローカルのファイルに目が行ってませんでした、、、
これから使い方を調べてみますです。
575 :
デフォルトの名無しさん :03/02/28 22:16
みなさん、perlで2次元配列を実装するときは どうしてますか? 俺は[]を使ってリファレンスを 一時配列に入れるようにしてるのですが(らくだ本から) もっと効率的なやり方はあるのでしょうか?
Perlを使わない
577 :
デフォルトの名無しさん :03/02/28 22:22
perlを使ってといってるだろうが
じゃあない。
579 :
デフォルトの名無しさん :03/02/28 22:28
じゃあperl以外だったら効率がいいやりかたがあるの? Cとかでやれというのですか?
Rubyを使えと何度言ったら分かるんだ(-_-;)
581 :
デフォルトの名無しさん :03/02/28 22:31
RubyってたとえばCライクに "型"[][]とかできるの?
a = [[1, 2], [3, 4]] p a[1][0] #=> 3 型を制限したいならそういうクラスを作る。 class Foo < Array extend StrongTyping def [](val) expect(val, Numeric) super end <snip> end
583 :
デフォルトの名無しさん :03/02/28 23:10
#★これは納得できる。 $str = '\100'; print "str: $str"; $str =~ s/\\/\\\\/g; print "str: $str"; # 実行結果 # str: \100 # str: \\100 #★これも納得できる。 my $pre = '\\\\'; my $after = '\\\\'; print "pre : $pre"; print "after: $after"; # 実行結果 # pre : \\ # after: \\ #★これが納得いかない。 # 変数に入れた場合は、置換後の文字列をエスケープしなくていいの? $str = '\100'; print "str: $str"; $str =~ s/$pre/$after/g; print "str: $str"; # 実行結果 # str: \100 # str: \\100
584 :
デフォルトの名無しさん :03/02/28 23:45
open(OUT, "+<test.dat"); flock(OUT,2); truncate(OUT,0); seek(OUT,0,0); print OUT "うんこ"; close(OUT); このプログラムやってもファイルが作成されないんですけどどうしてですか?
585 :
デフォルトの名無しさん :03/03/01 00:48
>>584 せめてopenの結果くらいチェックしろと(ry
>>583 $foo = '$bar';
$bar = 'hogehoge';
print $foo;
これで「$bar」って出るのと「hogehoge」って出るのと、どっちだったら納得できる?
>>584 open(OUT, "+<test.dat");
ではファイルは作られないよ。
前もって > とか +> でファイルを作らないとダメ。
>>583 良くは分からないが、置換前のほうが2度展開されてるらしいね。
>>575 2次元配列は
$dim[0][3]
で良いんじゃないの?
Perlはリファレンスを駆使して、自動的に配列を用意してくれるから、
$dim[23][11][32][1] = "A";
print $dim[23][11][32][1];
でちゃんと A が表示されるし。
>>551 552で指摘されているように、flock(DATAFILE,8)が不要。
あと、ファイルが存在しないときは何も起きない。
>>590 値看護の邦画一回しか展開されていないの。
マニュアルに宗書いてあるヨ。
>>563 に2人きりでPerl教え込みたい!!!!
うんこー!
595 :
デフォルトの名無しさん :03/03/01 12:21
>>595 その方法であなたのサイトのファイルをすべて書き換えてあげましょう。
(^^)
(^^)
flock(OUT,2);をすると書き込めませんがどうしてですか?
flock(OUT,2);をすると書き込めませんがどうしてですか?
>>603 Perlは君のことが嫌いなんだよ。
食事でもおごってやれ。
うわーーーーん
そろそろ山崎渉。
perlの正規表現で、ABという文字の連続以外を表したいときどうしますか? [^AB]だとAもBもはじいちゃいますよね??
(^^)
(^^)
>>611 は明らかに違うだろ
うろ覚えだが(?!AB)とかじゃなかったっけ
(^Д^)(^Д^)(^Д^)(^Д^)(^Д^) (^Д^)(^Д^)(^Д^)(^Д^)(^Д^) (^Д^)(^Д^)(^Д^)(^Д^)(^Д^) (^Д^)(^Д^)(^Д^)(^Д^)(^Д^)
ありがとうございます、608です 大変勉強になりました!
無口で社交性がなくてもできる仕事を教えてくれ
[^^]
[^^]
[^^]
s/[^^]/(^^)/
s!/[^^]/(^^)/!/(^^)/[^^]/!
628 :
デフォルトの名無しさん :03/03/02 21:39
s/([^^])/$1/
629 :
デフォルトの名無しさん :03/03/03 00:05
いやらしい!!
\[^^]/
\[^^]/
なんだか全員”コンパイル・エラー”をしているみたいだな
[^o^]
[^-^]
[^v^]
最新のactive perlを利用してperlを実行しているのですが、二重にネストされた上位関数の方でlocalで変数宣言をし、 その変数を下位関数で宣言無しで弄ろうとすると、上位の宣言部分及び下位の弄っている部分で global symbol $hoge requires... と「宣言をしていない」と怒られてしまいます。 これはlocalがサポートされてないと考えるべきなんでしょうか・・・。
641 :
デフォルトの名無しさん :03/03/04 06:27
>>640 perldoc strict 中の、strict vars を参照のこと。
解決方法はいろいろあるが、その「最新の active perl」が 5.6 以降なら、
our $hoge 宣言が一番早い。でなけりゃ $hoge のかわりに $::hoge を使う。
$hogeのかわりに$::hogeを使うと、use strictをする意味が無いのでお勧めできない。
>>641-642 ourを利用することで何とかなりました。
どうしようもない質問に付き合って頂いてありがとうございます。
訂正:641-642 -> 642-643 失礼致しました。
半角カタカナで書き込むと文字化けしてしまうんだけど半角カタカナでも文字化けしないようにするには プログラムでどのようにすればいいんですか?
>>646 まず日本語と質問の仕方を学習してください。
>>646 半角カタカナでも文字化けなんかしません。
やり方聞かれても困ります。普通にやれば文字化けしないのですから。
文字列0001を数字1にしたい場合、どうしたらよいですか?
自己レス int(文字列)でいけました
s/^0*//; あとはPerlが"1"を1にしてくれる。 もうちょっと解説書を読め。
解説書を読まなきゃならんのは漏れのほうだった。 恥ずかしい。
お目汚し申し訳ありません。 $a =~ s/</</g; $a =~ s/>/>/g; とし、タグの仕様を不可にした前提で、 <span style="font-size:10px">文章</span> #上記の style="〜" の〜は可変です の文体が送られた場合、これを成立させるにはどのように記述すればよいのでしょうか? $mes =~ s/<span>/<span>/g; $mes =~ s/<\/span>/<\/span>/g; では開始タグが成立しませんし・・・ どなたかご教授願えませんでしょうか?
>>654 HTMLエスケープしろ。
「これを成立」ってどういう意味?
>>655 さん
>成立
適当な文章が考え付きませんでした
つまるところ、タグとして稼動させるには、という意味でして・・・
って、コードがΣ( ´Д`)
修正・長レス申し訳ないです;
>>$a =~ s/</&lt;/g;
>>$a =~ s/>/&gt;/g;
>>とし、タグの仕様を不可にした前提で、
>><span style="font-size:10px">文章</span>
>>#上記の style="〜" の〜は可変です
>>の文体が送られた場合、これを成立させるにはどのように記述すればよいのでしょうか?
>>$a =~ s/&lt;span&gt;/<span>/g;
>>$a =~ s/&lt;\/span&gt;/<\/span>/g;
と、書いたつもりでしたが・・・迂闊でした;
$mes =~ s/<(span.*?)>/<\1>/g;
しまった、失敗。 $mes =~ s/<(span.*?)>/<\1>/g;
>>650 0を足すとか1をかけるとかでもいける。
算術演算を施すと文字列は数字に解釈される
>>658 さん激感謝っス
なるほど・・・ *? ですか・・・
勉強し直してきます;
open(F,"file.htm"): while(<F>){ ここで読み込んだ一行からマッチングを行いたいのですが 読み込まれた一行はなんという特殊変数に格納されているんですか? } close(F);
$_ です。
>>662 ありがとうございます。本をよく読むと書いて有りました。
自分が情けない・・・。
665 :
デフォルトの名無しさん :03/03/05 11:13
最近の素朴な疑問なのですが、 (1) print "1.hoge\n"; print "2.hoge\n"; print "3.hoge\n"; (2) print <<_EOD; 1.hoge 2.hoge 3.hoge _EOD (3) print ( "1.hoge\n" . "2.hoge\n" . "3.hoge\n" ); どれが一番良いのでしょう。 print の中で関数を呼び出す事が多いので、 個人的には(3)を良く使ってたりしますが、、
>665 趣味だ。どれでもいーだろ。あたしゃ2で書くけど。
>>666 やっぱ趣味ですか。私は(2)でかくとインデントし難く
なってしまうので余り好きではなかったりします。
# HTML吐く時は良く使うかもですが
スレ汚し失礼しました。
(1)が一番メモリに矢指と聞いたことがあるんだけどデマナンダ?
デマというか、真面目に考えたくない質問されて、俺流を通したいとき 「こうやるのが一番(メモリ消費の or スピードの)効率がいいんだよ」と 根拠もなくとりあえず言ってみて押し通す、っていう技があるよね。 で、ごちゃごちゃ突っ込まれたら、 「じゃ、あとでいろんなパターン書いてみてテストしてみてごらんよ、 俺の言ったのが一番だから。」 と、知ったかぶり(にもならないな)しておくと。
672 :
デフォルトの名無しさん :03/03/06 13:34
これはPerlに限った事じゃないと思うけど、ファイル内の書き換えをする時って 読むファイルと書くファイルって別物にしないとダメ? 毎回バックアップ作って書き換えするのがしんどいのですが
正規表現についてですが、ピリオドをマッチさせるにはどうしたら良いか ご教授してもらえないでしょうか?
\. [.]
$aと$bを連結する関数ってありますか? $a=abc; $b=def; ならabcdefになるようなものなんですけど・・・
あげ。
680 :
デフォルトの名無しさん :03/03/07 02:39
お願いします
$c = $a . $b;
684 :
デフォルトの名無しさん :03/03/07 07:38
open(IN, "--"); とかのINっていうのはなんなの? ファイルハンドルだっていうのは分かるけど、どんな変数なんだ。 自分で空のファイルハンドルを宣言したりできる? サブルーチンに受け渡したりできる? あと<IN>ってどうなってんだぼけ
685 :
デフォルトの名無しさん :03/03/07 07:51
入門書さえ買わない春房は、 放 置 で 。
686 :
デフォルトの名無しさん :03/03/07 07:53
>>685 買ったよぼけ
読んだけどわからねーんだよぼけ
687 :
デフォルトの名無しさん :03/03/07 07:57
拡張子の配列 @ex = ( 'jpg', 'png', 'sex'); があって $filename が @ex の拡張子に当てはまるか調べるにはどうすればいい? 制御文はつかわないで。
688 :
デフォルトの名無しさん :03/03/07 07:59
>686 名前:デフォルトの名無しさん 投稿日:03/03/07 07:53
>
>>685 >買ったよぼけ
>読んだけどわからねーんだよぼけ
「〜ぼけ」
知り合いに、これと同じ言い方する小学生の子がいたの思い出しました。
育った環境が悪いんですかね。
690 :
デフォルトの名無しさん :03/03/07 08:02
692 :
デフォルトの名無しさん :03/03/07 09:34
>>487 #こんどからはもっとよく調べてから質問しろよ。
if (defined(grep (/?Q$filename/, @ex))) {
print "found $filename?n";
} else {
print "not found $filename.?n";
}
#俺としたことが、うっかりだ。 $filename =~ s/^.*??.(.*)$/$1/; #を上に追加しといてくれ。 #内容が破壊されるのがいやなら、前もって待避しとけよ!
694 :
デフォルトの名無しさん :03/03/07 10:40
質問です。 $_ に含まれた4桁の数字を一行で$numに取得したいのですが、 どのようにしたらいいのでしょうか? いつもは $num = $_; $num =~ s/(\d{4})/$1/; のように処理しているのですが、もっとPerlらしい「ものぐさ」な方法がありそうなので。
すみません。大ボケしたので自己レス。 $num = $_; $num =~ s/.*(\d{4}).*/$1/; でした。
($num) = /(\d{4})/;
>>696 おおっ、できました! ありがとうございました。
意味はこれから自分で調べてみます。
698 :
デフォルトの名無しさん :03/03/07 16:42
自分で定義するサブルーチンと、始めから備わっている組み込み(?)関数は別物なの? たとえばハッシュの要素を grep するとき grep(length($hash{$_}), keys %hash) とかで、空の要素を含まない配列がつくれるけど これを自分で定義して mygrep(length($hash{$_}), keys %hash) sub mygrep { ... } って出来る? 要は 上の grep の引数内の$_の動きが疑問なんだけど
>>698 うん、別物。
第一引数に式を取る形式のgrepはサブルーチンでは再実装できないね。
ただし、プロトタイプを使う事でブロックをとる形式のmygrepは作れるよ。
sub mygrep(&@){
my $code = shift;
my @output;
foreach (@_){
push @output, $_ if $code->();
}
return @output;
}
@dst = mygrep{ length($hash{$_} } @src;
700 :
デフォルトの名無しさん :03/03/07 18:20
use Benchmark; を使ってサブルーチンとメソッドの呼び出し速度を比較しようとしたんですが、 use MyClass; my $count = 10000; my $instance = new MyClass(); # new, method サブルーチンが定義済み。 print $instance->method(); # 期待通り'test'が出力される。 timeit( $count, '$instance->method();' ); # << ここで Can't call method "testMethod" on an undefined value at (eval 9) line 1. というエラーが出ます。 さらに、 my $method = sub { $instance->method(@_) } timeit( $count, '$method->();' ); でも同じエラーが出ます。 もしかしてBenchmarkモジュールでは、メソッドの速度って計測できないのでしょうか?
質問です。 @array=qw(aaa bbb ccc ddd);の時'aaa'を取り出すのは$array[0]ですが、 逆にaaaは配列@arrayの何番目であるかを知りたい時はどうすればスマートですか? foreach(@array){ last if $_ eq'aaa'; $i++; } これじゃダサいよね?
>>684 「ファイルハンドル」はPerlではただのソフトリファレンスされたシンボル。
なので特定のユニークな文字列であればファイルハンドルの変わりに使うこともできる。普通やらんが。
>>700 「メソッド」がどういう仕組みで呼び出されるのか理解できれば、なぜなのか解かるでしょうけど…。
$instance->method(); は
&MyClass::method( $instance ); と実用上はほぼ等価だよ。(クラス継承は出来ないが)
>>701 map や grep を使う手もあるけど、書き方違うだけで遅いことに変わりはない。
むしろハッシュを使ったショートカットを別に用意したほうがはるかに早い。
$member = 0:
$str = 'aaa';
$array[ $hash{$str} = $member ] = $str;
言うまでもなく、これは重複文字列の存在は考慮してないけど。
#LZ法とかを実装するときに使う手。
perlで文法エラーが出て、どこが間違っているかわからないのですが、 間違っている個所がわかるツールとかはないでしょうか?
open(OUT,">$upload_path_name"); flock(OUT, 2); print OUT "$_"; flock(OUT,8); close(OUT); 上記のようにflockを使うとファイルに書き込めませんがどうしてでしょうか?
>>703 環境は?
その文法エラーを見れば当たりは付けられると思うんだけど
試しにその文法エラー見せてみ
>>700 Perlのコアや標準モジュールのバグを疑う前に、まず自分が間違ってないかを疑おう。
多分そのエラーはコード文字列をBenchmarkモジュール内でeval()するために、
my変数($instanceや$method)が見えないからだと思われる。
Benchmark::timeit()は、コード文字列以外にサブルーチンへのリファレンスも受け取るので、それを渡せば良い。
timeit $count => sub{ $instance->method() };
timethese $count => {
test1 => sub{ $instance->test1() },
test2 => sub{ $instance->test2() },
};
707 :
デフォルトの名無しさん :03/03/08 01:32
>>703 と似た質問ですが、
変数の推移が分かるように、
1行づつステップインでデバッグできるツールって
ないのでしょうか。
VC++などのデバッグ環境に甘えてしまっているせいか、
「文法エラーはないが思うように動作しない」という状況になると
手の打ちようがなくなってしまうので……。
>>708 ありがとうございます。
そのページを見てもう少しがんばってみます。
>>704 flock 無しなら問題ないことをチェックした上で、perl -v の出力を
書きましょう。
711 :
名無しさん@Emacs :03/03/08 09:05
ヤフオクの「マイオークション」とかのログインしないと見られない
ページのデータを収集したいのですがどうすれば良いのでしょうか?
use LWP::UserAgent;
use
HTTP::Cookies; $ua = LWP::UserAgent->new;
$ua->credentials('auctions.yahoo.co.jp','login','username','password');
$ua->cookie_jar(
HTTP::Cookies- >new(file => "cookies.txt",autosave => 1));
これで"cookies.txt"にクッキーが入ったのでこれを使えばログイン後の画面
を見られるような気がするのですがこれ以上はさっぱり分かりません。
OSはRHL8です。
>>706 ありがとう。
これからは標準ライブラリを信じて生きていきます。
Perlからwavなどの音楽は流せないんでしょうか? 流せるならば、その方法をご教授お願いします〜。
>>713 open(OUT, ">/dev/dspW");
print OUT $sound_in_raw_format;
あるいは、Audio::Play を使う。
ありがとうございます! ですが、私はまだ浅学なので、その文が理解できませんでした、、。 具体的な使用例とか書いて下さるとありがたいんですが〜、お願いします〜。
>>716 色々あるみたいなんで色々試してみます。
ども!ありがとうございました!
perl4 まではラクダ本は持っていて 理解してるんですが、perl5 からはいった オブジェクトとかリファレンス関係が よくわかりません。 web のどこかによい解説ページないですか?
719 :
デフォルトの名無しさん :03/03/09 01:17
質問です。 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(1049619599); print "$year - ", $mon + 1, "- $mday $hour : $min : $sec\n"; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(1049619600); print "$year - ", $mon + 1, "- $mday $hour : $min : $sec\n"; 上のスクリプトを実行すると、下のように表示されます。 103 - 4- 6 1 : 59 : 59 103 - 4- 6 3 : 0 : 0 1049619600 は 1049619599 の1秒後ですから、2行目は 103 - 4- 6 2 : 0 : 0 になるはずなのですが、何が原因なのでしょうか? また、 $tltime1 = timelocal(0, 0, 2, 6, 3, 2003); $tltime2 = timelocal(0, 0, 3, 6, 3, 2003); print "$tltime1 = $tltime2\n"; とすると、 1049616000 = 1049619600 と表示されます。 Perlのバージョンは v5.6.1 built for i386-freebsd です。
>>719 サマータイムのせいだろ。
JSTなら、普通にこうなる。
103 - 4- 6 1 : 59 : 59
103 - 4- 6 3 : 0 : 0
君のような結果になる timezone は… っと
% env TZ=US/Mountain perl tmp.pl
103 - 4- 6 1 : 59 : 59
103 - 4- 6 3 : 0 : 0
US/Mountain? アメリカからカキコんでるの?
>>719 103 - 4- 6 17 : 59 : 59
103 - 4- 6 18 : 0 : 0
1049562000 = 1049565600
うちではこうなった。(Windows2000/ActivePerl 5.6.1)
おっととコピペし間違えた。TZ=Japan の場合の表示はこうね。 103 - 4- 6 17 : 59 : 59 103 - 4- 6 18 : 0 : 0 timelocalの方も、TZ=Japanならこうなる。 1049562000 = 1049565600 TZ=US/Mountainだと、確かに 1049616000 = 1049619600 になるな。
>>721 >>722 ありがとうございます!
確認したら確かにタイムゾーンがUS/Mountainになっていました。
(知人の依頼でCGIを作成していたのですが、サーバがアメリカに
置いてあるレンタルサーバのようです)
サマータイムがlocaltimeでどのように実現されているかは知り
ませんでしたので、全く見当がつかずに困っていました。
お答えいただきありがとうございます。
725 :
デフォルトの名無しさん :03/03/09 07:10
win98 active perl 5.80 で perl ..\nantoka.pl .\file fileが .. ディレクトリに移動しちゃうんだけど。 仕様なの? fileは読みこんでるだけです。
5[4] みたいに表示させようとして $a=5; $b=4; print "$a[$b]\n"; ってやると、$aが配列と判断されるのは言語的にくさい
>>726 漏れは自然だと思うが。
print $a . "[$b]\n"じゃだめなのか?
>>727 に限らず、
print "${a}[$b]\n";
print "$a\[$b]\n";
とか、回避策なんていくらでもあるじゃん
単なるレキシカルアナライザの問題を
言語の問題にすりかえてしまう
>>726 に乾杯
>>726 の理由によりPerlは糞決定!PHPマンセー! By726
(プ PHP知らないくせに)
>729 Webでしか使えねーPHPとPerlを一緒にすんな。
>>731 いや使えることは使えるが。
つーか、糞エサに食いつくのはやめれ。
>>730-731 ちょ、ちょっと待ってよ。
726だったらきっとこんなこと言うだろうなって書いただけなのに。
(By726って書いてあるっしょ・・・ちゃんと読んでよ)
空間にn個の惑星が、どの2つの惑星間の距離も全部異なるように位置している。各々の惑星に居る天文学者は、自分と最も近い惑星だけを観測しているとする。この時、nが奇数ならば、どの天文学者にも観測されていない惑星が存在する事を数学的帰納法を使って示して
736 :
デフォルトの名無しさん :03/03/10 01:08
perl で nslookup をつくるにはどうすれば?
>>736 目的にもよるが、gethostbyname() などを使う。
あるいは use Socket6 しておいて、
getaddrinfo() や getnameinfo() 使うとか。
こまかいことしたければ Net::DNS
http://www.net-dns.org/
>>736 単にアドレスを引きたいだけ? なら、gethostbyname()。
739 :
デフォルトの名無しさん :03/03/10 02:18
>>737 >>738 ありがとうできました。が
自分のアドレス調べるにはどうするんでしょう?
ipconfigとかからもってくるのかな?
>>739 意外かも知れないが、それを真面目にやろうとすると結構大変(な筈)。
Unix 系の環境で、ホスト名が与えられていると仮定してよいなら
my $hostname;
chomp($hostname = `hostname`);
my @hostent = gethostbyname($hostname);
my @addrs = @hostent[4..$#hostent];
でいい。Net::Interface が使えれば一番いいが、これは 5 年前の
モジュールで今はまともにコンパイルできない。裏技として、手近な
ホストに接続して getsockname() を使う手もあるが、それをやるぐ
らいなら ipconfig (もしくは ifconfig)の出力を解析する方がまし
かな。
741 :
デフォルトの名無しさん :03/03/10 03:14
>>739 ていうか、「自分のアドレス」ってのがなんなのか
よく考えてみるんだな。
対話的操作ができないとnslookupとはいえない。
ifconfig の出力も OS ごとに微妙に違ったり。ipconfig だとどうだろう。 どちらにせよ NAT の内側だったりすると、用途によっては 簡単にはわからない。
だってIPアドレスって、基本的にはインターフェースに つけられるものであって…… コンピュータには、インターフェースをいくつもつけら れるし…… おまけにひとつのインターフェースにIPアドレスをいく つもつけられもするし……
746 :
デフォルトの名無しさん :03/03/11 00:17
共有サーバーでの自分のディスク使用量(duの結果)を毎日自分当てにメールさせています。 統計情報を取りたいのですが、perlで抽出出来ないでしょうか? 123main 234 sub1 345 sub2 456 image OSはWindows,使用しているメーラーはNetscape7.0です。 抽出したいデータはNetscapeのメール形式です。
747 :
デフォルトの名無しさん :03/03/11 00:27
やってみればいい
PerlとDelphiの違いおしえれ
Perlは関数型言語 Delphiはオブジェクト指向言語
Perlもオブジェクト指向言語です
>>749 区別がめちゃくちゃ。
関数型は lisp とか calm とかだよ。
749 は死滅スレの定番ネタだよ。 元は 「関数型言語の C から、オブジェクト指向の C# に変われば生産性があがるのは当たり前」 みたいな文。 知らないで言ったのか釣りだったのかはともかく、以降何度も引き合いに出されている。
753 :
デフォルトの名無しさん :03/03/11 08:03
Cは関数型じゃないぞ。構造型だ。 関数型を知ってるのかとことん問い詰め末尾再帰
754 :
デフォルトの名無しさん :03/03/11 08:14
しゃれたサイトだ
http://homepage3.nifty.com/digikei/ten.html ∧..∧
キタ━━━━━━( ´Д`) ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
'/ / \ __  ̄ ̄ ̄ ̄ ̄ ̄_____
/ / . \ __ ______
,.,..,.、,,,,/ /、,\ . )..,_ /i
;' ´Д`(ノ,:、,/ /:,.:::: ::`゛:.:゛:`''':,'.´ -‐i  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
'、 ;: ...: ,:. :.:.:.\ \ _;.;;..; :..‐'゛  ̄  ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
`"゛"゛' ''`゛ `'(___)
>753 >Cは関数型じゃないぞ。構造型だ。 んなの初耳だ。 なんだ構造型って。 最近こういう無知が多いのは、春先だからか。
構造型プログラミング言語でひっかかるのはここだけなんだが。 tp://yuzu.ee.uec.ac.jp/natu01/PHe1/activities.html > 完成作品予想図『機械語(バイナリ)』を根っことしたツリー構造型プログラミング言語年表 ってのはなにか違うと思われ。
C言語が関数型言語に拡張されたインターネッツはここですか? 凄い進化だな( ´,_ゝ`) プッ
>>757 [構造化言語 C] でぐぐれ
スレ違いなんでそろそろPerlの話に戻そうかねぇ
6っていつ出るのよ?
760 :
デフォルトの名無しさん :03/03/11 15:36
「手続き型」というフレーズが、いまだ登場しないところがなんとも…… しかし、googleしてみると、C言語を関数型だと思い込んでいる向きはけっこう あるみたいね。「関数」を使うから関数型だと。ぎゃ〜はっはっはっは。
761 :
デフォルトの名無しさん :03/03/11 15:43
うげ〜、C言語を構造化言語だとしている向きもあるんだね〜 そりゃ、C言語では、擬似構造化プログラミングを行うのが 普通だろうが…… うわ、よく調べてみると、構造化プログラミングのパラダイ ムをそもそも知らない連中が、C言語は構造化プログラミング 言語だとか言っているみたいだね。 根腐れ起こしてるね〜、プログラミング世界も。
擬似構造化なんて用語ありませんよ。自分で勝手に言葉作って 定義も無いまま当てはめないでくださいね
>>762 ? 「擬似構造化」って用語か?
おまえ、だれかが「擬似昼食」って云ったら、
「そんな用語ありません」って突っ込むのか?
構造化プログラミングだけしか出来ない構造化言語は無い。 よって擬似構造化プログラミングをできる言語は構造化言語である。 もし構造化言語なんて存在しないなんて考えなら、現実的ではないが 間違っていないことにしてやろう。
C言語は高級アセンブラ
やっぱ、変数を書き換えられるなんて変だよね。
プログラミングパラダイム論議を始めて、なおかつageするという最悪コンボ。
769 :
デフォルトの名無しさん :03/03/11 16:21
$"の使い方を教えてください。
elispは手続き型言語でつ
771 :
デフォルトの名無しさん :03/03/11 16:30
すべての言語がきっちり何々型とか何々指向で おさまる訳じゃないし、 プログラミングスタイルが伴っていなければ 何型使っても意味ないだろ。 lisp を手続き型的に使うのは簡単だが、 それじゃ言語の特徴を生かせない。 関数型的思考を身につけないと。
>>773 だって遅いもん。リソース食い荒らすもん > elispで関数型なプログラム書くと。
で、これはC言語か〜っていう、笑っちゃうelispのプログラムがそこら中に
満ちあふれているわけ。
パラダイムの他に、フレーバーっていう概念もあったじゃんか、プログラミング
言語/システム/ポリシーなどを特徴づけるものとして。
>>774 再帰関数だけが関数型ではないんではないかと。
let でローカル変数いっぱい作って
setq しまくり戻り値を捨てまくりのプログラムが
早いとは思えん。
みんなプログラマーですか??
>>776 胸の大きさで稼いでいるわけではありません。
778 :
デフォルトの名無しさん :03/03/12 00:24
Perl6の完成にはParrotの完成が前提なわけ? それにしても結構悠長にやってるな。>Perl6開発
779 :
デフォルトの名無しさん :03/03/12 00:56
CRLFがついた行をchompしたらLFだけ取れてCRが残っちまうんですが、 こういうもんなんですか? 使ってみたのはcygwin付属のperlです。
>779 詳しい説明は省くが、 その行をテキストモードで読みこめ。
open( FILE ,...); while( <FILE> ) { chomp; こんな感じですが、バイナリモードにしてるつもりは無いんで、 テキストモードで読んでるつもりです。
>>778 っていうか、みんな期待してるの? Perl6に。
>>782 Parl5すら使いこなせてないのに、Perl6に期待するなんてめっそうもない!
C言語を関数型なんて言ってる能無しがいるなんて始めて知った。
Perl6……むしろ別な名前にするべきなのではないか……
>>784 恐ろしいことに、そう教えている教育機関もあるようでつ。
ググルで、 "C言語" "関数型の言語" とか "C言語" "関数型言語" とかをキーワードにして検索すると結構見つかるね。 それもac.jpドメインだったりして。。どうなってるの?
モウダメポ
789 :
デフォルトの名無しさん :03/03/12 09:34
perl/tkをwindowsで使う方法を教えてください。 適当な解説ページがあればそれも。 あと、perlでネイティブコードを生成する方法を教えてください。
>789 ActivePerlをインスコする。 Windows用のperlでのネイティブコードって意味か?
>>789 perlcc とか perl2exe(perlexeだっけ?)でぐぐってみそ
793 :
デフォルトの名無しさん :03/03/12 15:26
正式名称がわかりませんので、違う場合にはご容赦ください。 $HASH->{HASH}-{A} = 1; $HASH->{HASH}-{B} = 12; $HASH->{HASH}-{C} = 3; $HASH->{HASH}-{D} = 8; .. .. $HASH->{HASH}-{Z} = 9; こんな感じにランダムの整数が入ったハッシュがありまして、 この整数を全て'0'にしたいのです。私は以下のように書いて みたのですが、もっと良い(簡単な)方法があれば教えて頂け ますでしょうか。 $HASH->{HASH}->{$_} = 0 foreach keys %{ $HASH->{HASH} };
794 :
デフォルトの名無しさん :03/03/12 15:26
>>779 $/ = "\x0a\x0d";
とか
$/ = ""
としてもダメ?
>>793 それでいいんじゃないかと思うけど、その他の解として
$HASH->{HASH} = { map { $_ => 0 } keys %{$HASH->{HASH}} };
とか。キーの値がA-Zならこうとか。
$HASH->{HASH} = { map { $_ => 0 } 'A' .. 'Z' };
>>795 ありがとうございます。大変勉強になりました。
$HASH->{HASH} = { map { $_ => 0 } 'A' .. 'Z' };
これが凄く気に入ってしまったので、キーの値をA-Zに
変更することに致します。<(_ _)>
後、余り関係ないことで申し訳ないのですが、質問があります。
$HASH->{KEY1} = 1;
$HASH->{KEY2} = 2;
$HASH->{KEY3} = 3;
上記のようなハッシュのスライスは以下のようにして取れるのですが、
@$HASH->{'KEY1', 'KEY3'};
@$HASH->{ keys %$HASH} };
$HASH->{HASH}->{KEY1} = 1;
$HASH->{HASH}->{KEY2} = 2;
$HASH->{HASH}->{KEY3} = 3;
上記のように少し深い構造のハッシュになってしまうと、スライスを
どのように取れば良いのかわからないのです。
書き忘れました。 $HASH->{HASH}->{KEY1} = 1; $HASH->{HASH}->{KEY2} = 2; $HASH->{HASH}->{KEY3} = 3; で $tmp = $HASH->{HASH}; @$tmp{'KEY1', 'KEY3'}; @$tmp{ keys %$tmp }; とかならできるのですが、、
>>796-797 たぶんこれでいけるはず。
@{$HASH->{HASH}}{'KEY1','KEY3'};
@{$HASH->{HASH}}{keys %{$HASH->{HASH}}};
>>798 あ、なるほど。理解致しました。ありがとうございます。
2ちゃんのスレッドのソースから名前だけ取り出す正規表現ってどうすればいいですか?
while (/<b>(.+?)<\/b>/g) {print $1,"\n"}
>>801 while (/<b>(.+?)<\/b>/g) {print $1,"\n"}
</b></a>ってのも名前にあげられてしまいます。
>>801 .*?
じゃないの。
あと、\/b>はいらないと思われ。
$/ = "\x0d\x0a"; # Cygwin だと "\x0d\x0a" eq "\r\n" だと思う…。
名前部分のタイプ例
<font color=green><b>デフォルトの名無しさん</b></font>
<a href="mailto:sage"><b>デフォルトの名無しさん</b></a>
<a href="mailto:sage"><b>空 </b>◆SORA//9k7. <b></b></a>
<a href="mailto:sage"><b></b> ◆F52DmOxJlc <b></b></a>
一応、これはどう?
while (/<b>([^<>]*?)<\/b>(\s*?◆[^<>]+?)<b><\/b><\/a>|<b>([^<>]+?)<\/b><\//g) {print $1.$2.$3."\n";}
}
>>803 2ちゃんのスレッドのソースだろ?違うか?
>>804 <b>空 </b>◆SORA//9k7. <b></b></a>
みたいなのはそれだとまずいです。
<dt>と<dd>に注目すれば確実性が増す予感…。
スレッドのソースってわけわからんとこに改行がはいってるよ・・・
スレを処理するときはDAT形式のほうがやりやすい。
XML挫折組みが現れ始めたな
×挫折組み ○挫折組
>>806 cygwinを使ってないのでよくわからんけど、
その仕様だとwindowsのテキストファイル(改行=CRLF)を
処理するのは面倒そう。
active perl は "\x0d\x0a" = "\n" でつ。
.* と .+? の違いって何ですか??
815 :
デフォルトの名無しさん :03/03/13 02:35
use HTML::TreeBuilder; my $tree = HTML::TreeBuilder->new(); $tree->parse($threadhtml); foreach my $dt ($tree->find_by_tag_name('dt')) { print $dt->find_by_tag_name('b')->as_text(). "\n"; }
#!perl -w use strict; if( "\r\n" eq "\x0d\x0a" ) { print 'true'."\n";} else { print 'false'."\n";} print length( "\x0d\x0a" )."\n"; print sprintf( '0x%02lx' x 2, unpack( 'C2', "\x0d\x0a" ))."\n"; print length( "\r\n" )."\n"; print sprintf( '0x%02lx' x 2, unpack( 'C2', "\r\n" ))."\n"; print length( "\r" )."\n"; print sprintf( '0x%02lx', ord( "\r" ))."\n"; print length( "\n" )."\n"; print sprintf( '0x%02lx', ord( "\n" ))."\n"; --------結果-------- true 2 0x0d0x0a 2 0x0d0x0a 1 0x0d 1 0x0a
>>814 > .*
0文字以上最大マッチ
> .+?
1文字以上最小マッチ
cygwinのsetupでExpにして5.8.0をインストールしたら治った。 ただのバグだったのかな?
>>816 嘘ですた。解説どうもです。
入出力のときにテキストだと "\x0d\x0a" <=> "\x0a" の
変換が自動的に行われるのです。
ですから $/ も "\x0a"でつ。
すれ立てるまでもない質問スレ 51番 より移動してきました。
http://pc2.2ch.net/test/read.cgi/tech/1047467699/51-55 再掲:
えーとCGI(言語はperl)からCookieの送受信に付いて質問があります。
用語が間違っていた場合にはツッコミを入れて頂けると幸いです。
# 適当なスレが見つかりませんでしたので、
# スレ違いであれば誘導して頂けるとありがたいです。
一度クライアントに保存された後は、環境変数HTTP_COOKIEに入っているの
で簡単に読み出せるのですが、問題はcookieを発行した直後、コネクション
が切れていないタイミングでCGIが吐き出したCookieを、クライアントが正
常受け取ったのかどうか判断する方法ってなにかありませんでしたか?
元々のやりたいことは、CGIプログラムにアクセスしてきたクライアントが、
Cookieの送受信が可能なのかどうかを判断したいのです。最初はJavaScript
で書いていたのですが、これじゃJavaScript非対応のw3mとかに対応できな
くなるので却下しました。
# w3m-js があるじゃん、ってツッコミはできれば無しでお願いします。
> CGIについての質問は板違いです。WEBプログラミング板でどうぞ。 > CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。 って書いてあるのに理解できませんか?? (その上「スレ立てるまでもない」で親切に答えてくれた人がいるってのに・・・) ってそれだけだとアレですので俺の見解を書いておくと、 「無理です」 Cookie確認CGIに飛ばしたらいい。 Cookieの仕組みとか調べてごらんよ。 ググルで 「netscape cookie specification set-cookie」 とかをキーワードにして検索するんだよ。日本語訳やって公開してるやつもいる みたいだよ。
>>820 次にアクセスした時に、前に渡したCookieを持ってるかどうか
調べたらいいんじゃ?
Cookieはclientがserverに送ってこそ初めて意味があるわけで、
clientが受けとったかどうかなんて知る必要はない。
それだと一見さんなのか、二度目なんだけどCookie無視した奴なのか
みわけがつかなくて困る、っていう話なんだろうけど、
そういうのはPerlの話ではなくてWebプログラミングの話なので
そもそも板違いなわけです。
こっちのほうがいいと思うよ。→
http://pc2.2ch.net/php/
824 :
こういった副作用の定義ってされてるんでしょうか? :03/03/14 01:58
my @i = ( 'a', 'b' ); my $i = 0; if( $i[$i] eq $i[++$i] ) { print 'true'."\n";} else { print 'false'."\n";} $i = 0; if( $i[$i] eq $i[$i++] ) { print 'true'."\n";} else { print 'false'."\n";} if( $i eq ++$i ) { print 'true'."\n";} else { print 'false'."\n";} if( $i eq $i++ ) { print 'true'."\n";} else { print 'false'."\n";} __END__ --------結果-------- false true true false
なんとなーく思ったんだが Tie::Scalar を使ってデバック出力かければ評価されるタイミングが分かるような気がするな 本物のスカラーと、Tie::Scalar は違うかもしれんし 今ちょっと手が離せないんで試せないけど、誰かやってみない? Perlの内部を探るのが本筋何だろうけど、そこまでは出来ない(^^;
Perl にかぎらず普通二項演算子の左右どっちを先に評価するかは決まってな いのでは(&&, || とかを除く)。
perlの比較演算子は非結合だね。 左結合の言語もあったような気がするけど手元に資料なし。
世界で一番不愉快になるネトゲーがココに参上!
ttp://sb-online.genki.co.jp/top.html アップデートするたびにクソゲーになっていくゲームです!
これでよく月々1800円もとれますね!
Supraなどに乗っている写真が張ってあるから行ってみれば
全然話がちがう! Supraなんてどこにもない!
まさに詐欺! 詐欺詐欺詐欺詐欺詐欺詐欺詐欺
>>824 とりあえず、上二つはeqが左オペランドを先に、右オペランドを後に評価するという事が分かっていれば問題ないよね。
で、下は、Perlの演算/関数呼び出しの引数が参照で渡されるからこうなるんだよ。
$i eq ++$i
これは、$iの参照がeqの左オペランドになり、++$iも(副作用により値は増加しているものの)$iの参照が右オペランドになる。
左オペランドと右オペランドは共に$iの参照だから値も同じで、だから結果は真になる。
$i eq $i++
この式は、左オペランドは$iの参照で、右オペランドは"$iをインクリメントする前の値"の参照になる。
この時左オペランドの値はこの式を評価する前より増加していて、右オペランドの値はこの式を評価する前の$iの値になるよね。
直感とは異なる結果にはなるけど、参照渡しによってコピーのオーバーヘッドを避ける為に、こういう仕様になっているんだろうね。
830 :
デフォルトの名無しさん :03/03/14 17:53
perlでstopとかquit使った時に 自動でコマンドプロンプトが閉じないようにするにはどこで設定すればいんでしょうか?
stopとかquit これはperlに標準では存在しない関数なのですが。
STOPっていうのはNECのパソコン、PC9800シリーズのキーボードに 付いてる、ちょっとバネの強いボタンのことだよ。それを押したときの話。
833 :
デフォルトの名無しさん :03/03/15 01:54
b.pm をつくったのですが使えないんです。 中身を全部コピーして、bbb.pmにしたら使えました。 b.pmというのは何かとぶつかっているのですか? 環境はv5.8.0 built for MSWin32-x86-multi-threadです
835 :
デフォルトの名無しさん :03/03/15 05:10
ああ、B言語のコンパイラかぁ 納得
%a = (a=>b); この場合のbは単に文字列なの?
>>836 bがサブルーチン定義されてなければ文字列。
されてればその結果。
838 :
デフォルトの名無しさん :03/03/16 02:13
>>837 引数を受け取るbが定義されてたらどうなんだ?
839 :
デフォルトの名無しさん :03/03/16 02:16
aとbの名前を持つシンボルは使わん方が……忘れた頃に地獄に落ちるなり。
840 :
デフォルトの名無しさん :03/03/16 02:37
チャットで、同じ文字が続くと文字を小さくしたいんですが、どうすればいいんでしょうか。 こんにちは!!!!!!!!!!!!!!! だとか あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお だとか。
>>839 sort の話しか思いつかないけど、もしかして他にも罠あったりする?
教えて偉い人
>>840 webプログラミング板逝け。
842 :
デフォルトの名無しさん :03/03/16 03:55
glob() 関数ってなにするかんすう?
>>842 ファイル名のワイルドカード
@c_files = glob("*.c");
とかそんな感じ
844 :
CGI経験10日の初心者です。 :03/03/16 14:08
1ヶ月早く今月初めからコンピュータ会社に入社してCGIの勉強をしているのですが、 以下の問題が全く解くことが出来ず困っていている為、質問しました。 <問題> あるサイトの管理者は、とあるプロバイダからアクセスし、 違反行為を行っている(荒らし行為を行っている)人に大変困っています。 そこでアクセスログを収集してプロバイダ単位で規制を行うことにしました。 HTMLからCGIを読み込み、 そのプロバイダからアクセスされた方に対してはエラーメッセージを表示させなさい。 ・・・で、私なりに調べたのですが、 HTMLの方では<!--#exec cgi="拡張子がCGIファイル名"--> っていうのでCGIのファイルをアクセス出来るのが分かったのですが、 呼ばれたCGI側の処理が全くわかりません。 ($ENV{'REMOTE_HOST'}っていうのでプロバイダ名は収集出来るようですが・・・。) どなたかプログラムのサンプルを書いて頂けませんでしょうか? 大変恐縮なのですが、ご協力して頂けたら嬉しいです。 また、そのような処理が掲載されているサイトがあれば教えて頂けると嬉しいです。
845 :
デフォルトの名無しさん :03/03/16 14:47
>>844 Web製作板にきくといいよ。
それと、2chはあんまり役に立たないから、
地道に検索して、専門サイトを巡礼した方がいいよ。
846 :
さちえLOVE :03/03/16 14:49
パスワード解析できるひといる?
↑の件の話はこのメールで。
849 :
CGI経験10日の初心者です。 :03/03/16 14:54
>>845 ご指摘、ありがとうございます。
今までもgoogleなどの検索サイトで検索を行っていたのですが、
いろいろな複数のキーワードで地道に探してみます。
>>849 ひとつアドバイスしておくと、REMOTE_HOSTを得られるようにしているところは少ない。
852 :
デフォルトの名無しさん :03/03/16 14:58
>>844 > CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
> CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
って書いてあるんだけど、見えませんか??
それと、
>>844 に書いてあるようなのはサーバーの設定でやったほうが楽ですよ。
httpd.confとか.htaccessとかですね。
CGIの話でもPerlの話でもないので、Webプログラミング板に行った方が
いいと思いますよ。
彼はPerlスレッドがあったから質問したとおもうんだけど すまんな・・・俺もPerlは電脳を調べたらわかるんだけど 脳内にはないから教えられないよ。
open(vote,"<vote.log"); @votenum=<vote>; close(vote); $votenum[$num] = $votenum[$num] + 1; open(vote,">vote.log"); print vote @votenum; close(vote); これってどこが間違ってるんでしょう? vote.logを配列@votenumに読み込んで、 $numが3だったら$votenum[3]をプラス1にして、 @votenumをvote.logファイルとして上書きする、という部分なのですが。 お願いします。
>>855 コピペミスでないなら、まずはperlの入門書を通読
いろいろ調べたし、読んでるんですよ。 お願いだから、教えてくださいよ。
>>857 で、$numってのはどこで出てきたの?
>>857 できあがったvote.logみりゃすぐわかる。
856は的確な答えを教えてくれてるのに 857=855はなんでそんなにえらそうなんだろう。
>>855 よし、初心者の漏れといっしょに考えよう
ファイルポインタの問題なのか?と思い、次のように書き直してみました。
open(vote,"+<vote.log");
@votenum=<vote>;
$votenum[$num] = $votenum[$num] + 1;
seek(vote,0,0);
print vote @votenum;
close(vote);
実行結果はおなじでした。
例えば$numが2の場合、$votenum[2]がプラス1されて欲しいのに、
$votenum[1]が$votenum[1]*10+1されてしまいます。1が$votenum[1]の最後の
文字列に加わってしまう感じ。
>>858 $numはhtmlのformから取得されるようになってます。
>>859 すいません。わからないです・・。
>>860 えらそうだなんて侵害ですが、そう思われたのなら謝ります。
>>861 お願いします。一緒に考えてください。
>>862 演算の直後に
$votenum[$num] .= "\n";
って入れてみ。
>>863 なるほど、できました!ありがとうございます。
これで投票CGI完成です。
>>862 $votenum[$num] = $votenum[$num] + 0;
$votenum[$num] = $votenum[$num] + 1;
はどうよ。
>>864 原因ちゃんと分かったんか?
一応言っとくと、読み込むときには各行に一つの数字でかかれているのに
書き込むときに一行に複数の数字で書いてるのが間違い。
すんませんが、 OOで書かれたサンプルプログラムで分かりやすい解説ついてるのとか ありませんか?
>>864 書き込む処理の前に
$,="\n";
と入れると幸せかもしれません。
>866 そう言われるとわかります。で、\n追加して区切ってやると。
>>869 つまり「できあがったvote.logみりゃすぐわかる」でしょ。ガンバ
スカラー変数に特定条件だけ除外して代入するにはどうしたらいいでしょうか?
>>872 if(条件){$val1=$val2;}
>>873 それだと条件の時のみ代入、じゃないでしょうか?
自分がやりたいのは具体的に・・・
$a = 条件zの一番最初の数字
とした場合
$bに$a以外の条件zを代入、としたいのです。
>>875 一番最初の数字
では無く
$n番目の文字
ですね
一番最初なら2番目〜に条件を変更すれば良いだけなので・・・
自分説明下手ですね・・・ $a = $z; $zに入るべき文字は二つあり、日替わり $b = $zの$aに代入されていない方;
日本語で書いてください
$zじゃなくて@zにしたら
$r_arrayって何か意味あるんですか?
>>882 なにをいきなり唐突に……
配列であることを変数名で明示してるんじゃない?
Perlでは $r と @r は区別されるから、プログラム的な意味はないけど
あくまで分かりやすさということで。
885 :
デフォルトの名無しさん :03/03/17 07:10
おいらは配列名にarrayは付けないけど、hashrefやarrayrefは付けるよ。 単純なスカラと勘違いして代入しないよう、念のため。
>>885 あ、それ俺もまったく同じ。
配列とかハッシュは目的別に変数名を付けるからちゃんと分かるけど、
リファレンスは区別がつかないからね。
%HASH = (); $str = 'A=10 B=20 C=30 D=40 E=50'; foreach ( split / /, $str ) { my ($key, $val) = split /=/; $HASH{$key} = $val; } なんてコードを一行にまとめるとしたらどのようにすればよろしいでしょうか。 my ($key, $val); map { $HASH{key} = $val, ($key, $val ) = split /=/ } split / /, $str; なんて書いてみたのですが、、、何か美しく無い気がします。
%HASH = split /[ =]/, $str;
>>888 言葉がありません。ありがとうございます。
>>887 ただハッシュにイロイロ代入するだけだろ?
%HASH = (A=>10, B=>20, C=>30, D=>40, E=>50);
かなり下がってるのであげておく。 見にくいけどこんな書きかたも出来る。 %HASH = (A,10, B,20, C,30, D,40, E,50); AとかBは、クウォートしないとエラるかも。
ファイルから読み込むって話じゃないの?
簡単に済ますときは %in = split(/[&=]/, $ENV{QUERY_STRING}); とかやる。
>>891 %hash = qw(A 10 B 20 C 30 D 40 E 50);
>>890-894 私は極基本的なことを忘れていたようです。
ハッシュへの代入は
%HASH = (
A => 1,
B => 2,
C => 3,
);
と'=>'を使わないとできないと認識していました。
本を読み直すと、
%hash = @array;
は
%hash = (
$array[0], $array[1],
$array[2], $array[3],
$array[4], $array[5],
);
は、全く同じですね。
重ね重ねありがとうございます。>890-894
896 :
デフォルトの名無しさん :03/03/18 18:45
Perlで読み込んだバイナリファイルを拡張子を頼りにせずに 何のファイルかを判断することってできますか? ※もしかしたらスレ違いかもしれませんが、Perlでやろうと していることなのでこのスレに書かせていただきました。
まー、perlって覚えきれないほど書き方あるからね。 ただ、一番基本形の書き方は必ず2〜3コくらいあるので忘れないようにしよう。
構文砂糖大杉
構文蜜壷
903 :
デフォルトの名無しさん :03/03/19 00:38
ラクダ本買ってきて必死に読んでるところなんですが、 奥が深くて道のり遠そうなんで教えてください。 とあるShift-JISのデータを(日本語を考慮していない)ツールで処理させねばならず、 困ったことにこいつが勝手に文字列を分割しちゃうんです。 "ABCDEFGHIJ" → "ABCDE" "FGHIJ" みたいな感じで。 で、2Byte文字を考慮していないので、変なところで分割されちゃうんですね。 "数を越えて" → "数を越?" "ヲて" ってな風に。 これをなんとか元の文字列に直して、適切な位置で分割し直してやる。 ってことがPerlならできるのかな?って思って調べてるんです。 一応、pack(),unpack()とかjcode.plとか見てみたんですが、どうもわかりません。 ヒントとかポインタとかいただけると助かります。
904 :
デフォルトの名無しさん :03/03/19 00:39
そもそもperlでは , と => は等価。 このスレのタイトルのPerlも間違いで、perlが正しい。
905 :
デフォルトの名無しさん :03/03/19 00:54
>>903 考慮していないのなら、考慮すればよい。
よくある解決方法は、前処理として一端データを問題のない文字コードへ変換する。
たとえば日本語EUCやUTF等にだ。
その後必要であれば、元の文字コードへ戻す。
上記の方法が、なんらかの問題により適用できないのであれば
以下の文字コードの後に\を付け加えることにより回避する。
ソ兎浬欺圭構蚕十申會箪貼能表暴予禄噂喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭
−(全角ハイフン)Ы(ロシア文字)\(ローマ数字の9)
しかし、文字コードを統一せずに処理をしてしまうこと自体に問題があるので
緊急対策的な方法は必ず破綻する。
データを処理する前に、問題の無いデータへ加工することが、最も負担が少なく
(コード別に処理プログラムを作ったり、例外的な分岐を追加せずに済む)また
問題も少なくなる。(コードのみとうしもよくなり、速度も期待できる)
>>905 さん
早速のアドバイスありがとうございます。
件のツールが処理する元のデータはバイナリ(より正確にはMacのリソース)なんで、
>よくある解決方法は、前処理として一端データを問題のない文字コードへ変換する。
は無理なんです。すみません。
ただ、考え方の方針として「処理前に問題の無いように加工しておく」ってのは
参考になりましたんで、その方向で考え直してみます。
>>906 それって○バイト目で強制的に分割されてるんじゃないの?
>>904 ダウト。
=>は左オペランドが識別子であれば、クォートを省略できる。
スレタイもPerlでいいと思うけど?(Perlが正しく、perlは間違い、とまでは思わないけど)
Perl => 言語
perl => Perlの処理系
909 :
デフォルトの名無しさん :03/03/19 16:38
もうこのスレもパート4が見えてきたね。
>>908 ダウト
>perl => Perlの処理系
あほすぎ
>>910 人を阿呆呼ばわりするならその根拠を述べろよな。
>>910 なんでだ?perlはPerlの処理系の一つだろ?
昔どっかで読んだ記憶がある。
perl以外にPerlの処理系はなさそうだが。
見つけた。
ttp://www.perl.org/press/glossary.html Perl
The language itself, as opposed to the interpreter, "perl", with a lowercase "p".
perl
The program which interprets Perl and makes the computer do what it says.
>>903 ,906
Shift_JISのデータってバイナリなんだ?へー
すみません、とても簡単なことかもしれませんが 煮詰まっているのでご教授願えませんでしょうか? あるファイル内に下のような記述があり、a〜mまでを 配列としてぬきだしたいのですが・・・ AAA ( a, b, c, d, e, f, g, h, i, j, k, l, m ); BBB ( n, o, p, q, r, s, t, u); chopで改行をなくしてAAA()内の文字列をマッチングさせようと 思ったのですが、どうしても1行目しかとりだせません。 chopしただけじゃだめなんでしょうか?
>917 tr/\n//d chop は末尾を削るだけ。改行文字を削るなら chomp がよい。
>>917 chopした結果をprintしてみるとかいう基本的なことはやらないのかい?
920 :
デフォルトの名無しさん :03/03/20 06:47
説明不足の質問かもしれませんが flock関数が使用できないOSがあると聞いてます こちらはwin98seでcygwinを使っていますが この関数は使えますか?
ageてしまいました
>>920 の質問は解決しました、どうもすいません
910、913は負け犬確定(大笑い
924 :
デフォルトの名無しさん :03/03/20 14:53
ActivePerlのPerl5.8.0で Encode.pmを使って文字コード変換したいのですがうまく変換してくれません。 jcode.plでの &jcode::convert(\$text,"euc"); と同じことをするのは $text=encode("euc-jp",$text); ではないのでしょうか?
自己レスです。 ↓みたいにencodeの前にdecodeするとうまくいきました。 $text=decode("shift-jis",$text); $text=encode("euc-jp",$text); ただこの場合、decodeの際に元文字コードが分かっていることが 前提になると思うのですが、分からない場合は 元文字コードが何であるかを調べるメソッドってあるのでしょうか?
928 :
デフォルトの名無しさん :03/03/20 15:41
packageをinstallをしようとしています。 # /usr/local/bin/perl -MCPAN -e shell snip cpan> install Term::ReadKey snip LD_RUN_PATH="" cc -Wl,-E -G -L/usr/local/lib ReadKey.o -o blib/arch/auto/Term/ReadKey/ReadKey.so /usr/ccs/bin/ld: illegal option -- E snip どうも/usr/ccs/bin/ld(Solairs付属ld)には-Eが無いため失敗している ようです。GNU ld(on my WS, /usr/local/bin/ld)には-Eがあります。 /usr/local/bin/ldを使わせたいのですがやり方が分かりません。 # PATH=/usr/local/bin/ld:/usr/sbin:/usr/bin; export PATH # LD_RUN_PATH=/usr/local/bin/ld; export LD_RUN_PATH しようが、 cpan> o conf LD_RUN_PATH /usr/local/bin/ld しようが、 /usr/ccs/bin/ldを使い続けます。 (Solaris教えてスレッドにも書いてます)
929 :
デフォルトの名無しさん :03/03/20 15:42
>>925 Encode::Guessが自動判別用モジュールだよ。
>>928 Config.pmを直接編集するしかないと思うよ。
931 :
デフォルトの名無しさん :03/03/20 18:57
レンタルサーバーで、 libディレクトリに入っているモジュールのバージョン違いを 自分のディレクトリに入れたのですが、それを優先的に使いたい場合は どうすればいいのでしょうか?
そろそろテンプレ作成時期かねぇ
--------------
前スレ Perlについての質問箱 3箱目
http://pc2.2ch.net/test/read.cgi/tech/1041205885/ "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/ --------------
Perl紹介文章はかっこいいの書き下ろしキボンヌ
Perlは世界を滅ぼします。
935 :
デフォルトの名無しさん :03/03/23 19:39
Cには2次元配列とか3次元配列jってあるけど Perlにはそのようなものってありますか?
936 :
デフォルトの名無しさん :03/03/23 19:53
やっぱコムソートがいいよね
やっぱコムドームがいいよね
javaにはガベージコレクターとか、スレッドとかありますが Perlにはないんですか?
コムソートってなんですか?
>>943 あふぉか
comb sort
かなり効率のよいsort
perlのリファレンスが知りたいです。 超分かりやすくて情報量が多いページを教えてください。
書 籍 代 を ケ チ る な よ
948 :
デフォルトの名無しさん :03/03/24 06:13
>>945 perlについているのがかなり良い!!
949 :
デフォルトの名無しさん :03/03/24 06:57
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д` ) < 2Get!!!!!!! (決まったか? /, / \______________ (ぃ9 | / /、 / ∧_二つ / / / \ / /~\ \ / / > ) / ノ / / / / . / ./. (゚д゚) < 兄ちゃんやったね!2ゲットだよ / ./ ( ヽ、 ゚( )− ( _) \__つ / >
950 :
デフォルトの名無しさん :03/03/24 07:00
Microsoft Internet Explorer の中止ボタンは確かに しいたけの傘の部分を上から見たものに見えます。 しかも調理の際、よく熱が通るようにつけるバッテンの 切込みまでもが本物そっくりです。 これは私個人の推測なのですが、IE の作者は実は食通 で朝食で食べる野菜炒めに必ずしいたけを入れるタイプ ではないでしょうか? 少なくとも冬場のおでんには入れているはずです。 実は、私も中止ボタンがしいたけに見えて、危うく食べ そうになり困った経験があります。どなたか同じ経験を お持ちの方、このスレで熱く語りませんか
perlにGCなんてあるわけないじゃん(ww
ありますよ。
>952 明示的に動かせたっけ? っていうか明示的に動かす必要に迫られたことないような。
>>953 明示的には動かせねぇよ。
しかるべきときに勝手に動く。
>953 っていうか明示的に動かしてもしょうがないのでは?
finalizerを走らせたいとか、長時間動くスクリプトでsleepに入る前にできる だけ余分なリソースを開放したいとか。
>>956 >finalizerを走らせたいとか、
は別にどうでもいいが、
>長時間動くスクリプトでsleepに入る前にできる
のはりソースの厳しいマシンだと嬉しいかも
958 :
デフォルトの名無しさん :03/03/24 16:45
ActivePerl5.8でDBD::ODBCをPPMインストールしようとしたら できませんでした。 search DBD::ODBCしてもリスト出てこなかったよー。
960 :
◆vZrORbBkXs :03/03/24 21:04
ファイル書き出しのコマンドは何でしたっけ? print?? "文字列" -"ファイル名" だった記憶があるんですが誰か教えて下さい。
氏ねgoogle
>960 open(FILEHANDLENAME, ">filename") || die "Can not open file for output:$!"; binmode(FILEHANDLENAME); # if you output binary data print FILEHANDLENAME "hogehoge"; close(FILEHANDLENAME);
963 :
◆vZrORbBkXs :03/03/24 21:28
964 :
◆vZrORbBkXs :03/03/24 22:16
>>964 ファイル書き出しする事に前のファイルの中身が消えてしまうんですけど
前の中身を消さずに追加していく方法はありませんか?
お願いします
アリマス。
966 :
◆vZrORbBkXs :03/03/24 22:19
どうやるんですか? 教えて下さい
>>966 まずは、君が調べてみたのか?
調べたのならどう調べたのか書いて見れ
話はそれから
968 :
◆vZrORbBkXs :03/03/24 22:23
>>967 ここは質問スレですよね?
私がスレ違いならば帰ります
970 :
◆vZrORbBkXs :03/03/24 22:27
冷やかしは止めて下さい
>>962 さんお願いします
ファイルの中身を消さずに追加していく方法を教えて下さい
調べれば数分でわかることをいちいち訊くのはどうなんだろうか。
>>968 質問スレだからどうだっていうの?
とりあえずヒントはたくさん与えてもらってるんだから、あとは検索ぐらいできるでしょ。
1から10まで教えてもらってばかりいちゃ、何も身につかないよ。
>>966 perldoc -f open or die
>>964 では、教えてあげよう
まず、perlでファイルを扱うためにはopenすると言うことはわかるだろう?
そして、君がしたいことはファイルの内容を消さずに内容を追加しながら書き込む方法だろ?
この二つを検索条件にして検索してみるぞ
検索クエリー例
「perl open 追加 書き込み」
これをgoogleにでも投げて見れ
君の求める答えは出てきたと思わないか?
この程度のことが自分ひとりで出来ないならプログラミングをするのをやめれ
975 :
◆vZrORbBkXs :03/03/24 22:37
あなたの言う通りでした 申し訳ありませんでした open(FILEHANDLENAME, ">>filename") || die "Can not open file for output:$!"; binmode(FILEHANDLENAME); # if you output binary data print FILEHANDLENAME "hogehoge"; close(FILEHANDLENAME); こうすればいいんですね あってますか?
>>974 おいおまえ!
この前コマンドプロンプトの起動のさせ方覚えたばっかしの初心者に、
そんな難しいこと言うんじゃねぇよ。
そもそも、googleって何だよ?クエリーって外国人の名前か?
専門用語連発するんじゃねぇよ。わけ分からん。
>>962 演算子の優先度の関係上、 or を使う方がよい。
|| と or は働きは同じだが前者は優先度が非常に高く後者は非常に低い。
open(FILEHANDLENAME, ">>filename") or die "Can not open file for output:$!";
>>975 実行してみればすぐに分かる。おそらく君の意図通り動く。
いずれにせよ、openみたいな基本的なコマンドを
「うっかり忘れました」なんてみえみえの嘘ついてる時点で好感度最悪。
「優しい」解答なんか返ってくるはずがない。
>>976 お前誰?
GCを継承する方法をおせいてくろさい
>>968 スレ違いじゃないよ。住む世界が違う。
君にぴったりなのは小学校か中学校だ。大抵優しく教えてくれる。
本当に小・中学生なんだったらすまんな。プログラマの世界は義務教育じゃないんだわ。
指摘するのはかまわんが、蔑むのはどうだろうか。 「プログラマの世界」なんていうのはそもそもないわけだし。
>>982 まあそうなんだけどさ。
プログラムって手取り足取り教えてもらうものか?
それで本当にプログラムができるようになるのか?
自分では一切調べないで人に全部書いてもらってプログラムしてるって言えるのか?
もし他人に全部書いて欲しいんだったら、スレ違いだろ。
WebProg板に改造してもらえるスレとかあった(ような気がする)からそっちじゃないか。
教えて君が来たら誘導するのが筋だわな
>>984 サンプルと称して、perlで書かれたブラクラCGIを踏ませたりとか?
989 :
デフォルトの名無しさん :03/03/25 01:42
WinXPマシンにActive perl インスコしたんだけど、CGIの文法チェックしようと思ったら、 XPのディレクトリ半角スペースあるんすけど、これ%20じゃだめじゃないすか。 どうやったら、マイドキュメント内のCGIファイルの文法チェックできるようになりますか?
990 :
nobodyさん :03/03/25 02:08
991 :
デフォルトの名無しさん :03/03/25 02:14
そっか。サンクス
>979 詳しい解説ありがとう。
人に教えるのは自分のスキルアップにもつながるので、 うざく無い限りは教えるようにしている。 新人に教えるときにも参考になるしね。
新スレ立ててくれ。
ごめん。間違えた。もう立ってた。
996
もう来ねえよヽ(`Д´)ノウワアアアアアン
もう来ねえよヽ(`Д´)ノウワアアアアアン
もう来ねえよヽ(`Д´)ノウワアアアアアン
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。