"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/01/17現在の最新版: 5.8.6
● 2005/01/17現在の開発版: 5.9.1
過去ログは7、8箱目だけ閲覧不可でした。
9〜14が開けない場合、2chブラウザ以外で試してください。
前スレにアドレス貼るの間に合わなかった。スマン。
6 :
デフォルトの名無しさん:05/01/17 20:00:00 ,
7 :
デフォルトの名無しさん:05/01/17 21:17:40
perl-5.8になってsetuidが使えなくなった?
8 :
デフォルトの名無しさん:05/01/17 21:32:24
>>7 普通に動いてるよ
ところで
>>6の時刻の後にカンマが見えるのは自分だけか・・・
俺も見えるな、0が続くと付くのか?
10 :
デフォルトの名無しさん:05/01/17 21:58:55
perlのプログラ厶上でUNIXコマンドを使用する方法が分からないです。
googleで探してもUNIXコマンドのページばかりひっかかってどうしても見付かりません
どなたか御指導お願いします。
system
すいません、あれからまた調べ続けたら…やっと見つかりました
'ls ./' などのようにすればいいだけなのですね。
お騒がせしました。
13 :
デフォルトの名無しさん:05/01/17 22:15:26
>>12 それシングルクォーテーションじゃ・・・
とりあえず三通り
[1]
system("command");
[2]
open(PIPE, "command |");
@msg = <PIPE>;
close PIPE;
[3]
$msg = `command`;
3番はバッククォーテーションだから注意
形態の印ね。, → Oに改変。
え、、、exec("command");、、、ハアハア
ドコモ携帯テスd
17 :
デフォルトの名無しさん:05/01/17 23:52:39
ə
15箱目ですか乙です。
14 の次が 15 だと推論するのに時間がかかりました。
なんか閑散としてますが他の人も同じなのか?
これがデフォ。
よほどのネタ振りがあるか
粘着初心者くんでもいないかぎり。
まあ大抵後者でスレが消化されて行くわけだが。
sudo 命令をパスワード付きでperlから実行できますか?
>>20 IPC::Open2なんか使えば出来るかも
>>20 Expect なんか使えば出来るかも
sudo の -S オプションなんか使えば出来るかも
唯一ついえることは、そんなことを聞くようなレベルでsudoは危険だぞ、と。
ソケットで他のサイトを読み込む時、5秒経っても鯖の応答がなければFaild、とするにはどうすればよいですか?
>>24 alarmとか使えばできると思うが、他のサイトってのがhttpなら
ソケットでごりごりやるよりLWP使ったほうが楽だよ。
自身のモジュール名(ソースファイル名)を取得する関数ってありますか?
ソースファイルのフルパスなら $0 でわかる(通常は)。
パッケージ名まで知りたいなら
my ($package, $filename, $line) = caller();
あたりでどうなんだろ?
>>26,
>>27 蛇足ですが、caller はサブルーチン呼び出し 1 段以上経てないと機能しませんから!
package foo;
sub bar {
my ($package, $filename, $line) = caller;
print "$package, $filename, $line\n";
}
bar();
print "$0\n"; # ついで
forって10回までしか繰り返せないんでしょうか?
50回繰り返したら1回だけ動かしたいスクリプトがあるんですが、
どう書いたら良いかわかりませぬ。
気が向いたら教えてくださいm(_ _)m
Σ(゚д゚) エッ!?
>>32 > forって10回までしか繰り返せないんでしょうか?
なぜそう思い込み、決めつけ、疑いのないそのまっすぐな眼差しで
この愚劣極まる質問を発したのかを説明してくれると、みんな楽
しめると思います。ぜひお願いします。
カモキター
100%釣り
37 :
デフォルトの名無しさん:05/01/21 19:16:13
くだらない質問でゴメン。
これでa.plを実行したら、表示される結果は1?2?
やっぱり1?
手元にperlを実行できる環境がないけど、至急回答が必要なの…。
./a.pl
#!/usr/bin/perl
my $a = "1";
require './b.pl';
print $a;
./b.pl
#!/usr/bin/perl
$a = "2";
1;
ここは丸投げ厨には厳しいインターネッツですね
41 :
デフォルトの名無しさん:05/01/22 22:55:29
なにを突然
>37
実行環境がなくてもすぐ手元で確認できるようにPerlのインタプリタを作ればいいじゃないか?
>>41 知ってはいるけど使ったこと無い
大抵はラベルとブロックを組み合わせた方法で事足りるから
リストで十分。
多態で十分。
今日暇だし標準モジュール全部使ってみるか
早くも挫折か?
CPANからHTML::モジュールをインストールしようとしたら、
cpan> install HTML
Warning: Cannot install HTML, don't know what it is.
Try the command
i /HTML/
to find objects with matching identifiers.
となります。どうやったらインストールできますか?
51 :
デフォルトの名無しさん:05/01/24 11:31:23
cpan> i /HTML/
i /HTML/
や
i /HTML::LinkExtor/
などとすると、
cpan> i /HTML::LinkExtor/
Module id = HTML::LinkExtor
DESCRIPTION Extract links from HTML documents
CPAN_USERID LWWWP (The libwww-perl mailing list <
[email protected]>)
CPAN_VERSION 1.33
CPAN_FILE G/GA/GAAS/HTML-Parser-3.45.tar.gz
DSLI_STATUS RmpO (released,mailing-list,perl,object-oriented)
MANPAGE HTML::LinkExtor - Extract links from an HTML document
INST_FILE /usr/local/lib/perl5/site_perl/5.8.5/mach/HTML/LinkExtor.pm
INST_VERSION 1.33
と出ます。
要するにインストールするにはどうしたらいいのでしょうか?
53 :
デフォルトの名無しさん:05/01/24 11:54:36
cpan> help install
インストールされているってことですか?
55 :
デフォルトの名無しさん:05/01/24 11:59:11
Sorry, can't speak English
どうなんですか?
No, am I. Read the warning message: "CANNOT INSTALL"
ここはアメリカンなインターネットですね
いぢめないで教えて下さい
60 :
デフォルトの名無しさん:05/01/24 16:54:23
activeperl5.6.1
windowsXP
この環境で、aというフォルダ内にたくさんあるフォルダの中にある.txt/.csv
ファイルなどを全てaの直下に移すプログラムを書きたいのですが、どうすればいいでしょうか?
my @fold = glob 'aの中にあるフォルダだけを取得';
foreach (@fold){
my @sub_fold = glob 'aの中にあるフォルダの中にあるファイルを全て取得';
}
・・・ファイルの移動ってどうやるんですか?
一度元を読み込んで、任意の場所でopenをして自動でファイルを新規に開いて
そこに元になるものを流し込むみたいな方法以外にないのでしょうか?
ちょっと大変そうですねそれ;
61 :
デフォルトの名無しさん:05/01/24 16:57:12
a\a.bat
move *.txt ..
move *.csv ..
>>60 File::Find
File::Copy
>>62 File::Copyの解説(英語)を読む方がしんどいです。
本当に日本語訳以外のperl.docの説明書って直感的でないですね。
英語だろうが、関数の使い方くらいパットミでわかると思いマシ多雨。が、疎コマsだsファslgじゃkjgばsdgかjdbがshd
1から自分で書きます。それなら30プンですから
64 :
デフォルトの名無しさん:05/01/24 19:28:42
1)エクスプローラで詳細表示、ファイルの種類で並べ換え、複数ファイル同時選択。
2)エクスプローラでF3を押してファイル名検索「*.txt;*.csv」検索結果をCTRL+A
英語はよく判らないけれど、サンプル見れば何となく判る漏れは逝ってよしですか?
最初にperlfaqを読まない者はきびしいな
あんなの読めないなんて釣られないぞ〜
あの程度が読めない奴が30プンで書いたああいやいや釣られないぞ〜
SQLiteを使ってみたんだが素晴らしいなこれ。
70 :
デフォルトの名無しさん:05/01/25 00:06:38
>>69 SQLite、使ってみたいと思ってます。
(いまのとこ、インストールしただけです。時間がなくて)
日本語、通りますか?
そのままじゃ通らないとしたら、urlエンコードなど
使ったりするのでしょうか?
よろしかったら、教えてください。
すんません、ちょっと教えてください。
Perlで「"」ダブルクォート内の文字列を抜き出したいのですが
やり方がわかりません。
何か方法が有るのでしょうか?
>>70 実際にやってみようとは思わないのか?
Shift_JISもEUC-JPも特に問題はないが、文字列操作関数を使うならUTF-8にしておいたほうが無難ではある。
>>71 while(/"(.*?)"/g) {print $1;}
>>60 C:\path\to\a\dir /s /b *.txt | perl -nle "`move /y $_ C:\path\to\a`"
うはwwww
71でつ。
>>74 それで1発で逝けました。
ありがとうございました。
>>70 サンクスです。
>実際にやってみようとは思わないのか?
思いますぅ。ただ、クエリの初歩から勉強という段階で…。
近日中に、なんとかします!
>>77 データベース板の SQLite スレもよろしく。
WindowsでのPerlについて質問があります。
環境はWindows XP Pro SP2,perl, v5.8.2 built for cygwinです。
#! /usr/bin/perl
use Cwd;
my $dir1 = Cwd::getcwd();
print "$dir1\n";
my $infile = $ARGV[0];
open (INFILE, "$infile");
open (OUTFILE, ">result.txt");
print OUTFILE "hogehoge\n";
上記のようなスクリプトをコマンドラインで実行すると実行時のデ
ィレクトリがカレントディレクトリになりますよね。
それに対しperlコンパイラ(PAR,perl2exe,perlcc)でコンパイルし、
入力ファイルを実行ファイルにドラッグすると、カレントディレク
トリである$dir1はホームディレクトリになってしまい、その結果
OUTFILEもホームディレクトリに出来てしまいます。
1)INFILEと同じディレクトリにOUTFILEを作りたいので、現在の所
infileの最後の"/" or "\" までを取得してchdirしているのですが、
もう少しスマートな方法はないでしょうか?
2)ドラッグ時にカレントディレクトリがホームになるあたりについ
ての説明のソース等がありましたら教えてください。
よろしくお願いします。
>>79 超一般論だけど、引きずって落とした時には、
その引きずり落としを行なうシステムが、
カレントディレクトリを決定するのではないか?
Winでそのあたりの設定をいじった記憶があるのだが、
もう何年も触ってないのでうろ覚え。
それから、ふつう、chdirなどせずに、OUTFILEを絶対パス
していしたりすると思うが。
>1)INFILEと同じディレクトリにOUTFILEを作りたいので、現在の所
>infileの最後の"/" or "\" までを取得してchdirしているのですが、
>もう少しスマートな方法はないでしょうか?
それが一番スマート
>>81 いや実は、少なくとも v5.6.1 では "$infile/.." で通る罠。
BEGIN {
push @INC, "$0/..";
}
とかよくやる。
>>82 のディレクトリ取得方法が合法だと主張したり勧めたりはしませんので念のため。
実際、perl 以外のシチュエーション(たとえば ls './foo.txt/..' とか)は NG (Not a directory) なので処理系依存であることは間違いない。
File::Basename
>>82 んなあほな、と思ったらマジでできる。。。
5.8.4でもOKだった。
../で打ち消される部分は単純にスラッシュの数だけ数えてて、
間のフォルダ名は何書いても評価されてないみたいね。
$cur = Cwd::getcwd();
open (OUT, ">>$cur/;,:?<>|/../foobar.txt");
こんなのまで許される。うわー。
my($input_dir) = $ARGV[0] =~ /^(.*?)[^\/]+$/;
my($exec_dir) = $0 =~ /^(.*?)[^\/]+$/;
おれこうやって受け取ったファイルのディレクトリとか
実行ファイルのディレクトリいつもゲットしてchdirをめったに使わん。
sjisのファイル名で漢字の第二バイトに\が含まれてて泣いた人いないっすか?
いや、いないならいいんですけど…
しょっぱい質問なんですけど、
while(1){
A;
B;
サブルーチン();
C;
}
これサブルーチンに一回戻ってもう一度Aから動かしたら
ABCと動いて最後にもう一度Cを実行してしまうんですが、
二回目のCを実行しないようにするにはどうしたらいいんですかね?
サブルーチンで一旦別の場所に飛んでwhile(1)に戻って来た時に
サブルーチン呼び出し以下のコードを二度繰り返さないようにしたいんですが。
last;入れてもループ自体が終了しちゃってだめですた。
フラグでも立てればいいだろ。
後藤さん出番ですよ?
イミフメ過ぎ
サブルーチンは毎回実行される(C; は繰り返さない)なら
while{A; B; サブルーチン();} と等価何じゃねーの
とりあえず next; 調べて来い
>>89 なにいいたいのかよく分からん。
戻るっていまドコにいるんだよ?
て言うかあれか?再帰とかしてんのか?
せめてルーチンの中見せなさいよ。
あー、やっと意味分かった。
1回目のループのみCを実行したいんだぬ?
while(1){
$count ++;
A;
B;
サブルーチン();
$count == 1 and C;
}
とか?みたいな?
Perlというよりは意味不明な文章の意味をみんなで
推理する謎解き大会になってきたな...
>>94 ネタだとは思うが一応。
無限ループ内で整数をカウントアップさせっぱなしはやめれ。
2^32 回に一回実行されるし、そもそも符号付き整数のオーバーフローで roundup せずに例外投げる
アーキテクチャも広い世の中にはあるらしい。(直に見たことはないが)
>>96 もとの記述が無限だったんだ。俺のせいじゃない。
先生!
>>89が「すれ立てるまでもない…」でマルチしてるんですけど、
勝手に自己解決してるみたいです!
どもです。
use Image::Size;
したいのですが、Can't locate auto/Image/Size/jpegsize.alって出ます。
ちゃんとスクリプト冒頭で
use FindBin qw($Bin);
use lib "$Bin/lib";
ってやってるのですが、なぜでしょうか?
(Size.pmは、(Perlスクリプト本体のディレクトリ)/lib/Imageの中にあります)
とんでもないヘマをやらかしてますか?
心優しいPerlコミュニティの皆様、教えてください…
>>99 エラーメッセージに書いてあるようにないのはjpegsize.alなので、
Size.pmがあったからといってどうにもならんのだが。多分Size.pm
は読めていてその中でjpegsize.alを要求していると思われる。
まずはjpegsize.alがあるか確認すべきだろうな。
jpegsize.alをググって、はいずりまわって探し出しました。そして、
Size.pmと同じ階層のディレクトリに置きました。
いざ実行してみると!
…同じエラーが出てだめでした。
alファイルというのはオートロードファイルということがわかったの
ですが、このオートロードというのは、どの時点で自動(オート)で
読み込まれる(ロード)でしょうか?スクリプトの実行時?
(そもそも画像データの扱いはImage::Magickを使うのが一般的なので
しょうか。)
アウチ!!
できました。お玉冷やしたおかげで、わかりました!
Perlディレクトリ\lib\auto\Image\Sizeにalファイルを置いたら動きました!
うわぁあああん、ありがとう。
でも、これってサーバー上のPerlディレクトリをいじれなかったらできないん
ですか?
>>103 >>99-104(このレス)まで含めperlと関係ないスレッドのゴミになってるのがわからんのか?
いいかげんにしろよ。
>>103 置ける場所に置いて、その場所を示すuse libを追加してやればいい。
>>104 間違った投稿していたなら謝ります…。
あとはメーリングリストにでも行って聞いてきます。
ありがとうございました。
っていうか、どういうインストールの仕方をしたら、
そういうグチャグチャの状況になるんだ?
無益な煽り合いはそのへんでもうやめれ。
それがPerlクオリティ
>>103 CPAN にこんな奇妙なモジュールが置いてあるのか、と疑問に思ってテストしてみたよ。
>>103 は
Image::Size の取説を読んでないんじゃないの?UNIX なら指定のmakeファイルを使ってイン
ストールしなきゃならないし、Win32 ならREADME.Win32 に書いてある通りに編集しなきゃならない。
少なくともWin2000なら、それで全く問題なく動いたぜ。
自分で勝手に判断してインストールするとどうなるか、という点では有益な投稿だったんじゃないかな。
ファイルを一個だけコピッて充実してたのかねえ?
>>112 はい。スカーっとした気分でした。
モジュール使う場合はインストールするしかないのですね。
レンタルサーバーとかの場合でモジュールの追加できないとなると、
こまりましたねぇ…。
use lib 'unko';
ってやってモジュールの位置を教えてあげれば
require 'unko.pl';
みたいに使えるのかと思ってました。use libすごい大発見
だったのに
ははは
115 :
79:05/01/26 16:09:38
>>80-87 皆さんどうもありがとうございました。
大変勉強になりましたので、いただきました解決方法を簡単にまと
めます。
0)infileの最後の"/" or "\" までを取得してchdir
1)OUTFILEを絶対パスで指定
2)infile/.. で記述
3)File::Basenameのdirnameを使ってdirectory名を取得
4)my($input_dir) = $ARGV[0] =~ /^(.*?)[^\/]+$/;
(レス番号順)
>>113 SSH/telnet できるならレンタルサーバでもモジュールインストールできるよ
おれは ~/lib/perl5 にCPANからインストして
use lib '/home/user/lib/perl5';
ってしてるけど
環境変数 PERLLIB はお嫌い?
perl5.8 つかってます。
いったん立てた thread を thread の外部から頃すことってできますか?
use threads;
sub hoge() {
print "x" while(1);
}
$thr = threads->new(\&hoge);
ってしたところで、メインルーチンから適当なところでスレッド $thr を殺したいんです。
>>113 >レンタルサーバーとかの場合でモジュールの追加できないとなると、
>こまりましたねぇ…。
ユーザにモジュールの追加を許したらどうなると思う?
サーバはすぐにdosアタックやらスパムメールやらの基地にされるだろう。
>>103,
>>120 あの、レンタルサーバーにも Perl のセキュリティー設定にも詳しくないんで質問なんですが、
main のスクリプトと同じディレクトリに使いたいモジュール一式コピーして、main 先頭で
(つまり use する前の行で)
>>82 のコード書いてもだめなんですか?
↑ あ、.pm は ./ にコピーしますが、
al や dll については、たとえば Foo::Bar.pm が使うものであれば
./auto/Foo/Bar/ 以下に置くとします。
>>121 お前が設置すべきファイルを全て手元で揃えられるならよほ
どのことがない限りそれでできる。
しかし一般に配布されているモジュールの中には設置すべき
ファイルがそのままの形で含まれていないものもあるという
話だな。一部がC等で書かれていてコンパイル必要なものとか
オートロードのためにインストール時に分割されるように
なってるものとか。運がよければ設置に必要なファイルを
まとめた配布物が手に入ることもあるがそうでなければ自分で
なんとかする環境を持ってないとどうにもならないことも
ある。
>>113 つーかそんな下手糞にインストール任せる業者さんが居ると困るっしょ。
業者さんに素直に頼みなさいな。
「金よこせ」っていわれたら、「友達を紹(ry
メーリスで聞くのもやめた方がいいぞ。うざいから
メーリス
メーリスと言うのもやめた方がいいぞ。恥ずいから。
恥ずい
メーリスで聞いたら、わかりました!
TELNETで入って
perl Makefile.PL INSTALLSITELIB=~/lib INSTALLMAN3DIR=~/man3
make
make install
(~/lib、~/man3は適当に変える。今回はこのまま指定して出来たモノ
をあとから好きなところに移動してuse libで指定しました)
ここで書いていいもんかどうかちょっと悩みましたが、もしかしたら
僕と同じことで悩んでる人がここを見るかもってことで書き込みマウス
メーリスの人とても親切でしたよ。
少なくともここでキレてた人よりも(ニッコリ
バカは答え書いて追い払った方が早いからな
131 :
デフォルトの名無しさん:05/01/27 12:51:23
超くだらない質問で申し訳ありません。
誰か教えてください。
$value = 'test';
$string = '$value';
上の例で変数$stringの内容に従って変数$valueの値を展開して返すような命令なり、
関数なりはありませんか?
132 :
デフォルトの名無しさん:05/01/27 12:57:05
>131
eval
>>132 ありがとうございます。
$value = 'test';
$string = '$value';
print eval $string;
これで期待通りの結果が出ました。
>>129 > メーリスの人とても親切でしたよ。
> 少なくともここでキレてた人よりも(ニッコリ
いや、案外同じ人だったりするもんだよ。
メーリス
>>133 本当にそれでいいのか・・・?
前後にも文字列が入ってるんじゃないのか・・・
>>136 その応用で大丈夫だと思ったのですが、期待したとおりにならず
苦しんでいます。(T_T)
何がなんだか解らなくなってきて、どういう風に質問をあげれば
良いのかも判りません。
>137
evalとFAQ見ろ
>>139 本当はやりたいことは
$string = "$value";
というだけのことだったりして・・・
""すらいらなかったりして・・・
Perlも長いこと使ってるがいまだにpack、unpackの使い方が
良く分からん。
>>142 それは必要とするケースを扱ったことがないっちゅう事ですかな
実例を伴った例で調べればすぐに分かるもんだと思うが・・・
'&'付きで呼んでも、プロトタイプのチェックをさせるには
どうすれば良いですか?
>>143 今までにあった必要とするケースといえばCGIで
URLエンコード/デコードに使ったくらい。
食わず嫌いになってる感じ。
>>144 確かできないと思ったが。
既存cgiの改良依頼ってOK?
昔配布されていた2ちゃんのスクリプトを現行のものと同じレベルに改良して欲しいんです。
業者に頼むのも考えましたが「既存スクリプトの改良」「2ちゃんにあわせろ」っていう点で
ちょっと気が引けたのでここで依頼しようと思います。
ここで受けていただけるようでしたら改めて詳細等を記して有志を募ろうと思います。
(Perlでリクに答えるスレはなんか死んでるようなので・・・)
よろしくお願いします。
>>142 固定長のデータを分解するときには便利ですよ。
CPANについて質問です。
CPANでモジュールをインストールしたのですが、
その時にオプションを選ぶようになっていて、別の選択肢を選び直したいと思っています。
そこでいったんモジュールをアンインストールしようと思い立ったのですがやり方がわかりません。
思い切って~/.cpanの中身を捨ててしまったのですが、
CPANのセッティングはやり直しになるものの、モジュールに関しては以前に出た問い合わせが出ずすぐにインストールが終わるようです。
どうすればモジュールのアンインストールができるのか、正しいやり方を教えてください。
よろしくお願いします。
半角と全角が混雑した文字列を半角60文字のサイズで切り取りたいんですけど、
Googleのキーワードが悪くてよいのが見つかりません。
エレガントでスマートな方法を教えてくだちぃ。
Jcode使うのでしょうか?
>>151 Jcodeのfoldでいいんでねーの?
153 :
デフォルトの名無しさん:05/01/28 13:25:46
open IN, "hoge.prog |";
で hoge.prog のstdoutを ファイルハンドル IN に対応させて、
と、 ここまではいいのですが、同時に hoge.prog のstderrも別の
ファイルハンドルに対応させたいのですが、どのようにすればいいのでしょうか?
即レスサンクスです。
よく探したら過去ログにもありました。m(__)m
>>153 対応させるのは154の言うようにIPC::Open3で簡単にできるが、
両方のファイルハンドルから適切に読み出してやらないと
ブロックするので注意。まじめにやるとselectとか駆使する
ハメになって結構めんどいよ。
perlfaq8(1)の「How can I capture STDERR from an external
command?」あたり参照。クックブックにもなんかそれっぽいのが
あったと思ったけど手元にないので不明。
たしかにクックブックの583ページにそれっぽい事が載ってますね。
私には要約できませんが。
158 :
デフォルトの名無しさん:05/01/28 20:33:22
>>150 ~/.cpan/CPAN/MyConfig.pm
が設定ファイルだから再インストなんかしないでこいつを編集。
rootで入れたんなら、
/usr/local/lib/perl5/5.8.4/CPAN/Config.pm
が設定ファイルなので好きなようにパラメータを編集すればよし。
俺が思うにperlでpdf自体が王道じゃない。
だって、初めて聞いたし。
でも興味あるから見てみる。
PDFJ なんて物があったんですね。これは良さそうですね
articledemo.pdf のようにサンプル論文PDF程度のことが
ことができれば自分的には十分なので
なるほど〜
失礼します。perlのプログラミングをやってみたいのですが
手始めに何か参考本がほしくなりました。お勧めの本とかってありませんでしょうか?
あんまり入門本とかではなくて分厚くて読み応えのある本がいいのですが・・・。
よろしくお願いします。
>>164 perlがはじめてで読み応えある本希望ということなら、
>>3の
駱駝で決まりだろうな。
あぁ。助かります。どうもありがとうございます。
アマゾンで予約してきます。
169 :
デフォルトの名無しさん:05/01/29 22:28:40
パソコン初心者板総合質問スレッドvol.931から誘導されてきた者なんですが。
age2ch.plのsearch.plを
my @crypted = ($content =~ /<dd>([0-9a-zA-Z\/\.]{11})<br><br>/g);
↓
my @crypted = ($content =~ /<dd>\s*([0-9a-zA-Z\/\.]{11})\s*<br><br>/g);
に書きなおすということは、どういうことで、どのような変化が起こるのですか?
教えて下さい。お願いします。
170 :
デフォルトの名無しさん:05/01/29 22:29:49
Usr | S 11/17 00:46:33 1100619993.349208 | E 11/17 00:46:33 1100619993.361487 | ID:21124 | 0.012279
Cnt | S 11/17 00:07:07 1100617627.980650 | E 11/17 00:07:39 1100617659.310731 | ID:32539 | 31.330081
Day | S 11/17 00:04:59 1100617499.362986 | E 11/17 00:04:59 1100617499.628110 | ID:21124 | 0.265124
というような形式で記述されているテキストを、『| E』の直前の17バイトの数字で
ソートしてファイルに書き込みたいのですが、どのようなコードかわからず躓いてます。
while( <READ> )
{
if ( /(\w{3}) | S (\d+)\/(\d+) (\d+):(\d+):(\d+) (\S{17}) | E (\d+)\/(\d+) (\d+):(\d+):(\d+) (\S{17}) | ID:(\d+) | (\S+)$/ )
{
push ( @value , [ $2, $_ ] );
}
}
@sort_value = sort{ $a->[0]<=>$b->[0] } @value;
print WRITE $_->[1] foreach( @sort_value );
としてあるのですが、意図した通りに動いてくれません。
どのようにしたらいいでしょうか?
どなたかわかる方、ご教授お願いいたします。
171 :
デフォルトの名無しさん:05/01/29 22:31:52
push ( @value , [ $2, $_ ] );
は、
push ( @value , [ $7, $_ ] );
の書き間違えです。
$7 の方でやっているのにできません。
>>170 俺なら、「『| E』の直前の17バイトの数字」をkeyとするhashに行をぶち込み、
(まあ、たとえば%hogeとすると)
foreach (sort keys %hash){
print WRITE $hash{$_};
}
とするな
つか、無理に正規表現で表そうとしないで
単純にsplitすればいいんじゃない?
>>173 そうね、「『| E』の直前の17バイトの数字」の抽出は正規表現でもいいし、
行に規則性があればsplitのほうが簡単
>>170 > としてあるのですが、意図した通りに動いてくれません。
> どのようにしたらいいでしょうか?
どこでおかしくなっているのか調べて、そこを修正するといいよ。
>>170 「|」は正規表現のメタキャラクタだからエスケープしろ。
他にも突っ込みどころはあるが致命的な間違いはたぶん
これ。
my @value = <READ>;
my $RegExp = qr/(\S{17}) (?: \| E)/;
close READ;
print WRITE map $_->[1], sort $a->[0] <=> $b->[0], map [ (/$RegExp/o)[0], $_ ], @value;
close WRITE;
かな?
>>169 my @crypted = ($content =~ /<dd>([0-9a-zA-Z\/\.]{11})<br><br>/g);
というのは、$content(投稿内容)に含まれるIPアドレスを暗号化して、
age2ch.plを誰が使っているのか解らなくする命令だ。そこに「\s*」を
挿入すると、暗号化が解除されて、キミのIPアドレスが2ちゃんねるの
運営側に筒抜けになる。
意味が解らない人に罠をかけて陥れようとする香具師がいるようだな。
180 :
169:05/01/30 02:28:02
>>179 ホントですか!?なんか人間不信になりそうですが・・
ではこれは、やらないほうがいいということですね。
そうするとsearch.plは、もう使い物にならないということですか?
他になにか探す方法はないのでしょうか?
教えて下さい。お願いします。
>>179 面白いけどちょっと遊びすぎw
>>180 嘘ですよ
それは、
<dd>※(本体)※<br><br>
※のところに空白が入っていても、マッチングに成功するようにする修正パッチ。
>>180 > ホントですか!?なんか人間不信になりそうですが・・
↑そっくり、お返ししたい今日この頃…。
joinを使って連結させようとしているんですが。
半角スペースを区切り文字に指定するとき
join(" ",@array)
で出来ないのですが、半角スペースはどう書けばいいんでしょうか?
>>183 どう出来無いの?
それで当ってそうだけど
#ってか本人ならCスレに誤爆詫び入れとけよ
わかりました
DBファイルとして保存しようとしたんですが。
" "で、連結したのに、" "がないんです。
ども、できました
失礼しました。
余談だけど、展開する必要のない文字列は '' で、囲うクセを付けると良いよ。
>>188 同意だけど二つ並べちゃうとダブルクォーテーション一つに見えるよ・・・
'hoge'.$hage
"hoge$hage"
どっちがいいの?
>>189 > 同意だけど二つ並べちゃうとダブルクォーテーション一つに見えるよ・・・
プログラミング環境の表示を、シングルクォート2つがダブルクォートに見える
ようにしておくのはマヌケの3乗だよ。
192 :
169:05/01/30 17:50:47
>>181 一体どれを信じればいいんですか?
search.plは今もちゃんと使えるんですか?
194 :
169:05/01/30 17:56:00
↑追加
search.plで検索すると
前は○○○×○とかだったんですけど
最近はeeee×eeとかで、串がまったく見つからないんですが
どういうことでしょうか?
原因と改善策を教えて下さい。
>>191 プログラミングも好きだけどAAも好きなんだよヽ(`Д´)ノワーン
#2chブラウザだし
>>190 ベンチマーク的には同じだった。
書きやすいから、漏れなら下の方を選ぶ。
>>190 それはどんな場合の話?
printの引数なら "hoge",$hage にするよ
>>190 100万回やったら上のが早かった
Winだけど
>>191 Visual Studioはどうしてる?
なんつーか技術レベルの低い奴に限ってどーでもいい些事にこだわるよなw
>>201 細かいことにこだわらないようじゃプログラマ失格だな。
188みたいなのはあくまで「どーでもいいこと」であって「細かいこと」じゃねえよ。話をすり替えるなアホ
>>204 そ、それだけすか?それだけのために '' にしろと言われても・・・
どこに''にしろって書いてあるんですかー
>>206 >>188 に書いてますよね。
というか、私は \ による展開は '' の方が意図しないものになるように感じるんですよね。
% cat hoge.pl
print '\';
% perl hoge.pl
Can't find string terminator "'" anywhere before EOF at z.pl line 1.
>>208 ああすいません、揚げ足取りしたかったんですかね。
書いてません書いてません。
''にした方がいいってのは188の理由だけじゃないと思うけど。
漏れは"は沢山使うとごしゃごしゃして汚いから
シングルクォート派だけど。
>>211 ごしゃごしゃって"<tag name=\"hoge\">"見たいなケース?
そういう場合は、普通こうだろ
qq|<tag name="hoge">|
'の場合でもq|hoge'hoge|っと
213 :
デフォルトの名無しさん:05/01/31 00:19:26
以下のようなデータベースサーバのログがあります.
1秒後 (処理時間2秒)
5秒後 (処理時間6秒)
13秒後 (処理時間9秒)
16秒後 (処理時間5秒)
…
サーバ開始時間を0秒として,それから何秒後にリクエストが来たか,
その処理時間は何秒だったか,というような形のログです.
このログデータを使い,プログラムで任意の数のクラスタサーバを用意して,
どうすれば一番効率の良い負荷分散をするプログラムを作ることがしたいのですが,
どういう構造にしたらいいのかわかりません.
たとえば3台のクラスタサーバを用意するとした場合,
1台目 … 0+ (3×0行目,3×1行目,3×2行目・・・)
2台目 … 1+ (3×0行目,3×1行目,3×2行目・・・)
3台目 … 2+ (3×0行目,3×1行目,3×2行目・・・)
というラウンドロビンで振り分けていくプログラムを作りました.
これはこれで1台でやるよりは効率よく処理できます.
しかし,これに加えて処理時間と到着時間が被っていないかで判定して振り分けるのがいいと思うのですが,
どういう制御文にしたらいいのかわかりません….
Perlで作らなければいけないのでここで質問させていただいたのですが,
どなたか知恵を貸していただけませんか.
読み込むログデータは冒頭のような形で固定です.
一応シングルクオートの方がコンパイルは早いはず。
でも別にわざわざ気をつけるほどのことじゃないけどな。
>>212 そうだね。そういう時は特にそうだね。
でも単純に
$foo = 'hoge';
$bar = 'hage';
$baz = 'zure';
というときもシングルクオートにしちゃうね。
エスケープがうんぬんというよりも、
見た目が単に綺麗じゃないよね。ダブルクォートって。
フォント変えれば心も変わるかもしれないけどね。
正確にはログデータには日本語は入っておらず,
1.42423_2.53556
5.24524_6.35352
13.43663_9.59301
16.93821_5.23428
・
・
という形です.
『_』はスペースです.
>>214 そんなに違いますかね?
コンパイル時ってことは評価されるのは一度だけですよね?
>>214 え?
評価可能なパターンが入っているかどうか、
いやらしい眼でなめずるように見るか、
それとも見ないかの違いじゃないのか?
実行時に作用しないか?
219 :
Hiro58:05/01/31 00:40:18
今バイトでCGI(perl)を作る仕事をしてますが、バイト先の人がperlだと素人みたいだからほかの言語で作ってほしいといわれてしまいました。
perlは素人の言語なのでしょうか?その会社の人はphpかaspとかいっているのですが、わざわざ変える必要はあるのでしょうか?
>>219 はてなのシステムはPerlだそうだが。
phpのほうが素人っぽくないか…?
あれだ、顧客に変な知識がついてんだろう。
>>219 そんなことないと思うが、その場で反駁できなかった時点で負けと思ってほかの言語で頑張れ。
>>219 その会社の人は間違いなく素人
違うところでバイトした方が君のためだ
>>219 顧客の見たPerl感はPerl4と個人サイトの掲示板なんだろうなぁと想像
とりあえずPerl5で作って、Perlで作られているものの代表例を言ってみることをお勧め。
Movable Typeとか。
226 :
デフォルトの名無しさん:05/01/31 01:48:25
スレ違いかも知れませんが、
御存じなら教えていただけないでしょうか?
TL10DにUpdate kitを当てた状態で、
Perl/Tkを使いwedgitに日本語を表示させたいのですが文字化けします。
Tcl/Tkのwishでは問題なく表示されているので、
Perl/Tkの問題のように思いますがGoogleでも、
TurboのHPでも有効な情報は検索できませんでした。
環境は以下の通りです。どうぞよろしくお願いします。
tcl-8.3.5-18
perl-Tk-800.023-4
perl-5.8.0-11
227 :
Hiro58:05/01/31 01:50:45
なるほど。やはりperlでも問題ないですよね。顧客に吹きこまれたかw
まあ、社員はみんな良い人で社長もいい人☆バイト代もたくさんもらえるので
がんばってperlで続けてみます。
そういえばaspだとすごいWebアプリが作れそうな気がするのですが…。
ユニクロとかaspだし。でも簡単にはできないですよね。。
>>224 その通りです。会社で誰も作れる人がいないのでバイトの自分がプログラム
してます。
perlでこんなことが出来る、って感じの書籍やサイトはありませんか?
>>227 まあ、PerlにもWebアプリケーションフレームワークは色々あるみたいだし。
>>227 お前の腕次第だ。馬鹿。
asp使ってもお前にはすごいWebアプリが作れるとは思えない。
Perl PHP ASP、どれも一定の機能を備えてるから、
ウェブ開発で不可能なことは無いしね。作る人次第だ
234 :
Hiro58:05/01/31 02:58:55
>>230 visualC#でもやってみようかと。。どちらにしろ、そこまで大きな依頼は
無いのでやはり必要ないかもしれないですね(スイマセン)今のところHPの管理ページ
のみなので。(ショッピングカートや在庫管理など)
>>231 Webアプリケーションフレームワークありました。とりあえず「Sledge」を見つけたのですが、スクリーンショット
など無くて、どのようなもんか想像できないです(泣)
Jakarta でも眺めて何でもできる気分にでもなってくれ。
>>226 WINのActivePerlなら、下のコードで こんにちは と
確かに表示できるので、use encoding "cp932"; とSJIS指定してる
ところで、EUCでも指定すれば、出来ると思うけどなぁ。
(ActivePerlでは、cp932と指定しないと化ける)
use Tk;
use encoding "cp932";
$mw = MainWindow -> new;
$lb = $mw -> Label(-text => "こんにちは!", -font => 'System') -> pack();
MainLoop;
>>Hiro58
Cやshでも使ってやれよ。
>>234 >のみなので。(ショッピングカートや在庫管理など)
B2C?
SSL とか 負荷分散とか FW までヤラサレル悪寒 (((( ;´ω`))) カクカクプルプル
$aが abcdefghiの値のいずれかの場合というifをつくるとき
if($a==/[abcdefghi]/){〜〜〜}
でいいのでしょうか?
eq
>>239 やりたいのはこういうことかな
if($a !~ /[^abcdefghi]/){〜〜〜}
こうでは?
if ($a =~ /\A[abcdefghi]\z/) { 〜〜〜 }
なるほど最初と最後の一文字でやるんですね
=~でしたね
すみませんでした。
ひねくれてみた。
if ($a =~ tr/abcdefghi// == 1) {〜〜〜}
>>239 if (-1 < index('abcdefghi', $a)) {
;
}
>>242 \Z のZは、小文字でも良いんだっけか?
if ( $a =~ /\A[a-i]\Z/ ) { 〜〜〜 }
>>246 違うものだよ。
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
>>247 大文字Zだと$aの中身が "a\n" でもマッチしちゃうのね。
納得。お勉強になった。つか、ずっと勘違いしてた。
ご指摘、サンクスです。
>>246 と書く前にさっとマニュアルを見るという行動が
なぜ出来ないのかと。
251 :
デフォルトの名無しさん:05/01/31 23:22:45
>>236 御親切に御回答いただき有難うございます。
残念ながら御指摘の点を以下のように変更し実施しましたが、
文字化けの現象を回避するには至りませんでした。
暇を見付けて、もう少し検証を続けてみようと思っております。
有難うございました。
use encoding "euc-jp";
>>250 > \z って、最近実装されたんでね?
それで?
いや、だから、
% perldoc perlre
に相当するアクションを行なわないのはなぜかと。
どういう問題があるの?
Winだと、添付マニュアルは、htmlで提供されてい
たりするんだっけ。
254 :
デフォルトの名無しさん:05/02/01 01:03:18
配列の要素数を知りたいとき,
$num = @array;
でわかりますよね。
では,配列の配列(リストのリスト) の要素数を知りたい場合はどうすればいいでしょう?
たとえば,
1年1組は生徒数30人
2年1組は生徒数32人
3年1組は生徒数31人
という学校を,
@array[学校のクラス][各クラスにいる生徒の数]
という配列に当てはめたとき,
$num = @array;
とすると「$num = 3」(クラス数)になります。
そうではなくて,
num[1] = 30(1年1組)
num[2] = 32(2年1組)
num[3] = 31(3年1組)
という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?
255 :
デフォルトの名無しさん:05/02/01 01:04:35
(誤)
という感じで各クラスの数を知りたい場合にはどうすればいいでしょうか?
(正)
という感じで各クラスの生徒数を知りたい場合にはどうすればいいでしょうか?
です。
すみません。
perlで、Lan内へarpの問い合わせが出来るようなライブラリはありませんで
しょうか?
>>256 質問する前にsearch.cpan.orgで調べようと思わんのか?あーん?
>>254 まず、その配列の配列の実装方法わかってる?
(@arr1, @arr2)じゃ駄目、リファレンスを使う。
リファレンスについて調べれば自ずと方法がわかるはずだ。
>>254 なにがしたいのかよくわからんが
$array[1] = 30;
ではいかんのか。
>>254 $num[1] = @{$array[1]};
ところで、「リファレンス」って言葉ググるのすごく大変だよね・・・
>>254 # @array[学校のクラス][各クラスにいる生徒の数]
# では、あやしいので、
# @array[学年][クラス] [生徒]= 各生徒のデータ
# のとき
# (1年2組)
my $num = @{ $array[1][2] };
265 :
デフォルトの名無しさん:05/02/01 11:45:43
$ans = hoge($s_time, $e_time, $abc1_num, \@moge1e_time) ;
↑これってどういう意味…?
特に最後の『\@』の意味がわからん…。
誰か教えてくれ〜。
>>261 「デリファレンス」でググるとピンポイントですごい命中
>>267 ホントだ。「デリファレンス」って Perl 以外では使われない用語?
$hoge = '(foo|bar)([baz]+)';
$fuga = '$2,$1,moge';
# ...
$piyo =~ s/$hoge/$fuga/;
こんな感じに動的に$fugaの中の$1,$2を評価したいのですが、
どんな方法を使えばいいでしょうか。
>>268 C系の「ポインタ」は「参照を値に戻す」という概念ではない。
「リファレンス」を使うJavaは基本的にプログラムでデリファ
レンスしない(Javaが自動で行う)
PHPにはあったような希ガス
>>270 evalを使って、実行式をその都度生成。
>>270 my $hoge = '(foo|bar)([baz]+)';
my $fuga = q/"$2,$1,moge"/;
my $piyo = 'barb';
$piyo =~ s/$hoge/$fuga/ee;
print $piyo;
eeには笑った。
eval(s///ee含む)は激遅なのでループ内部などではお奨めできない。
Return-path: <
[email protected]>
Delivery-date: Mon, 11 Aug 2003 22:49:59 +0900
Received: from lupin by eqv.ne.jp with local (MailPost 5.6)
id HJGJRA-0001JO-00
for
[email protected]; Mon, 11 Aug 2003 22:49:58 +0900
To:
[email protected] (MINE Fujiko)
From: LUPIN III <
[email protected]>
Subject: yeah!
X-mailer: My Post Tester V1.0
Message-Id: <
[email protected]>
Date: Mon, 11 Aug 2003 22:49:58 +0900
Dear mine@:
Hello, Fuuujiko Chaaan!
Are you OK?
--
lupin
このメールが誰から誰へ送信されたものか、また本文を示すスクリプトを作りたいのですが
どなたか分かる方いらっしゃったらよろしくお願いします。
>>277 > このメールが誰から誰へ送信されたものか、また本文を示すスクリプトを作りたいのですが
> どなたか分かる方いらっしゃったらよろしくお願いします。
メールのテキストから、それが誰から誰へ送信されたものなのかを
厳密に同定する技術的手段は存在しない。
もちろん「誰から誰へ送信されたものということにしてあるか」は
ヘッダから抽出可能であり、そのレベルのもので良いのなら、可能だろう。
ヘッダとボディは、「最初の空行」で分割される。
っていうか、のあたりをやるモジュールがあるはず。
CGI・perlを使い背景に画像を持ってきたいんですがうまくいきません。
backgroundでは駄目なんでしょうか?
278ではないけど
>>282 詳しく教えて下さい。
仕組み的に無理だと思うのですが。
284 :
デフォルトの名無しさん:05/02/01 23:39:43
お願いします!
「キーボードから日本語のデータを入力し、1字づつずらしながら表示し、
ファイルにそのデータを出力する。」の方法を教えてください!
285 :
ゆうこりん:05/02/01 23:57:41
以下のやり方を教えてください。
1、1月1日が土曜日の平年について、曜日の入力データからその月日
をすべて表示する。
2、2つのファイル{英文と日本訳}を読み込み、行数を数えながら、
表示し、新しいファイルを作成する。
マジわからなくて困ってます!よろしくお願いします!
>>285 こういうバカが絶対に業界に来ないようにする方法って
ないものだろうか。
>>283 >詳しく教えて下さい。
>仕組み的に無理だと思うのですが。
横からなんだが、しかも全然詳しくないんだが、
メールヘッダの送信先を偽るのは簡単だけど、ルーティング情報を隠すのは
難しいとされてるみたいだよ。
メール ルーティング情報 とかで、ぐぐってみれば?
詳しくないので、このへんで。
>>287 詳しくない人は、頓珍漢なこと言いながら出て来るのはやめて。
>>284 system "stty raw";
open F,">>test.txt";
while ($c = getc) {
last if ord($c) == 13;
print F $c;
}
close F;
(除ActivePerl@Windows)
>>288 詳しくないついでに。
Received: メールの経路情報
送信メールがどのサーバーを経由して配送されたかがわかる。
Received:ヘッダは複数あるのがふつうで、
その場合は下の方にあるほど送信元となる。
>>290 > Received: メールの経路情報
× 送信メールがどのサーバーを経由して配送されたかがわかる。
○ 送信メールがどのサーバーを経由して配送されたかがわかることになっているが、偽造可能。
> Received:ヘッダは複数あるのがふつうで、
× その場合は下の方にあるほど送信元となる。
○ その場合は下の方にあるほど送信元となることになっているが、偽造可能。
>>291 それ以前に、Recievedにはユーザ名が入ってないって。
ユーザ名が入っていても、それも偽造可能。
一番下にある Received ヘッダは常に正確に発信元を示しているとは限らない。
スパマーは Received ヘッダを偽造して追跡から逃れようとするのだが、
すべての Received ヘッダを偽造することはできない。
偽造された Received ヘッダは本来の Received ヘッダの下に現れ、
通常は一目で分かるほど偽物らしいものだ。
詳しくないので、このへんで。
メールサーバは黙って相手の名乗りを信じるのではなく、
DNS 検索を行い、相手の本名を発見し、ヘッダに記録する。
最近のSPAMって受取人アドレスのメールサーバーに直接SMTP接続して送ってくるよね?
296 :
デフォルトの名無しさん:05/02/02 08:05:57
文字列とその繰り返す回数を入力し、文章の段落を作成し、
文章の段落を繰り返す回数の入力でデータを作成する。
(一行のデータは30文字とする。)
※wordで、直接入力で =rand(2,4)と入力するのと同様のプログラム
実行結果例:
文字入力:今日は晴れるが、明日は雨が降る。
繰り返し回数:3
段落数:2
本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。
本日は晴天なり。明日は雨が降る。本日は晴天なり。明日は雨が降
る。本日は晴天なり。明日は雨が降る。
297 :
デフォルトの名無しさん:05/02/02 08:07:08
>296の問題が分かりません…
教えてもらえないでしょうか??
>>296 print '文字入力:';
my $str = <>;
chomp $str;
print '繰り返し回数:';
my $count = <>;
print '段落数:';
my $p = <>;
print $str x $count, "\n\n" for(1..$p);
適当に書いたけど一応動作確認済み
スマン。30文字の条件忘れてた
print '文字入力:';
my $str = <>;
chomp $str;
print '繰り返し回数:';
my $count = <>;
print '段落数:';
my $p = <>;
$line = $str x $count;
$line =~ s/(.{30})/$1\n/g;
print $line, "\n" for(1..$p);
>>296 my $mojiretu = ' 文字入力:今日は晴れるが、明日は雨が降る。 ';
my $repeat = 3;
my $danraku = 2;
$_ = $mojiretu x $repeat;
$_ = "$_\n\n" x $danraku;
print;
301 :
デフォルトの名無しさん:05/02/02 08:52:44
302 :
296:05/02/02 09:08:45
たびたびすみませんが
print"文字入力";
chomp($moji=<STDIN>);
print"繰り返し回数";
chomp($rep=<STDIN>);
print"段落数";
chomp($danraku=<STDIN>);
for ($i=0;$i<&danraku;$i++){
での形も教えてもらえないでしょうか?
てめーの宿題を他人にやらせるとはいい度胸だなw
304 :
296:05/02/02 09:17:29
>>303 >>all
ごめんなさい!
どうしても分からなくて…
306 :
296:05/02/02 09:30:02
>>305 for文自体は調べて分かったんですが、
複数使うやり方がよく分からないんです・・・
>>302 もう出来てるやん…まあ一応汚染チェックとか入れてみるか。
#/usr/bin/perl
use strict;
my ($moji, $rep, $danraku, $i, $j);
print"文字入力 : ";
chomp( $moji = <STDIN> );
while( $rep !~ /^[0-9]+$/ ){
print"繰り返し回数 : ";
chomp ($rep = <STDIN>);
}
while($danraku !~ /^[0-9]+$/){
print"段落数 : ";
chomp ($danraku = <STDIN>);
}
for ( $i = 0; $i < $danraku; $i++ ){
for ( $j = 0; $j < $rep; $j++ ){
print $moji;
}
print "\n\n";
}
書き殴り動作未チェック。カキコindent用に全角スペース入り。
perl的にはこういう回すだけのやつは(1 .. $rep) とか使いたいが、
c的、for文ネストの教科書的にはこんなもんだろ。
308 :
デフォルトの名無しさん:05/02/02 09:43:18
perlの宿題スレってありますか?
宿題みたいなのは、cgi板のperl初心者スレでやってくれないかなあ
310 :
デフォルトの名無しさん:05/02/02 11:39:52
18.95354 〜 25.58224 の数値の間でランダムで150件数値を生成したい,
という場合はどういう乱数の使い方をすればいいでしょうか?
$a=rand(10);
というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,
開始範囲が1からに固定になってしまいますよね。
乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?
>>310 > $a=rand(10);
>
> というのは 1〜10までの範囲で乱数を発生させる,というのはわかるのですが,
違います。
> 乱数の範囲を指定できればいいな,と思っているのですが,こんなことってできるでしょうか?
例えば、3に4を足すと、7になるということは知っていますか?
312 :
デフォルトの名無しさん:05/02/02 11:56:11
$ sort --version
sort (coreutils) 4.5.3
で
sort -n -k2 -k3
のようなことをしているのですがこれをperlで
実現できる手段はありませんか?
$a=rand(1)*(25.58224-18.95354)+18.95354
315 :
デフォルトの名無しさん:05/02/02 12:58:54
®ist # データ更新
&sendmail # 更新データメール送信
&view # 更新後データ表示
こんな流れでやってるのですが、&sendmail でちょっと時間がかかるので
&view までモタモタしてしまいます。
&sendmail の返りを待たずに &view の処理に進ませるにはどうやるのでしょうか。
>>315 forkしてやるとか、alarmと$SIG{ALRM}で平行に流すとかまあいろいろある。
このへんのキーワードでググってみてくれ。
>>315 ®ist # データ更新
&view # 更新後データ表示
&sendmail # 更新データメール送信
こんな流れでやるとか。
319 :
312:05/02/02 16:15:13
とても親切な314様のおかげで 思いどおりのsortができました。
314様 ありがとうございました
>>319 314は、ネ申 だからな。実生活は別にして。
しかし、キミもエスパーだねぇ。
わたしも今後、314様を見習うことにします。
俺も2年程前Perlでスパムツール作ったことある。
Net::DNSでMXレコードを引いて、Net::SMTPで直接メール投げてた。
( ゚Д゚)そいつはすげぇ
324 :
デフォルトの名無しさん:05/02/03 02:47:12
ファイルを読み込んだ後に数字を入力し、その数字の行数分、読み取ったファイルからランダムに抜き出して
別のファイルに書き込むにはどうすればいいでしょうか?
そうすればいいです
>>324 File::Slurpでも使って、ファイルを配列に読み込み、
rand(@配列)という書式で乱数を生成し、既出行を排除しつつ
必要行数ピックアップし、出力用ファイルをopenして
そこに書き込めば良いです。
>>324 > どうすればいいでしょうか?
ご自分で、調べ、考え、試行錯誤の上、どうしても解らないところだけ
質問して下さい。宿題丸投げスレでは、ありませんよ。
perl -e 'open F,"read.txt";open W,">result.txt";@f=<F>;print"Number:";$a=<STDIN>;print W $f[int(rand(@f))]for(1..$a);'
※出力行重複未考慮
>>328 > ※出力行重複未考慮
破壊検査
perl -e 'open F,"read.txt";open W,">result.txt";@f=<F>;print"Number:";$a=<STDIN>;print W splice(@f,int(rand(@f)),1)for(1..$a);';cat result.txt
でオケー
>>324 そのモジュールのrandom_lineというのがそれっぽいですが、
出力に重複を許してるような気がします。324の欲しいものは
どうなのかな?
紹介されていたアルゴリズムを利用して重複しない$N行を
抜き出すとしたらこんな感じだろうか。
while (<F>) {
if (@Line < $N) {
push @Line, {lno => $., str => $_};
} else {
if (rand($.) < $N) {
$Line[int rand($N)] = {lno => $., str => $_};
}
}
}
foreach (sort { $a->{lno} <=> $b->{lno} } @Line) {
printf W $_->{str};
}
メールをパースするいいモジュールはありませんでしょうか?
ヘッダーだけでしたらMail::Headerで文句無しなのですが
添付ファイルを含めパースしてくれるものを探しています。
自分である程度の物は作れたのですが精度がイマイチです。
my $mail = parser(*MAIL);
print "題名:$mail->{header}->{subject}\n";
print "差出人:$mail->{header}->{from}\n";
for my $file_name (@{$mail->{attach}){
print "---$file_name---\n"
print $mail->show_file($file_name);
}
このような事を実現出来るものはありますでしょうか。
>>332 > メールをパースするいいモジュールはありませんでしょうか?
> ヘッダーだけでしたらMail::Headerで文句無しなのですが
> 添付ファイルを含めパースしてくれるものを探しています。
MIME関係は別扱いでMIME::*っていうのが色々あると
思うけど。
どなたか以下の症状に遭遇した方いませんか。
WinXP+ActivePerl5.8.6で下のコードを実行するとperlが異常終了してしまいます。
use threads;
use encoding "euc-jp";
$th = threads->new(sub {print "thread: end.\n"});
$th->join;
print "main: end.\n";
use encodingの行をコメントアウトするとちゃんと動きます。
だれか助けて
>>334 ホントだ。
Cygwin Perl(This is perl, v5.8.5 built for cygwin-thread-multi-64int)
でも再現した。
Segmentation fault (core dumped)
>>333 MIME-toolsで望み通りの事が出来ました。ありがとうございました。
use threads;
$th = threads->new(sub {print "thread: end.\n"});
$th->join;
print "main: end.\n";
use encoding "euc-jp";
339 :
デフォルトの名無しさん:05/02/04 12:04:30
LWP::UserAgentでフォームデータをPOSTしてデータを取得するプログラムを組んだのですが、
少ないデータをリクエストすると期待通りにデータを取得できます。
でも、多いデータをリクエストすると'500 SSL read timeout:'となってしまいます。
$ua->timeout(600)のコードを入れても3分ほどで終了してしまいます。
何とか10分くらいは待たせておきたいのですが、どうしたら解決できるのでしょうか。
どなたか教えてください。
これではいけないのでしょうか?
$ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);
$ua->timeout(600);
>>339 通常ファイルに吐かせて、その間「作業中ページ」を5〜10秒refreshで回す。
10分も(しかも待ちで)接続維持させるのはイクナイ。
341 :
デフォルトの名無しさん:05/02/04 12:32:52
ブラウザーでダウンロードするのを自動化したいのです。
サーバー側の方はどうしようもないので、こちら側は待つしかないのです。
ブラウザーでダウンロードしてみたのですが、それは数分で終わりました。
問題は別のところにあるのでしょうか?
具体的にはテキスト・バイナリの判定をやろうと思い、ファイルの文字コードをEncode::Guessで
調べようと考えました。全部読み込んで文字コード判定はアレゲなんで、10行ほど読んで、Joinして
判定しようかと考えたところ、ファイルの改行コードがCRのファイル、LFのファイル入り混じりなん
です。それでセパレータをCR,LF両方対応に出来ないかと思い、$/= "(\r|\n)";としてみましたが、
やはり正規表現は受け付けてくれませんでした。
レコードセパレータにCR,LF両方をいれるのは無理でしょうか?
また、日本語ファイルのテキスト・バイナリ判定に良い方法(数行読んで文字コードの判定以外に)
はありますでしょうか?教えてください。
すいません追加ですが。日本語ファイルなのでファイルテスト演算子は使えません。
"(\r|\n)"
↑ そもそも正規表現じゃないし、
>>342 search.cpan.orgで検索するとPerlIO::eolが使えそうな感じだが
試したことはないな。
しかし目的を考えると10「行」である必要はあまりないし、逆に
バイナリファイルだといつまでたっても改行文字が出てこなくて
大変なことになりかねないといったことを考慮すると、読み込む
量は適当なバイト数とかで決めた方がいくない?
>>345 アリガトンです。全くもってその通りでした。readでやってみたら上手くいきマスタ。
↓こんな感じです。
use Encode::Guess qw/euc-jp shift-jis/;
print "text\n" if is_text("/foo/bar");
sub is_text{
$file = $_[0];
open FH,$file or die;
read (FH, $buf,200);
my $guess = Encode::Guess::guess_encoding($buf);
unless(ref $guess){return 0;}
else{return 1;}
}
perl-lib.pl
ってライブラリがあるんだけど、試したヤツいる?
ttp://www.tryhp.net/perllib.htm この中で、ksubstrって関数があるんだけど、
----------------------------------
!/usr/bin/perl
require 'jcode.pl';
require 'perl-lib.pl';
$str = "コンピュータを使用している";
$a = ksubstr($str,0,5);
print $a;
----------------------------------
【結果】
コンピ
はえ?
実行環境 linux perl 5
>>347 ソースを眺めたところSJISを仮定しているようだ。
1バイト目が0x81〜0x9f, 0xe0〜0xfcにあるときのみ
2バイト文字として扱われ、それ以外は半角カナを
含む1バイト文字とみなされているらしい。
で、「コンピ」がEUCだとすると
% echo コンピ | hex
0x00000000: a5 b3 a5 f3 a5 d4 0a - コンピJ
だからして、f3 a5の並びが2バイト文字他は1バイト文字
になってちょうど5文字という判定になるようですな。
しかし扱えるのがSJISだけだなんてどこにも書いてないぞ(笑)
>>348 だよね?だよね?
俺もソースで
unpack("C", $string)
で返ってくる文字を一文字ずつチェックしてみたんだけど、
やっぱりおかしいんだよね。
if ($cn >= 129 && $cn <= 159 || $cn >= 224 && $cn <= 252)
の部分で文字コードを判別しているんだけど、
この部分をEUCに置き換えたいんだけど、
その文字コードをどうやって調べたらよいのか・・・
ちなみに、
$str = "コンピュータを使用している";
&jcode::convert(\$str,sjis);
$a = ksubstr($str,0,5);
とか
$str = "コンピュータを使用している";
&jcode::convert(\$str,jis)
$a = ksubstr($str,0,5);
とか挿入して判別させてみたんだけどとんでもない事になったよ。
>>349 jcode.plの中にEUCの1文字にマッチさせるための正規表現があるので
これを参考にすればいいんじゃないかな。
$re_euc_c = '[\241-\376][\241-\376]';
$re_euc_kana = '\216[\241-\337]';
$re_euc_0212 = '\217[\241-\376][\241-\376]';
1文字が3バイトになるやつ(最後の$re_euc_0212)があるのがちと
面倒だろうけど、基本は同じはずだから健闘を祈る。
(もし使えるのなら)Perl5.8のEncodeを使うのが早いと思う……
ちょっと使いにくいけど。
申し訳ありませんが質問させて下さい
cgiの入力フォームで送信ボタンを押した後など
ブラウザでリロードを行うと同じ処理が繰り返し行われてしまいます
そのせいで、例えばリストの中の2番目のデータを削除していた場合
リロードの度に新しく2番目となったデータが削除されていってしまうのですが
こういった場合にある程度経験のあるプログラマーの方は
どのようなやり方で解決しているのかお伺いしたいのですm(__)m
レスどうもです。
書き込んでからいろいろ情報探してたけど、解決方法は見つかりませんでした。
やはりバグなんでしょうか。
英語苦手なんで、どうやってバグ報告しようか。
板違い申し訳ありません
誘導ありがとうございましたm(__)m
>>355 encodingのことならJcode.pmメーリングリストあたりで弾さんに相談してみるのも手。
二次元配列の中身をテーブルにして出そうと思ったんですが・・・
$tbl[0][0] = "00";
$tbl[0][1] = "01";
$tbl[1][0] = "10";
$tbl[1][1] = "11";
print "<TABLE BORDER=1>\n";
foreach $value (@tbl) {
print " <TR>$value\n";
foreach $value2 (@value) {
print " <TD>$value2</TD>\n";
}
print " </TR>\n";
}
print "</TABLE>\n";
何もでてきません
何がだめなんでしょうか?誰か教えてください・・・
すいません
print " <TR>$value\n";
この行の$valueってのはデバッグ用です 消し忘れました
$valueと@valueは別の変数だよ。
open2が難しすぎる。プロセスを鵜飼のように使いこなす指南サイトはござりませぬか?
>>359 多次元配列でハマってるんだからそう板違いでもない罠。
そのデバッグコードで「ARRAY(0x10166cbc)」といった出力があるだろう。
外側のループでは$valueには配列へのリファレンスが入るので、
内側のループではデリファレンスしてやる必要がある。
× foreach $value2 (@value) {
○ foreach $value2 (@{$value}) {
perlでは多次元配列は作成出来ない。
多次元配列は配列へのリファレンスの配列を作ることになる。
CやVBから入ってきた人はここでつまづき易い。
つまりこの場合、
$tbl[0] には 無名配列 {"00", "10"} へのリファレンスが、
$tbl[1] には 無名配列 {"10", "11"} へのリファレンスが
代入されている。
$tbl[1][0] は $tbl[1]->[0] (または ${$tbl[1]}[0]) の略記。
C++経験者なら $tbl[1]->[0] でピンと来るだろう。
わかるかな〜?
>362
気をつけなきゃいけないのはバッファリングとシグナルの扱いぐらいなんじゃないの?
365 :
デフォルトの名無しさん:05/02/05 13:10:53
デバッグ中です。
$foo = undef; であるとき
if ($foo->{bar}->{baz}) {...} とかすると
$foo->{bar} = {}; が自動生成されてしまいますが
これを禁止する、あるいは自動生成しそうになったときに
自動的に die かなんかする方法ってないでしょうか?
if ($foo and $foo->{bar}->{baz}) {...}
>>366 サンクスです。
確かに毎回チェックすればオーケーなんですが
チェックせずに済む方法ってないでしょうか。
既にあるソースの中で、どこで自動生成しているのか簡単に突き止めたいのと
$foo->{level_1}->{level_2}->{level_3}->{level_4}->{level_5} ...
と階層が深くなった場合の要素の存在チェックが面倒なので…
>>367 どもです。
exists使っても $foo->{bar}までは自動生成されてしまいます。
use strict に自動生成禁止とかのオプションってないのかなぁ...
>>365 う〜ん、先日、auto-vivificationを禁止するモジュールを
見つけて何に使うんだろうと首をひねった記憶があるが、
どこで見たのか忘れた。
372 :
デフォルトの名無しさん:05/02/05 16:35:36
パールって、位置付けはWeb言語になるのかな?
5.8.5 → 5.8.6 の変更点がわかりやすく説明してあるとこ教えて。
perldoc perl586delta
ありがとうございます。早速見てみます。
質問させてください。リストからテキストを読み込んで、パターンマッチしようと思っています。
メタ文字を展開するのに悩み、evalを使う事で何とか出来たんですが、余り意味がわかってない
せいか挙動が把握しきれません。
$a = '\d \t';
($pattern,$str) = split /\s/,$a;
$_ = 'one2three';
・s/$pattern/$str/g;
・eval {s/$pattern/$str/g};
$_ -> one\tthree
この2つでは、$patternは展開され、$strはメタ文字ではなくリテラル
eval "s/$pattern/$str/g";
$_ -> onethree
これでは、$patternは展開され、$strはメタ文字になります。
なぜ、eval " "でメタ文字が展開されるのでしょうか?
evalを使わないでメタ文字を展開する方法はありますでしょうか?
また、eval " "で展開しないようにするためにquotemetaしたんですが、2重にしなければ駄目でした。
\\tでは駄目、\\\tでは'\t'になる。これもなぜかわかりません。質問ばかりで申し訳ありませんが、
教えてください。
>>379 >なぜ、eval " "でメタ文字が展開されるのでしょうか?
eval "s/$pattern/$str/g"; というのは、「s/$pattern/$str/g」という
文字列を展開し、展開した文字列を評価する、ということなのだから、
「$str」を" "で展開した結果、「\t」という文字列が現れたなら、
eval するとき、それはメタ文字のタブであると評価されるだろう。
>evalを使わないでメタ文字を展開する方法はありますでしょうか?
s/\\t/\t/g; のようなことをメタ文字ごとに繰り返すしかないだろうね。
それ以降の質問は、何をしたいのかよくわからん。
>>379 とりあえず、evalを使う方向で問題に対処してみたつもり。
もうちょっと綺麗にならないかな・・・
$a = '\d \t';
($pattern,$str) = split /\s/,$a;
$str =~ s/"/\\"/g;
$_ = 'one2three';
s/$pattern/eval qq|"$str"|/eg;
説明は
>>380さんもしていますが、
eval {s/$pattern/$str/g}; では、
s/$pattern/$str/ が、
eval "s/$pattern/$str/g"; では
s/\d/\t/g が評価されます。
eval ""は""を普通に文字列としてみるわけ。
Perl6はいつ出るのよ?
>>370 サンクスコです。ばっちりでした!助かりました。
>>380-381 サンクスコです。ダブルクォート→evalの順に評価ということで、疑問が解けました。
お二人とも大変丁寧なご説明ありがとうございました。
最後の質問は
$str = '\\t' と $str = '\t'
の結果に差がないのが不思議だったんです。すいません質問が悪かったです。これについては
evalも少しは理解できたので、考えてみたいと思ってます。
>>381 > s/$pattern/eval qq|"$str"|/eg;
オプションのeは、evalと同義なので
s/$pattern/qq("$str")/eeg;
で、よさげ。
>>384 > $str = '\\t' と $str = '\t'
' '内でも \' と \\は、展開されるからだと思う。
>>385 (` ・ω・)づ ヘー
eオプション重ねられたんだ
添削ありがとう
PascalやSQLとかにある in演算子(?)を作りたいのですが、可能でしょうか?
@list = qw(a b c d e);
$value = 'a';
if ($value in @list) { ....
のように包含条件を判定するものです。
演算子オーバロードでいけるのかな?と思ったのだけれど
+や-などの記号の類しかオーバーロードしてくれないようで…。
なんか関数の左側にある項が引数として渡ってくる方法があればよいのですが。
素直にgrep使えばいいといえば、そうなのだけれど。
use strict;
sub In($@){
my$val =shift;
for(@_){
return 1 if $_ eq $val;
}
return undef;
}
my@list = 'a'..'e';
my$value = 'a';
print "yes\n" if In($value=>@list);
↑じゃぁイヤかな〜?
>>387 > 素直にgrep使えばいいといえば、そうなのだけれど。
grepはつねに全要素を処理するので効率が悪い。
>>388 う〜ん、やはり関数スタイルになってしまいますかあ。。。
しかしレスありがとうです。
>>390 Switchなんかはどうやってるのかと見てみると、
Filter::Util::Callなんてのが出て来ました。
Perlのコードを解釈前/解釈時に置換できるみたいです。
その上にFilter::Simpleがあったのでちょっと使ってみましたが・・・
これ使うなら――がんがれ
>>390 そこにこだわるなら。
use overload "nomethod" => nomethodMethod";
"nomethod" は、4 つのパラメータを持つ関数へのリファレンスが引き続きます。
これが定義されていれば、多重定義の仕組みで、 何らかの演算子に対するメソッドを
見つけることができなかったときに、 呼び出されます。 この関数の最初の 3 つの
引数は、本来、 呼ばれるはずだったメソッドに対する引数と一致し、4 番目の引数は、
見つからなかったメソッドに対応するシンボルとなります。 いくつかのメソッドが
試されている場合には、最後のものが使われます。 たとえば、1-$a であれば、 "nomethod" => "nomethodMethod" の組が use overload 指示子で 指定されていれば
&nomethodMethod($a,1,1,"-") と同様です。
>>391 おお!ありがとうございます。CPAN見てみました!
プリプロセッサのようなものと思えばいいのでしょうか。
やってみるよ!ありがとう。
>>392 どもです。
試してみたのですが "in" を使うとBarewordでやはり弾かれてしまうようです。
>>394 プリプロセッサに通すとか。
まあ、こんな事にこだわるのは、本末転倒だと思うけどな。
>>395 >まあ、こんな事にこだわるのは、本末転倒だと思うけどな。
あは。それは認めるよ。
ただ、まぁ、自分はSwitch.pmもTry/CatchのError.pmも好んでuseするほうだからさ。
できればソースはすっきりしてるほうがいいじゃない?
藻前スタイルで記述したスクリプト全部を perl構文に置換してeval すれば?
398 :
デフォルトの名無しさん:05/02/06 15:56:02
素朴な疑問です。
例えば
my $a = 100*200;
これは内部でどういう処理をしているのでしょうか?
Perlはコンパイルするだけだと思うのでスレ違いな気もしますが、
Perlしか知らないのでここでお願いします。
コンピュータは基本的にon/offの感知しかしませんよね。
もしかして100+100+100+.......
ていう行為をしているのでしょうか?
CPUが一瞬のうちにかけ算の筆算をしてると思えばヨイ
>>398 「アセンブラ」を少し勉強すれば、コンピュータが何をしているのか解るだろう。
最近は掛け算のテーブル(9x9みたいなの)を持ってる
>>398 二進数って知ってる?
十進法だろうと二進法だろうと数学は成り立つから安心汁
403 :
398:05/02/06 16:28:09
>>399-402 ということはコンピュータはあらかじめ3*3の答えを知っていて、それを
どこかにメモリしているだけですか?
そもそも1+1というのは一つのハコに異なる二つを入れてソレを後から数えた結果ですよね。
掛け算はどうなのでしょうか?
コンピュ−タができる意味がわからんのです。
>>403 Perlに関係ないってことはわかるよね?
>>403 > コンピュ−タができる意味がわからんのです。
CPUの内部構造やらアーキテクチャにまで踏み込んだ本でも
買って読め。
>>404 わざわざ指摘するまでも無くはじめに自分で言ってるじゃないか・・・
ここで答える気が無いなら適切なところに誘導するくらい汁
#漏れは答える
>>403 > ということはコンピュータはあらかじめ3*3の答えを知っていて、それを
> どこかにメモリしているだけですか?
それは高速化するための工夫であって原理とは少し違う
とりあえず、掛け算の前に足し算をどうやってるか知った方が良いと思ふ
原理的には、コンピュータが行う足し算は、
筆算での足し算方式を二進法でやったもの。
実際に紙に書いてでもやって見れ。
>>398 1100100 * 11001000 の筆算やってみ?
ほんと、厨の出たときにしか盛り上がらないスレだな
いまさら何言ってるんだよ
2chってどこもそうだろ?
>>391s
Filter::Util::Call面白そう。
サンクス。
411 :
デフォルトの名無しさん:05/02/07 00:17:09
リファレンスの管理でラクしようと思って、弱いリファレンスを使ってみたのですが
自己参照を含むリファレンスをweakenしても思うように動作してくれません。
use Scalar::Util qw(weaken);
my $outer;
{
my $inner = {id => 'inner'};
$inner->{self} = $inner;
$outer = $inner;
weaken $outer;
}
print Data::Dumper->Dump([$outer]);
の出力は
$VAR1 = {'self' => $VAR1, 'id' => 'inner'};
と、$innerが解放されずに自己参照が生きています。
まだ実験機能らしいしこういうものなのでしょうか?
ちなみに5行目の $inner->{self} = $inner; をコメントアウトすると
ちゃんと $innerのスコープ外で $outerはundefになります。
な、なんで??
ちなみにperl v5.6.0および5.8.5共に同じ動作です。
>>440 弱いリファレンスについては始めて知ったんだけど、
weaken $outer じゃなくて、
weaken $inner->{self} じゃないの?
まだ試してもいないから思いっきり見当違いだったらスマソ
やってみた。
weaken $inner->{self};
weaken $outer;
両方やったら、
$VAR1 = undef;
成功した模様。
>>413 ええ、私も始めそう思って weaken $inner->{self}したのですが
解放されませんでした。
perldocのサンプルが
{
my $var;
$ref = \$var;
weaken($ref); # Make $ref a weak reference
}
# $ref is now undef
となっているので411的な書き方でよいかとは思うのですが
どうも上手くいきませぬ。。。
>>414 お!ほんとだ!!ありがとう神様!!
これで、自己参照セットするときに weakenしとけば解放忘れないということですね。
やった!!
>>416 weaken $foo = $bar;
と書きたくなるけど、
weaken($foo = $bar);
じゃ無いと駄目なのね・・・
ところで、
>>413に
>>440なんて何所から出てきたのやらw
>>411 たぶんこういうことだと思う。
use Scalar::Util qw(weaken);
my $outer;
{
my $inner = {id => 'inner'}; # 無名ハッシュのrefcount = 1
$inner->{self} = $inner; # refcount = 2
$outer = $inner; # refcount = 3
weaken $outer; # refcount = 2
}
# ブロックを抜けたので$innerがなくなりrefcount = 1
# これは $inner->{self}による参照が残っているから
ということで、414の言うようにweaken $inner->{self}を追加すると
ブロックを抜けた時点でめでたくrefcount=0になって解放されると。
循環リストみたいのつくっていらなくなったらまとめて消すのには
使えるかもしれないな。要素を保持する配列か何かが別途必要に
なるけど、普通だとまともに解放するにはデータ構造たどって全部
参照けすところをその配列消すだけですむのでだいぶ楽だ。
>>420 ありがとう。
環境linuxなんだけど、
echo 'コンピュータ' |hexdump -b
ってやると、
0000000 245 263 245 363 245 324 245 345 241 274 245 277 012
000000d
って出てきたんだけど、このコードのことだよね?
ふむふむ
これを検索すればいいのか・・・
マンドクセ
初歩的な質問ですみません、
%Ext = (
foo => {
path => "/foo",
data => [ "ab", "ac", "ad", "af" ],
},
bar => {
path => "/bar",
data => [ "cc", "cd" ],
}
);
このようなハッシュの配列があるとすると、
要素"af"が与えられた場合のpathの値を返す方法がわかりません。
どのようにすれば良いのでしょうか?
Perl というより、アルゴリズムの質問な気が…。
use List::Util qw(first);
my $node = first {
first { $_ eq 'af' } @{$_->{'data'}}
} values(%Ext);
die 'not found' unless $node;
my $path = $node->{'path'};
すげえ!すみません、取り乱しました。
こういうアルゴリズムはどうやって覚えるのでしょうか?
なにはともあれありがとうございます!
ほとんどHashの意味が無くなってるがw
元のデータ構造が糞すぎるもん。
>>423 素直に考えてみた。
$target = 'af';
foreach (values %Ext){
push @result, $_->{'path'} if grep{ $_ eq $target } @{$_->{'data'}};
}
print join "\n", @result;
素直に "ab", "ac", "ad", "af" や "cc", "cd" を Hashキーにした方がいいぞ。
>>418 解説ありがd。
weakenはその参照がなかったことにする(参照カウントを一つ戻す)
関数ということで理解したよ。つまり、外部参照であれ循環や自己参照であれ
参照している部分を全てweakenしておかなければいけなかったんだね。
俺は1回やればOKなのだと思ってた。勉強になりました。ありがとう。
みなさんありがとうございます。
覚えたてなので、いろいろなやり方がある事もわかって、
かなり勉強になりました。
もう少し難しい質問が出来るように精進します。
>>431 >>429の言うデータ構造にしてみ。
たとえばこんな感じ。
%Ext = (
foo => {
map{$_ => "/foo"}( "ab", "ac", "ad", "af" ),
},
bar => {
map{$_ => "/bar"}( "cc", "cd" ),
}
);
$Ext{bar}{cd}
とか
$Ext{foo}{ad}
とかでアクセスできるよ。
あんまり嬉しくない構造だよな
一歩下がって、「何をしたいのか?」レベルから再考すべき
ケースですね。
>>434 非常に良い意見だ。
perlウィザードになるとハッシュとリファレンスでおよそどんな
構造でも作れてしまうから逆にハマったりするんだよね。
まったくもって、そのとうり。
>>432のできが良くない構造をレスしたのは、俺なんだけど
自分で示しながら正直データ構造として使う気にはなれんしね。
各パスからdataを追加したり、削除したりするときにハマるのは目に見えてるし。
あくまでデータの内容が固定だったら、要素にアクセスする記述が簡単である
ていうしかメリットはなかったりする。
ただ、
>>423がそれでことたりる話というのであれば
こういうアプローチもあるよって示しただけなんで。
まあ
>>432は反面教師ということでヨロ。
「とうり」
%Ext = (
"/foo"=> ["ab", "ac", "ad", "af" ],
"/bar"=> ["cc", "cd"],
);
%Ext2 = map{my $key=$_; map{$_ => $key} @{$Ext{$key}} } keys %Ext;
print $Ext2{af};
ハッシュをリニアスキャンするなど、弾の入った銃で殴りかかるのと同じだ…と、Perlクックブックに合った気がする。
440 :
デフォルトの名無しさん:05/02/09 21:06:50
PerlでLALR(1)構文による構文解析をするようなモジュールは
ないですかね?
Parse::RecDescentはなかなか良いんですが、LL(1)構文なので
左再帰ができないんですよね。
cpan で検索すれば引っかかるだろ。
Parse::Yapp でいいじゃねーか?
きっとアホな質問かもしれません。
しかも文章長いです。
win98で開発してます。
どーしてもperlで開発したいんですが「exeファイル」で「GUI」したいんです。
この時点で「あー、なんか俺って間違ってる」ってのは分かるんですが、perlがいいです。
ちなみに、ぶっちゃけGUI回りはperlの力じゃなくていいです。
内部処理をperlで作りたいだけです。
んで、実行環境は複数のマシンで使うんですが、OSは全部winでバージョンはなんかいろいろです。
perlはインストールされてるかどうかなんて知りませんし、ソース隠蔽したいから完全なexeにしたいです。
んで、試したのは、perl/Tk。これ微妙だけど使ってもいいとおもた。
exe化ではperl2exeとかやったらバグが多くて断念。しかも料金請求されたし。払う気ない。
あと、コンパイラはBCCとかあるけど、ヘボプログラマーなんで
どやってCとperlインタプリタごと全部コンパイルしてexeにしたらいいか分からんくて断念。
これから、ちょっと試してみたいと思うのは、画面だけHSPで作って内部処理は全部perlにやらせる、
ってのを試したいと思うけど、
どーせperlコンパイラごとexeになんて出来そうにないからきっと断念するんだろうな、と思っている。
なんか誰か簡単に出来るいい方法、アホな俺に教えて下さい。
追伸。
実行速度はそんなに重視しない。それなりに稼動すればOK.
実行ファイルも、でかくてOK。
GUI以外の内部処理がperlで作れて、どんなwin環境でも実行出きるexeならそれでいい。
ただし、お金は一切払わない。なんも買わない。
exeにしても結構な再現率でデコンパイルされてしまうよ
とりあえずバイトコードにしないとな
何をしたいんだ?
質問です。
処理に時間がかかるスクリプトを foreground で実行して、
経過時間をリアルタイムで表示させたいんですが、ヒントいただけませんでしょうか。
>>450 何所のヒントがほしいのかねぇ。キーワードを挙げれば、
時刻の取得 time関数
表示の更新 復帰文字(\r)
バッファリングの抑止 $|
ついでに、サンプルコードも書いちゃる
$|=1;
my $start = time();
while(1){
print "\r", time() - $start, 's';
sleep(1);
}
>>451 おお!
まさに、「表示の更新」、「バッファリングの抑止」の方法が
知りたかったです。どうもありがとうございます。
勉強になりました!
テキストファイルの行数を数え上げるのってどうやってますか?
open IN, $file or die $!;
1 while <IN>;
close IN;
print $.;
>>454 print `wc -l hoge.txt`;
うそですうそです。
open R,"<hoge.txt";
$i++ while(<R>);
print $i;
458 :
デフォルトの名無しさん:05/02/10 17:53:04
こんちはー perl初心者です!
遺伝子配列を処理するperlのモジュールを
少しいじって出力形式を変えてやろう考えたのですが、
このモジュールの中で、
$$data = 0.;
とか書いてあるんですけど、なんなんでしょう、この$$って?
>>458 $var = "abcdefg';
$data = \$var;
print $$data,"\n";
$$data = "xyz";
print $var,"\n";
とすれば
abcdef
xyz
と表示される。
山椒寿司
>>441 Parse::Yappってコンパイラコンパイラですよね?
Parse::RecDescentのようなインターフェイスで
LRLA(1)構文のPerl製パーサってないのかな。
Parse::RecDescent は良くて Parse::Yapp がイカン理由が分からんのだが。
阿呆?
>>464 全然インターフェイスが違うじゃん。阿呆?
キャラ名<>ID名<>パス<>a<>b<>c<>d<>e<>f<>g
・
・
キャラ名<>ID名<>パス<>a<>b<>c<>d<>e<>f<>g
こんな感じのキャラゲーのデータが10垢分あるのですが、
a〜gのデータを10垢分読み込んで、
aのデータのランキング、bのデータのランキング、cの・・・
っと7項目それぞれのランキングを表示させたいのです。
sortを使うのかな・・・程度しか思い浮かびませんが。。。
htmlへ表示させる時は、各$a、$b・・・だけを任意の場所に書き加えれば良い様に・・・
具体的にどう書けば宜しいのでしょうか?
どなたか御教授頂ければ幸いです。
そんなどうとでも書ける質問されてもなー
簡単な(けど効率の悪い)やり方
#aでランキング
print sort { (split "<>",$b)[3] <=> (split "<>",$a)[3] } @data;
469 :
デフォルトの名無しさん:05/02/12 09:17:35
今、「素数を計算プログラム」を作っているのですが苦戦中、、、
とりあえず素数を計算する所は出来たのですが、
計算した素数をファイルに保存しておいて、次にさっき計算した以上の素数を計算する時は、そのファイルを読み込んで追加で計算させたいんですが、、、 よろしくお願いします。
470 :
デフォルトの名無しさん:05/02/12 09:18:32
素数を計算するだけ
#! c:/perl/bin/perl
$endnum = 100; #この数字まで計算
$x = 0; #素数の個数-1
$number = 2; #2から計算
$so[0] = 2; #素数に2を入れておく
# 計算
while($number <= $endnum) {
$s = 0;
while ($number % $so[$s] != 0) {
if($s == $x) {
++$s;
$so[$s] = $number;
++$x;
last;
}
++$s;
}
++$number;
}
++$x;
472 :
デフォルトの名無しさん:05/02/12 09:54:51
PCのスペック上の問題で、10万までしか計算していません。すみません。
>>469 読み書きするのがperlからだけなら、Storableモジュール使うのが
楽だよ。
474 :
デフォルトの名無しさん:05/02/12 16:00:08
どなたかご助言お願いします。
zlibによって圧縮されたデータが借りてるWEBサーバー(apache)へアップされてきます。
それをPerlによって解凍し、中身を読んで、ソートしたいのです。
zlibの解凍処理はどのようにしたら良いのか、なにか手段はありますでしょうか。
ググったら「Compress-Zlib-Perl」というのがソレかなーという感じなのですが、
どうもこれはサーバー側にインストールされるべきモジュールのような気もします。
あと、自作Perlソースに
use Compress::Zlib;
$dest = uncompress($source);
とか書いておいて、サーバー上で実行してもエラーが出ないので、
借りてるサーバーでも既に利用可能なのかなーと思いますが、それ以上の使い方や
動作チェックの方法がよくわかりません。
476 :
デフォルトの名無しさん:05/02/12 20:24:55
Storableモジュールですか?初めて聞きました、、、
ぐぐってみましたがよくわかりませんでした(泣
よろしければ、モジュールについて説明してもらえないでしょうか?
お願いします。
$hoge = {
abc => 1,
def => 2,
array => [0, 1, 2],
scalar => \'hello',
ref = {
aaa => {
bbb => {
123 => ['a', 'b']
}
}
}
};
みたいな複雑な変数をファイルに出力できる。
次回このファイルを読み込めば同じ変数を再現できる。
参考になりそうなキーワード シリアライズData::Dumper MLDBM
478 :
デフォルトの名無しさん:05/02/12 23:52:46
ファイルの中にプログラムを入れておけば、
ファイルを読み込んできて、そのファイルの中のプログラムを実行できるんですかね?
perlの本を買ってきます、、
ぽりぽり、、、 わからないっす。
計算した素数をファイルに保存するのは、
openを使うより、モジュールを使った方が楽って言うのがよくわかりません、、、
度々質問すいません。
>>480 中断する事や計算した素数を他の処理で使う事を考えた場合の話だね
一回だけ起動して素数計算して終わりなら関係無いけど
素数を見つけた時にハッシュに入れるのではなく、ファイルに保存するということですか?
ラーメンを作る->フリーズドライして保存可能にする->お湯をかけて
ラーメンを再び食べられる状態に戻す。
Perlの中断時に、いまどこまで計算したかをファイルへ保存する
次回Perlの起動時に、前回どこまで計算したかをファイルから復元する
…ってことでしょ。
>475
しょうもないミスの連発で時間かかりましたが、おかげでばっちし動きました!
こんな感じです。ひょっとして将来誰かの役に立てばと思い、メモっておきます。
#表示用、解析処理(引数=ファイル番号)
sub replayfiles_read {
#フルパスのファイル名を得る
$readfilename = "$replay_dir/$files[ @_[0] ]";
#リプレイファイルサイズを得る
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
= stat( $readfilename );
#リプレイファイルをバイナリとして読み込む
open( IN, $readfilename );
binmode( IN );
sysread( IN, $buf, $size );
close( IN );
#zlib解凍
$dest = uncompress( $buf );
if ( !defined( $dest ) ) { return "zlib decode error"; }; #解凍失敗なら、退出する
#数値配列へ変換しておく
@data = unpack("C*", $dest);
…
>>482 それよりも、ハッシュという言葉に気になったんだが・・・
何で素数をハッシュに入れるの・・・
PHPのeregi関数みたいな、文字列の中に文字列があるかどうかっていう関数ありますか?
>>486 pregiはどこからパクってきたか知ってるか?
>>486 eregi関数は知らないが
こんなことはperlの得意技だと思うのだが。
>>486-489 eregiは「大文字小文字を区別せずに正規表現によるマッチングを行う」。
つまりm//iとまあだいたい同じ。
違うのは正規表現のマッチングの方法。
>>486 っつーわけで、当然のようにあります。関数じゃないけど。
調べても出てこないんです・・・教えてもらえますか?
ど、ど、ど、ど、童貞ちゃうわ!
>>491 入門書の最初の方すら読まないあなたには教えてあげられません。
>>488 PHPのeregiを知ってるくらいだからpregiも知ってるだろう。
pregiを知ってたらこんな質問はしないだろう。
という皮肉のつもりだったが、だめか?
あと perldoc perlop も
>>492 空耳かよw
>>491 Perlで正規表現は関数じゃない。
だから検索キーワードから関数をはずせ
win32apiに渡す時、構造体のポインタって何を渡せばいいですか?
使いたい関数はkernel32のProcess32Firstです。
>>498 ハァ?渡すものが分かっていて、何を渡したらいいか
分からないって、アンタ真性の(ry
M・S・D・N!M・S・D・N!
質問の仕方が下手糞
PerlでWinのSleep関数をまねるにはどうすりゃいいのだろう?
そんなのよりXML::SimpleのXMLoutを使うと属性で書き出されるのだがどうしてだ?
実行結果
<opt title="TEST">
<chapter body="XML/Perl TEST" subtitle="TEST - 1" />
<chapter body="Chapter2 ARR Test" subtitle="TEST - 2" />
</opt>
$VAR1 = {
'chapter' => [
{
'body' => 'XML/Perl TEST',
'subtitle' => 'TEST - 1'
},
{
'body' => 'Chapter2 ARR Test',
'subtitle' => 'TEST - 2'
}
],
'title' => 'TEST'
};
ソース
#! /usr/local/bin/perl
use utf8;
use XML::Simple;
use Data::Dumper;
$x = new XML::Simple;
my $xml = $x->XMLin('test.xml');
print XMLout($xml);
print Dumper($xml);
__END__
test.xmlだが適当なデータを用意してくれ
環境
ActivPerl v5.8.6 built 811
perl 5.8.6 (cygwin)
504 :
デフォルトの名無しさん:05/02/14 19:13:11
MCPANについての質問です。
MCPANでImage::Magickモジュールを入れようとしましたが、エラーになってしまいました。
そこで、ついforce installをしてしまいました。その結果か、入っていないにもかかわらず、
MCPANではImage::Magick is up to dateと表示されてしまうようになりました。
現状どおり、Image::Magickが入っていないと表示されるようにするには、どのようにしたら
良いのでしょうか。よろしくお願いします。
>>502 XML::Simpleはこの間使ったから良く知ってる
属性で書き出されないようにするには
NoAttr => 1
すればいい。
あと、chapterの所の出力形式で困ったら、GroupTagsを調べてみるべし。
>>502 XMLは回答ついてるようなのでSleepの方。
たぶん秒より小さい単位のsleepが欲しいのだと思うが、
そのためには
(1) Time::HiResのusleepを使う
(2) select(undef, undef, undef, 0.25); とかする。
>>505殿
ありがとう、解決できました
>>506殿
半分正解です、
sleep関数が出現したところで実行が一時停止して欲しいんですよ
できました!ありがとうございます
しかし関数じゃなくてこんなの(?)なんすね・・なんかカルチャーショック・・・
Perlを知らずPHPからWebProgに入る世代がもういるのか・・なんかカルチャーショック・・・
すみませんでした。
サンプルコードをください。
初心者です。たのんます
use Getopt::Std;
getopt("abcde");
みたいにした時、「二つ以上の$opt_hogeが正なら」みたいな判断、
みなさんはどうやってますか。
条件処理ごとにフラグを立てるくらいしか思い浮かばなかったんだけど
なんかうまい手がありそうな・・・・。
>>508 Perに慣れると何で他の言語では正規表現が
関数やクラスなんだと思うようになる。
>>512 エディタのカラー設定をする時は何で関数じゃないんだと思うことがある。
514 :
デフォルトの名無しさん:05/02/15 18:26:43
初歩的なんですが、perlで作ったプログラムはブラウザを通してじゃないと
動作できないのでしょうか? クーロンで起動させたいのですが・・
>>513 エディタのカラー設定でperl5互換の正規表現が欲しくなることがある。
質問ですが
オフラインでperlで作成したcgiを作成した場合で、cgiにパラメータを引き継がせたい場合
どのように起動すればいいのでしょうか?
./exsampl.cgi?a=abc
でやるとエラーになりますた
pack()っての難しすぎてよくわからんよ。
>>518 >質問ですが
>オフラインでperlで作成したcgi
うーん、コマンドラインでperlスクリプトを引数付きで起動させたいってこと?
だとしたらcgiじゃないよ。別に拡張子が.cgiでもいいけど
>でやるとエラーになりますた
エラーログは?
なんか基本的に勘違いしてる様子。
--test.pl
#!/usr/local/bin/perl
my $cmt = $ARGV[0];
print "$cmt\n";
で、コマンドラインから
$ ./test.pl baka?
ってやってみ
>>522 うまくいきますた
ちゃんとbaka?って でましたよ
どうもです
>511 こんなんどうでしょ?
use Getopt::Std;
getopt('abcde', \%opt);
print "OK\n" if(2 <= grep { $opt{$_} > 0 } a..e);
シンボリックリファレンス使うのがやだからちょっと変えた。
>>525 use Getopt::Std;
getopt('abcde',\%opt);
print "OK\n" if ( keys(%opt) >= 2 );
print "$_ = $opt{$_}\n" for (keys %opt); # 表示 :)
ハードコードなくした。
>>525 >>526 全てのオプションの重複を調べたいのはむしろ特殊な場合であって
普通はオプションの一部のいくつかが重複不可な方が多いような気が
する。a..eもkeysもやりすぎで列挙した方がいいのではないか。
>>525-527 レスありがとうございます。
昼には読んでいたのですが理解するのに時間かかってました。
望み通りの挙動得られました。
一応確認なんですけど、
(数字 <= 文字列)
といった条件式の場合、というか不等号のような算術演算子の場合は
文字列は文字数として読まれる、てことだったんですね。
まだまだダメだなあ。おらー。
>>529 いや、スカラコンテキストでgrep()はマッチした回数を、
リストはリストの要素数を、それぞれ返すって事。
ああ、配列の挙動と一緒か。やっと飲み込めました。
あれこれ申し訳ない。いろんなとこ逝ってきます。
$ perl -de 1
DB<1> $str="abcde123fgh";$str =~ /(\d+)/;print "$1\n";
123
DB<2> $str="abcde123fgh";$str =~ /(\d+)/;
DB<3> print "$1\n";
となるんだけど、どうして$1は2行に渡って書くとなくなるの???
あと、カーソルキー使えないんだけども
設定ファイルとかでなんとかならないですかね?
This is perl, v5.8.2 built for i386-linux-thread-multi
>>532 デバッガ内部でコマンドライン解析の為にマッチングを行ってるからだろうよ。
デバッガ書き直さないかぎりむりぽ。
(@mached) = "foo" =~ /(o)/g;
とでもするしかないな。
$hoge = "hogehugafooHOGE";
$huga = ($hoge =~ m/h/g);
@hoge = ($hoge =~ m/h/g);
print "$huga\n\a";
foreach (@hoge) { print "$_ "; };
print "\n\a";
というコードで、
1
h
というように表示されるのですが、
@hoge の内容はなぜ
hh
にならないのでしょうか…
動作環境:v5.8.6 built for MSWin32-x86-multi-thread
>>535 > $huga = ($hoge =~ m/h/g);
カッコが余分。リスト数が代入される。
$huga = $hoge =~ m/h/g;
と、すれば?
>>536 > > $huga = ($hoge =~ m/h/g);
> カッコが余分。リスト数が代入される。
> $huga = $hoge =~ m/h/g;
> と、すれば?
($huga = $hoge) =~ m/h/g;
っしょ。
っていうか、
>>535に必要なのは、「デバッグしろ」という言葉だな。
質問ですが・・
週ごとのシフト表を登録・管理するためのCGIを組んでいます。
それで、週ごとにcsvファイルを新たに作って記録していきたいのですが、
ファイル名を20050220.csvのように日曜日の日付を基準につけたい場合に
どうすればいいのか悩んでいます。
例えば、2月28日月曜日にCGIから登録すると、
CGIは次の週の日曜日の日付を基準に20050306.csvというファイルを作り、
そこに内容を記録するといった風にしたいです。
($sec, $min, $hour, $day, $month, $year, $wday, $yday) = localtime(time);
$year += 1900;
$month++;
これを使ってなんとかアルゴニズムを作ろうとしてるんですが
四苦八苦しています・・・。
現在の日付・曜日から次の日曜日までの日数を計算して、
そこから月や日を処理しようとしてるんですがなかなか上手くいきません・・・
何か見落としてるんでしょうか・・・
>>539 foreach (0..6) {
($sec, $min, $hour, $day, $month, $year, $wday, $yday) = localtime(time + 60*60*24*$_);
last if ($wday == 0); # 日曜なら終了
}
これでいいべ?
>>539 # 一日は何秒?
my$day_sec = 24 * 60 *60;
# 後何日で次の日曜?
my$wday =( localtime(time) )[6];
my$next_sunday =(7-$wday)%7;
# で、何日?
my( $day, $month, $year ) =( localtime($day_sec *$next_sunday +time) )[3,4,5];
printf "%4d%02d%02d.csv", $year +1900, $month +1, $day ;
かぶってたので、sub化してみた。すまん>541
# my( $day, $month, $year ) =next_weekday_date($weekday_No);# sun0~sat6
sub next_weekday_date($){
( localtime( 86400 *($_[0]+(7 -localtime[6] )%7) +time) )[3,4,5]
}
彼の人は、ずっと「あるごにずむ」と言ってきたのだろうか……
ニズムを刻む。ニンゴ、ニムジン、ニカルデントガム、ニクエスト、…。
なんかイイなっ!「に」。常用しようっと。
質問の仕方が悪かったようです.すいません.
$hoge = "hh"; # h は2回だけ
$huga = ($hoge =~ m/h/g); # マッチする
print "$huga\n\a"; # 1
$huga = ($hoge =~ m/h/g); # マッチする
print "$huga\n\a"; # 1
$huga = ($hoge =~ m/h/g); # 3回目マッチしない
print "$huga\n\a"; # ヌルポ 以下同様
となるのですが、これは仕様なのでしょうか…
動作環境:v5.8.6 built for MSWin32-x86-multi-thread
>>541-543 レスありがとうございます。
おかげさまでうまく出来ました。
7で割った余りをとるのがミソだったんですね・・・
とにかくどうもありがとうございました。
>>546 同じ文字列に対する連続したマッチ処理は、前回マッチが成功した位置を
覚えていてそこから開始される。この位置は pos によって知る事ができ、
マッチしなかったり、既に末尾に達していたり、別の文字列を評価した際に
リセットされる。
my $str = 'abcde';
my($rv, @rv, $pos);
$rv = $str =~ /a/g; $pos = pos $str; print "[$rv][$pos]\n"; # [1][1]
$rv = $str =~ /b/g; $pos = pos $str; print "[$rv][$pos]\n"; # [1][2]
$rv = $str =~ /f/g; $pos = pos $str; print "[$rv][$pos]\n"; # [][]
@rv = $str =~ /./g; $pos = pos $str; print "[@rv][$pos]\n"; # [a b c d e][]
$rv = $str =~ /c/g; $pos = pos $str; print "[$rv][$pos]\n"; # [1][3]
@rv = $str =~ /./g; $pos = pos $str; print "[@rv][$pos]\n"; # [d e][]
>>546 $hoge = "hh"; # h は2回だけ
$huga = ($hoge =~ m/h/);
print "$huga\n";
$huga = ($hoge =~ m/h/);
print "$huga\n";
$huga = ($hoge =~ m/h/);
print "$huga\n";
$huga = ($hoge =~ m/h/);
print "$huga\n";
print "gあり\n";
$huga = ($hoge =~ m/h/g);
print "$huga\n";
$huga = ($hoge =~ m/h/g);
print "$huga\n";
$huga = ($hoge =~ m/h/g);
print "$huga\n";
結果
1
1
1
1
gあり
1
1
>>546 仕様もへったくれも、"hh"に "h" が2回しかマッチしないのは
当然だろうが。3回目に何にマッチするってんだよ。
551の豚まん
MIME::Parserを使って/var/mail/のスプールファイルからメールを読み出して添付ファイルだけを任意の名前で保存したいのですが。
以下のような感じでMIME:Parserを使ってみているのですが、FOMAから送信してjpgのファイルの時は成功して、3gpのファイルの時は失敗してしまいます。
mimetypeは取得できていて(image/pjpegとvideo/3gpp)ハッシュと名前つける関数を使ってファイル名を決めています。
とりあえずこの部分ソースでどこかツッコミはありますでしょうか?
一応添付ファイルは1件だけを想定してて、複数件あっても一つだけ処理できれば良いという考えです。
my $parser = new MIME::Parser;
$parser->output_to_core(1);
$entity = $parser -> parse_open("/var/mail/user");
my %hash_mime = ( 'image/pjpeg' => 'jpg', 'video/3gpp' => '3gp' );
@parts = $entity->parts;
$mimetype = $entity->parts($#parts)->mime_type;
# 保存するファイル名を取得
open (FILE, "> /home/user/http_data/image/file") || die "file open error!\n";
if( $#parts == 0 ){
print FILE $entity->parts(0)->bodyhandle->as_string;
}
else{
print FILE $entity->parts($#parts)->bodyhandle->as_string;
}
my $size = (stat(FILE))[7];
close( FILE );
}
どこで失敗してるかは自分で掴めてないのか
>>554 ファイル名を決めてファイルをオープンするところまでは上手くいってるようなんです。
メールのマルチパート処理の部分で、$entity->parts($#parts)->bodyhandle->as_stringで添付ファイルが
取れる場合と取れない場合があるんですよね。
本文 有り/無し
添付 jpeg/3gpp
のマトリックスでテストケース作ってもうちょい絞り込みしてみます。
スミマセン自己解決したみたいです。
スクリプトではなく、添付したファイルが問題だったみたいです。
きちんとした3gppのファイルを添付したら上手く切り出せたみたいです。
お騒がせしました。というかお目汚ししてスミマセン。
>>547 > 7で割った余りをとるのがミソだったんですね・・・
単なる思いつきだよ。
my$next_sunday =(0,6,5,4,3,2,1)[$wday];
とか、
my$next_sunday =( !$wday ? 0 : 7-$wday);
とか、でもいいし。
558 :
デフォルトの名無しさん:05/02/22 00:40:58
2005-01-07 14:32:08
2005-01-07 14:30:52
2005-01-07 14:29:52
・
・
・
といった日付・時間がかかれたデータをUnix時間に変換するにはどうすればいいでしょうか?
やはり 365× 24× 60× 60 とか閏年を考えつつやっていくしかないのでしょうか?
use Time::Local;
中でほかのコマンドを起動するようなスクリプトを作りたいんですが、
$cmd = "/full/path/to/command/";
みたいにしなくても適当に ($ENV{"PATH"} などから) 実行ファイルのパスを
探してくれるような便利モジュールがあれば教えてください。
PATH通ってれば
$cmd = `cmd_name';
で実行してくれない?
コードのチェックをするのによいツールとか無いですかね。
一定のコーディング規約に則ることを前提にして。
たとえば、
my $class = Class->new();
$class->methed();
package Class;
sub new {bless {}, shift;}
sub method {}
を実行前にエラーとして検出するには、
インスタンスを ->new で作るという規約があれば自動化できますよね。
>>561 あ、もちろんいきなり実行するだけで構わないもの (`cmd` や system('cmd')) は
それで良いのですが、
引数としてコマンドのパス文字列を渡す必要のあるケース
(Expect の spawn() や IPC::Open3 の open3() など) では
ちょっと具合が悪いのです。
>>564 ありがとうございます。早速使ってみます。
しょうもないことではまってたんでちょっと質問させてください。
正規表現のデミリタを/以外の文字に代えると、
その文字がデミリタと見なされる。
たとえば、|だったらorとぶつかり、{}だと範囲指定とぶつかるetc.
($str =~ s|ab(?!(?:d|e))|zz|g;は不正な構文になる)
でも/をデミリタに使いたくない。
こういうときは何をデミリタに使ってます?
#
デミリタじゃなくてデリミタね。delimiter
>>567-8 ども。寝ぼけてる。
/x使ってずらずらなんがいからコメント入れたくて
#も使いたくないときはどうでしょ?
m"(pattern)" とかは?何か気持ち悪いが。
>>566 そもそもカッコ系はちゃんとバランスみるから中でその文字使っても
ペアで出てくる分には問題ないよ。
m{a{3,4}}とかm[[a-z]]とか試してみ。
s(){} みたいに、前後で異なるかっこも使える
俺は/と|が使えない場合はs!hoge!fuga!gだな
漏れは s"hoge"moge" だ。
みんなはスクリプトとか書いてコードチェックしたり、
デバッグの手間省いたりとかしてないの?
>>570 >>574 "は大丈夫だね。
>>571 確かに大丈夫だった。データの中括弧団子の帳尻あわせみたいなことを
やってるときにおかしなことになったんで使わなくなってたけど
自分のバグだったみたい。
>>573 !だと
>>566の例では引っかかる。
>>577 漏れは、比較的長い時はカッコとxを使うよ。
s{ [a-z]{ 1, 6 }
| [A-E]{ 2, 8 }
| [F-Z]{ 3, 9 } # (?# ~ )使わずコメント入るし。
}{
hoge\ moge\ mage\n
}x;
とか。
>>575 ふつうにする。エディタの整形機能とskkの補完機能と
-w && use stict,-cのSyntax Checkで間に合ってる。
562みたいな希望に沿うようなものを知らんから書かな
かっただけだよ。
貴様らエディタ何使ってる?
xyzzy?
eclipse + EPIC
jcode.plとjcode.pmどっち使ってる?
Encode.pm
特定のライブラリのバージョンを確認する方法ってあるんでしょうか?
perl -MFoo -e 'print $Foo::VERSION'
Pod 形式でドキュメント書きたいのですが、何を読んで勉強するのが良いですか?
>>586 perlpod
perlpodspec
>>588 ありがとうございます。Pod 形式のドキュメントも perldoc であったんですね。
考えてみたら当然か。早速それ読んで勉強します。
つーか君達はPerlを書くのにエディタ使ってる?
正直もうそろそろPerlプログラマもエディタは卒業だと思うのよ。
EclipseなどのIDEを使うべきだろ?
正規表現のデバックなんかエディタじゃ限界来てるもんなぁ。
591 :
デフォルトの名無しさん:05/02/24 01:17:08
エディタ自分はxyzzyを使ってます。emacs好きなもので。
ちょっと質問なのですが、perlで買いカゴを作っているのですが、
メーカー選択画面はhtmlにして、買い物をするページはcgiにしたいのですが
買い物途中に違うメーカーに移る時にhtmlへ移動してしまうと買いカゴの情報を
保持できなくて困っています。
つまり、確実にクライアントを特定できる情報をゲットしたいのですが、
有効な手段が思いつきません。どなたか知恵をかしていただけませんでしょうか?
ちなみにIPアドレスではproxyサーバを経由している(会社内・学校内)場合
ローカルエリアネットワーク共通の買い物籠となってしまいます(爆)
cookie
593 :
デフォルトの名無しさん:05/02/24 01:56:11
>>592 なるほど。ですが、最近はクッキーを受け付けないと設定している人が
多いような気がします。やはりクッキーしかないですかね?
>>590 > 正規表現のデバックなんかエディタじゃ限界来てるもんなぁ。
「デバック」とか抜かしてるようじゃ、バグ出しまくりなんだろうな。
前向きなコーディングかチェックしてるんだよ、きっと。
LinuxでPerl5.8使ってます。
コンソールでの文字の色を変えたいのですが、良いモジュールはありませんか?
>>596 Term::ANSIColorとかどうよ。
>>593 セッション情報として鯖に持たせるとか、ほかにも手はある。
まあ板違いだ罠。WebProg板池。
UNIX で daemon 作るのに標準入出力を /dev/null に繋げたいのですが、
Perl だとどうすればいいでしょうか?
クックブック17.17より
for my $handle (*STDIN, *STDOUT, *STDERR){
open($handle, "+<", "/dev/null" ) || die "$!";
}
>>602 制御端末とかセッションとかのからみがあるので、600が示した
faqの最後の方に紹介されてるProc::Daemonモジュールを使うのが
オススメです。
俺もクライアントばっかじゃなくそろそろダエモンも組んでみるかな
誰か面白いの作ってる?
`rm -rf ./`
覚えたて?
607 :
デフォルトの名無しさん:05/02/25 11:27:35
どなたか教えてください。
windows上にて、perlでutf-8のテキスト処理を行っています。
テキスト処理はうまくいっているのですが、取り出した
UTF-8テキストでフォルダーを作成すると、文字化けの
フォルダーになってしまいます。
windows上で、普通に新規フォルダーを作成し、名前変更でUTF-8テキストを
ペーストしたらうまくいくのに、perlからだとうまくいきません。
フォルダ作成は mkdir("utf-8テキスト"); としています。
何か設定があるのでしょうか?
お助けお願いします。
perlは5.8.6を使用しています。
>>607 >windows上で、普通に新規フォルダーを作成し、名前変更でUTF-8テキストを
Windowsはsjis。よってUTF-8は文字化けするのが仕様。
609 :
デフォルトの名無しさん:05/02/25 11:54:57
Win2000でのファイル名、フォルダー名にユニコード使えますよね。
perlがDOSベースで動作している?ので、できないということに
なるのでしょうか?
MLDBMで、既存のデータベースに対し、serializerを交換するには
どうしたら良いのでしょう?
というのは、serializerに何を使うかは、
use MLDBM qw(DB_File Storable);
と、use時に指定する仕様になっているのです。
この場合、どうしたら良いのでしょう?
>>610 マニュアルを読む限りでは
$MLDBM::Serializer or $OBJ->Serializer([SZROBJECT])
The global $MLDBM::Serializer can be set to the name of the serial-
izing package to be used. Currently can be set to one of
"Data::Dumper", "Storable", or "FreezeThaw". Defaults to
"Data::Dumper". Alternatively, you can specify the name of the
serializer package at "use" time, as the second "parameter".
じゃないかと。
>>609 でいないはずがない。
use Encode;
#utf8flagが立っているUTF-8テキスト
mkdir( Encode::encode('Shift_JIS', $dirname) );
#単なるバイト列 UTF-8以外でもEUC-JPなどなんでもあり
Encode::from_to($dirname, "UTF-8" => "Shift_JIS");
mkdir($dirname);
>>610 データベースを作り直すしかないね。
自分の質問を読み返してみると、若干不明瞭ですね。
つまり、Data::Dumperを使って作ったDBファイルを、Storableを使うものに
変換したいというわけです。
>>611 ところが、異なるserializerは排他のようなのです。
入力用と出力用に、tieなり$OBJ->Serializerで指定なりすると、
2番目の指定で
Can't locate auto/Storable/serialize.al in @INC (モジュールパス一覧) at /usr/local/lib/perl5/site_perl/5.8.6/MLDBM.pm line 160
などと出る始末。逆でもStorableがData::Dumperになるだけで同様です。
異なるpackage内でそれぞれやればなんとかなるかな?
あるいは、いったんダンプして、別プログラムで新DBを作る?
と、いろいろやってます。
perlのウイルスってありえますか?
615 :
デフォルトの名無しさん:05/02/25 15:09:14
>>612 use Encode;
$fname = "■■■";
Encode::from_to($fname, "UTF-8" => "Shift_JIS");
open( OUT_FILE ,">$fname.txt");
close( OUT_FILE );
mkdir($fname);
上記スクリプトをUTF-8形式で作成。
上記実行でファイルとフォルダの名前は"■■■"に、
Encode行を外して実行すれば、ファイルとフォルダの名前は
"文字化け"になります。
実はこの名前全部もしくは中に「SHIFT-JIS外」の文字があった場合です。
この場合、
Encode行を外せばファイルとフォルダの名前は"文字化け"に
Encode行有効では、ファイルもフォルダもできません。
・・・
>>613 こういうこと?
use MLDBM;
use Fcntl;
$dbm1 = tie %o1, 'MLDBM', 'testmldbm', O_CREAT|O_RDWR, 0640 or die $!;
$MLDBM::Serializer = 'Storable';
$dbm2 = tie %o2, 'MLDBM', 'testmldbm2', O_CREAT|O_RDWR, 0640 or die $!;
while (($k, $v) = each %o1) {
$o2{$k} = $v;
}
>>615 >実はこの名前全部もしくは中に「SHIFT-JIS外」の文字があった場合です。
意味不明。
>>615 だめなときはopenとmkdir失敗してそうだから、or die $!つけて
エラーメッセージ見れば何か手がかりになるかもナ。
>>613 > つまり、Data::Dumperを使って作ったDBファイルを、Storableを使うものに
> 変換したいというわけです。
> 異なるpackage内でそれぞれやればなんとかなるかな?
> あるいは、いったんダンプして、別プログラムで新DBを作る?
結局、Storableで一括ダンプして、別プログラムで
一括リストアしてStorableなMLDBMにするという方法で
逃げました。
なんか釈然としないけど、とりあえず結果報告しておきます。
いわゆる機種依存文字に関する質問です。
Shift-JISで書かれたテキストをUTF-8に変換して
s///やm//で必要な部分を取り出してどうのこうのするスクリプトを書いています。
環境はPerl5.8で文字コードの変換にはEncode.pmを使っています。
スクリプト自体はUTF8で書いています。
もとのテキストの中にある丸に数字などのいわゆる機種依存文字を
どの環境でも見れる文字列に変換したいのですが、やり方がわかりません。
ttp://x68000.q-e-d.net/~68user/webcgi/char-code-2.html に書いてある事を応用すればよいのだと思いますが阿呆なもので何をどうすればいいのかわかりません。
どうかご指導よろしくお願いします。
623 :
デフォルトの名無しさん:05/02/27 02:27:50
質問なのですが、perlでクッキーの書き込みを行ったところうまくいかず、
クッキーの内容がブラウザに表示されてしまいました。
以下のプログラムは間違っているのでしょうか? どうしてもできずに泣きそうです(泣)
$cookie = "123";
$cookie =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
print "Set-Cookie: test=$cookie; expires=Thu, 1-Jan-2030 00:00:00 GMT\n\n";
だいたい予想はつくが
>>1も読まないバカに教える気は無い。
下のように書かれているなら、\n を一つに減らせ。
print "Content-type: txt/html\n\n";
↓
print "Content-type: txt/html\n";
さらに、
>>623 の部分をこの行より前に書け。
>>622 cp932で変換したら普通にutf8にならない?
変換してもフォントになかったら見れないけど。
必要に迫られPerlの勉強を始めたが、
「リャマ本」にのってるジョークがおもしろくありません。
講習会でバカ受けの最高のジョークらしいですが、
僕には意味すら分からないときがあります。
こんな僕は、Perlをマスターできませんか?
>>627 必要に迫られていない時に勉強するのは最高
必要に迫られて勉強するのは最低
まぁ、がんばれ
下記のコードで3を入力したときに、表示されないのはなぜでしょうか。
入力した引数に応じて、名前を表示させるだけですが、
3を入力したときは、なぜかnot exsitsになってしまいます。
chomp(@line =<STDIN>);
%name = (1 => jane,
2 => fred,
3 => amy);
@key = keys(%name);
foreach(@line){
if(exists $key[$_]){
print "$name{$_}\n"
}else{
print "not exists";
}
}
630 :
デフォルトの名無しさん:05/02/27 19:58:36
>>629 > 下記のコードで3を入力したときに、表示されないのはなぜでしょうか。
> 入力した引数に応じて、名前を表示させるだけですが、
> 3を入力したときは、なぜかnot exsitsになってしまいます。
関係する変数をダンプしてみればわかる。
ハッシュと配列の区別の付いていない奴がいるな
ダンプしたところ、入力した値はちゃんと1 2 3と入っていました。
ハッシュのキーを下記のように数値から文字に変更すると、
うまく表示できました。この数値と文字の動きの違いというのは
なぜですか。
%name = (a => jane,
b => fred,
c => amy);
@list = (1,2,3)
このとき@listの3番目の要素は何だ?
>>633 >@list = (1,2,3)
>このとき@listの3番目の要素は何だ?
要素がないので、undefです。ようやくなぞが解けました。
ハッシュは、インデックスでなく、キーで値を取れるということで
入力も1 2 3とすれば、jane fred amyと返すはずだったけど、
@key = keys(%name); と配列に代入したときに、0番目から代入されるので
if(exists $key[$_])の時に存在しない3番目をアクセスしてしまう。
そのため、not existsになっていた。解決策としてif(exists $key[$_-1]){
とすると無事amyが表示されました。ありがとうございます。助かりました。
で、無駄な事をしているのにはまだ気が付かないのかね
ただのCPUでも出来ることだし何もすごくない
Larryって今どんな仕事をしているのですか?
ラリーX
マッチングについて聞きたいのですが・・・
"タチツテト" =~ m/チ/i
これだとマッチするのに
"タチツテト" =~ m/タ/i
これだとマッチしません
他にも全角でできないのがいくつかあるようです
マッチしない全角をマッチするようにする方法なにかありませんか?
>>641 とりあえずそれだけ動けばいいのであれば use encoding。
644 :
デフォルトの名無しさん:05/03/01 21:51:40
$bar="1"と$foo=1を区別したいのですが、
文字と数値を判断する方法ってありますか?
文字列なら cmp で数値なら <=> で比較したいのです。
if /^\d+?$/ {#数値扱い} else {#文字扱い}
とかは?
>>644 内部的には違いはあるといえばあるのだが、調べるモジュール
とかはあるのかな? 残念ながら私は知りません。
目的次第では数値として解釈できる文字列かどうかを判定する
Scalar::Utilのlooks_like_numberは使えるかもしれない。
どちらもlooks_like_numberなら数値比較、そうでなければ
文字列比較とか。
しかし同じScalar::Utilのdualvarを使って作った値とかを考えると
いやになると思うけどな(笑)
647 :
デフォルトの名無しさん:05/03/01 22:36:33
>>645 それ、実際に自分で実行して書いてるの?
>>644 Devel::PeekというモジュールのDumpってのを使うとperlの内部をのぞくことが
できる。コレを使うと
% perl -MDevel::Peek -e '$foo = 1; Dump($foo);'
SV = IV(0x816378c) at 0x8163d1c
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 1
% perl -MDevel::Peek -e '$foo = "1"; Dump($foo);'
SV = PV(0x814cef8) at 0x8163d1c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x815d438 "1"\0
CUR = 1
LEN = 2
と一見区別できるように見えるのだが、
(改行多すぎといわれたので続く)
(続き)
% perl -MDevel::Peek -e '$foo = 1; $bar = "$foo"; Dump($foo);'
SV = PVIV(0x814d308) at 0x8163d2c
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
PV = 0x815d448 "1"\0
CUR = 1
LEN = 2
% perl -MDevel::Peek -e '$foo = "1"; $bar = $foo+1; Dump($foo);'
SV = PVIV(0x814d308) at 0x8163d2c
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
PV = 0x815d448 "1"\0
CUR = 1
LEN = 2
というように使われ方ですぐに元がどっちだったかは区別できなくなってしまう。
単純に"1"が来たら1に置き換えちゃう方が楽そう
651 :
644:05/03/02 00:01:52
コンテキストに応じて文字列<->数値の変換を勝手にやっているところ
を見ると、数値っぽい文字列なら数値として扱うのがperl流ってとこですかね。
あまりこだわらずに"1"は1として扱うようにしようと思います。
あと、Scalar::Utilのlooks_like_numberはやってることは
>>645とほとんど
同じでした(あと浮動小数点への対応とか)。
まあ、文字列をインクリメントできたりするわけだが。
Perl のモジュールをまとめようと思って、
ExtUtils::MakeMaker::Tutorial を参考にファイルを整理しているんですが、
サンプルコードみたいなものはどこにおくべきかで迷っています。
``eg'' というディレクトリに入れているケースもあるようなのですが、
これが Perl モジュールの標準的なサンプルコードのディレクトリでしょうか?
>>653 わかりやすい構成にしときゃ別にどこでも好きなように。
e.g. = exempli gratia = 「例えば」
質問です。
$aaa ← 配列のリファレンス
があります
これの内容を参照するには、@$aaa[添字]でとれますが、
要素数はどう指定すれば取得できますでしょうか?
scalar(@$aaa)
>>653 素直に「examples」としているモジュールが多いように思う。
>>655 my @{array} = (0..3); # 'array' という名の配列
print @{array}, ${array}[2], $#{array}, scalar @{array}, "\n"; # 0123234
print @array, $array[2], $#array, scalar @array, "\n"; # 0123234
my $array = \ @{array}; # 配列変数 @array のリファレンス
print @{$array}, ${$array}[2], $#{$array}, scalar @{$array}, "\n"; # 0123234
print @$array, $$array[2], $#$array, scalar @$array, "\n"; # 0123234
>>657さん
他の例まで書いて頂きまして、ありがとうございます。
質問なのですが、
グループA,山田,水,3
グループB,鈴木,月,3
グループA,山田,水,4
グループB,鈴木,月,4
グループC,佐藤,木,2
グループA,山田,水,5
グループC,佐藤,月,3
のようなcsvファイルを@list = <FILE>;で読み込んで、その後に
グループA,山田,水,3,水,4,水,5
グループB,鈴木,月,3,月,4
グループC,佐藤,木,2,月,3
のように重複するグループ名と名前をまとめて、その後に曜日と時間をくっつける
構成の配列に直すところで悩んでいます。グループや曜日の順番は順不同で
かまわないのでくっつけるだけなのですが、上手くできません・・・。
いったいどうやったら上手くできますか・・・?
>>660 グループと名前をキーにしたハシュにしてみては?
foreach (@List){
$_ = [split /,/];
$hash{sprintf qq|%s,%s|, $_->[0,1]} .= sprintf qq|,%s,%d|, $_->[2,3];
}
foreach (sort keys %hash){
push @List_new, $_ . $hash{$_};
}
みたいな。
SSL機能ってperlでもできるのでしょうか??
できるでしょ。
勘違いしてそうだけど。
>>661 俺の趣味ではこうだな。やってることはほぼ同じだが。
#!/usr/bin/perl
open READ,"test.csv";
while(<READ>){
chomp;
split /,/;
push @{$dummy{join ',',@_[0,1]}},@_[2,3];
}
close READ;
open WRITE,">result.csv";
print WRITE (join ',',($_,(@{$dummy{$_}}))),"\n" for (sort keys %dummy);
close WRITE;
666 :
デフォルトの名無しさん:05/03/03 16:00:41
perl から、xhtmlを表示させたいのですが、ヘッダーエラーとなります
色々調べましたが、とんとわかりませんのでよろしくです
$top_html = <<"<EXIT>";
<html>
<head>
<title>制作してみよう</title>
</head>
<body bgcolor="#FF0000">
test
</body>
</html>
<EXIT>
&jcode::convert(\$top_html, "sjis");
print "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n\n";
print $top_html;
ヘッダをprintしてないんだろう。
668 :
デフォルトの名無しさん:05/03/03 16:18:46
>>667 プリントしてますけど、アパッチのログにはヘッダーエラー?みたいなものがでます
malformed header from sc
ript. Bad header=<?xml version="1.0" encoding=": index.cgi
print "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n\n";
orz
> perl から、xhtmlを表示させたいのですが、ヘッダーエラーとなります
> print "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n
> <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n\n";
xhtmlに見えません…
time関数はうるう秒を考慮していませんよね。
天文計算をperlで行なう人は、時間をどのように扱っていますか?
>>674 ユリウスに変換するのがもっとものような。。。
676 :
デフォルトの名無しさん:05/03/04 08:17:11
$perl[Enter]
としたときに、プログラムを記述できますが、それを実行するにはどうしたらよいのですか?
677 :
デフォルトの名無しさん:05/03/04 08:27:12
>>676 EOFの送り方か?
UNIXならCtrl+D
@$aaa
これってどういうこと?
679 :
デフォルトの名無しさん:05/03/04 09:45:06
>>677 THX!
ちょっとしたコードもファイルに書き出していたから助かります。
>>674 うるう秒はシステム依存。
OS(というかlibraryまわり)によって対応してたりしてなかったりする。
うるう秒なシステム上のperlだとちゃんと働く。
>>680 うかつにうるう秒に対応させるとnfsやsambaなんかでハマるので気をつけれ。
周辺のマシン含め一斉にやらないと、makeが発狂したり、
ファイルコピー時にタイムスタンプがズレたりと、問題おこりまくり。
>>678 >@$aaa
配列へのリファレンス変数のデリファレンス
683 :
デフォルトの名無しさん:05/03/04 20:44:17
>>673 最初の ?xml
がXHTMLのヘッダや
>>683 ほほぅ。
じゃあこれは何かね?
> <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n\n";
>>684 それは、どこかのサイトに書いてあった
のをコピーしただけ 違うの?
Q1.
リャマ本読んで習得中の修習生です。(プログラム経験なし、13章で混乱中)
WINでperl使いたいのですが、初めてのWIN32(ワニ本)に切り替えた方が
良いでしょうか?リャマはUNIX的な表現が多くてWINに移行できるか不安です><
続perlは購入済
Q2.
続perl以降に読むべき本は 駱駝→Effective Perl→クック でOKですか?
use LWP::Simple;をつかって
$doc = get $url;
のようにして他のサーバーのファイルをgetするプログラムを作っています。
質問なのですが、このサーバーがとてもおもくて、応答が無いせいか、
プログラム自体がとまってしまうことがあります。
1分くらい応答がなかったらリトライするというふうにしたいのですが
どのように書けばいいのでしょうか?
ご指導よろしくお願いいたします。
689 :
デフォルトの名無しさん:05/03/04 22:39:08
age
690 :
デフォルトの名無しさん:05/03/04 23:02:48
691 :
デフォルトの名無しさん:05/03/04 23:06:44
>>688 LWP::Simpleじゃ無理。
マニュアルにある通り、
LWP::UserAgentを使え。
692 :
デフォルトの名無しさん:05/03/04 23:10:44
>>688 UserAgentのtimeoutを60に設定して使うのがよろし。
ところで、サーバーを待っている間に他の処理をさせたいと思った場合は
なにを調べるのが良いでしょうか。
>>692 timeoutを60でリトライになるのでしょうか?
それとも、新たに処理をかくのでしょうか?
>>692 LWP::Simpleのソース見てみたんだが、
タイムアウト60にデフォルトで設定されているような。
となると、完全に応答がないわけじゃなくて、
少しずつデータが送られてきているような状態なんだろう。
となると、別スレッドで監視して、一定時間たったら
処理を中断させるなり何かしないと駄目だろうな
695 :
デフォルトの名無しさん:05/03/04 23:34:48
>>687 AUのサイトにかいてありました
さんくすこ
##############
ここから
ここまでのしょり
を60秒以内で済まさない限り外に出れない(繰り返される)
#############
こんなかんじでできないでしょうか?
いままでLWP::Simpleのgetで書いてきたんでなるべくそこのところは変えたくないのですが。
どなたかよろしくお願いします。
697 :
デフォルトの名無しさん:05/03/04 23:49:29
>>696 インターバルタイマでシグナルを打って、
シグナルハンドラで後始末するんだな。
そんなややこしいことをしたがるなんて、チャレンジャーだな。がんばれ。
698 :
デフォルトの名無しさん:05/03/04 23:50:39
>>697 おっと、別にインターバルタイマでなくてもいいか。
alarm使えばいいな。
>>697 むむむー
やっぱややこしいんですか。
どなたか簡単なサンプルをいただけませんでしょうか?
他のサーバーのファイルをとってきて60秒間応答なかったらリロード(再読み込み)
みたいな感じなんですけど・・・・(。-人-。)
700 :
デフォルトの名無しさん:05/03/04 23:56:27
>>694 > LWP::Simpleのソース見てみたんだが、
> タイムアウト60にデフォルトで設定されているような。
それはsocketのコネクション要求のタイムアウトだろう。
読み込みはすっぴんsysreadで読んでいるから、そこでブロックするだろう。
> となると、完全に応答がないわけじゃなくて、
> 少しずつデータが送られてきているような状態なんだろう。
でなきゃ、まったく送られてないかだな。
> となると、別スレッドで監視して、一定時間たったら
> 処理を中断させるなり何かしないと駄目だろうな
selectを使うのは最近は流行らないのかな。
702 :
デフォルトの名無しさん:05/03/05 00:21:35
>>701 とりあえずWindowsにPerlのインストールはしてる?
本読んでるだけで実際に手を動かしてる様子じゃなさそうだな。
>>695 もっとマシなもの参照するようにしろよな・・・
>>703 KDDIって、xhtmlをWAPで正式採用してるから 問題な酢
>>686 本の選択は間違っていないので買った本を良み進めるがよろし。
WindowsでActivePerl使うのでも基本的な部分は変わらない。
Effective Perlは読みやすいし短いし、Perlらしい表現を覚える
のに良いので続リャマの前に読んでも。
クックブックは読む順番は気にせず、実際にちょっとコード
書こうとした時とかにちらちら拾い良みすれ。
Ruby以外の言語は糞
ましてやPerlは汚物
Javaのjavawコマンドのようにコンソールウィンドウが開かないようなコマンドは
perlでできますか?
wperl.exe
よくあるCGI管理画面でパスワードでログインをするページありますよね?
アドレスをコピーして、他のブラウザに貼り付けしたらログイン
できないのですが、あれはどのような仕掛けになっているのですか?
ソースを見る限りformタグのhiddenを使っているのではないようなのですが…。
なぞです…。
cookieとか。
それともGET,POSTの話か?
クッキーだった場合アドレスバーに同じアドレスを打ち込めばログイン可能
となってしまいます。(おそらく)
アドレスは
http://〜.co.jp/〜.cgi?hoge=hoge&hogehoge=hogehoge
となっていたので、POSTではないようです。
やはり何か難しい処理をしているのでしょうか?
712 :
デフォルトの名無しさん:05/03/05 02:10:57
セッションクッキーじゃない
>>713 ありがとうございます。セッションクッキーを調べてみます。
>>712 板違いすいませんでした。読んでませんでした。m(__)m
715 :
デフォルトの名無しさん:05/03/05 02:33:05
昨日からperl始めた初心者ですが
>>3で紹介されてるプログラミング講座を見ています
それについて質問ですが
講座の中にこんなのがありました
%weekday =(
1=>'Sunday',
2=>'Monday',
3=>'Tuesday',
4=>'Wednesday',
5=>'Thursday',
6=>'Friday',
7=>'Saturday');
if( exists $weekday{$ARGV[0]}){
print $weekday{$ARGV[0]};
}else{
print "範囲外です!!";
}
これをこのまま実行すると”範囲外です!!”となります
$ARGV[0]だから”Sunday”と表示されるんじゃないんですか?
718 :
デフォルトの名無しさん:05/03/05 02:43:39
719 :
715:05/03/05 02:59:36
$ARGVについて調べたのですが
スクリプトを実行するときに指定した引数のリストが格納される特殊な配列。
第一引数
$ARGV[0]
第一引数だからこの場合$ARGV[0]は1で
$weekday{$ARGV[0]} は $weekday{1}; になってSundayと表示されると言うことじゃないんですか?
721 :
715:05/03/05 03:16:54
さっきから調べてるのですが
まったくもって分かりません
では違う質問してみます
>>715でsundayと表示させるにはどうすればいいのでしょうか
実行する時に
>perl myscript.pl 1 [Enter]
と入力
723 :
715:05/03/05 03:27:01
ファイルへのパスのあとに1を入力するということですか
それでも範囲外ですってなります
724 :
デフォルトの名無しさん:05/03/05 03:29:46
>>721 > さっきから調べてるのですが
関係する変数を表示させてみたのか?
725 :
715:05/03/05 03:37:03
なんだかもうわけが分からなくなりました
単語一つにしろググって調べないと意味もわからない
プログラムって難しいですね
今日はもう寝ます
いろいろありがとう
> 第一引数だからこの場合$ARGV[0]は1で
って言っといて
>>723みたいに答えてるからわかってなさそ。
727 :
デフォルトの名無しさん:05/03/05 04:05:13
ふむふむ、参考にしている
>>3のサイトが初心者にわかりにくいってことだな。
@ARGVのごく簡単な説明とperlスクリプト文での使い方は説明してあるが、
実際に@ARGVに値を入れて実行する方法が書いてないようだ。
このなかでPerl勉強して後悔した人はいますか?
730 :
デフォルトの名無しさん:05/03/05 10:05:15
>>730 fork() した時点で、メモリ上で動作中のプログラムがコピーされて2個になると思えばいい。
全く同じ2つのメモリイメージだけど、親の方では $pid に(新しく作られた子の)プロセスIDが入る
子の方は0が入る
親では、 if($pid = fork) が true になる($pidに子プロセスIDがセットされる)から、waitまで行くが
子では if($pid = fork) がfalseになる( $pidが0にセットされる)ので、そこはパスして
elsif(defined $pid) の部分が実行される
正確な話は自分でmanでも読んでくれ、大体こんな感じ。
>>731 なるほど。
丁寧な解説でようやく理解ができました。
ありがとうございました。
>>731 open していたファイルはそっちでも open していることになるよね?
open していたものがデバイスだったら競合はしないの?
>>729 後悔はしていないけど、Cしか知らなかった頃に比べて頭が悪くなったような希ガス
C より Perl 書く方が苦痛だよな。
737 :
デフォルトの名無しさん:05/03/05 19:25:11
n行目からm行目までを処理しようとして
while (<IN>) {
hoge($_) if $n..$m;
}
ってやってもうまくいかないのですが。
最初から最後まで処理されます。
>>737 自動的に$.と比較してくれるのは定数のときだけなので、
今回のように$n,$mのような変数に入ってる場合は、明示的に
$.==$n .. $. == $m
のようにする必要があります。
Perlはじめたら父ちゃん家出して母ちゃんは酒びたり、姉ちゃんは変な男連れ込んでごそごそしてるしもうこんな生活いやだ。
僕に最適な言語を教えてください。
674です。
>>675 >>680 >>681 ありがとうございます。
perlでなくシステムの話になるのですね。
makeが発狂しないように気を付けてポチポチいじってみます。
sub mailer{
添付めーるを送信する処理
}
このようなサブルーチンを作って、logディレクトリにある画像ファイルを片っ端から一通ずつ送るということをやろうとしています。
環境はwindows2000でsendmailの代わりにsendmane.exeを使っています。
jcode.plとmimew.plを使って添付処理をしているのですが
&mailer("file1.jpeg");
のように一回の処理だとうまく送ることができるのすが、
foreach $aa ($filelist){
&mailer($aa);
}
のようにやったり、
&mailer("file1.jpeg");
&mailer("file2.jpeg");
のようにやると、添付ファイルの一部が破損しているようで送信はできるのですが、
正常なファイルを送信することができません。
なんとか
foreach $aa ($filelist){
&mailer($aa);
}
のような処理をうまくやる方法はないでしょうか?
送信プログラムは
http://www.parkcity.ne.jp/~chaichan/src/perl05.htm ココのを参考に作っています。
よろしくおねがいします。
foreach $aa ($filelist){
$filelist?????
&mailer("file1.jpeg");
&mailer("file2.jpeg");
でうまくいかないんだから
mailer内で一回目に書き換えた変数を
二回目以降も使っているのだろう。
すまんこ。
euc-jp環境のLinuxでShift-jisのファイルを読み込み、
シェル上から日本語文字列のコマンドライン引数を受付け、
euc-jpの標準出力に出力、つうスクリプトでハマってます。
--
use Encode;
binmode STDOUT,':encoding(euc-jp)';
open IN, "< :encoding(shiftjis)","sjis.txt" or die;
...
ここまではいいんだけどこの状態で$ARGV[0]をprintするとエラー。
binmode $ARGV[0],':encoding(euc-jp)'; とか
binmode ARGV,':encoding(euc-jp)';
とかやってもダメ。
参考サイトだけでも教えてくださいませんか。
あーすみません。
$str = decode("euc-jp",$ARGV[0]);
でいいんですね。お邪魔しました。
>>746 Jcode mailinglistで聞いたら?
>>745 一応mailerサブルーチンの中身は全部my変数にしてあります。
jcodeとかmimewの問題なのでしょうか?
>>744 @filelistのなかに、送信するファイルの一覧が入っています。
一応確認だが、複数送ろうとするときにおかしくなるファイルは
単独で送れば全てきちんと送られているわけね?
解決しました”””
$encodedata = &bodyencode($sdata);
$encodedata .= &benflush;
↓↓↓
$encodedata = &bodyencode($sdata, "b64");
$encodedata .= &benflush("b64");
にしたらうまくいきました
なんでだろー
PerlにCのような構造体を実装するモジュールってあるかな?
753 :
デフォルトの名無しさん:05/03/06 15:12:30
>>752 > PerlにCのような構造体を実装するモジュールってあるかな?
あるし、それ以前に、hashへのリファレンスを使えばやりたい放題だが。
>>749 >
>>744 > @filelistのなかに、送信するファイルの一覧が入っています。
こんなバカを言って澄ましている節穴眼野郎が、
>
>>745 >
> 一応mailerサブルーチンの中身は全部my変数にしてあります。
> jcodeとかmimewの問題なのでしょうか?
とかほざいても信用できないね。
まったくだw
>>751 あーわかった。
&benflushの形式で呼び出すと@_がひきつがれてしまうので、$codingに
不正なパラメタを与えてしまってたんだろう。benflushはしらない
パラメタが与えられると何もしないのでいろいろいやなことが置きそうだ。
最初の一つが大丈夫だったのもたぶん偶然半端がでてなかったとか
なんじゃないかな。
いまどきのperlではサブルーチン呼び出しに&つけるのはやめた方が
いいよ。(あえて必要な場合を除く)
いったい何の話やら
オブジェクト指向のところがさっぱりわからん。
C++やjavaは、別に分からんことないのに、
perlのオブジェクト指向は、なんか良く分からん。
バカな俺のために、もっと見通し良く実装してくれ・・・
>>758 perlのオブジェクト指向ってのは変数やサブルーチンを区分けされた
名前空間でリファレンスとして扱うってだけのことで、Javaのように
オブジェクト指向を徹底しているわけではないのね。
このなんちゃってOOPが慣れると結構使い易いんだわ。
Perlのいい所(あるいは最悪の点)は、他の言語のいい所を適当につまみ
食いしてるところなんだよね。
>>739 そんな貴方にはObjective-Cをお勧めします。
>>758 Perlのオブジェクト指向メカニズムは、
確かに異常に変だな(笑
761 :
デフォルトの名無しさん:05/03/07 02:28:02
コンソールの文字の色などを変えるようなモジュールってありますか?
>>761 Term::Cap
Term::ANSIColor
すまんこ。再び本当にすまんこ。
use Encode;
binmode STDOUT, ":encoding(euc-jp)";
open IN, "< :encoding(shiftjis)","sjis.txt" or die;
としたファイルハンドラINをサブルーチンに渡すところで
またまたつまづいてしまいました。以下
$cnt = Getlines(\*IN);
print $cnt;
exit;
までがメイン。サブルーチンは
sub Getlines {
my $fh = shift;
my $count = 0;
while(<$fh>) {
$count++;
}
return $count;
}
なのですが、実行すると
shiftjis "\x87" does not map to Unicode at unko.pl line 20, <IN> line 829.
shiftjis "\x94" does not map to Unicode at unko.pl line 20, <IN> line 829.
とエラーを吐きます。Perlのバージョンは5.8.5。
サブルーチン内でも文字コード云々の対策が要るのでしょうか。
>>764 それはエラーじゃなく警告だろ。
open IN, "<:encoding(CP932)", "sjis.txt" or die;
う、かたじけない。警告でした。
CP932にしたらやたらと出てた警告も
"x85"と"x9F"だけになりました。
サンプルに2chの.datファイル20個ほど使って
警告二つなら安心して使えます。どうもです。
767 :
デフォルトの名無しさん:05/03/08 03:13:59
今日からperl始めたら
何日で掲示板が作れるようになれますか?
就職がかかってますのでマジレスキボンぬです
768 :
デフォルトの名無しさん:05/03/08 03:24:16
Perlで無理にオブジェクト指向するくらいならRuby使うよ
>>767 一応マジレスすると、一概に言える訳ないだろヴォケ。
perl以外の言語の経験、プログラミングの経験によって答えは変わる。
>>767 3日。
一通り網羅された本を手元において、
他人書いた掲示板のソースコードを解読してけばいいんじゃない。
>>767 しかし書き込みの程度からして一ヶ月はかかるな、こりゃ
プログラミング経験がほとんどないように見える
新しい言語にすぐなじめるような経験がある人ならこんな質問はしない
まあ、まったく経験が無いとしたら、
出来上がった掲示板が使い物になるかは別問題だけどなー
セキュリティ知識とかCGI動作原理とか覚えることは色々あるぞ
プログラミング経験が無いならみっちり6ヶ月はやってほしい。マジで。
最低限のセキュリティ知識がないと怪我をしかねない。
掲示板って言ってもめちゃめちゃピンキリなのでは
776 :
デフォルトの名無しさん:05/03/08 16:13:49
6ヶ月か
767だけど
プログラミングは高校のときのベーシックでライン引いたりした以来です
つーか板違い。
とりあえず、どんな掲示板が作りたいかくらい言えるようになれ。
>>775 > 掲示板って言ってもめちゃめちゃピンキリなのでは
バンド幅が狭かった昔は、多くの大学でWeb掲示板を動かしたり作ったり
するのが禁止されてたりしたな。
よく分かってない人が作ると、利用者がリロードする毎に30MBも再ロード
するような何も考えてないシステムになるからな。
2chって、Perlで出来てるの?
780 :
デフォルトの名無しさん:05/03/08 22:37:27
まさか
WindowつかってCPANをやろうとしてます
CPANでmakeまでうまくできてるみたいなんですけど、
C:\.cpan\buildに展開されてるだけで、インストールされてないみたいなんですけど、
どこか設定ミスってしまったのでしょうか?
可能性あることをおしえてください
CPANのインストールが出来ただけだと思う
print で出力すると数値も文字列となって出力されますが
数値又はバイナリとして出力する方法はありますでしょうか?
ActivePerlの-Cオプションの意味・使い方を教えてください。
doc見ても簡単すぎてさっぱりわからない。
788 :
デフォルトの名無しさん:05/03/09 20:18:49
$r = int rand (9);
$h-i-rady = 'i-rady-mb'.$r.'jpg';
これで、エラーになるんですけど、なぜかわかりません
おせえて
$r = int rand (9);
$h_i_rady = 'i-rady-mb'.$r.'jpg';
791 :
デフォルトの名無しさん:05/03/10 16:43:59
Perlの.NetFramework版ってActiveStateで売ってあるやつしかないの?
フリーで欲しいんだけど
Template Toolkitの構文をインデント付で記述したいのですが
START
[% IF 1 -%]
[% IF name == 'doraemon' -%]
boku doraemon
[% ELSE -%]
boku nobita
[% END -%]
[% END -%]
END
だと出力結果が
start
boku nobita
end
bokuの前のスペースは仕様上しょうがないかもしれないけど、せめて
START
[% IF 1 -%]
[% IF name == 'doraemon' -%]
boku doraemon
[% ELSE -%]
boku nobita
[% END -%]
[% END -%]
END
と記述したいです 実際の出力結果は
START
boku nobita
END
今NOVAってますが日本語のドキュメントが少なくてつらひです
こうすれば行頭を見れば地の文か制御ロジックかの見分けが付きやすくなって良いと思うんだけど、ダメかな。
START
[% IF 1 -%]
[% IF name == 'doraemon' -%]
boku doraemon
[% ELSE -%]
boku nobita
[% END -%]
[% END -%]
END
問合せたURLの画像ファイルがあればTrueを、無ければFalseを返す関数。
だれかもってませんか?
sub exist_url { `wget --quiet --spider $_[0]`; !$?; }
>>792 [%- foo -%]
だと何か問題あるんだっけ?
sub exist_img {
use LWP::Simple;
return get($_[0]) ? 1 : 0;
}
strtol?
ありがとうございます
>>801 そうですね、C言語で言うところのそれです。
ltoaなどなど。
>>802 20進数や30進数などが作りたいのですが、
ページの最終行を見る限り、perlはこういう処理は
苦手なのか…。
今回は頻繁に呼び出さない処理の予定なので、Cで作って
外部コマンドで実行した方が手っ取り早い気がしてきました。
>>803 Cの関数ならPOSIXモジュールに幾つか定義されているから使えるかもしれん。
806 :
デフォルトの名無しさん:05/03/12 01:35:37
$a $b $c のうち二つが真ならば評価する式は
($a && $b)||($a && $c)||($b && $c)
これが一番短いですか?
>>806 演算子重視じゃなくていいなら、俺ならこんな感じにする。
(gerp {$_} $a, $b, $c) >= 2;
なんて言うか、意味的に分かりやすいから。
あ、807のほうがいいと思った。
810 :
デフォルトの名無しさん:05/03/12 02:26:39
遅くなりましたが皆様回答ありがとうございました。
>>793 今すぐ実践出来そうなので早速使ってみようと思います(゚ー゚*)
>>798 [%-が直前の行の改行から[%-までのスペースを削除するというのが
今回の用途ではちょっと使いにくいんですよね><。
START
[% name = 'doraemon' -%]
[% IF 1 -%]
[%- IF name == 'doraemon' -%]
boku doraemon
[%- ELSE -%]
boku nobita
[%- END %]
[% END -%]
END
にて希望通りの動作しましたが削った改行、それを補うための改行を
出力する場所を考えると脳みそぷるるん
おばんです。
Windows上で日本語ファイル名を読み取らなければならない時
どうしてますか。
カレントフォルダ内ののファイル名を得るとして
use Encode;
while(<*.txt>) {
$fname = decode("cp932",$_);
. . . .
みたいにしても
opendir DIR,".";
binmode DIR, "encoding(cp932);
. . . .
としても、結局入ってくる文字は化けてしまう…。
>813
あなたの言う「化ける」とは何をどうしたときにどうなることを指すのか説明してください。
で、ディレクトリハンドルに binmode してどうする、っつーか use warnings; したら警告でますが。
あーごめんなさい。
<*>なりopendir() readdir()なりしてディレクトリ内にあるファイルの名前を得たいと。
得たそれをSTDOUTなりテキストファイルなりに書き出すと
x\[0023]x\[0021]....
みたいな記号の羅列になっているということです。これを元の日本語として出力するには
どうすればいいんでしょうか。
ポカーン
化けてる訳じゃないから何の問題もない
うむ、まるっきり予想通りの展開。
decode() することによって文字コードが CP932 → UTF-8 になっていることは分かってますか?
従って、書き出したテキストファイルを UTF-8 が読めるエディタ等で開けば普通に日本語で読めるはずです。
あるいは、encode() し直せば CP932 に戻るので Windows 上で普通に読めるでしょうね。
ファイル名に対して文字列処理をしないのならばわざわざ decode()/encode() する必要はないでしょう。
教えてください
perlで構文エラーを出さないように
英語の文章を書く(※動作は見ない)
なんて冗談みたいな話があるって
聞いたのですが、googleで探しても
そんな情報が見つかりません。
誰かご存知ないですか?
>>819 > 誰かご存知ないですか?
知ってるよ。詩を書いたりとかね。
去年は、俳句コンテストもやってたし。
#!/usr/bin/perl
@num = qw ! one two three four five !;
print "数字を入れて\n";
chomp ($input=<STDIN>);
push @num,$input;
print @num;
これはどこがおかしいでしょうか。例えば6を入力して
one two tthree four five 6
という答えが返るようにしたいのですが、実際には何も表示せずに終了してしまいます
>>823 最後に print "\n"; って付けてみな
Perl的には出力してるけど、シェルがかき消してる
改行すれば消されずに済むよ
ついでに、 $,=" "; ってしないと配列が繋がる。
おお成功しました。ありがとです
・・・
なんか良い開発環境とかあります?
フリーでも有料でも。
828 :
デフォルトの名無しさん:05/03/14 19:05:16
質問させていただきます。
戻るのボタンクリックして戻ったり、更新ボタン押した時に
「戻らないで」と表示させる方法を教えてくれませんか?
教えてください。
831 :
デフォルトの名無しさん:05/03/14 21:00:55
>>831 もしそういう目的なら、セッション管理して一度先に進んだら
戻ってやりなおしてもダメって制御した方がいいんじゃないの?
835 :
デフォルトの名無しさん:05/03/14 21:07:50
>>831 いや、「つまり」じゃなくてさ人の話を聞けよ
次は「わからない人は黙っててください」と言うに65535perl
わからない人は書き込まないでください
やさしくしてね
( ゚д゚)、ペッ
ここは話のわからないインターネットですね。
次
↓
ターン
(゚д゚・)・∵; …━━━━
845 :
デフォルトの名無しさん:05/03/15 00:16:49
仲良しビームッッ!(@u;@);
(@u@ .:;)ノシ おはようビーム!
なによその顔文字、ふざけてるの?
849 :
デフォルトの名無しさん:05/03/15 00:40:34
なんだと
>>848 じゃぁ、perlで円周率を小数点以下100万桁まで計算する方法を教えて下さい。
853 :
デフォルトの名無しさん:05/03/15 08:19:38
perlを使ってどうにかそういう不正行為をなくしたいんです。
方法はあるはずなのですがどうしてもわかりません
もしそういう目的なら、セッション管理して一度先に進んだら
戻ってやりなおしてもダメって制御した方がいいんじゃないの?
perlを使ってどうにかそういうスレ違いな質問をなく(ry
ここはPerlの言語仕様についての質問しか出来ないスレですか?
858 :
デフォルトの名無しさん:05/03/15 13:06:49
>>855 ありがとうございました。無事にできました。
859 :
デフォルトの名無しさん:05/03/15 13:11:02
|
>>858をお迎えに上がりました
\__ _________
V
凸\_________/,凸、
ノ´⌒`ヽ三三三三三三三i三.ノ´⌒`ヽ、
[二ノ´金`ヽ二]二二二二二二i仁ノ´劵`ヽニフ
,.-┴―┬┴┐鬨鬩鬨鬩鬨鬨鬩鬨
/ΛΛ //ΛΛ||L匳匳||卅||匳匯||匳||
/_(゚д゚_//_゚Д゚,,)| |丗卅丗卅丗卅丗卅丗
_,,,.-―''''"_,,,.-―''''"|コ ̄ ∪i  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
i゛(}[王i王]I()0コ ―― |―――=|――――――――――〕
|_∈口∋ ̄_l_l⌒l ノ ノ ___l⌒l_ソ
 ̄ ̄`ー' ̄ `ー' ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄`ー' `ー'
ぱいチンコびろーん
∩___∩
| ノ ヽ/⌒)
/⌒) (゚) (゚) | .|
/ / ( _●_) ミ/
.( ヽ |∪| /
\ ヽノ /
/ /
| _つ /
| /UJ\ \
| / ) )
∪ ( \
\_)
861 :
デフォルトの名無しさん:05/03/15 14:48:59
今自作スクリプト作っているのですが、
#メンテナンス中にするか(メンテナンス中は1。1にするとゲームを中断させることができます。
$mente = 1;
#メンテナンス中の時に出すメッセージ
$menteme = "ただいまメンテナンス中です。しばらくお待ち下さい。";
--------------------省略---------------------
#メンテナンス
if($mente == 1){&error("$menteme")}
と記述して、$menteme = 1;とやると500エラーになります。
なぜでしょうか?
Rubyスレと違って
Perlスレは下品だしスキル低いね・・・
864 :
デフォルトの名無しさん:05/03/15 15:09:02
もし Larry Wall が死んじゃったらどうするの?
後継者とかいるの?
お前やれ
Rubyスレのどこが(ry
昔PerlスレでPerl叩きやってたるびきちって最高に下品だったね。
>>864 > もし Larry Wall が死んじゃったらどうするの?
なんの変化もないよ。
ここでいいのかな?
ExtUtils::MakeMaker で作った Makefile を使うと、
Test::Unit や Test::Class と一緒に使うのがスゲーまんどくせーです。
# Test::Unit の方は Test::Unit::HarnessUnit があるから幾分マシだけど…。
ExtUtils::MakeMaker で、make test の挙動を変更したりとかできませんか?
Test::Harness 嫌い(#´Д`)
>>861 せめて maintain と書いて欲しい
自己レスです。
ExtUtils::MakeMaker(3pm) の Overriding MakeMaker Methods にやり方が書いてありました。
Makefile.PL の中で、MY::test() を定義してやれば上手く行きそうです。
872 :
861:05/03/15 17:45:32
結局なぜなのでしょうか?
文法チェックしてみましたが記述は間違えていなかったようです。
874 :
デフォルトの名無しさん:05/03/15 17:52:06
ちんこ隠しました
∩___∩
| ノ ヽ/⌒)
/⌒) (゚) (゚) | .|
/ / ( _●_) ミ/
.( ヽ |∪| /
\ ヽノ /
/ /
| /
| /● \
| / ) )
∪ ( \
\_) ちんこちっさっ!!
>>861 1. 断片的で答えようがない
2. シンタクス的に問題はない
3. errorというサブルーチンが無いという落ちではありませんよね?
4. まさかPerl以前の問題だったりはしませんよね?
5. 時に、
>>1は読まれましたか?
>>861 条件判断が $mente == 1 なのに入力が $menteme = 1 となってて、変数名を混乱してるようだな
880 :
デフォルトの名無しさん:05/03/15 20:21:31
それだw
881 :
861:05/03/15 20:26:49
>>877 perlとはCGIの開発によく使われるプログラミング言語のこと。
CGIとはWEBサーバーとブラウザ側で双方向のデータのやりとりができるプログラムのこと。
CGIとperlの区別はついていますよ?大体どこがCGIの質問なんですか?
どこ考えてもperlの質問でしょう?
syntax error の訂正も自力でできないような奴の質問は noisy なので、
Web プログラミング板に行ってくれ。というか俺がいるスレで質問するな。
…と、そういう事が言いたいんじゃないのか?(´ー`)
>>881 じゃあ「500エラーになります」って何なんだよ?
実行環境もエラーメッセージも適切に示さずに
的確な回答を得ようなんて浅ましすぎるんだよ。
CGIとはWEBサーバーがプログラムを起動してクライアントに結果を返す際のインターフェイスのこと。
885 :
861:05/03/15 20:57:35
実行環境
OS:WINDOWS XP
ウェブサーバアプリケーション Apache
エラーメッセージ 500 Internal Server Error
>>881 じゃあ、Webサーバー通さずにそのスクリプトのみで実行してから質問しろ
>>885 error_log も出すんだよ。ヴォケが。
>>885 > エラーメッセージ 500 Internal Server Error
こんなこと書くようではなぁ。
webprog板に行けばきっと幸せになるよ。
889 :
861:05/03/15 21:04:56
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
890 :
デフォルトの名無しさん:05/03/15 21:07:32
>>885 まさしく「CGIとPerlの区別がつかないバカ」だな。
>>889 画面じゃなくてApachのエラーログだろ。どこにあるか知ってるよね?
>>889 > More information about this error may be available in the server error log.
それだよ、それ
英語読む気もないのだろう。
>>861そんなにこのスレに書きたければWebサーバ上で実行するな
861、恥の厚化粧w
897 :
デフォルトの名無しさん:05/03/15 21:16:07
>>889WEBプログラミング板逝くと楽になれるよ。。。
あなたと同じぐらいのスキルの人たちがいっぱいいるよヴァカ
>>892この誤りに関する詳しい情報はサーバ障害記録で利用可能であるかもしれません。
という意味だよ。。。ヴォケ
>>892 Apachって何?Apacheの名前もしらない人がそんなこと言う資格はないと思うよ。
898 :
デフォルトの名無しさん:05/03/15 21:20:51
>>861小学生にしては良くやったと思うよw
早くおうちに帰りなさい
ActivePerl5.8.6でUDPソケットを一つ作って、ithreadで
送信と受信を別々のスレッドで動かしてみたんだけど、
受信スレッドでselect中に送信スレッドで同じソケットに
sendしたところ、selectがタイムアウトするまでsendが
ブロックされてしまいました。同じスクリプトをLinuxで
実行してみましたが、sendがブロックされるようなことは
ありませんでした。
これ、sendがブロックされる原因は何処にあるのか
ご存知の方いませんか?
902 :
861:05/03/15 21:32:47
ロクにスキルもないのに書き込んですみませんでした。
これからはもっともっとperlの勉強をして出直したいと思います。
>>902 いや、perlの勉強って訳じゃなくてね・・・。
perlの勉強はこのスレでしても良いんだよ?
>>902 スキルの問題じゃなくて、質問の仕方が問題なの。
もっと的確にエラーや状況を説明するようにしないと。
905 :
861:05/03/15 21:55:53
わかりました。状況も詳しく説明しないのに
教えてもらおうなんて虫が良すぎますよね。
次からは気をつけます。本当にすみませんでした。
>>899 > 誰も
>>879-880につっこまないの?
そっとしておいてやれ。
今ごろ、顔を真っ赤にしてもじもじしている
かもしれないんだから。
見ないふりしてやれ。
Perlって多少間違ってても動いちゃうからバグ見つけるの大変だ
最近はJAVAに浮気中
ひさびさにPerl触ると、文字でも数字でも入る変数に便利さより戸惑いの方が大きい・・・
>>861 まあ・・・原因は予想つくけどね
# ここでは言わないのがマナーであろうな
まだ解決してなかったら素直にWebProg板に行ってらっしゃい
向こうで見かけたら答えてあげるから
まあJavaと比べちゃうとPerlはカタナシだよなあ
上手いこと言ってません
>>901 ithreadsはネイティヴスレッドなので実装はOSによって大きく異なる。
…漏れに判るのはそれだけ。すまん。
>>905 WebProg板で同じ質問したら多分答えてもらえる。
パンを食いたきゃパン屋へ行け。肉が欲しけりゃ肉屋行け。
そんな当たり前のことが何故できん?
913 :
デフォルトの名無しさん:05/03/16 07:00:04
>>912 スーパーに行ったらパンも肉も買えるよw
>>913 疑問なのですが、どうしてそんな的外れな発言が出来るのでしょうか?
才能?
精肉コーナーに行ってもパンは手に入らず、パンのコーナーにも
肉は置いてないだろう?
>>914 別に的外れでもないと思うぞ。言っていることは頓珍漢だけど
問題はここがスーパーじゃないということだろが
そうだ、ここはスーパーじゃない。
スーパーの裏のゴミ捨て場。
朝からご苦労様です
918 :
デフォルトの名無しさん:05/03/16 09:10:31
>>915 頓珍漢なのが才能なのでしょうか?
2ちゃんねる全体はスーパーではあるけどね。
919 :
デフォルトの名無しさん:05/03/16 09:32:40
なんか、珍獣を可愛がるスレになってるな
>>907 君の彼女が君の父親に浮気しても
「彼女の動作も父親の動作も
すべて仕様どおり。想定の範囲内だす」と
んー、は?
924 :
デフォルトの名無しさん:05/03/16 15:18:27
正規表現を学ぶのに最適なサイト教えてください
926 :
デフォルトの名無しさん:05/03/16 17:56:18
パール超初心者なんですが、perlがlocalで動きません。どうもperl.exeがちゃんと認識されていないようです
OS WindowsXP Pro ,
Perl ActivePerl-5.8.6.811-MSWin32-x86-122208
apache_1.3.26-win32-x86-no_src
を使っています。
ActiveperlはC:\usr\localにインストールし、
apacheを起動させて、ブラウザのアドレスに "
ttp://local/・・・・ " と打つと、
CGI以外のhtml等はちゃんと表示されるのですが、拡張子がCGIではInternal server errorが出てしまいます。
CGIファイル中のperlのパスも合ってるんですが・・
どなたかこの問題の解決方法がわかる方、教えていただけませんか
>>861 のすぐあとでコレってもうネタか釣り以外考えられないだろ?
>>911 荒れてる中レスしてくれてサンクス
今のところWindowsでの解決策がないので、切り捨てるしかなさそうです。
>>926 Apacheのhttpd.confでCGIを許可する必要がある。
Options ExecCGI, Include, AddHandler あたりがキーワードだ。
あとはググるかWebProg板へ煎って暮。これはPerlの問題でもFAQでもないんでね。
無事動いた後、Perlのテクニック的な問題で壁につきあたったらまた来るがいい。
グドラク!
>>930様
色々いじってみたんですがやっぱりうまくいきません・・
具体的に教えていただけませんか
>>931 釣りじゃなければ、まずお前が具体的にソースコード教えろ。
そうじゃなきゃ誰にもわからん。
> 色々いじってみたんですがやっぱりうまくいきません
いじりかたがわるいんだろうね
>>931 しかたないな、のび太くんは。
「ScriptAlias」でcgi-binフォルダが外部にエイリアスされてないか確認。
俺も昔いつだったかhttpd.confがデフォでScriptAliasを設定するように
なった時、htdocs以下のcgi-binフォルダを無視されてえらいハマったっけな。
がんがれ。スレ違いなんでホントに最後だからな。あとはWebProg板へ池。
print "表1を参照";
print "<table><tr><td>";
:
:
がうまく表示されないよぅ、とかのレベルになったらまた来るがいい。
スレ汚し許せ>ALL
なんかちょっとperl覚えてCGIとかやりたい初心者が、環境構築が出来ない
故にperlを嫌いになって欲しくないんで助けてやりたくなったのさ。
ActivePerlをC:\usr\localにインストールしたのなら、
スクリプトの最初の行は
#!/usr/local/perl/bin/perl
だと思われるが、それは大丈夫だろうな。
というか、エラーログ嫁。
Apacheってデフォ設定でCGIファイルの一行目のパスを参照するの?
それのどこがPerlの質問なのかね
様式美になってきたな
>>938 いやいや、上のやり取り見てたらね・・・
俺はApache使ってないからわからないんだけど・・・
WindowsでPerlのパスが通ってないってオチじゃないよね・・・
だから、そういうものが関わる質問は一切無視だと何度言ったら(ry
>>935 > スレ汚し許せ>ALL
> なんかちょっとperl覚えてCGIとかやりたい初心者が、環境構築が出来ない
> 故にperlを嫌いになって欲しくないんで助けてやりたくなったのさ。
この汚れを拭い去るのに、数スレを消費し、優に1年を要することは珍しくないのである。
そんくらい目つぶってやれよ
こんな駄スレが1年使いものにならなくなってもだれも困らねえだろ。
945 :
デフォルトの名無しさん:05/03/17 07:08:30
あざーす
あっざーす
もうそろそろ次スレのことを考えておいた方がいいな。
様式美 ヘビメタ万歳 パーカッションを語るスレ
スレ違いの質問は適したスレに誘導するほうが
双方にとっていいと思うのだが。
>>949 それが分からないバカな子が居るってだけの話さ
>>950 だな。質問する方もする方だが、答える方も答える方だ。
というわけで、次スレよろしく。>
>>950
まだ50もあるよ・・・
1000取った椰子はPerl神
Perl6はまだですか?
こないだ5.9あたりを見かけたが
>>956 5.9は5.10になるから6とは関係ない。
6は……ある程度なら実装があるっぽい。
ライブラリとかがないから仕事で使いにくそうだけど。遊びなら。
Perl6::Classes使って見れば雰囲気は味わえる
>>958 まぁおそらくプリプロセスかましてるだろうから
速度的にアレなんだろうな。
960 :
デフォルトの名無しさん:05/03/19 21:35:42
じゃPerlの標準関数でしりとりしながら埋めようか
getppid
die
die
うへ、かぶた
964 :
デフォルトの名無しさん:05/03/19 21:52:57
each
hex
uhawwokwww
chomp
空手chop
if( i == 10 )
continue;
pos
next if $i == 10;
5.9から5.10になるのはなんか違和感ありませんか
ドットと小数点の区別は付けとけ。井桁とシャープみたいなもんだ。
$VERSION = 1.10;
ってやってハマることってよくあるよね?
>>973 D知ってる奴は慣れっこだ
なにせ、DMDは0.99->0.100になったからな
# イツニナッタラ1.0ニナルンダヨ
(x-1).9が開発版で、正式版をx.0として出すバージョンのつけ方もあるからややこしい
例えばXFree86なんかがこの方式
>>975 $VERSION = v1.10;
とするとか。
>>978 v-stringはdeprecated。
リャマ本読んで習得中の者ですが、perlでVB、VCのような視覚的コードディんグって
可能ですか?
フォームに自動記入とか、オートログインやりたいことが沢山あるのですが
作業の自動化とか...何から手をつけてよいものやら...リャマ本を何度も何度も
読み返してはいるのですが、やりたいことの敷居が高すぎて、
遊びで計算、集計などチマチマとコーディングしながら学習中です
>>980 > リャマ本読んで習得中の者ですが、perlでVB、VCのような視覚的コードディんグって
> 可能ですか?
お前に可能だとはとても思えない。
手段はあるが知能が足りないので無理って意味ですか...なるほど。
オイラにはコマンドライン→ファイル出力が限界なのですね...
素直にVB,VC選択しとけばよかった...はうう、明日、宅配便ラマ本到着
するなあ、手遅れか。 切腹
>>982 視覚的コードディんグってのが何なのかわかんない
CGIの質問なら板違い
ええと、VC系だとボタンやチェックBOX等オブジェクトを容易に作成でき
クラス分けしコーディングしてますよね?
それを視覚的と呼びましたスイマセン><
perlもオブジェクト指向なのですが、オイラの技量じゃコンソールが精一杯
なのです。コマンドライン操作ではなく、直感的なボタン等が欲しかったのです。
また、他のアプリ定型作業をperlで自動化させたいなあ っと儚い夢を抱いておりました
>>984 適当なGUIモジュールを入れれ
[GUI perl]でググれば出てくる。
VB,VCみたいなやさしい環境は期待するな。
Perl/Tk用のGUIビルダがあると、何かの本で読んだことある
リャマ本の最後にGUIについてちょっと書いてある
詳しくはO'Reillyの入門Perl/Tkを読んでください、と
Fight!(*^ヮ^*)
IDEが欲しいってだけの話なんじゃないかな...
Windows限定で良いなら、Win32::GUI::Loftはけっこうお勧め。
簡単なGUIビルダーもついてるよ。
Perl6 っていつ(ry