"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2006/01/29現在の最新版: 5.8.8
● 2006/01/29現在の開発版: 5.9.3
リンク集は
>>2-3 過去スレは
>>4-5
乙
実用perlプログラミング第2版はどうしてcbook24では発刊予定としてリストにあるのに オライリーでは何も情報がないのですか?
>>9 ありがとうございました。
firefox1.5.0.1でそのページを見ていたのですが、なぜか表示されないんですよね。
近刊書籍の部分だけ・・・
IEで見たらちゃんと表示されました。いったいなぜなんだー
両方のブラウザでページのソースみてみたら、
firefoxの方では、近刊書籍のリストの部分がごっそり欠如していました。
広告削除拡張入れているわけでもないので、欠如する理由がわからない。
なんだよオライリーはIEびいきかよ
11 :
デフォルトの名無しさん :2006/03/08(水) 14:11:43
> 実用Perlプログラミング 第2版 4-87311-280-X\3,360 2006年03月 相変わらずオライリー高いなあ……と思ったら、 第1版 4500円じゃん?!
>>10 親分格の Mozilla Suite 1.7.12 では正常。
ここだけの話、うちの Firefox 1.5.0.1 では正常に表示されているわけだが。
実用perlプログラミングって、難しそう もとの本がAdvaced Perlとかいう本らしいし
15 :
デフォルトの名無しさん :2006/03/08(水) 17:39:04
>>14 なに弱音を吐いてるんだッ!!
この本は君のようなAdvanced Perlerのために書かれた
本じゃないかッ!!!
17 :
安西先生 :2006/03/08(水) 18:43:13
>>14 諦めたらそこで試合終了だよ
,.‐- 、
廴ミノ
///¨' 、
y':;:;:;:/⌒i!
J:;:;:;:;};:;:/;},
;il||||li' t`'---‐';:;:;:l
,.r'"''、,┘ 7;:;:;:;:;:;:;:;「
ノ4 (⌒i .}:;:;:;:;:;:;;/
/..,__彡{, | `i:;:;:;:;:;}
( .ミi!} l、 .」:;:;:丿
クュ二二`Lっ) `==='
18 :
三井クン :2006/03/08(水) 18:50:47
,.‐- 、 廴ミノ J ブーン ⊂二二///¨' 二二二つ y':;:;:;:;:;::;;;} (:;:;:;:;;:;:;:;::;;}, t`'---‐';:;:;:l (´ .___ノ \\ \\ レ' \\ 三 レ' ;il||||li' ブーン ⊂二二二'"''、,┘二二⊃ ノ4 / /..,__彡/ ( ヽノ ノ>ノ 三 レレ
既に終わった人生という試合はどうすればいいですか?
22 :
デフォルトの名無しさん :2006/03/08(水) 21:14:53
open(FH,"<./data.log"); flock(FH,1); @d=<FH>; close(FH); flock(FH,8); foreach $data (@d){ ($q,$a)=split(/=/,$data); printf("問題:$q\n解答例:$a"); }
foreach (@d){ /=/, printf ("問題:%s\n解答例:%s\n", $`, $'); } printfの使いかた違うし。
×/=/, ○/=/;
25 :
22 :2006/03/08(水) 21:54:59
ぐおお Cが入った
>>11 安くなったのは多分、内容が入れ替わって本自体が薄くなったから。
洋書置いてる本屋なら Advanced Perl 2nd Edition 売ってるよ。
>>25 または
print "問題:$q\n解答例:$a\n";
か、律儀に
print '問題:', $q, "\n", '解答例:', $a, "\n";
>>30 完全に別物だね。
第1巻、第2巻という風にしてもよさそうなもんなのに。
32 :
デフォルトの名無しさん :2006/03/09(木) 00:18:59
某サイトで'c:\tools\perlmail\msg\alert.txt'の中に送りたいメッセージを書いとけば 送信できるYO!とあったのですが、やってみてもどうしてもメールの送信すらできません。 これはどのようにコードを改良すればできるのでしょうか? use Net::SMTP; my $from_address = 'sender'.'@'.'provider.com'; my $sender_name = "Any Name"; my $to_address = 'recipient'.'@'.'destination.com'; my $subject = "nurupo"; my $message = ""; my $filename = 'c:\tools\perlmail\msg\alert.txt'; open(INFILE, $filename); my $mail_server = "outgoing.verizon.net"; $smtp = Net::SMTP->new($mail_server, Debug=>1); die "Couldn not connect to server" unless $smtp; # Authenticate the user $smtp->auth ('sender', 'password'); # Prepare for sending $smtp->mail($from_address ); # use the sender address here $smtp->to($to_address); # recipient address $smtp->data(); # Start the mail $smtp->datasend("To: $to_address\n"); $smtp->datasend("From: $from_address\n"); $smtp->datasend("Subject: $subject\n"); $smtp->datasend("\n"); while () { chop; $message = "$_\n"; $smtp->datasend($message); } # Terminate $smtp->dataend(); # Finish sending the mail $smtp->quit; # Close the SMTP connection
つうか著者からして違うのもんなぁー でも 2nd Edition も有用(というか現代的)なので買ってそんはしないよ Perl Best Practice とセットで買え
例示に実在するドメインを使う香具師に何も教えたくない。
>>34 元のファイルをそのままコピーしたもので。。。スマソ
undefについて教えてください。 undef $scalar; とすれば、undef値がスカラー変数に入ると思いますが、 undef @array; や undef %hash; とやるとすべての要素にundef値が入るってことなのでしょうか? それともメモリ開放ですか?
un defined のことです。
補足 perlは未定義値を入れるということはできないので。 Rubyのnilみたいな
40 :
36 :2006/03/09(木) 00:43:58
ありがとうございます。 じゃあスカラー変数に対するときだけ、undef値代入ってことですね。
undef() は undef値を返すから、それを左辺に代入する事はできるぞ
1かundefかって話で、$hoge eq undefできないってことでは? 身近なのでJavaScriptの if (huga == false) {}みたいな 違うか。
43 :
32 :2006/03/09(木) 09:40:28
すみませんが、どなたかよろしくお願いします。
>>43 エラーメッセージとか何か出てない?
どこまで正しく処理できててどこでどんなふうにコケたかとか、
状況が良くわからないとなんとも。
45 :
デフォルトの名無しさん :2006/03/09(木) 10:36:31
レスありがとうございます。 SMTPの窓が開き、認証は終わり、こちらのメールアドレスを送信し終わったところで 止まります。 たぶん、 >$smtp->mail($from_address ); # use the sender address here か >$smtp->datasend("To: $to_address\n"); のどちらかだと思うのですが。 本文の送信部分までは至らないです。
>>39 いや。できるって。
$a = undef; は可能。
@a = (undef, undef, undef); みたいなのも可能。
但し @a = undef; とやると @a = (undef); になってしまうので
undef(@a); とは意味が違う。
>>42 my $a = undef;
if ($a == undef) {
print "これは出来るんだが…。\n";
}
でも SQL の is null みたいに undef かどうかは defined() で
別途判別するのがいいような気がする。
>>45 MAIL FROM:<XXXX>
RCPT TO:<YYYY>
のそれぞれに対する応答はどんなのが返っている?
>>45 while () {
まさかここに条件が入ってないまま実行してたりしないだろうね。
これそのままだと無限ループだぞ・・・
>>47 ところが、それは
my $foo = "";
if ($foo == undef) {
print "true¥n";
}
でも trueになってしまうので defined 使うしか無いんだよね。
>>49 <INFILE> が、投稿時に消されてしまったのではないかと思われ。
fcntl() の F_GETLK の返り値はどこに入るんでしょうか? 引数と同じ? でも入りません。Linux なんですが。 別のプロセスでロックを掛けておいて use Fcntl; $b = pack('s2l3', F_WRLCK, SEEK_SET, 0, 0, 0); fcntl(F, F_GETLK, $b); をしても $b に変化がない。 C言語で同じやつを作ると l_pid にちゃんとPIDが入って来ます。
55 :
デフォルトの名無しさん :2006/03/09(木) 14:57:09
56 :
デフォルトの名無しさん :2006/03/09(木) 15:21:26
PerlでCSVファイルから名前がBBBのタイトルを抽出する場合って下記のように一行ずつ調べていくやり方しかないんでしょうか? SQLみたいに抽出できないんですか? foreach $line(@lines){ @data=split(/,/,$line); if($data[1] eq "BBB"){ $title=$data[3]; last; } } print "$title" (CSVファイルのデータ) 番号,名前,メール,タイトル,本文 1,AAA,,無題1,本文1 2,BBB,,無題2,本文2 3,CCC,,無題3,本文3 . . . 200,AAA200,,無題200,本文200
>>56 > PerlでCSVファイルから名前がBBBのタイトルを抽出する場合って下記のように一行ずつ調べていくやり方しかないんでしょうか?
そんな事はない。工夫次第。
58 :
安西先生 :2006/03/09(木) 15:32:12
>>56 >> PerlでCSVファイルから名前がBBBのタイトルを抽出する場合って下記のように一行ずつ調べていくやり方しかないんでしょうか?
>そんな事はない。工夫次第。
でもまあ、普通はそんな感じ。
>>56 仮にSQLが使えたとしても、SQLの内部動作はそれとほぼ同じになると思う。
(実際には構文解析とかもあるのでもっと複雑)
その他、予め全部読んでおいてキーとなる項目をハッシュに
入れておくという方法がある。これはデータを何度も検索する
場合は都合が良いが、ファイルを一回読んで一回しか処理しない
という場合は(全部読んで保存しておく必要があるため)無駄が
多いと思う。
# 予めこんな風にしてハッシュを作る。
for (@lines) {
@d = split /,/;
$h{$d[1]} = [@d];
}
# 検索はこれだけで済む。
if (defined($h{'BBB'})) {
$title = $h{'BBB'}[3];
}
61 :
デフォルトの名無しさん :2006/03/09(木) 17:05:44
つ〜か、CSV全部を単一のスカラに読み込んで、indexでパターンを探して、 その行を切り出して目的の行か調べる。というのもかなり速げ。
62 :
デフォルトの名無しさん :2006/03/09(木) 18:44:13
>>48 それぞれのメールアドレスがきちんと表示されてます。
>>49 >>51 えっ?そのままですが・・・・・?
そのままだとファイルの中身をすべて送ってくれると思っていたのですが。
元々の引用元もそうだったので。。。
も、もしかして私、一人漫才やってますか?(汗)
試しに
>>51 さんの発言を中に入れてみたのですが駄目でした。
63 :
デフォルトの名無しさん :2006/03/09(木) 19:27:07
どこかの人が大迷惑を被る結果に至らないこと/至っていないことを祈る。
日本語の通るPerl用のObfuscatorってないですか? そんなにギッタンギッタンにしてくれなくてもいいんですけど。
ググレカス
62です。できました誰にも迷惑はかけてなかったみたいです。 味噌汁で顔を洗いなおしてテンプレサイトで勉強してきます。 ありがとうございました。
ググレカレー
DIコンテナっていいよね。 Perlプログラミングでも使いまくりですよ。
ループさせて面白いのかと
>>66 どうやって解決したかくらい言ってくれても罰は当たりませんよ。
>>70 <>が全角だっただなんて、ぐぐっても出てこないDQNミスは味噌汁で顔を洗うことぐらいしかお詫びできないかと思いまして・・・o...rz
>>71 ワカメ入りの味噌汁で洗っておくれ。そんでもって、写真うp
今Sendmailを用いたプログラミングを行っています。 メールは正しく送信されるのですが、意味の分からないところで固まってしまい、あたふたしています。 以下が問題の部分なのですが、 &ProgramAccessTimeOut('Line : 734'); &jcode'convert(*emails,'jis'); &ProgramAccessTimeOut('Line : 736'); if(open(MAIL,"| $sendmail $mailto")){ print MAIL "$emails";&ProgramAccessTimeOut('Line : 738'); close(MAIL);&ProgramAccessTimeOut('Line : 739'); &ProgramAccessTimeOut('Line : 740');return true; }else{ &ProgramAccessTimeOut('Line : 742');return false; } で、ProgramAccessTimeOutは sub ProgramAccessTimeOut{ my $md = $_[0]; my $sa = time - $ProgramAccessTimeOut_StartTime; if($sa > 20){&Error('Time Out');} open(IPR,">>prosess.txt"); print IPR "$md\n"; close(IPR); return; } となっています。これはプログラムの動きを見るために付けたものです。 prosess.txtに保存されている最後の内容が、Line : 738で、print MAIL "$emails";までは正しく働いていることが確認できるのですが、何故か close(MAIL)で固まってしまっている様子です。エラーの内容は、「OUT OF MEMORY!」でした。 全く歯が立たないため解決方法をお願いしたいのですが、お願いできませんでしょうか、お願いいたします。
sendmailへの引数は合ってるのか?
>>73 デバッグのやり方、考え直した方がいいと思う。
sendmailにおくるとき、末尾の改行の数厳密だったっけ?最後"\n\n"になってる?
今まで特に問題なく動いていたので引数は特に問題ないと思います。 $emailsの内容も1KB未満で、$mailtoに入っているメールアドレスにも受信ができたので正しくメールは送信されています。 その他の部分はif文やfor分だけなので特に干渉している部分も無く、エラー部分がclose処理なので、エラーに心当たりが無い感じです。
どうして固まっているのにエラーを知ることができたのだろう? eval{}で囲んで例外キャッチするべきではないか。
>>75 末が\nだったので\n\nに修正したところ正しく動作しました。
今まで\nでも正常にcloseの動作がしていたため全く気付きませんでした、ありがとうございます。
正しいデバックの方法を知らないため、あんなことしてます。すいません。
>>77 STDERRをファイルに出力しているため、エラーを取得できました。
evalの使い方はまだ習得していないため分からない感じです。すいません。
ありがとうございました。
デバック → デバッグ バグ潰し、ね。 "\n\n"は覚えておいて損はないよ。 use strict; は早めに覚えておいた方がいい。
>>80 了解です
>>79 で解決したかに見えましたが、プログラムを何も変えずに再度実行したところまたエラーが発生しました。
やはり、エラー箇所はclose(MAIL)のようです。申し訳ないです。
とりあえず、そのごちゃごちゃしたコードをさっくり削除して、 どこぞのサンプルコード張っただけで動くか確認してみれば?
83 :
73 :2006/03/10(金) 02:19:28
Linux逝てしまった・・・ まずLinux治します。しばらく消えます。
84 :
73 :2006/03/10(金) 02:41:35
以下のプログラムの実行結果を2レスに渡って書きます
require './jcode.pl';
$sendmail='/usr/sbin/sendmail';
$subject = 'testmail';
BEGIN{
$| = 1;
open(STDERR, ">&STDOUT");
}
print time ."...Start\n";
$mailto = '
[email protected] ';
$emails = "To: $mailto\n";
$emails .= "From: $mailto\n";
$emails .= "Subject: $subject\n\n";
$emails .= 'あかさたな'."\n\n";
print time ."...\$emails input\n";
&jcode'convert(*emails,'jis');
print time ."...jcodeconvert\n";
if(open(MAIL,"| $sendmail $mailto")){
print time ."...if(open(MAIL))\n";
print MAIL "$emails";
print time ."...\$emails\n";
close(MAIL);
print time ."...close(MAIL)\n";
}
exit;
85 :
73 :2006/03/10(金) 02:42:23
実行結果 1141925875...Start 1141925875...$emails input 1141925875...jcodeconvert 1141925875...if(open(MAIL)) 1141925875...$emails 1141925889...close(MAIL) closeするのにえらい時間がかかっていることが確認されました。原因は不明です。
86 :
73 :2006/03/10(金) 02:42:36
うんこ
なんか来たので一応使い捨て鳥入れときます。
ちょwwwwおまwwww 「&jcode'convert(*emails,'jis'); 」って。。。。wwww &によるサブルーチン、'によるパッケージ修飾、型グロブ渡し・・・ 10年以上前、Perl4時代のコーディングスタイルだよ。 Linuxが直ったらとりあえずそこらで適当にここ1〜2年で刊行された Perl本を買ってきて読め。マジで。
>>88 1年前1冊買った本見ながら最近やり始めたとこなのに・・・orz
その辺りはネットで漁ってみます。問題はclose処理に10秒以上も掛かっている部分なんです・・・
90 :
86 :2006/03/10(金) 02:48:21
ミスったorz
Perlよりsendmailを疑うけどな、普通は。 Linuxが不安定なら、ビルド失敗してるとかじゃないの? とりあえず、Linux安定させないと問題の切り分けができませんよ。
ですね・・・Linux板に行って見ます。 SendmailやPerlは元々入っていたので全くもって無知ですが・・・。
sendmailのlogとれよ。
>>73 見て思うんですがbarewordがno strictでエラーにならないのはどういう用途を想定してるんですか?
自然言語にクォートの概念はいらないって意味合いですか?
>>85 > closeするのにえらい時間がかかっていることが確認されました。原因は不明です。
うちのFreeBSDでは
1141927843...Start
1141927843...$emails input
1141927843...jcodeconvert
1141927843...if(open(MAIL))
1141927843...$emails
1141927843...close(MAIL)
だったヨ。
DNSクエリかな?
>>94 すまん、酔っぱらって帰ってきたんでアレなんだがどこらへんが裸語句?
97 :
94 :2006/03/10(金) 03:34:16
酔っ払い同士になるけどreturn false;のfalse
98 :
安西先生 :2006/03/10(金) 04:35:57
>>94 use constant つかったんじゃないのか?
use constant true => 1;
use constant false => 0;
print "true:", true, ", false:", false, "\n";
# => true:1, false:0
いや、俺もconstant使ったことないから知らんけどさ。
そろそろBenchmarkぐらい教えてあげようよ。
>>99 > そろそろBenchmarkぐらい教えてあげようよ。
指示するな。
102 :
デフォルトの名無しさん :2006/03/11(土) 14:45:38
Perlで作った掲示板に携帯で書き込んだ場合とPCから書き込んだ場合を判別するのってどうすればいいんですか?
ブラウザでチェックかな
>>102 $ENV{HTTP_USER_AGENT}の文字列の中身をみて判断するんだろうが、
PerlではなくCGIの質問なのでWebProg板にでも行ってきなさい。
WWW::Mechanize で Cookie を扱うにはどうすれば良いですか? 教えてください。
>>104 ホストで判別ってのは??
if($host=~/ezweb\.ne\.jp|docomo\.ne\.jp|vodaphone\.ne\.jp/i){$type ='Phone';}else{$type = 'PC';}
とかで。
UserAgentはユーザーが任意で送るものだからホストの方がいいかもね。 そこまで厳格化する必要はないだろうけどUA全部調べるのは大変だし。
WebProgでは既出なノウハウをわざわざここで煮詰めなくても
use
HTTP::Cookies; my $cookie_jar =
HTTP::Cookies -> new (file => 'file.cook', autosave => 1);
$cookie_jar -> add_cookie_header ($request);
$ua -> cookie_jar ($cookie_jar);
quota制限時にファイルを作成するとサイズが0バイトのファイルになってしまいますが 適当なファイルを作成し0バイトで無ければ処理へという方法以外に何かスマートな方法は ありますでしょうか?
日本語でおk
>>112 作ってみてエラーになるかチェックするのが必要十分にて一番スマートな方法。
ファイルシステムにもよるし、quotaの設定にもよるし、自分がrootかもしれないし、
nfsかもしれないし…と、汎用的な事前チェック方法は無いと思ったほうが良い。
こーたに当たったらシグナルが飛んでこなかった?
やはりそうですか。 テスト書込から実際に書き込むまでの間にdisk fullになる可能性もありlockと似たような 問題が生じる事があるんですよね。 取りあえずテンポラリファイルに実際の内容を書込をしてサイズが0で無ければ 元ファイルを削除→テンポラリファイルをrenameといった手法でいこうと思います。 awstatsもこの方法でサイズ0問題を回避してますね。
>>115 openでは捕捉出来ないと思います。
コンソールだとエラーメッセージは表示されます。
print や close の返り値や $! をいちいち検査してみるのもいいかも。 あと、 Windows は知らんけど、 UNIX なら「元ファイルを削除」は要らんよ。
119 :
デフォルトの名無しさん :2006/03/14(火) 08:48:58
@a=( [[1,1,1],[11,11,11]], [[22,22,22],[222,222,222]]. [[33,33,33],[333,333,333]], ); という配列の中にあるそれぞれの配列の要素数を知るには どうしたらよいのでしょうか?
scalar @{ $a[1][0] }; # (22, 22, 22)で3
>>119 > print $#{$a[1][0]};
> 2
> print "@{$a[1][0]}";
> 22 22 22
122 :
119 :2006/03/14(火) 10:08:01
うーん
>>120 何も出力されません。
>>121 -1 になってしまいます。
Perl のバージョンは
>perl -v
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
です。
>>122 @a=(
[[1,1,1],[11,11,11]],
[[22,22,22],[222,222,222]]. ←
[[33,33,33],[333,333,333]],
);
124 :
119 :2006/03/14(火) 11:26:48
>>123 !!
ちゃんと出力されました。
本当にごめんなさい。
>>119 二行目(22,22がある行ね)って , じゃなくて . になってるのは間違え?
うえええかぶってた
use strictってしてないやついるの?
間違え?
use strictしているが、oop多用しているので関数名については実行時まで わからんし、$self->{hoge}のチェックにもならん罠。 後者はuse fieldsでなんとかなるのかな〜。まだ使ってないけど。
perlccにおいて意図しない動作が発生したのですが原因、もしくは解決法をお教え頂ければ幸いです。 ---test.plの始まり--- #!/usr/bin/perl use Data::Dumper; use subs qw(exit); $Data::Dumper::Indent = 0; Valiable->new(our $val = {}); require "./test2.pl"; hoge::hoge(); print "main : ", Dumper($val) . "\n"; Valiable::valiable($val); exit; package Valiable; sub new { my ($class, $dbg) = @_; *::exit = sub { valiable($dbg); CORE::exit; }; } sub valiable { print "val : ", ::Dumper(shift) . "\n"; } ---test.plの終わり--- ---test2.pl--- package hoge; sub hoge { $::val->{hoge} = 'hage'; } 1; ---test2.plの終わり---
-素の状態のtest.plの結果 main : $VAR1 = {'hoge' => 'hage'}; val : $VAR1 = {'hoge' => 'hage'}; val : $VAR1 = {'hoge' => 'hage'}; perlcc -B test2.pl -o test2.pl -test2.plをバイナリコードへ変換した後のtest.plの結果 main : $VAR1 = {'hoge' => 'hage'}; val : $VAR1 = {'hoge' => 'hage'}; val : $VAR1 = {}; Segmentation fault どちらも同じ結果になるのを期待しています。 perlのversion This is perl, v5.8.6 built for i386-linux-thread-multi perlccのversion # Version 2.04, Enache Adrian,Fri, 18 Jul 2003 23:15:37 +0300 os fedora core4 バイナリコード変換後の動作でここ以外の処理は問題無かったのですが ここだけ互換性がありませんでした。
perlccはまだ実験段階。動かなければそれまでと思ったほうがいい。
本当に実験段階なんでしょうか。 perlcc関連の資料をググってると日本では間違ったイメージを持ってる人が多いと思います。 1,perlccで作ったバイナリはまともに動かない 2,perlccでコンパイルするとC並の動作速度が期待出来るが生成されるコードは実用に耐えない 1に関して-Bオプションを使用した場合、Cコードは生成されず、通常Perlが踏むバイナリコードへの 変換だけ行われ、非常に高いレベルで動作します。 2に関してはperlccのソースを見る限りperlコードをCのコードへ変換しているわけではなく ネイティブで実行出来るインタプリタにバイナリコードへ変換したソースをくっつけているだけで バイナリコードの変換とローダ部分のコストぐらいしか軽減されず例え動作に成功しても 10%ぐらい高速化するのがせいぜいだと思います。
134 :
105 :2006/03/15(水) 21:10:03
>>109 >>111 どうも有難うございました。
無事Cookieを受け入れてくれました。
ところで、HTTPサーバからCookieを要求された場合、特別何かしなくても
WWW::Mechanize->new() で生成されたユーザエージェントがサーバにCookieを送信してくれるのでしょうか?
135 :
デフォルトの名無しさん :2006/03/15(水) 22:27:36
>>135 PARなら
ppm install PAR
で入ったような気がする。
>>133 PARはどーよ?
138 :
135 :2006/03/16(木) 00:11:33
139 :
133 :2006/03/16(木) 00:17:18
>>137 目的はソース隠蔽なのでPARは向かないのです。
それとバイナリコードではなくバイトコードの誤りでした。
中間コードではある程度復元出来てしまいますが--)
namespaceを越えてアクセスすると発生するようなのでコーディングスタイル
を変更することで対応したいと思います。
Perl6ではこの辺りのことも触れられているようなので期待しています。
>>135 > やりたいこととしては、実行形式にしたファイルに、処理対象のテキストファイルを
> ドラッグドロップで入力し、出力結果として別のテキストファイルを作成というもの。
それだったら、実行形式にする必要ないんじゃないの?
Tkでいいんじゃない?
>>130-131 linuxは普段使ってないから、(knoppixで)軽く確認した程度だが...
セグメンテーションフォルトは、requireされた側でByteLoader.pmの読み込み
が発生したときに起こっていた。
つまり、読みこみ側(test1.pl)が使わないByteLoaderを読まれる側(test2.pl)が
使っているのが原因。
現状で唯一の対策はByteLoaderを使わない事。
また、表示内容の不一致は、$valではなく$dbgを表示している為。
バイトコード化されたtest2.plをrequireした時点で、$valと$dbgは別物になる。
確認は、こんな感じで。
#!/usr/bin/perl
our $val = {'dummy'=>''};
my $dbg=$val;
print "-initial\nval($val)=[",join(',',keys $val),"]\n";
print "dbg($dbg)=[",join(',',keys $val),"]\n";
require "./test2.pl";
print "-Required\nval($val)=[",join(',',keys $val),"]\n";
print "dbg($dbg)=[",join(',',keys $dbg),"]\n";
hoge::hoge();
print "-hoged\nval($val)=[",join(',',keys $val),"]\n";
print "dbg($dbg)=[",join(',',keys $dbg),"]\n";
exit;
初期化される変数の一覧は、バイトコード化されたモノをvi等で見ればわかる。
ここまで書けば、解決方法は解るよね?
正攻法以外に、嫌な方法や汚い方法があるけど、嫌な方法が手軽でPerlらしいと思う。
>>133 ここに書いた程度しか理解してないのに言うのも何だけど、perlccは実験段階だろ。
あるクラスのbase(のひとつ)を別のものに置き換えたいのだが、 丸コピーしてeditせずに継承とかそんな感じのメカニズムでうまく やる方法はないだろうか? 具体的にはNet::POP3をPOP3 over SSL対応させたるために IO::Socket::INETのかわりにIO::Socket::SSLを使いたいのです。
継承で良いんじゃない?
>>144 ああそうかと思って試しにやってみた。今回は単純なので
package Net::POP3::SSL;
use strict;
use IO::Socket::SSL;
use Net::POP3;
use vars qw(@ISA);
@ISA = qw(IO::Socket::SSL Net::POP3);
1;
とするだけでなんとかなる感じ。(IO::Socket::SSLもすこし直さないと
だめだったが。)
継承関係が複雑だとこんなにすんなりとはいかないかもな。
多重継承で後のクラスのメソッドを前ので置き換えてる場合など
順序に意味があると単純に前後にくっつけりゃいいわけじゃない
ので難しそうだ。上のもNet::POP3とIO::Socket::SSLの順序いれかえ
るとNGだし。
試してないけど、 use Net::POP3; @Net::POP3::ISA = qw(Net::Cmd IO::Socket::SSL); てのはどうだろう。強引だが。
>>146 試したらそれでも動きました。いろいろ書き方あるもんだね。
Windowsでドライブ一覧を取得したいんですが APIは使わずに(getLogicalDrives等)取得する方法はありますでしょうか?
>>148 最終的にはAPI使わないと無理だと思うがなぜ?
全26ドライブレターについてopendirしてみるって手はあるかもね。
でもFDDドライブなんかがあるとそこでダイアログが出て止まるよ。
150 :
149 :2006/03/16(木) 18:49:55
うへ、ドライブ余計だった フロッピーディスクドライブドライブ…orz
cygwin の perl なら "/cygdrive" を readdir() すれば有効なドライブのみ見える。
>>142 激ありがとうございます!!
不思議に思っていた点が全て合点しました。
Segmentation faultもtest.plをバイトコード化することで回避出来ました。
ちなみにPerl5.8.8でバイトローダーが0.5から0.6に上がっていたので試してみたのですが
結果は同じでした。中間コードでもバージョンの違いで動かないのはまだしも
プラットフォームが違っても動かないようですーー;
で解決法は
・引数で渡す
・一つのファイルにまとめる
・{ local $::val; require './test2.pl'; };
・変数宣言時の直後にrequireする
ぐらいしか思いつきませんでした。
現在のスクリプトでは動的にrequireするのと「$::」でアクセスするのは$::dbgに適当に変数を
入れて最後にDumperで表示するデバック目的とクエリを格納した$::form{name}なんかにアクセス
するのに使っているので変更が少なく実用的なのは3番目かな。
>>149 なんとなく余計なモジュールは使いたくなかったんです
すみませんありがとうございました
>>141 普通に @ARGV を見ればいいんじゃない?
155 :
デフォルトの名無しさん :2006/03/17(金) 12:43:07
「ImageMagick」は何と読むのですか?
Image Magick これは読めるよな?あとは繋げるだけだ。
いまげまぎく?
158 :
デフォルトの名無しさん :2006/03/17(金) 13:14:53
>>156 「Magick」が読めません(´・ω・`)
まず「Peal」も読めないな
「Perl」って書くつもりだった・・・orz
(´・ω・)
( ^ω^) ・・・
イメッジ マジック
>>150 震えるぞハート、燃え尽きるほどヒート、刻むぞ血液のビート!
オーバードライブドライブ!
Microsoft Samにでも読ませてろ
PerlでWindowsのAPIを使うにはどう書けばよいのでしょうか? 具体的にはCombinePathが使いたいです。 CombinePath($buf, "c:\\windows\\System32", "..\\notepad.exe"); buf eq "c:\\windows\\notepad.exe" とかしたい
168 :
166 :2006/03/17(金) 15:42:28
>>167 Win32::APIでできました。ありがとうございました。
>>159 ピール
ま、しかし、 Pearl にしようと思ったら既にあったから Perl ってのも何とも言えない命名。
>>166 この程度、File::Specで済みそうなもんだが・・・
use File::Spec;
$buf = File::Spec->catdir("c:\\windows\\System32", "..\\notepad.exe");
print $buf; # C:\windows\notepad.exe
そういえば先日、某大手チェーンPCショップYに行ったら、書籍コーナーでPealと書かれてた(´・ω・`) # 他にもTCP/1Pになってたり
(´・ω・)
Pearl っていう、英単語として正しい綴りだったのを、どこかで見たような気がする。
[\w]このような表記で全ての文字を表す場合どう記述すればいいのでしょうか。 自分の頭では[\d\D]しか考えつきませんでした。
[\x00-\xff]
Unicodeも考える場合5.8系だけで良いなら[\p{Any}]とか
ありがとう。1byteが8bitでその範囲がとか考えればよかったんですね。
180 :
135 :2006/03/18(土) 01:49:23
>>140 自分のPCにはActivePerlがインストールしてあるんだけど
他の人のPCで自分の作ったスクリプトを簡単に動かしたくて。
# まだPAR試してない…
PAR って、norton antivirus の auto protect を有効にしてると初回起動時の temp フォルダへの展開に激しく時間がかかるな。 自分自身を圧縮等して antivirus soft による検出を逃れようとする virus も 多いから仕方ないのかもしれんが…。
TextSS のWindowsXP(Professional)64bit化おながいします もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
これスクリプトか? ム板のどのスレ行っても貼ってあるんだがw
>>184 微妙に変わってたりするから手動のような気がする
スクリプト言語のスレに貼っても意味ないだろうにw
>>183 1. 作者に言え
2. ネイティブ対応にする意味ねぇだろ。普通に使えりゃ。
釣られてスマソ
>>186 いーよいーよ!
ガンガン釣られちゃえよ!
Σ∩
.(ヨ ∧∧
\(゚∀゚)
ヽ E)
188 :
デフォルトの名無しさん :2006/03/20(月) 16:21:19
一行に収まらないステートメントを 複数行に分けるにはどうしたらいいんですか?
189 :
デフォルトの名無しさん :2006/03/20(月) 16:52:02
>>188 ……分けたいところにカーソルを置いて、リターンキーを押します。
何のためのセミコロンだと… きっと今までVBとかそういうのを使ってたんだろうなぁ
変数名とか関数名が200文字くらいあるんじゃね?('A`)
193 :
デフォルトの名無しさん :2006/03/20(月) 18:26:35
>>189 ああすいません
僕がばかでした
正規表現で長い文字列を使いたいんですけど
余計な変数とか使わないで書くにはどうしたらいいんですか?
今
if(/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/)
って感じなんで
if(/xxxxxxxxxxxxxxxxxxxxx\
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/)
こんな風にならない
>>193 x オプションを使えばあるいは。
if (m{
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}x)
195 :
デフォルトの名無しさん :2006/03/20(月) 18:47:25
>>195 何所で詰まってるかわからないんだけど、
分割して一つづつやることはできるの?
基本的なところミスってたりしてない?
197 :
デフォルトの名無しさん :2006/03/20(月) 18:56:33
>>196 分割してもできるんですけど
ファイルから一行ずつ呼んで
if(/xxxx/){
}elsif(/xxx/){
}elsif(/xxx/){
}elsif(/xxx/){
}
って感じで正規表現で分けて処理してるうちのひとつなんで
変数使いたくないっていうだけです
実際にどういう値が入るかは書けないの?
>>195 x を付けるとパターン中の空白文字を単純に読み飛ばすから、
マッチ対象にしたい空白文字はクォートしないと駄目だぞ。
x 付けて任意の位置で改行できないなら... もしかしてPerl4?
つか x の続きってだけだったら /x+/ にしろとか /x{10}/ にしろとか そんな回答しかできないんだけど。
if(/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/) は if(/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/) でいいんじゃねーの? なにが不満?
長い正規表現なら 別ファイルに正規表現だけ入れて 変数に読み込ませるのが良いんじゃないかな
辞書総当り?
204 :
デフォルトの名無しさん :2006/03/21(火) 00:26:59
連想配列の要素に配列を入れるのってどうやるの? @tmp = ($a, $b, $c); $data{$key} = @tmp; print $data{$key}[0] . "\n"; これで上手くいかないのはなぜ?
>>204 つperllol
$data{$key} = \@tmp;
206 :
デフォルトの名無しさん :2006/03/21(火) 00:31:39
>>205 うおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
できたあああああああああああああああああああああああああああああああ
2時間悩んだけど聞いてよかったあああああ
ありがおつ
まじありがとう
ありがおつたりがおつありがおつ!!!!くぁwせdrftgyふj
>>206 使い方には注意点があるから使用の際にはperlrefやperllolをよく読んだほうが良いよ。
例えば、
for $i (0..2){
@tmp = ($i);
$arr[$i]=\@tmp;
}
print $arr[0][0], "\n";
とかやると2になってしまう。
my @tmpとしてレキシカルスコープ変数にしないと,、
実体が同じだからこういうことになるわけ。
208 :
デフォルトの名無しさん :2006/03/21(火) 00:45:02
>>207 リファレンスなんだね!
気をつけてやってみます.
ありがとう
すいません助けてください。 例えば「ABC DEF GHI JKL "○○○" PKR STU VWX YZ」という文字列があるとします。 それで""で囲まれた文を抜き出すにはどうすれば良いでしょうか? ""の間は決まった文字列ではありません。
210 :
デフォルトの名無しさん :2006/03/21(火) 00:51:57
>>209 「perl 正規表現」でぐぐると幸せになれる
perlのルールでは,配列内の配列は平たく展開されてしまう。 また、ハッシュのキー、値を対応付ける => は , のシンタックスシュガーであるから。 %data = ( $key => ($a, $b, $c) ); と %data = ( $key => $a, $b => $c); は等価となってしまう。 でも、これだと、$data{$key} の値が矛盾する。前者は($a, $b, $c)であり後者では $a 結局、配列のネストは平たく、括弧は減らす方向に展開されるのがperl流なので、構文解釈上は 後者になってしまう。だから、配列の中に、他の要素と混ざらないように配列を入れるには、それ 自体スカラであるリファレンスを使い、配列によって実装されるハッシュもまた、同様の方法を使う ことになる。
213 :
210 :2006/03/21(火) 00:58:41
"(.?)"
>>213 $hoge =~ /"(.*?)"/;
print $1;
216 :
209 :2006/03/21(火) 01:00:17
217 :
209 :2006/03/21(火) 01:00:52
htmlファイルを読んで、テーブルタグを除去しようと思いまして、 $hogehoge =~ s/<table>.*<\/table>//g; と記述したのですが、期待通りに動きません。どうしたらよいでしょう orz
HTMLエスケープで我慢汁
すみません、直前に類似質問ありましたね。自己解決しました。 $hogehoge =~ s/<table>(.|\s)*?<\/table>//g; ありがとうございました。
>>220 多分、選択より文字クラスを使った方が速いから (.|\s) より [\S\s] の方が良さげ。
それより/sオプション
tableがネストしてるとダメだと思うがなぁ。
perlのプログラムにコマンドラインオプションを送りたいのですが、コマンドラインオプションを読み取るには どうすればいいのでしょうか?
なんかさ、親切な奴がもの凄い勢いでこのスレ監視してないか?
>>224 $ perldoc Getopt::Std
$ perldoc Getopt::Long
>>227-228 すみません。できの悪いおいらには難しいみたいなので、サンプルコード探してきます。
ありがとうございました。
ギリギリスレ違いでもないと思うのであえて質問しますが、 perlってどこがいいんだろ? 最近わからんくなってきたよ。
マジレスするとメロディライン
>>230 昔からそうだけど、何でもありな所
何でもくっつけちゃう糊(glue)言語
コードが汚かろうが何だろうがお構い無しで、やるべき事をやる
>>233 ちょっと分かった。アリガト
使い捨て感覚で気軽に作れるしね。
>>230 そういう議論するまえに動くスクリプトが出来てしまうことだろうね。
Larryが認めるようにC,sed,awk,shから多くを「盗用」したあげく、
「やりかたは何通りもある」ので、そのあたりの言語経験者なら
初期学習コストはないに等しい。
仕様を実装する言語でなく問題を解決する道具なんだな。
それが利点であり欠点。
>それが利点であり欠点。 オレは今欠点が目に付くんだろうな。アリガトオヤスミ。
>>230 言語仕様的な良さとは違うかもしれないが、
個人的にPerlを使い続ける大きな理由としては「CPANがあるから」というのもある。
俺は自分好みにデータや記述を整理して、実行できる点がメリットが特に気に入ってるかな?
これも利点と欠点を同時に持ってるけど。
>>233 汚くすればなんぼでも汚く出来るし、
綺麗にしようと思えば、なんぼでも綺麗にできる。 (なにが綺麗かは個人の差あり)
これも利点と欠点が同時に…。
共同開発に向かない言語ってのはよく聞くけど、
それは俺も賛成。
今更だけどスレ違いじゃね
>>239 >>1 > "There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
ってことだから良いんじゃなかろか
ファイル指定でも、標準入力からパイプで流し込んでも、 while(<>) だけでテキスト処理できるのはパールだけ。 正直、これだけのためにperl 使うといっても過言ではない。
つ、釣られないぞ・・・
Ruby while {|l|}
釣れたw
結構な数のUNIX/LINUX系環境にデフォで付いてくるとことか。
>>242 sed, awk, sort, uniq, ...
>>246 どこでも使えるのは魅力だよね。
ウェブサーバ付いてればGUIも作って遊べるし。
>>248 CGIの間違いか?
あ、いけね。ここは見て見ぬふりしないとまずかったか?
GUIで合ってるけどな。
でもperlとは直接関係ないし
シェバン(#!)行についてなんですが、 いまだに #!/usr/bin/perl と書いてあるのを見ますが、 これって #!/usr/env perl とした方がよくありませんか? それともenvを使うのは何かまずい点でも あるのでしょうか?
>>253 > #!/usr/env perl
/usr/env
/usr/env
/usr/env
/usr/env
/usr/env
シェバン行って言うんだ・・・勉強になった
せめてshebangって書け
258 :
デフォルトの名無しさん :2006/03/23(木) 23:58:53
文字列変換処理でパターンマッチするたびに、マッチした箇所に対して サブルーチンを呼び出し、サブルーチンの戻り値でマッチした箇所を書き換えたい のですが、とりあえず以下のものは失敗でした # fooにマッチした箇所すべてをhogesubサブルーチンの戻り値で #書き換え $hoge =~ s/foo/&hogesub/g; やりたいことはお察しいただけるとおもいますが、うまくいく方法があれば おしえてもらえないでしょうか?
>>258 つperlop
$hoge =~ s/foo/&hogesub/eg;
うお!すげぇ! とperlopをみないでeg先に付与してやってみました。 本当にありがとうございました。
261 :
253 :2006/03/24(金) 00:13:29
X /usr/env ○ /usr/bin/env ごめん。ずっとshebangをシェバングって読んでて 最近シェバンと読むのだと知って天狗になってました
>>238 POD 完備の PBP スタイルの綺麗な Perl と,やっつけ仕事の一行スクリプトの
両方を書けるやつとなら Perl で協同開発してもいいと思う
関係ないがpingもピングって読む奴多いな
>>253 setuidビットをセットするとenvだと動かなかった。
>>263 PNGはピングと読むのが多くないか?
公式見解ではpingと同じ発音だそうだが。
KINGKONG キンコン
setuid系はsuidperlが使われるのでshebang関連で 不具合が起こることがあるね。
>>268 kwskって言われても書いたままだが。
Debianでperl-suidを入れて、setuidしたperlスクリプトを動かそうとしたのだが、
shebangがおかしいと言われて動かなかった。
まあ、セキュリティ上の配慮なんだろうと思うが。
〜ngはンでもングでもないので、単にカタカナ表記上の好み次第かと。
ンでもングでも無いって言うか、そもそも 日本語のンって鼻音である事以外指定してないんだよな。 n でも m でも ng でもンになるし 逆に言えば、その3つのどれでも無い鼻音もンで表せる。 っつーか、スレ違いだな。
print "@{[ $var ]}"; これは何をやっているの?
$varを要素とする無名配列のリファレンスを作成しそれをデリファレンス?
ポポポポ( ゚д゚)゚д゚)゚д゚)゚д゚)゚д゚)ポカーン
@{[...]}は変数じゃない式でも文字列に埋め込むかなり苦し紛れ気味だが 有名なワザ。しかし普通の変数を埋め込むのに使うのははじめて見た...
>>277 >変数じゃない式でも文字列に埋め込む
え、それどういうの?具体例挙げておしえてください。
sub hoge { return (1,2,3,4,5); } print "sub hogeの結果は"; print &hoge; print "です。"; #ってのが print <<EOF; sub hogeの結果は@{[&hoge;]}です。 EOF #で済ませられるって事?
そこまで書いて実行してみないのね。
;が余分だって事に気がついたのは書き込んだ後だった。
>>277 有名だったのか。知らなかった。
しかし、どういう時に使うんだ? リストの区切りを別に設定して
そのまま文字列に入れたいときとか? (区切り変えなくてもいいか)
でも全部定数ならそのまま書けばいいような…。
use strict; を配布スクリプトに含んでいるのをけっこうみかけるけど、 これって本来デバッグ用途じゃないの? パフォーマンス的にみたら、 配布時には当然けずるべきだと思うんだけど みなさんはどうしてまつか?
>>283 俺はそのまま。
でもパフォーマンスは大差ないのでは? 最初のコンパイルにちょっと
時間が掛かるだけで動いてしまえば変わらないと思うが。
285 :
デフォルトの名無しさん :2006/03/24(金) 16:18:56
1〜5を1秒おきにprintするプログラムとして,以下のようなプログラムを書いたのですが, my @a = (1,2,3,4,5); foreach(@a){ print $_; sleep(1); } 出力先が標準出力だと,5秒待ったあとに1〜5が同時にprintされてしまいました. 出力先を標準エラー出力に変えると思い通りの動作をしたのですが,標準出力では このようなプログラムは書けないのでしょうか?
予め $| = 1;
287 :
283 :2006/03/24(金) 16:39:30
>>284 れすさんくす
でもmod_perlとかfastcgiとか使っていないサーバで
たくさんアクセスされるcgiスクリプト置いてたりしたら
結構深刻なのかなと思って。
Javaのassertみたいにコンパイルオプションで
オンオフを切り替えられたらいいのに。
288 :
デフォルトの名無しさん :2006/03/24(金) 16:46:49
>>283 > みなさんはどうしてまつか?
use strict;
↓
#use strict;
289 :
285 :2006/03/24(金) 17:02:30
>>286 できましたー!!ありがとうございました.
>>283 CGIで耐えられる程度しかアクセスがないなら気にする事はないし、
mod_perlだのfastcgiだの使ってるならどうせ最初だけだから
気にする必要はない。いちいち外すのメンドイ。
本当に use strict; を付けなくても安全なプログラムが書けるようなスキルの奴なら そもそも2ちゃんで「けずるべきだと思うんだけど」なんて情けない質問はしない。
>>291 本当に use strict; を付けなくても安全なプログラムが書けるようなスキルの奴は
ちゃんと use strict; を付けてる。
>>288 当然いつでも書きっぱなし。
理論上実行速度は速くなりますが、それはどうでもいいかな。
use strictで書けない奴は平気でサポートメールを送ってくる。 use strictで書けないがuse strictをコメントアウト出来る奴は 少しの知識と自分で努力するという気持ちを持っている。 本来はデフォでuse strictにして明示的にuse indulgeするべきだと思う。
>>292 まあ、香港は英語では Hongkong と書くが g は読まない、というのと似ている。
>>292 まあどっちの発音しても大体通じるからどっちでもいいんじゃね?
Hongkong は香港だが、 Kingkong はキングコング。
use strict; と use warnings; ぐらいつけるの許してくれよ。
数日前にパラメーターの送り方を聞いてperlvalとARGVだと教えてもらった224ですけど、 いろいろぐぐったのですが、どうしても分かりませんでした。 すみませんが、hoge.exeにabcと123を送るサンプルコードを書いてもらえないでしょうか。 馬鹿と言われるのは承知ですがどうか。。。
>>300 どういう状況で何がしたいんだおまいは?
302 :
デフォルトの名無しさん :2006/03/24(金) 19:44:52
>>294 え?ということはuse strict;したら
逆に速度が上がるってこと?
どうしてそうなるの?
>>295 use indulgeって何かと思ったらstrictの逆という事ね
>>300 それ「Perlのプログラムに」じゃなくて「Perlから他のプログラムに」だから( ´д`;)
それなら@ARGVは違う。
色々方法はあるけれど簡単にやるならsystemの第二引数以降にでもつければOK。
system 'hoge.exe', 'abc', '123';
ところでActivePerl5.8付属のPPM3.4になってなんか使い勝手変わった?
どうもモジュール名で検索するとヒット率が落ちた気がする。
ディストリ名で検索すれば出てくるんだけどさ…今までもそうだったっけ?
>>300 それだけなら
print "@ARGV¥n";
だけで分かるはずだけど…。
>>303-304 ご、ごめんなさい。Perlのプログラムにパラメーターを送るです。。。。。
首を吊るべき間違いですが、どうか。。。
イ`
>>305 ん?だから system 'hoge.exe', 'abc', '123'; じゃなくて?
「Perlのプログラムにパラメーターを送る」?意味わからんがな。
>>307 他のプログラムhoge.exeからPerlのプログラムにパラメーターを送って、
Perlのプログラムでhoge.plでパラメーターを受け取る方法です。。。
あるいはファイル名を指定して実行でperl c:\hoge.pl abc 123でパラメーターを受け取るプログラムを
作りたいのです。
>>308 ジュワッジュワワジュワジュワッ?ジュワワ。m(._.)m
>>310 perlにパラメータ送る方法は
>>303 に書いてあるだろ。無視すんな。
hoge.exeってのはperlで書かれたプログラムなのか?
--hoge.pl-- #!/usr/bin/perl print "argv is $ARGV[0],$ARGV[1]"; 結果 argv is abc,123 これでも分からなければ父さんお手上げ
ディレクトリの存在チェックをしたいのですが、うまくいきません。 '表と'いう文字が、原因だと思いますが、 このディレクトリ名をかえるしかないでしょうか? いい方法があったら教えてください。 # 末尾に'表'というディレクトリ名があるか判定する。 mkdir("ペケペケ表\"); if (-d "ペケペケ表\") { print "ある\n"; # 本来はこっち } else { print "ない\n"; # でもこっちがよばれる } OS : Windows2000 SP4 Perl : v5.8.8 built for MSWin32-x86-multi-thread
シングルクォート使えよ
"表" の 2byte目 が "\" だから
mkdir "\x83\x79\x83\x50\x83\x79\x83\x50\x95\x5c"; if(-d "\x83\x79\x83\x50\x83\x79\x83\x50\x95\x5c"){ print 'Success'; }else{ print 'Error'; } でもエラーになるのはどうしてwhyなぜ
末尾にあるパスセパレータの\を勝手に削っちゃってる悪寒
解決しました。 ありがとうございます。 存在チェックはWin32API(GetFileAttributes) をつかって判定することにしました。 ディレクトリ内のファイル一覧取得は、 DIRコマンドをパイプで取得することにしました。
買えばいいんじゃないかな
学生だからクレカが無いのよ
学生ならクレカ持っててもいいだろうと思う 審査ザルだから学生のうちにとっておくことをすすめる
IOCモジュールについて語りませんか?
また来たよ。
なら望み通りオリンピックについて語ろうか。
>>313 既に解決しているようだけど、winなら
-e join('/',$dirname,'nul');
が使える気がする。
DOS時代の記憶なので、2000だと駄目かもしれん。
mkdir "ペケペケ表\";
print "ある\n" if -d "ペケペケ表\" || -e "ペケペケ表\/NUL";
Win32用 ActivePerl zip 版の Installer.bat の改行コードが LF な件……
>>328 .bat ファイルって、LFだとダメだったっけ?
>>330 そこで Perl ですよ!
……あれ?
Microsoft Installer 2.0だろ。
最近ActivePerlを導入しまして。 CSVを分解するのにsplitを利用したのですが、連続するデリミタやスペースを 一纏めにデリミタ扱いするにはどうするのでしょう? この例だと、タブ文字とカンマが連続するからカラ配列が途中に入ってしまって。 初歩的な内容ですよね? $readline ="16\t,130118\t,05,12,13,29,34,35,30,"; #$readline ="16,130118,05,12,13,29,34,35,30,"; open(DST ,">./test.txt" ) or die "file open error DST : $!\n"; @readarray = split(/\s|,/ ,$readline); # 第n回。 $top = shift(@readarray); # 日付。 $day = shift(@readarray); # 末尾。 $ende = pop(@readarray); for($i =0; $i < @readarray; $i++ ) { # body. print DST " $i:$readarray[$i]"; } print DST "\n"; exit;
>>333 - @readarray = split(/\s|,/ ,$readline);
+ @readarray = split(/\s*,\s*/ ,$readline);
これでどうでしょ?
mod_perlでuse libを使うときの質問です。 環境 perl-5.8.5 mod_perl-1.99_16-3 httpd-2.0.53 fedora3 use lib 'ore/lib'; とした場合、Apacheプロセスに読み込まれる初回起動時は正常にlibが読み込まれ @INCにore/libが入ります。また%INCにlib.pmがロードされます。 2度目のアクセス時にはmod_perl時にはBEGINは初回にしか実行されずlib.pmは既にロード されているので実行されずに@INCにore/libは追加されません。 初めに全てのモジュールを読み込むのであればこの挙動で問題ないのですが 処理によって動的にモジュールを読む場合、不具合が出てきます。 $INC{'lib.pm'}を消して強制的に読み直す、Setenv PERL5LIBを設定する、use libではなく unshift @INC, 'ore/lib'とする等、いくつか解決法はありますがしっくりきません。 元々こういった用途ではuse libを使うのは好ましく無いのでしょうか。
>>334 >>335 うわ、解決しました。
ありがとうございます!
でも、理解出来ていない漏れ┐(´∀`)┌
もっと場数経験します。
Windows環境でPerlを使う場合、ActivePerlと比較して PxPerlを使うメリットというのは ・pugs が使える ・エディタ SciTE が使える ・GDライブラリがはじめから入っている 程度でしょうか? ActivePerlから乗り換えるメリットはあるでしょうか?
>>333 素直にText::CVSとか使えば?
>>336 mod_perl使うならstartup.plとかでuseしておきなよ。
libもそうだけど、必要なモジュールはできればstartup.plで読み込んでおいたほうがメモリの節約になるでよ。
>>339 個人的にはppmを使いたいのでActivePerl使ってる。
Win32でコンパイル環境あればCPANでいいんだけどね……。
Text::CVS Text::CVS Text::CVS Text::CVS Text::CVS
342 :
333 :2006/03/26(日) 23:42:56
>>340 この通り正規表現も満足に扱えていない初心者ですが、
扱いは容易なのでしょうか?
ググってみたら類似情報釣れましたけど、まだリファレンスも分かっておりませんで。
主にラクダ本2版で学習していますが、早く3版2冊欲しいなあ。
>>342 > この通り正規表現も満足に扱えていない初心者ですが、
> 扱いは容易なのでしょうか?
> ググってみたら類似情報釣れましたけど、まだリファレンスも分かっておりませんで。
1,2,"white gyouza", 3
のようなのを処理する必要があるのなら使った方がいいね。
> 主にラクダ本2版で学習していますが、早く3版2冊欲しいなあ。
第2版があるなら、第3版いらないじゃん。
さすがに第1版しか持ってなかったら買い直した方がいいけどな
最近perlを始めたミジンコですが配列の処理でつまずいています。 $sample = 170; @data = <<DATA_END; 43<>48 90<>110 160<>199 DATA_END $ans = "範囲外です"; foreach (@data) { ($a_1,$a_2) = split(/<>/,$_); if (($sample >= $a_1)&&($sample <= $a_2)){ $ans = "範囲内です"; } } print $ans # この場合は2行目の範囲内なので"範囲内です"と表示したいのですが・・・ 上記のスクリプトは @dataの各行毎に<>で挟まれた値の範囲に$sample値が存在するかどうかを判定する目的で 上記のようなプログラムを書いてみたのですが@dataの一行目しか参照してくれません よろしければどなたかおかしな所と正しい書き方を指摘していただけませんでしょうか 宜しくお願いいたします。目標は@dataと$sampleの範囲を下記のようにを2次元的なものに広げて $sample = '100_48' @data = <<DATA_END; 43<>48/73<>115 90<>110/45<>50 160<>199/0<>255 DATA_END (この場合$sampleは@dataの2行目に該当するように) のようなデータの処理を行いたいと思います。
>>346 > よろしければどなたかおかしな所と正しい書き方を指摘していただけませんでしょうか
おかしな所: まったくデバッグしていない所
348 :
デフォルトの名無しさん :2006/03/27(月) 03:11:44
今perlでプログラムを書いているのですが、 データの読み込みで、 必要になったときのみファイルから読み込んで実際にデータを扱う、 ということをしたいのですが、どういう形で実現するのがよいでしょうか。 データを利用する側から、いちいちデータを読み込むタイミングを指定してやるのも 変ですし・・・・。 微妙にperlから質問がずれていますが、 分かる人いたらお答えお願いできませんか?
>>345 変数とはつまりデータの入れ物なんだけど、そこに何も入っていない状態、それが未定義。
もしCやJavaをやっていればNULLポインタに近いものといえばわかってもらえるだろうか…
>>346 配列に改行の入った文字列を入れようとしても自動で行ごとには分かれない。
多分<>をみて出来ると思っちゃったんだろうけど、これはコンテキストによって
動作が変わるように作られてるから特別だと思ったほうが良い。
逆に言えば<>でファイル等から読み込んでやろうとすればちゃんと動くはずだよ。
@data = split /\n/, <<DATA_END;
43<>48
90<>110
160<>199
DATA_END
>>348 必要になったときに読み込めばいいんじゃないかな:-p
もっとどういう物を作っているかとか構造だとか
インターフェイスとか詳しく書いてもらえないと解らん。
もしくはエスパーを待て。
>>302 宣言の基本なんだけど。
そりゃ明示的にstrictしたらPerlも断定して処理する。
プログラマも断定して読めるから読むのが速くなるのと同じ。
変なコト起きれば実行もせずコンパイルフェーズでエラー吐いて終わるだけ。
>>345 未定義は数値か文字かリファレンスか分からない状態、またはそれ以前の値。
ブールで偽になる値だけど、数値としての偽でもなく、文字としての偽でもない。
何も無いの偽って感じ。
例えば、一度も使ってない変数名だけ書いたらこの状態になるし、
関数とかから未定義値が返ってくることもある。
サブルーチンなら return(); って書いたら未定義値が返る。
変数を数値型や文字型にフォーマットするには
$hoge = 0;
$hoge = "";
とか書いておく。(これで分かりやすいし-wなどの警告も出なくなる)
関数などの戻り値が未定義がどうか知りたいなら
definedを使う。
>>346 ちゃんと読んでないから知らんけど
@data = (
'43<>48',
'90<>110',
'160<>199',
);
こうじゃないんだろうか。
配列の中身くらい出力で確認し(ry
>>348 'ファイル読み込み' if(必要で真);
351 :
350 :2006/03/27(月) 04:58:54
>>345 書き忘れた。
変数を初期化(未定義に戻す)する時は
undef
を使う。
>>345 「未定義」という表現は、確かに分り難い。
見た感じ「未定義値」の事だと思うので、未定義値について。
未定義値は「未定義である事を表す値」で、数値演算分野のNaN(非数)と似た概念。
未定義値には専用の(内部的な)型がある。
つまり、Perlの未定義値は、値であると同時に(未定義型という)型でもある。
Perlの型は、必要に応じて文字列,数値,論理値に自動的に変換されるが、
「未定義型」は空文字列,0,偽に変換される。
全ての変数は初期値として「未定義(型|値)」を持つ。
そして、(明示的な|暗黙の)代入によって他の型(値)になる。
また、(明示的な|暗黙の)代入によって、「未定義(型|値)」にする事もできる。
ま、「未定義という特別な値(型,状態)がある」程度の感覚で構わないのでは?
winな環境で、 print 1; というようなスクリプトを作って、 .plファイルをダブルクリックすると、 コマンドプロンプトが開いて、 一瞬のうちに閉じてしまいますが、 これを閉じないようにするにはどうすればよいでしょうか?
最後に<STDIN>入れたら?
CHECE { `pause` }
356 :
353 :2006/03/27(月) 16:33:17
>>354 ありがとう。なるほど、確かにこれならできますね。
ただ、ちょっとしっくりきませんが。
>>355 !!!!!うまくいった。ありがとう。
でもCHECEなんて初めて見たよ。
日本のgoogleで「perl chece」で検索してもヒットしないよ。
らくだ本に載っていますか?
よかったらちょこっとだけ説明してくれませんか?
357 :
353 :2006/03/27(月) 16:37:04
>>355 らくだ本みても索引に載っていなかった。
一体何なのCHECEって?
Linux だとエラーが出るよ。(UNIX系OSでは不要な機能なのでどうでもいいが) $ cat x #!/usr/bin/perl print "aaa\n"; CHECE { `pause` } $ perl x aaa Can't locate object method "CHECE" via package "pause" (perhaps you forgot to load "pause"?) at x line 3. $ Windows 用 Perl だけの機能かもね。
359 :
353 :2006/03/27(月) 18:15:59
checeについてローカルにインストールされたActivePerlのドキュメントに grepかけてみたけどヒットせず、 海外でぐぐってもそれらしいページにヒットせず なんなんだ〜
windowsで実験したけどCHECE じゃなくて適当な文字でもストップしたよ。 たんに`pause`だけが聞いてるような希ガス
ヒント perldelta 5.8 BEGIN END CHECK INIT
sub END { <STDIN> }
363 :
353 :2006/03/27(月) 18:45:19
やっと謎が解けました。 自分のあほさ加減にいやけがさしました。 `pause`ってバッククォータだったのですね。 '(シングルクォータ)とみまちがえてました。 pauseはDOSのコマンドだったのですね。 お騒がせしました。 バカな僕を許して下さい。すんません。
ただ CHECE { } ってのは一体何だったのか、 これがCHECKのtypoだとしたら、 なぜわざわざCHECKブロックでpauseする必要があるのか わかりませんが。 print 1; `pause`; だけで期待の動作になるのですが、、、
これだからperlは・・・
ところで実用Perl第二版発売しましたが、 読んだ方おられますか? どうでしたか?
やるんだったらENDブロックだよな。。
これだからperlは最高だ。
つか、いちいちスクリプトにそんなの仕込むのめんどくね? 俺は.plの関連付けをPerl.exeへの中継batにして、その中で pauseするようにしてる。
>>369 それどうやるの?
perl
pause
っていうバッチファイルつくって関連付けしても
当然うまくいかない。
実行したperlスクリプト名がバッチファイルから
わかればいいんだけど、やりかたがわからない
(´-`).。oO(「windowsでperlなスレッド」がいるのかなぁ。。。)
@echo off perl %1 echo. pause これでどうよ
373 :
371 :2006/03/27(月) 20:11:32
>>371 ごめんおれが悪かった馬鹿だった
>>372 できた
%1でショートカット元のファイル名が
取得できるのね、というか
バッチファイルへの第一引数が取得できるのね
ありがとう!!
(´-`).。oO(ry)
#!/usr/bin/perl $SIG{'INT'} = 's'; while (1) {A:} sub s { print "トラップしました"; goto A: } 実行したスクリプトに対してC-cを発行して、そのSIGTERMを 受けても終了しないようなものを作りたいのですが 上記のスクリプトは実行してC-cを押すと Can't find label A となってしまいます どこがまずいのでしょうか? あとgotoはできるだけ使うなとの情報があったのですが gotoを使わずにINTから抜ける方法ってないでしょうか? sub s { print "トラップしました"; } だけにすると何も受け付けなくなります
>>375 「トラップしました」を表示する必要はないんだよな?
$SIG{INT} = 'IGNORE';
とやったらどうなる?
> sub s {
> print "トラップしました";
> }
> だけにすると何も受け付けなくなります
漏れの環境(perl5.8.7のcygwinおよびperl5.8.5のLinux2.6(CentOS))では再現しないな。
ちゃんと元のループに戻ってくる。環境は?
テストに使用したコード:
perl -e '$SIG{INT} = \&t; while(1){print scalar <>}; sub t{print "Traped!\n"}'
377 :
375 :2006/03/27(月) 22:31:22
>>376 すまそ勘違いだった
C-c押すとちゃんと反応していることがわかった
gotoに関してのみの質問に変更させてください
>>377 > gotoに関してのみの質問に変更させてください
gotoを消せばよい。
>>377 Perl 5.8.7 の perlwin32.pod には
Signal handling may not behave as on Unix platforms (where it
doesn't exactly "behave", either :). For instance, calling C<die()>
or C<exit()> from signal handlers will cause an exception, since most
implementations of C<signal()> on Win32 are severely crippled.
Thus, signals may work only for simple things like setting a flag
variable in the handler. Using signals under this port should
currently be considered unsupported.
と書かれている。
使って駄目だったのなら、gotoも(win32だと)ハンドラ内では使えない機能なのだろう。
>>366 発売と同時にゲットした俺がきましたよ.
現代的内容つーか別の本になってた.著者もちがうし.
Tk とかもうありません.CPAN ネタが増えました.
XS はちょろっとでてくるけど Inline のほうが比重が多いです.
すみません、教えてください。 ウィンドウズでperlを使っています。 カレントディレクトリから一つしたのフォルダに テキストファイルを出力しようとして open(OUT, ">card/$filename.txt"); #$filenameにはファイルの名前が入っています と書いて、一つ下のフォルダ(card)にテキスト ファイルができることはできるのですが$filename が展開されず、消えてしまって.txtというファイルが 出力されてしまいます。 open(OUT, ">card\\$filename.txt");とか open(OUT, ">card\$filename.txt");とか open(OUT, ">card\\.\\$filename.txt");とか open(OUT, ">card/"."$filename".".txt");とか いろいろやってみたのですがうまくいきません。 自分では/と$filenameが重なるのが原因で思った 通りに動かないと思うのですが、解決できませんでした。 どうすれば一つ下のフォルダに変数が展開された状態 でテキストファイルを作ることができるでしょうか?
>>381 > open(OUT, ">card/$filename.txt");
に問題はないよ。
本当にちゃんと$filenameにファイル名が入っているのか確認した?
>382 あ、ありがとうございます!解決しました! 本当に恥ずかしい限りです。 my関数をよくわかってないせいで sub xxx{ while(1){ my($filename)="aaa"; last; } open(OUT, ">card/$filename.txt"); } というように無限ループの中でmyを使って初期化ていたのですが これが原因でした。my($filename)="aaa";を無限ループの前か 後ろに書いたらうまくいきました。 冷静に考えれば.txtというファイルできたということは$filenameがundefの状態で 展開されたということですよね、本当にありがとうございました!
>384 すみませんわざわざ!読んでだんだん精進していきます。
386 :
デフォルトの名無しさん :2006/03/28(火) 08:29:19
10101111 のような文字列を、後から (データの一部なので最初に 0b10101111 とは書けない) 二進数として識別する簡単な方法はないでしょうか?
>>380 辛抱たまらず買うことにしました
ありがとう
Attempt to free unreferenced scalar とアパッチエラーなのかな?がでまくっています。 これメモリ異常っぽいんですが、どういうことやってると起きやすいですか? perlだからメモリを確保・開放なんてやってないのにな…
>>389 APTの3番とRPPの5番あたりがよく問題を起こすらしい。
"AbcDefGhi"という文字列を、 "_ABV_DEF_GHI"と変換する簡単な方法はありますか?
$a = "AbcDefGhi"; $a = "_ABV_DEF_GH";
$str =~ s/([A-Z][a-z]+)/"_".uc($1)/ge;
$str =~ s/B/V/g;
$str =~ s/I//g;
>>392 変数に $a や $b を使うなと習ったろうがこのバカチンが。
394 :
391 :2006/03/28(火) 11:59:47
ごめんなさい。"_ABC_DEF_GHI"の間違いでした。 でも、 $str =~ s/([A-Z][a-z]+)/"_".uc($1)/ge; で一発でした。ありがとうございます。
ち、ちんこは関係ないじゃないっ!
$s = 'ん'; print "ち$sこ\n";
397 :
デフォルトの名無しさん :2006/03/28(火) 15:51:05
jperl で Error: Runtime exception てでますた。これナニ?
そのjperlそのものがどっかバグってんじゃない?
399 :
デフォルトの名無しさん :2006/03/28(火) 16:19:19
フツーに動いてたんだけど、処理データが 飛躍的に多くなったらこうなりますた
情報小出し者の出現です!!
401 :
デフォルトの名無しさん :2006/03/28(火) 16:49:02
隠す気はありませんので質問があれば何でも聞いてくれたまい
>>397 「これナニ?」って聞かれたら、実行時エラーです、としか答えようがないな。
他に質問があれば何でも聞いてくれたまい
403 :
デフォルトの名無しさん :2006/03/28(火) 17:04:27
ActiveStateが提供してる.net対応perlの情報があるサイトってどこかありますか?
>>397 error = 誤り
runtime = 実行時
exception = 例外
405 :
デフォルトの名無しさん :2006/03/28(火) 17:07:18
原因は?配列とかにデータを詰め込みすぎってことだすか
>>397 ナゾナゾですか?! よーし負けねーぞー
ども。 jperl が悪いのか〜。
you are = 君は fool = 馬鹿
どうでもいいけど今時JPerlかよ
△ fool ◎ foolish
変数に$aや$bを使うなと書かれていますが どうしてですか? sortのときに使う$aや$bは局所化されてる から問題ないと思うんだけど 他に理由があるの? 変数の中身が判別しにくいという視認性 の問題以外に。
414 :
デフォルトの名無しさん :2006/03/29(水) 12:27:19
クソな変数名つけんじゃねえ
あらゆる点でダメダメ。 そんな変数名をつける奴はプログラミングはやめとけ。
416 :
デフォルトの名無しさん :2006/03/29(水) 12:31:08
視認性の問題以外に
use strict をすり抜けるから怖い。
ttp://perldoc.jp/docs/modules/File-Slurp-9999.01/extras/slurp_article.pod より
「
そしてこれは、open呼び出しの必要を削除した、そのコードの変形です:
my $text = do { local( @ARGV, $/ ) = $file ; <> } ;
$fileの中のファイル名はローカル化された@ARGVに設定され、
nullのファイル・ハンドルは@ARGVの中のファイルからデータを読み込むために使われます。
スカラーに代入する代わりに、上記の丸呑み全てを配列に代入することができます。
そしてそれはファイルを取得しますが、($/が行の終わりの印として使われて)行に分割されます。
」
my $text = do { local( @ARGV, $/ ) = $file ; <> }
っていう便利なコードで、openも使わずに$fileの内容を一気読みで丸呑みして$text
に代入できるというのはわかったのですが、
そのあとの
「スカラーに代入する代わりに、上記の丸呑み全てを配列に代入することができます。」
「行に分割されます」
というのがわからない。
上記で取得した$textに対して
@list = $text;
としたって
$textの内容が$list[0]に代入されるだけで行には分割されない
$textの内容が
a
b
c
だったとしたら、$list[0]=a,$list[1]=b,$list[2]=cとはならない。
どうして?
@text = do { local(@ARGV, $/) = @file; <> }; # @fileで指定した複数のファイルがファイル毎に@textの要素として読まれる とか @text = do { local(@ARGV) = $file; <> }; # $fileが行ごとに@textに読まれる のような使い方を言ってるんだと思うが、書いた奴に聞かないと よくわからんね。
420 :
デフォルトの名無しさん :2006/03/29(水) 13:51:26
>>418 > 「スカラーに代入する代わりに、上記の丸呑み全てを配列に代入することができます。」
> 「行に分割されます」
>
> というのがわからない。
分からないなら原文に当たれ。
酷い訳だな。
422 :
418 :2006/03/29(水) 15:19:35
>>419 なるほど、そういうことをいっていたんですね
よくわかりました。超さんくす。
ICOについて語りませんか?
>>424 メッセージ届いたときの「カッコー!」って音が大好き。
携帯メールの着信音もあの音にしちゃったよw
>>424 > ICOについて語りませんか?
ゲーム板行け!!
スレを間違えたのかと思いました
429 :
デフォルトの名無しさん :2006/03/30(木) 21:36:54
Class::DBIをつかってOracle9iにつないでいます。 ORA-01000が出るんですが、原因がわかりません。 常に出るわけではなく、なにをきっかけにしているのか ずーっと悩んでいます。 Class::DBIを使った場合、カーソルが開く(もしくは閉じる)タイミングというのは いつになるんでしょうか? なにかヒントのようなものでもよいので お願いします。
ISOについて語りませんか?
磯釣り
どうでもいいけどISOってアイソってテレビで読んでた IPAもアイパなんだろうか
ISO野波平
昔はCDライティングを「磯焼き」と呼んだものだが
Autrijus たんいつの間にあんなことに・・・
>>435 Wikipediaみてみそ
俺も驚いた
自己解決した。 写真みて、へぇ、女の人だったんだとおもたよ。 これからもよろしくね、鳳たん。
>>438 blogの方には臍出し写真も… (;´Д`)ハァハァ
>>434 > 昔はCDライティングを「磯焼き」と呼んだものだが
10年くらい前、そう呼んでたね。
perlからwin32apiは使えますけど、 .netapiは使えないのでしょうか?
ラリーがperl6の開発資金生活費として使い込んだり、 オライリーをリストラされたってのは本当?
生活資金として使うのは問題ないんじゃない? 生活費を稼ぐべき時間をPerlの開発に充当するんだったらね。
446 :
デフォルトの名無しさん :2006/03/32(土) 21:58:09
ラリーの一人や二人食わしてやってもいいじゃん。世界的に貢献してんだからさ。
>>444 の質問見たの3回目くらいなんだけど何かそういう情報元あんの?
俺のような認識でこの質問が出たのかも知れんけど。
おれYAPCでラリーに握手してもらったよw
WindowsXPでActivePerl5.8.8.816に上げたら俺様のスペシャルラーメンタイマーが 異常なんですけどコードに問題ありますか? DOS窓開いてperl timer.plで起動すると問題ないんですけどアイコンの ダブルクリックで起動してDOS窓からフォーカスが外れると CPU使用率が100%になるんですけど。 $| = 1; $time = time + 3 * 60; while (1) { if (time <= $time) { printf "%05d\r", $time - time; } else { print "\a"; } sleep 1; }
>>448 YAPCいってきたなら、ちょっとくらい感想を述べてくれもていいじゃない
誰のどんな発表がすごかった?
(個人的にはDANがどうしてあんなにえらそうなのか知りたいが)
ごめん、何がおもしろいのかわからん。 時間がきたら1秒に一回ビープ鳴らすんだよね? sleepしてるし、なんで100%になるんだろう。
>>450 448じゃないけどDamian Conwayにサインもらった俺が来ましたよ。
> 誰のどんな発表がすごかった?
Damian に 「sensei」と呼ばれた高橋会長の発表といったら怒る?
まじめに言うと、すごいというのとはちょっと違うけど、Damianの
初日の発表は大学の講義でも受けているようで印象に残った。
スライドはまだのようだけど、MP3の録音データは公開されてるから
よかったら聞いてみそ。
まあPerl Best Practice を買っていながらちゃんと読んでいなかったせいも
あるんだろうけど。
あとは Audrey Tangの発表といいたいところだけど、基本的には
ほかのカンファレンスなんかで発表したのを手直しして使っていた
ようで、彼女のblog追いかけていれば見覚えがあるようなものだった。
> (個人的にはDANがどうしてあんなにえらそうなのか知りたいが)
まあそれはねえ。
ソープンソースは集金のシステムをなんとしてでも作るべきだったね どんな思想を持っていようと金が必要なことには変わりない。
>>449 もう少しコードを細かく切って、
どこが原因か調べてみたら?
コード的にはおかしくない気がするから、449 の環境の問題なのかも。
お前らがAudrey、Audrey Tangなどとうるさいから どんなやつかと思って検索してみたら・・・・・・ トランスジェンダーしちゃった人なのね・・・ なるほど、これは確かに、ねたになるというか、 強烈というか、いやね、写真みたんですよね。彼女のblogの いやね、反則だろ、おいと。
>>449 実行はしてないけど…。
俺は昔、win98で \a を使った瞬間落ちたことがある。
それ以来winで \a は使ってない。
たぶん永久ループは関係ないと思う。
>>449 > WindowsXPでActivePerl5.8.8.816に上げたら俺様のスペシャルラーメンタイマーが
う〜ん、むかしWin95 + Perlで、やっぱり「フォーカス外れると」100%で難儀した記憶が
あるようなないような……
463 :
449 :2006/04/02(日) 18:21:47
sleep 1000; が1行のみのsleep.plでも同じ現象になったので インストールしなおしたり環境変えたりいろいろやってみたんですが 原因わからず、マニュアルのperlfuncのリンクが変になっていたこともあり 5.8.7にして解決しました。ありがとうございました。 インストーラーなんだから俺様のナウでヤングなスピリッツにオプティマイズした コンピューターにあわせろってんだよ>ラリー
464 :
デフォルトの名無しさん :2006/04/02(日) 18:52:25
/←の逆ってどうやって表示するんですか。
首を傾けるといいんじゃね
\
ソープンソースつぼった
>>464 「ななめ」と書いて変換すると「\」になるw
Perlのスカラー変数ってどの程度までの値を格納できますか? 例えばCですとcharは1バイトと規定されてますが、Perlはどうなのでしょう
文字列だと、特に制限はなくメモリの許す限り
>>469 デフォルトでは数値は倍精度浮動小数点型
(これはperlの内部的にはNVと呼ばれる)の表せる精度まで。
5.8ではuse bigint;
とすると多倍長整数を使用するようになって上限は無い、はず。
5.6でもプラグマが無いだけでMath::BigIntを使えば出来る。
参考: perlguts
そうですか 数字の場合はどうでしょうか
>>471 リロードしろよ俺orz
参考になりましたありがとうございます
474 :
デフォルトの名無しさん :2006/04/02(日) 21:29:34
>>455 > > (個人的にはDANがどうしてあんなにえらそうなのか知りたいが)
> まあそれはねえ。
くわしく
475 :
429 :2006/04/02(日) 21:30:10
>>442 じゃあどこに質問するのが
一番よいのでしょうか?
例えば次のdo-whileがあるとします。 do{ .... }while(1); この時 ....の部分で last if(条件);としdo-whileから抜けようとしますとエラーが出てしまいます。 ただし普通のwhile(1){ .... }ですと問題がないようです これは仕様ですか? Perlのバージョンは確か5.8.8〜です
>>475 doブロックがwhileブロックの中にあると解釈されるからだろうね
わざわざブロックの末尾でwhile(1)使うより、redo使ったほうが自然じゃない?
479 :
デフォルトの名無しさん :2006/04/02(日) 22:48:29
UNIXサーバで利用できるPerlモジュールの一覧を表示する事ってできますか?
481 :
デフォルトの名無しさん :2006/04/02(日) 23:15:32
Image::MagickでRAW画像をTIFFに変換したいのですが、 my $img = Image::Magick->new( size=>'128x128', colorspace=>'RGB', depth=>'8', ); $img->Read('fileName.raw'); $img->Write('fileName.jpg'); こんな感じでやると420エラーが出てしまいます。 コマンドのconvertで同様に行なうと変換出来ています。 どこかにサンプルコードありませんでしょうか?
483 :
455 :2006/04/03(月) 00:14:46
>>474 いや漏れも付き合いがあるとかネタをにぎってるとかいうわけじゃなくて、
伝え聞く中学生以降の人生(笑)とか見ていると、他人になめられたくないとか、
自分を大きく見せたいという気持ちが常に表に出ちゃうんじゃないかなあ
ということ。
ま、生まれ(育ちか?)がそーなのよ。
つーことで。
サブルーチンの引数についてなんですが Perl実行時にもし望まれない引数が指定された場合コンパイラがエラーを吐くようなプログラミングをしたいのですが (C言語ライクに int hogehoge(int a)関数があってhogehoge("ぬるぽ")としたらコンパイル時にエラーを吐くような) これはdie関数などを用いてサブルーチン内で実装するしかないのでしょうか?
487 :
481 :2006/04/03(月) 01:54:31
>>482 ありがとうございます。
ファイル名をfileName.rgbに変えたらすんなり出来ました。
Perl言語でホスト名を取得する方法ってどうやったら出来るのですか? 教えてください。
>>488 おっしゃってる意味が全くわかりません。
特にPerlはネットワークを介さずに実行できる仕組みになっております。
>>489 あんたの言ってることの方が、全くわからん。
493 :
デフォルトの名無しさん :2006/04/03(月) 19:40:51
>>488 perldoc -q hostname
494 :
デフォルトの名無しさん :2006/04/03(月) 21:33:27
Solaris9標準のPerl5.6.1にモジュールをインストールしようとしたのですが、 どのモジュールもgccよりccを見に行ってコンパイルできません。 その他のオープンソースはコンパイルできる環境はあるのですが、 同様の現象ってありますか?
495 :
デフォルトの名無しさん :2006/04/03(月) 21:55:05
CC=gcc make とか
496 :
デフォルトの名無しさん :2006/04/03(月) 21:56:34
make CC=gcc はどうですか
質問です。 演算子のオーバーロードしたくて以下のスクリプトを書いたんですが… package Num; use overload { 'cmp' => \&compare }; sub new { my $classname = shift; my $t = {}; $t->{'value'} = shift; bless $t, $classname; } sub compare { my ($x, $y)=@_; $x->{'value'} <=> $y->{'value'} } package main; my @l = (new Num(1), new Num(4), new Num(2), new Num(3)); foreach (sort {$a cmp $b} @l) { print $_->{'value'}, ', '; } エラーはでないですがソートできません。比較するサブルーチンの内容に問題 がありそうな気はしてるんですが、そもそもNum::compareが呼ばれてないみたい なんですけど、何が間違ってるんでしょうか。
>>498 overloadに渡すのはリファレンスじゃない
use overload (
'cmp' => \&compare
);
似てる有名人 子飼弾vs江川達也
>>499 ありがとうございます!できました!
ドキュメント見てたつもりだったんですが何故か{}を使う
と思い込んでてそこは再チェックしてませんでした…
503 :
masaki :2006/04/04(火) 14:43:41
質問させてください WindowsXP Pro Eclips3.1.1(日本語化済) ActivePerl-5.8.8.817 + padwalker でPerlをデバック実行したいのですが ブレークポイントではとまりますが 変数を覗いたりできません。 デバッカーとエディターがリンクしていない感じです。 こんな変な状況になった人いますか? 解決法を教えてください。
EPICの重さは何とかならないのか メモリ256Mしかありましぇん字もうてましぇん
505 :
masaki :2006/04/04(火) 15:23:43
Eclipseの方へ転記したので クローズさせてください。
EPICでプロジェクトに含めるplファイルって一つだけなの? plファイルを追加する方法がわからない
右クリック→New→File
質問です。 perl -e 'print "Hello.\n"; を実行すると、 Can't find string terminator "'" anywhere before EOF at -e line 1. というエラーがでます。 なぜでしょうか? 教えて下さい。 OS win2000 perl This is perl, v5.8.6 built for MSWin32-x86-multi-thread
perl -e "print \"Hello.\n\";"
DOSのコマンドラインの解釈には癖があるから、 ワンライナでは極力""を使わないほうが賢明。 q{}オペレータが便利。 perl -e "print qq[Hello.\n];" ちなみに癖ってのはこういうのをやってみればわかる。 perl -e "print \"|\";" 原因はDOSシェルは\によるエスケープを解釈してないからの模様。
511 :
508 :2006/04/04(火) 22:25:36
>509 ありがとう。 でも、実行すると、 C:\myPerl>perl -e "print "Hello.\n;" HelloSCALAR(0x1624f80) となります。 なんででしょう?
>>510 DOSのコマンドライン解釈はよくわからんが、perl処理系には
print Hello.\n;
というプログラムが渡っているのだろうと思われる。文字列定数がベアワードに
なっているが、quoteを補うと
print 'Hello' . \ 'n';
513 :
508 :2006/04/04(火) 23:07:31
>510 >512 ありがとう。 皆さんは、perlをどんな環境で使っていますか? 私は、win2000+ACTIVESTATE社のperlを DOS上で使っています。
Linux+vim
>>508 いやさ q{}とかはいいんだけどさ。
お前さんシングルクォート閉じてない・・・
Perl のスレッドで、親スレッドと子スレッドの間で複雑な構造のデータの内容を 共有するにはどのような手段があるでしょうか? 多段になっている配列やハッシュ変数の内容を子スレッド側で変えたいと思っています。 use strict; use threads; use threads::shared; my @s : shared; main(); sub main { my $th = threads->new( \&thr ); $th->join; print "in main: @s\n"; } sub thr { @s = ( 1, 2, 3 ); # OK # @s = ( 1, [2, 3] ); # NG print "in thr @s\n"; } threads::shared のドキュメントを読んで、こういうことはできなそうだと分かったのですが、 スカラー変数などに詰め込んで渡して、親スレッド側で展開等しかないのでしょうか・・。
>>516 > Due to problems with Perl's prototyping, if you want to share a newly created reference, you need to use the &share([]) and &share({}) syntax.
threads::sharedのPODに書いてあったよ
確認してないけどこうじゃない?
@s = ( 1, &share([2,3]) );
>>517 ありがとうございます。
@s = ( 1 );
$s[1] = &share( [] );
@{$s[1]} = ( 2, 3 );
でいけました。
win2000pro+eclipse3.2.0+EPIC0.3.12+cygwinのperl でperl debugger使おうとしてるけど デバッグしようとしたとたんに Failing to create PerlDB-Interface !!! とか Error within Debug UI: と出てうまくいきません。 日本語の情報は皆無でした。 英語でぐぐってもさっぱし Interpreter typeもちゃんとCygwinになってるし Perlのパスもきちんとcygwin\binに通ってるし mountコマンドもcygwinに入ってる。 上でperl debugger動いている人いたけど どうやったの〜?
>>520 Cygwinで普通に動くが…。
setup.exeで普通にダウンロードしたわけだが。
ディレクトリ内のファイルの一覧を取得する際に opendir my $dh, $dirname or die "#!"; #.や..以外のファイルを取得 @filelist = grep { !m/^(\.|\.\.)$/g } readdir $dh: c;psedir $dh; とやってるのをみかけたのだが これって @filelist = readdir $dh; shift(@filelist);shift(@filelist); とやっちゃまずいの?結果は同じでこっちの方が処理速度速いと 思うんだけど あと grep { !m/^(\.|\.\.)$/g } の正規表現の中の最後のgっていらなくね?
@filelistって . と .. が最初にくるって保証されてるんだったら別にいいんじゃない?
日本語がおかしいな。 @filelistの最初に . と .. が…でおk
Encodeのモジュールを全部サーバにアップしたのに、 ↓このエラーが出ます。 Can't locate loadable object for module Encode in @INC ・・・ 助けて下さい!!
>>522 速いけど環境依存になる可能性あるな。
特定の環境でのみ実行ってのならよさそう。
527 :
デフォルトの名無しさん :2006/04/06(木) 07:03:27
use strictってrequireする全てのファイルに書くの…? 大元のファイルからrequireされたファイルに グローバル変数を渡す時はourが必要になるんだけど、 requireされたファイルではuse strictが無視されてるみたいなんですけど。
>>528 ほとんどのpragmaはレキシカルスコープ(myと同じ)です。
詳しくはperldoc perlmodlibのPragmatic Modulesを参照。
>>525 そりゃ無理だろうな。Encode.pmはビルドしないと使えないXSモジュールだ。
ちゃんとsshでログインしてビルドすれ。
530 :
デフォルトの名無しさん :2006/04/06(木) 09:41:23
>> 520
俺もいろいろ悩みましたが
結局各バージョンの相性でした。
eclipse3.1.X以上は難しいと思います。
俺の成功例は。。。
ActivePerl-5.8.8.817 + padwalker(ppm install padwalker)
eclipse-SDK-3.0.1-win32 + NLpack-eclipse-SDK-3.0.x-win32
EPICは
http://e-p-i-c.sf.net/updates よりインスコ
で動きます。
Linuxで外部コマンドを投げっぱなしジャーマンスープレックスするときは system('rm -f /foo/bar &'); で可能でしたがwindowsの場合はどうやるのでしょうか。 上記のような感じでやると起動したプログラムが終了するまでコンソールに帰ってきません。 fork以外の方法で出来ればと思います。
wperl
533 :
531 :2006/04/06(木) 19:32:02
ありがとうございます。wperlで行ってみたのですが挙動は変わりませんでした。 wperlという物を初めて知ったのですがperlと1バイトしか相違点がないんですね。
>>531 fork と同じようなことだけど、
use threads;
threads->new( sub { 'rm -f /foo/bar &' } );
とかどうかな。
バックグラウンド実行に比べればかなーりアレだけど・・。
>>531 投げっぱなしではないけど、手軽なのはopenかな。
投げっぱなしが希望なら、CMD.EXEのSTARTコマンド経由。
別ウィンドウを開くのと、NT系のみが欠点。
もし、(OS/2のCMD.EXEにあるような)DETACHコマンドが(NTのCMD.EXEにも)あるなら、
(STARTのかわりに)それを使うのが楽そう。
536 :
デフォルトの名無しさん :2006/04/06(木) 21:30:02
open (IN, "./file!"); 複数のファイルを一遍にopenする事ってできますか?
>>536 openした後どうやって処理するつもりなの?
>>536 open(IN,"cat file1 file2 file3|");
ある文字列の前後の任意の文字数にのみマッチする正規表現ってどう書けばいいのでしょうか? たとえば $str = 'foobarbazhogeほげホゲ'; $pat ='hoge'; があったとして、その前後2文字 'az', 'ほげ'にマッチさせたいのですが。
>>539 マルチバイト文字を考慮するとなると、マルチバイト文字にマッチする
正規表現を使う等の工夫が必要。
(Perl 5.8 なら、そうしなくてもできる方法があるのかな)
( $a, $b ) = $str =~ /(..)$pat(..)/;
5.8ならそのまま.が一文字に値します><
534,535さんありがとうございました。 早速試してみます。
perl, v5.8.7 builtをインストールしたのですが、(PCはwindows xp) 漢字の検索ができずに困っています。 どなたか対処方法をご教授願います。 if($_=~ m/漢字/) { print "hit\n"; }
┐(´д`)┌
>>543 スクリプトの文字コードがshifjisなら
use encoding "shiftjis";
でOK
>>3 のテクニックのとこのページって
いまだにスクリプトをeuc-jpで書けってとこで
アドバイス止まってない?
euc-jpで書いても日本語処理は完璧じゃないのに
<<548 Y!はeucだからソースをeucで書けば、普通に漢字でマッチできるはず。 shiftjisで書いて<<546のプラグマを使うのなら、 Encode.pmのdecode関数でutf化する必要がある。
>>549 ありがとうございました。
eucでファイルセーブしただけでマッチするようになりました。
ただし今度は漢字のprintが文字化けますが、とりあえずは
次に進めます。
551 :
デフォルトの名無しさん :2006/04/08(土) 23:46:24
ActivePerlのマニュアルがIE6でちゃんと動作しないのはどうにかならんの?
動作しないって5.8.6くらいの折りたたみ式のやつのことか? だとしたら5.8.8にすると解決。
>>550 スクリプトがeuc-jpならprintの出力もeuc-jp
windowsの文字コードはshiftjis
したがってもしコマンドプロンプトにそのまま出力
したら化けて当然
ゴメンクダサイ。質問です。 複数ファイルを一気に置換したいのですが、 perl -pi.bak -e 's/<FONT COLOR="white">/<FONT COLOR="blue">/g' *.html これはWINじゃダメみたいです。 WINでやりたいのですがどうすればいいでしょうか? ご教授お願いいたします。
557 :
556 :2006/04/09(日) 20:15:55
ぶっちゃけwinじゃperlは使いづらいかもですね。
>>557 速度面で一時ActivePerlにしたがそんなに違わなかったのでCygwin-Perlに
戻して、Utf8-TeratermSSH組み込みのCygtermで使ってます。
もうコマンドプロンプトに戻れない。
560 :
デフォルトの名無しさん :2006/04/10(月) 16:58:48
HTTPのレスポンスヘッダの時刻データなんですが、 Mon, 10 Apr 2006 07:28:55 GMT これを秒数の整数値に変換する方法ってないでしょうか? GNUのdateコマンドで $date --date='Mon, 10 Apr 2006 07:28:55 GMT' +%s というものなんですが、データの量が膨大なのでPerl内でこれをやりたいです。
(´・ω・)
564 :
デフォルトの名無しさん :2006/04/11(火) 09:41:24
cpan> install Bundle::LWP MIME::Base64 is up to date (3.05). Digest::MD5 is up to date (2.33). Running install for module URI The module URI isn't available on CPAN. Either the module has not yet been uploaded to CPAN, or it is temporary unavailable. Please contact the author to find out more about the status. Try 'i URI'. LWPをインストールしようとすると、こんなの出るんですが、これなんでしょうか?
>>564 多分、ダウンロードに失敗している。ミラーを設定してみたらどう?
設定の仕方はo conf urilist辺りでググってくれ
なぁ、List::Utilのshuffleって本当にちゃんと動いてるの? @i = shuffle 1..500; ってやってみたんだが いくつか数字が欠けてる
567 :
566 :2006/04/11(火) 12:27:51
四月馬鹿でした
少なくともオレのところでは % perl -e 'use List::Util qw(shuffle); for (1..10000) { my @i=shuffle 1..500; my %i; @i{@i}=(); for(1..500){exists $i{$_} or warn $_}}' とやってみたがなんともなかったな。
569 :
デフォルトの名無しさん :2006/04/11(火) 16:55:34
perlの連想配列はハッシュインデックスを使ってるんですか?
570 :
デフォルトの名無しさん :2006/04/11(火) 17:31:10
>>569 > perlの連想配列はハッシュインデックスを使ってるんですか?
それはあなたが「ハッシュインデックス」と呼称しているものが何かによる。
一応呼び名はハッシュだなあ。
データベース用語なのかな? 「ハッシュインデックス」って。 データベース管理システムに「インデックス」と呼称されるエンティティがあって、 それの種別を表すのに、「ハッシュ」とか「ツリー」とかが前置されるようだね。
普通に計算機科学用語だと思うが、 アルゴリズムとデータ構造とかからちゃんと勉強してる Perl 使いって少ないのか?
スクナイヨ
そんなことはないと思うがな と今日SICPの原書を買った漏れが言って見るテスト
>>572 で、その「インデックス」は「クラスタ」と置換可能らしい。
「インデックス」自体もデータベース用語なんだろうね。
>>569 > perlの連想配列はハッシュインデックスを使ってるんですか?
以上を踏まえると、Perlの連想配列はハッシュテーブルですが、しかし
「ハッシュインデックスか?」と聞かれると質問の意味が良く分からないと
答えざるを得ないということですね。
まあしかし連想配列の実装にただの配列使うやつは少ないんではないかと…。 てか、UNIXとかなら最初からライブラリあるし、ライセンスの都合で使いたく ないにしても変な実装はしないんじゃないかなあ。
579 :
デフォルトの名無しさん :2006/04/11(火) 20:58:48
Perlスクリプトの中で引数を使っているのですが、 引数の指定が1つでなかったらスクリプトを終了させる 記述ってどうすれば良いですか?
>>579 引数の数を調べて、1以外の時にはexitする。
if(@ARGV != 1){ die }
>>578 hv.c や hv.h 見たけど、ライブラリは使ってなかった。
複数の単方向リストがあり、ハッシュ値(32bit)を元にリスト自体を選んだ後は
リストを辿りながらキーを捜してるっぽい。
これって、ハッシュ値重複が前提の直接ハッシュ法??
よくわかりません。
>>579 $#ARGV == 0 or die "引数が...";
$#ARGV != 0 and die "引数が...";
die "引数が..." unless scalar @ARGV == 1;
die "引数が..." if scalar @ARGV != 1;
たぶん、どれもこれも駄目な記述。
583 :
デフォルトの名無しさん :2006/04/11(火) 21:29:36
579です みなさまありがとうございます。
質問なのですが、 perl自体をコンパイルしてインストールしたいと思ったときに、 CPAN上で提供されているパッケージが含まれてしまうのですが、 これを除外 or その一覧を取得する方法って無いでしょうか?
$#hogeの値は$[の値で変わるので配列の要素数が1か判定するのに$#hoge == 0のように使うのには抵抗があるのだが、 だからといって $hoge[0]のかわりに$hoge[$[]とは書かないダブルスタンダードな俺。
>>582 ハッシュはまんま実装してあるね。
今のソースは知らないけど、前はラリーウォールの名前入りの
かなり古いソースが長い間使われていた。
確か、バケット占有率だけ見て
リスト長については目をつぶるタイプのハッシュだったと思う。
アルゴリズムの本読めば分かる程度の、普通の(難しい事抜きの)実装だった。
587 :
デフォルトの名無しさん :2006/04/11(火) 22:28:43
pugsって新種のコンパイラ、インタプリタでしょうか? そうすると、今、普通のコンパイラ、インタプリタは、なんと言う名前なのでしょう??
>>582 ていうか、重複しないハッシュテーブルなんて普通は作れない。
重複した時の処理で隣のハッシュ値を使うかもう一つテーブル
作って同じハッシュ値でやるかだ。
あ、そんだけじゃない。テーブル作らなくてもリスト構造にしちゃうとかあるな。 まあいいや。
591 :
573 :2006/04/11(火) 23:51:29
あながち間違いでもなかったか。
ハ_ハ (^( ゚∀゚)^) ハ_ハ ) / ('(゚∀゚∩ みんな仲良く (_ノ_ノ ヽ 〈 みんなPerl仲間 ヽヽ_)
反吐が出ます
出さないでください
>>568 の
@i{@i}=();
の左辺て何やっているの?
>>595 ありがとうございます。
perl 6 は、本家の実装が今後でてくると。
言語仕様もかなりかわっているようです。
599 :
デフォルトの名無しさん :2006/04/12(水) 10:54:34
C,C++,PHP,MySQLなどの経験があり、 今度仕事でpostgreSQL+perl環境でWEBサービスを作るんだけど、 今のうちにperl+postgreSQLの演習として何か作ろうと思うんだが 何が良いだろう? perlもpostgreSQLもほぼ未経験です。
今度仕事で作るモックアップを作ればいいんじゃないの
601 :
デフォルトの名無しさん :2006/04/12(水) 11:51:47
Pg.pmってなんじゃ?DBIの方が資料があっていいと思うよ。
603 :
デフォルトの名無しさん :2006/04/12(水) 13:02:33
DBD-Pgがwin版ActivePerlのPPMでダウンロードできない。 search DBDってしてみても、PgPPしか見つからないんだが PgPPとPgで構文って変わってくるかな? 変わらないなら、別にPgPPでも良いので。
605 :
603 :2006/04/12(水) 13:23:09
ありがとう。 すごく助かった。
>>597 %iに@iのキーを手っ取り早く作る手法
ハッシュスライスに空リストを代入でキーだけ作られる
ただ、値は未定義なのでexistsで確認しなければならない
607 :
デフォルトの名無しさん :2006/04/12(水) 14:57:52
copalってもしかしてpostgreSQL用のDBI機能はちゃんとエミュレート出来ない?
>>597 $i{@i}=();
だったりするとまた意味合いが違うんだよね。
マジカルPerlタンハァハァ
609 :
607 :2006/04/12(水) 16:00:11
ごめん、勘違いだった。 DBD::Pg使うと perlのcommand line iterator自体が落ちるみたいだ。 インストール失敗してるのかな・・・
610 :
デフォルトの名無しさん :2006/04/12(水) 19:13:08
ずびばぜーん
XML::DOM::ParserでXML文書から取り出したutf8化されてしまった日本語を(大元はsjis)
Jcode.pmでShift_JISに戻そうとしたんですが、失敗してしまいます。
$result = Jcode->new($target, "utf8")->sjis;
とやっても
$result = Jcode::convert($target, "sjis");
とやっても文字化けした難しい漢字の
並んだShiftJISへと変換されてしまいます。
元の日本語コードを自動判別させても同じでした。
環境はWindowsXPで、PerlはActiveStateの5.6です。
Jcode.pmは、
ttp://openlab.jp/Jcode/index-j.htmlのJcode-2.03をコンパイルして使ってます 。
5.8のEncodeを使おうと思ったのですが、他に利用してる重要な
モジュールが5.6じゃないと動かないとあって、5.6ははずせない状況です。
何か解決方法ってありますか?
関係ないと思うけどJcodeは2.00以降と2.00以前でconvertの挙動違うから気をつけな
>>610 > 何か解決方法ってありますか?
どのように変換されているのか調べて問題を突き止め、それを解消する。
613 :
610 :2006/04/12(水) 19:47:47
何やらsjis変換前の文字コードをJcode::getcode($target) で調べてみたら「ascii」とか出てきてしまいました。 おかしいと思い変換前の日本語をファイル出力して、それを EmEditorで読ませるとちゃんとutf8として自動判別されます。 もちろん文字化けしていない、大元のShift_JISだったころの日本語です。 XML::DOM::Parserも内部処理ではutf8で処理してるはずなので、 エディタの判定が正しいのは明らかなのですが。。
614 :
610 :2006/04/12(水) 19:52:06
すみません、
>>613 に関して大間違いでした。
ちゃんと変換前の文字コード判別は「utf8」で判別されていました。
もう少し調べてみます。。
615 :
610 :2006/04/12(水) 20:14:10
自己解決できました。 お邪魔しました。
616 :
デフォルトの名無しさん :2006/04/12(水) 20:47:55
知恵を貸して下さい。 fileにいくつか文字列が記述してあり、その記述の行をログから抽出する Perlの記述はどうすれば良いですか? UNIXでいう、fgrep -f ./file /var/log/messages です。 しかし、fgrepを使わず、Perlのみで可能にしたいです。
618 :
デフォルトの名無しさん :2006/04/12(水) 21:01:30
619 :
618 :2006/04/12(水) 21:03:55
ユニークでなければいけません。 ハッシュ化しようかと思ったが、それでは駄目ですよね。
URLを全部エンコードしてやれば。
例)
http://www.yahoo.co.jp/ ↓
%68%74%74%70%3a%2f%2f%77%77%77%2e%79%61%68%6f%6f%2e%63%6f%2e%6a%70%2f
>>620 長いホスト名だとPATH_MAXにひっかかるよ。
正規化してmd5でも使ってhexに変換しる。
>>621 >様々なurlをファイル名にするのに
~~~ ~~~~~~~~~
そもそも、何をしたいの? 絶対にURLがファイル名でないとだめなの?
624 :
618 :2006/04/12(水) 21:25:17
はい。絶対にURLがファイル名でないとだめです。 いろいろと参考になりました。ありがとうございます。 なんらかの形でエンコードしてみます。 今情報あさってたんですが。Base64なんてどうかな。
いいんじゃないの。なんでも。
RFCではURLの最大文字数は定められていないが、 ファイルシステムにはMAX_PATH制約があるからURL->ファイル名の変換は不可能。 適当な方法で文字列を生成して対応関係を別の場所に記録しておくしかない。
627 :
618 :2006/04/12(水) 21:44:29
>>626 わかりました。
MD5ってユニークなんですか?
ぐぐってんだが、イマイチわかんない。
MD5に限らず固定長の一方向ハッシュ関数の結果はユニークじゃない。 MD5は128ビットだから1/2^128の確率でダブル可能性がある。
629 :
618 :2006/04/12(水) 21:50:57
>>628 はい。やっと理解した。
普通に考えて、ユニークのわけないよね。
元の対象のものとハッシュに一意性があるっつーことね。この辺でこんがらがってた。
ヒント: perl -Mbigint -e "print 2**128"
MD5じゃ、保存・参照するとき常にURL文字列がないとできないし、 ディレクトリをlsしたときに、どのサイトのファイルかもわかんなくてちょっと困る木がするが。
似たようなソフトいっぱいあるだろうし、 wgetとかダウンロードソフトの保存ルールでも参考にしてみたら?
めんどくさい時はSQLに突っ込んでみよう
どうせファイル名<->URLの変換はDB参照しなきゃいけないんだから、 既存のファイル名とかぶらない文字列をランダムに生成すれば十分。
635 :
618 :2006/04/12(水) 22:24:43
説明不足の中、 いろいろとレス頂き有難う御座います。 有用な、レスばかりで感謝しております。 最終的には、どこかで線引きできると思いますので、 試行錯誤やってみます。 そういやwgetってサイトミラーリングした時、アドレスフォルダ名にしてたな。みてみよ。
まぁ、長いURL(目的のファイルシステムで使える文字長以上の)がない
と仮定できるのなら、URIエンコードのような感じで変換するのがお手軽。
Wikiとか参考になるかも。
>>620 のように全部変換するのではなく、英数字やピリオド等は
もとのままにしておくと ls で見たときとかにも分かりやすくてgood。
番号振っときゃいいじゃん。
THcomp でも使っとけと
MD5は、もう、死んでいる。
640 :
デフォルトの名無しさん :2006/04/13(木) 09:57:02
cygwin上のperlだと、$HOMEがカレントディレクトリを返すんですが これは仕様ですか?
どういうこと?
すまん勘違いでした。 perlからは$ENV{HOME}を見るのが正しいのか。
スクリプトが自分のフルパス名を知るにはどうしたら良いのでしょうか? __FILE__ や $0 は相対パスしかくれません。 cwd を繋げればいいのかと思ったのですが、別フォルダから実行すると スクリプト自身のパスになりません。 よろしくお願いします。
FindBin
645 :
643 :2006/04/13(木) 10:38:30
646 :
デフォルトの名無しさん :2006/04/13(木) 11:13:24
windowsXP+perl+dbi+postgreSQL+apache この環境を構築する方法について情報下さい。 通常のやり方ではエラーになるのです。
649 :
デフォルトの名無しさん :2006/04/13(木) 11:40:33
誰かお馬鹿な俺でも分かるようにScalar leaked: 1の原因を説明してくれ・・・
>>646 , イ)ィ -─ ──- 、ミヽ
ノ /,.-‐'"´ `ヾj ii / Λ
,イ// ^ヽj(二フ'"´ ̄`ヾ、ノイ{
ノ/,/ミ三ニヲ´ ゙、ノi!
{V /ミ三二,イ , /, ,\ Yソ
レ'/三二彡イ .:ィこラ ;:こラ j{
V;;;::. ;ヲヾ!V ー '′ i ー ' ソ
Vニミ( 入 、 r j ,′
ヾミ、`ゝ ` ー--‐'ゞニ<‐-イ
ヽ ヽ -''ニニ‐ /
| `、 ⌒ ,/
| >┻━┻'r‐'´
ヽ_ |
ヽ _ _ 」
ググレカス [ Gugurecus ]
( 2006 〜 没年不明 )
651 :
646 :2006/04/13(木) 12:30:43
>>648 apache,perl,postgresqlをwebを参考にインストール。
それぞれ単体で動作確認成功。
ppm使ってdbiとdbd-pgをインストール。
perlからdbiを使ってpostgresqlへコネクトしようとすると
perl command line interpreterが落ちる。
>>650 同じ言葉を返したい。
ぐぐった上にさらに自分でこの環境を構築してみてから言ってくれ。
着々とすすむGoogleのファシズム的支配体制を阻止しよう。 すぐに、ググれという馬鹿の一つ覚えはやめましょう。Googleで探して見つからないと、 この世に存在しないのと同義になりつつあります。あらゆるものがGoogleベースで 構築されようとしています。そろそろ、どうやってGoogleの監視から逃れて、 自由なネット生活を送るかを、真剣に考えましょう。
またエラー隠蔽者が暴れてるのか。
>>651 んと、全く同じ環境を再現できるひとはそれほど多くないと思うので、
具体的なエラーメッセージや使ってるバージョンとか参考にしたサイトの URL とか
できるだけ詳しく出した方が良いと思うよ。
Perl 落ちる でググれ。 解決方法どっかにあるぞ。
質問者の態度悪ぃなぁ いい加減にしろよクソアマが マジ頭くんぜ初心者!
人間とは、若い頃は年寄りから「近頃の若い者は」と言われ、自分が歳を 取ると若い者を見て「近頃の若い者は」と言い出す生き物のことである。
Perlでスクリプト書いてて、どうしてもメモリ使用量的にキツイときって おまえらどうしてますか?C?C++?LISP?
メ モ リ 増 設
メモリを増設
ぐは、かぶった・・・orz
キツイのがメモリ使用量だけなら、Perlでメモリ消費を押えた記述をする。
メモリ節約にundefって効果ある?
アルゴリズムを見直す
>>668 どう見直すかは状況によるに決まっとろうが。状況の例を挙げろと?
ごく簡単な例で言えばファイルの中身を全て行単位でひっくり返すものだとすれば、
最後の行から逆順に読んで書き出していくようにすれば良い。
ソートなら分割統治法で複数回に分けて挿入ソートとかいろいろあるもんだよ。
>>660 もっとメモリが沢山あるマシンにログインする。
・でかい変数をコピーしない ・そもそもでかい変数を作らない ・いらなくなった変数は消す ってやってりゃそうそうメモリ足りなくなること無いと思うけど
ちょっとしたプログラムなのに15MBもメモリを使ってしまう。 Perlはこれぐらいは覚悟して使うべき?もちろんCで書くより何十倍も楽なんだけど・・・
俺のちょっとしたプログラムは2MBもメモリを使ってしまう。 俺はそれぐらいは覚悟して使っている。
15Mぐらいは気にしない。気にしない。一休み。一休み。
15MB のメモリと何十倍の開発効率とどちらを取るべきかなんて それの程度のこと自分で判断できないようなら開発者失格だろう。
最新の5.8.6使ってるのが駄目なのかもしれんね。 threadやめて10年前の古いバージョンでfork使って試してみるわ。
そろそろperl6じゃないの?
ちょっとしたので15Mって使いすぎじゃね?
ちょっとしたプログラムの例 $a = `cat hello.doc`; もちろん hello.doc は 15M のファイル。
> もちろん hello.doc は 15M のファイル。 ちょwwwとしたプログラム。
683 :
デフォルトの名無しさん :2006/04/13(木) 23:33:27
15Mでメモリ使い杉って・・・どんだけショボイマシン使って開発してんだよwwww
昔はメモリが足りなくてスラッシングしたこともあったな。 その時は根本的に処理変えてメモリの中身をディスクに落とすように書き換えた。 データ分割してウィンドウ処理。 今時、テキスト処理でメモリ不足って、余程じゃなきゃ無いんじゃないの? テキストのみなら新聞1年分読み込んでも数百MBでしょ。
Perlスクリプトが使うメモリの量って把握できるの?
できるよ
メモリがきつそうだったらDBM使うのが当たり前じゃないの?
「ちょっとした」 で15Mは無駄遣いしすぎだと思うけどなぁ
「ちょっとした」でそこまで判断できるなんておまいらエスパーですか?
ほんとうにちょっとしたプログラムだと、 数メガのテキストファイル読み込んで配列つくって 文字列の検索置換してあたらしく数メガのテキストファイル作っちゃったりするけどな。 メモリや速さの効率考えずに思いついたままのスクリプト書いちゃう。
ちょっとした... (数字はi386 <STDIN>実行時点のDATA消費メモリ) 約064MB perl -e "$#a=0xFFFFFF;<STDIN>" 約256MB perl -e "$#a=0xFFFFFF;$a[$_]=undef for (0..$#a);<STDIN>" 約320MB perl -e "$#a=0xFFFFFF;$a[$_]=0 for (0..$#a);<STDIN>" 約384MB perl -e "$#a=0xFFFFFF;$a[$_]=0.1 for (0..$#a);<STDIN>" 約320MB perl -e "$#a=0xFFFFFF;@b=@a;<STDIN>" 約128MB perl -e "$a=' ' x 0x4000000; <STDIN>" 約064MB perl -e "$a=' ' x 0x4000000; undef $a; <STDIN>" 約064MB perl -e "$a=' '; $a x= 0x4000000; <STDIN>" 約000MB perl -e "$a=' ';$a x= 0x4000000; undef $a; <STDIN>"
<STDIN> って何?
ああ! sleep してるのね。
ちょっとしたWin32::OLE使ったExcelリモート操作で5MB程度
64bitCPUが主流になりつつある時代に何を言ってるんですか貴方達は
・・・という夢を見た。
>>687 えっ、そうなんですか?
DBMだとメモリ消費抑えられるの?
>perl -e '<STDIN>' タスクマネージャ:プロセス perl.exe 3404K 何もしなくてもインタプリタで普通に3M強は喰うわけだ。
use Data::Dumper; sub func_A{my $H=shift();$H={key=>'val_A'}} sub func_B{my $H=shift();%$H=(key=>'val_B')} my $H={}; func_A($H); print Dumper $H; # $H={} 変更されない func_B($H); print Dumper $H; # $H={key=>'val_B'} 変更される 上記の理由がよくわからないのですが、どう理解すればいいのでしょう?
>>699 use Data::Dumper;
sub func_A{my $H=shift(); print "func_A : $H\n"; $H={key=>'val_A'}; print "func_A : $H\n";}
sub func_B{my $H=shift(); print "func_B : $H\n"; %$H=(key=>'val_B'); print "func_B : $H\n";}
my $H={};
print "\$H : $H\n";
func_A($H);
print Dumper $H;
func_B($H);
print Dumper $H;
これで実行してみ
701 :
699 :2006/04/15(土) 01:05:36
>>700 えーっと、これは、つまり、
func_A は、「$H が指す先」でなく、「$H そのもの」を書き換えてるから、
ということですね。
言われて、よ〜く考えると、何とか理解できたのですが、奥が深い。
ありがとうございました。
use Storable;
sub save{
my ($Hash_a,$Hash_b)=@_;
store [$Hash_a,$Hash_b],'file';
}
で保存したハッシュを保存した場合、
sub load_ng{
my($Hash_a,$Hash_b)=@_;
($Hash_a,$Hash_b)=@{retrieve('file')};
}
では間違いで、やはり、
sub load_ok{
my($Hash_a,$Hash_b)=@_;
($Hash_a_file,$Hash_b_file)=@{retrieve('file')};
%$Hash_a=%$Hash_a_file;
%$Hash_b=%$Hash_b_file;
}
と書くしかなさそうですね。
キマイラにも程がある
>>698 俺が昨日作ったa.exeなんてファイル開いただけなのに4104Kぐらいつかってたぞ。
>>702 この生物、後付けしまくったにもほどが… それが6なのか
>>701 なんで素直に
($hash_1, $hash_b) = load();
sub load {
@{ retrieve('file') };
}
にしないの?
707 :
699 :2006/04/15(土) 12:23:57
>>706 Thanks!!! おっしゃる通りです。
呼び出し側を load(\%hash1,\%hash2) の形式で書いていたので、
考え方がそっちに固まってました。
ありがとうございました。
DBMに複雑なデータ構造を保存する時は Storableでfreezeしてシリアライズしてからというのが定石ですか?
PerlScriptについて
win2000pro,IE6SP1,fully patch,perl 5.8.7
かなりマイナーな質問なのですが、
ローカルに保存したhtmlファイル中に
<html><body>
<script language="PerlScript">
$window->document->write("heho!");
</script>
<body></html>
と書いています。これをIEで読み込めばちゃんと動きました。
次に上記のファイルの先頭行に
<!-- saved from url=(0005)
http://a -->
を付け足します。
IEでは、htmlファイル中に上記の一行があれば
そのhtmlをマイコンピュータゾーンではなくて
インターネットゾーンのセキュリティで実行できます。
この状態でhtmlをIEで開いてもperl部分は動きません。
PerlScriptのデフォルト挙動では、セキュリティのためか、
ローカルのhtmlファイル中では動くが、ネット上のものについては
動作しないようになっているようです。
IEがhtmlファイルをネットにあるものと認識しているため
動かないのだと思います。
#続き それに従いレジストリエディタで HKEY_LOCAL_MACHINE\SOFTWARE\ActiveState\PerlScript\1.0 の REG_DWORD: EnabledZones = 0x0010 (default) の値を0x0020(Enable Internet) に書き換えました。 これでPerlScriptのセキュリティモードがインターネットゾーン向けに なったと思ったら、まだ動きません。 先日PerlScriptなるものがあると知り、 しかもJavaScriptとほぼ互換性チックな使い方ができる知り、 セキュリティリスクについて実験しようと思ったのです。 例えば、どこかのHPで、 html中にPerlScriptで 'format c:'; なんてやられたらどうなってしまうんだと。 そこでローカル上でネット上にhtmlがあるかのように 振舞わせようとしたのですが、頓挫しました。 どこがおかしいんだろう。 長文失礼しました。
>>708 定石かどうか知らないが、DB に限らずスカラーにして保存する場合、
おれもそれしか思いつかないなぁ。
Data::Dumper でも同様のことができると思うが、Storable の方が効率がいいしね。
正規化するまでもなかったりマンドクセな時はよくやるな
714 :
デフォルトの名無しさん :2006/04/15(土) 16:10:25
配列の要素っていくつまで入れれるのですか?
やってみればいいじゃない
他の言語やってきたらPerlの変数内の値の扱いについて混乱してきた… 他の変数に代入した場合に何所まで複製されるかがこんがらがってる。 Devel::Peekで色々やってみたら実装レベルで考えると文字列が特別扱いされてるようだけれど… $fuga = $hoge = {}; の場合は、RVが複製され、その際ポインタが値として複製される。 $fuga = $hoge = 'piyo'; では、PV自体と、一つの単位である文字列の中身の複製が行われる。 Perlでは数値も文字列もリファレンスも等しくdatumであって、 その単位に応じて複製されている、と考えれば良いのかな。
元々違うだけで、特別扱いとかじゃないんだけどね。 XS周り読むと分かるよ。 別に複製が特別な作業してるんじゃなくて、 RVの代入はRVの代入=ポインタ複製。 PVの代入はPVの代入=文字列複製。 SVの先にある構造体が何かによるだけ。
>>719 確かにそれぞれ別のデータ構造なんだから特別扱いというのは変でしたね…
ちょっと文字列が参照として表わされた言語に慣れちゃったようで
$fuga = $hoge = 'piyo';
$hoge =~ s/piyo/hage/;
すると$fugaも変わってしまうような感覚に囚われてしまったもので(´・ω・)
perlgutsなりperlの実装なり読んで来る事にします。サンクス
win環境でperlを使っています。 perlスクリプトを実行させると、ウインドウタイトルが 「C:\Perl\bin\perl.exe」、ウインドウ クラス名が「ConsoleWindowClass」 となりますが、このウインドウタイトルを変更する方法ってないでしょうか? いくつも実行するとわからなくなるので、ウインドウタイトルにスクリプト名 を添付したいのです。
win板池
use Win32::Console; $CONSOLE = Win32::Console->new; $CONSOLE->Title('たいとる');
print \n; ってすると SCALAR(0x1625088) って表示されるんだけど これって何が起こっているの?
>>725 perl -MO=Deparse -e 'print \n;'
print \'n';
-e syntax OK
barewordなnが文字列と解釈されて、そのリファレンスを取っている。
use Win32::Console; $con = Win32::Console->new(); #現在のウィンドウサイズを表示 print join('::',$con->Window()),"\n"; #ウィンドウサイズを相対指定で変更 $con->Window(0,0,0,20,20); #変更後のウィンドウサイズを表示 print join('::',$con->Window()); これで 0::0::79::24 0::0::94::44 となることを期待しているのですが ウィンドウサイズは変更されず 0::0::79::24 0::0::79::24 になってしまいます なんでー
728 :
725 :2006/04/16(日) 04:37:24
>>726 barewordって初めて聞いた
剥き出しの、つまり裸のワードってことなんですね
perl独特の言い回しなのかな
ところですみません
nのリファレンスを取っているってどういうこと?
たとえばprint \hとかprint \tとやっても結果は
print \nと同じ
SCALAR(0x1625088)
になるんだけど
hやtのリファレンスをとってもnと同じになるのはどうして?
リファレンスはメモリ上のアドレスだと解釈してるんですけど
リファレンスが取れるということはメモリ上にnの実体が確保されてるんだよね?
ということはこれをデリファレンスはできないの?
変数のデリファレンスはできるけど、barewordのデリファレンスはどうやるんだろ?
>>728 なにかnの部分を特別扱いして考えてないか?それは文字列そのものだよ。
そのリファレンスそのものを文字列に変換したもの"SCALAR(0x1625088)"
に含まれているのは型とメモリ上のアドレスだから、それを見て比較するのは筋違い。
> リファレンスが取れるということはメモリ上にnの実体が確保されてるんだよね?
それはその通り。リファレンスの指す先が文字列"n"の実体。
> ということはこれをデリファレンスはできないの?
一旦変数に入れないなら ${\n}
barewordはuse strictしてればエラー扱いだけどね。-wでも警告を吐くし。
Perlの暗黒面だろうねぇ…
>>728 >bareword
他の言語では構文エラーと呼ぶからね
>print \hとかprint \tとやっても結果はprint \nと同じ
同じスクリプト中に複数書いたら728の想像通り別の値になるはずだけど?
print \n; print \t;
print "\n"; だろ と一言書けば済む話じゃないのか? ちなみに間違えてやってることは $s = "n"; print \$s;
>>731 確かにそうだけど、話は広がったほうが面白い。
>>731 > print "\n"; だろ
use strict;だろ。
736 :
デフォルトの名無しさん :2006/04/16(日) 17:20:20
Windowsでperlを使っています。versionは5.8.4です。 パッケージについての質問です。 コマンドプロンプトでperlを起動し、プログラム中で自作パッケージを 使用しようとしました。 長いファイル名の場合、読み込みに失敗するのですが、 パッケージ名を変えずに読み込むことはできないでしょうか? ちなみに、短いパッケージ名だと読み込みができました。
長い、短いを具体的な文字数で書いて、エラーの内容も書いてちょうだい。
携帯電話や、写真の取り込めるmp3プレーヤーにパソコンに取り込んだ写真を転送しようと、Perlで画像をリサイズするプログラムを作成しました。 これは正常に動きました。 jpeg縦横比を判別し、横のほうが長い場合、90度回転させてからリサイズしたいのですがどのようにすれば回転させることが出来ますでしょうか? Windows,ActivePerl 5.8を利用しています。よろしくお願いいたします。
use Image::Magick; rotate
すいません、ImageMagickの入れ方が分からないためできないっす。
ならばしかたがないのぅ。 ベクターあたりで適当なコマンドラインツール拾って system とかで呼べばできるんじゃね
Image::Magick の入れ方を知ろうという気はないのか・・・。
ppm install Image-Magick
ppmには無いよ あと、グーグルで調べていくとドツボにはまる。 今のバージョンに全然該当しないのばかりが検索の上位
何らかのライブラリ使ってリサイズはできてんだろ? あとは本人がドキュメントの回転に関する項読めばいいだけだろ? それとも比にとらわれて if( $h < $w ) という条件式に気付かなかったのか?
>>738 回転を行なうソフトのソースを読んで、それを自分で実装すればいいよ。
748 :
740 :2006/04/16(日) 23:07:06
離席してました。すいません。
resize2jpegとか言うのつかってsystemでコマンド送って一括でできるようにはしてます。
もちろん比率を受け取ってリサイズするので
>>745 の条件式は使ってます。
ImageMagickに変わる何かを探してみます。
質問です。 いま書いてるスクリプト中で以下のようなコードがあります。 ---------------------------------------------------- open FH1,"<$hoge" or die $!; print "ループ前\n",Dumper(@main::pkgs),"\n"; while(<FH1>){ print "ループ中\n",Dumper(@main::pkgs),"\n"; ---------------------------------------------------- ここでwhile分の中とあとでなぜか配列中のひとつの 値が書き換わってしまいます。しかしループ処理がない 場合は書き換わりません。 この書き換わる理由としてどういったことが考えられるでしょうか? あと都合によりソース全体は晒せませんです。スマソ
>>749 > この書き換わる理由としてどういったことが考えられるでしょうか?
それは、配列のどの値がどのように書き変わったかに大きく依存する。
ImageMagickって普通に公式からexe落として 適当にインストールして適当にPATH通せば使えたような
OSは Windowsと 同義なり 友蔵心の俳句
ImageMagickの回転って、losslessだっけ? わしはjpegtranちゅうのを使っているが。
自分で検索する能力もないのはプログラムしちゃいけないとおもう
>>755-756 激しく同意なんだが実際問題としてはそんなのがそこらにうようよいるんだ。
何かっつーとインタプリタやコンパイラがバグってるって言い出す始末。
自分の考えやコードは決して疑わないの。
いいから黙ってそのエラーメッセージをGoogleの検索ボックスにコピペして
Enterを押せと100万回言っても、まず人や掲示板に聞き、自説を振りかざす。
そんな自説を延々と掲示板に描いてる暇があっt(ry
_ ∩ ⊂/ ノ ) / /ノV ≡≡≡≡し'⌒∪ ┴┴'┴┴' イナバウアーーーーーーーーーー!!!! /⌒`ヽ 二 と(、A , ) つ < イナバウアー 三 V ̄Vノ( ゝ 二 └=ヲ└=ヲ
>>754-758 こういうやり取りこそが2ちゃんなんだな。
そして全てを達観してる俺のような奴が必ず現われるのも2ちゃんなんだな。
>>754-759 _,,:-ー''" ̄ ̄ ̄ `ヽ、
,r'" `ヽ.
__,,::r'7" ::. ヽ_
゙l | :: ゙) 7
| ヽ`l :: /ノ )
.| ヾミ,l _;;-==ェ;、 ,,,,,,,,,,,,,,,_ ヒ-彡|
〉"l,_l "-ー:ェェヮ;::) f';;_-ェェ-ニ ゙レr-{ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| ヽ"::::''  ̄´.::;i, i `'' ̄ r';' } | こういうやり取りこそが2ちゃんなんだな。
. ゙N l ::. ....:;イ;:' l 、 ,l,フ ノ | そして「全てを達観してる俺のような奴」を
. |_i"ヽ;:...:::/ ゙'''=-='''´`ヽ. /i l" < 達観してる俺のような奴が必ず現われるのも2ちゃんなんだな。
.| ::゙l ::´~===' '===''` ,il" .|'". |
.{ ::| 、 :: `::=====::" , il | \________
/ト、 :|. ゙l;: ,i' ,l' ノト、
/ .| \ゝ、゙l;: ,,/;;,ノ;r'" :| \
'" | `''-、`'ー--─'";;-'''" ,| \_
jpegってヘッダ1byteだか1bitだか書き換えるだけで回転できなかったっけ?
やってみてよ
764 :
デフォルトの名無しさん :2006/04/17(月) 16:35:29
765 :
デフォルトの名無しさん :2006/04/17(月) 16:41:22
クラスを定義する時にメンバのアクセスを制御する構文はないんでしょうか C++系の様にprivateとか
>>765 構文は無いので、普通(?)はprivateメソッド名の頭をアンダーバーにする。
全然privateじゃないけど、気持ちprivateなつもりになれる。
他の人にもそれを期待する。その程度。
768 :
740 :2006/04/18(火) 00:08:00
Data::Dumperでデシリアライズする場合、evalを使っていますがセキュリティ上、不安があります。 Data::Selializer等を使えば解決出来そうですがもっとお手軽な方法は無いでしょうか。 Storableのthawのように期待するデータでない場合dieするようなメソッドを望んでいます。
evalしてるからと言ってセキュリティが下がるかというと、必ずしもそうでもない。 てか、何故Storableじゃダメかね?
Storableで構わないのですが開発中はData::Dumperで直接ファイル触れる方が 便利なので。で実運用でStrableに替えようと思っていても面倒くさくてそのままな事もしばしば・・・ クリティカルな物で無い場合効率優先でいってしまいます。 そういえばCGI::Sessionはどうしてるのかなと見てみたらSafe.pmなるものを使っているようなので ちょっと調べてみます。
Storableのがいいとおもうよ。はやいし。
ちなみにData::Dumperのものは my $hoge = do("fugafuga.dump")で取り込めるぞ
>>773 いやそれ実質evalだからw
まぁセキュリティには影響ないけどな。
evalが嫌ならdoもだめちゃう?
ハ,,ハ ('(゚∀゚∩_ おいらをどこかのスレに送って! /ヽ 〈/\ お別れの時にはお土産を持たせてね! /| ̄  ̄ ̄|.\/ |dexiosu|/  ̄ ̄ ̄ 現在の所持品:たばこ・ライター・コーヒー・ブラックブラック・枕・ケータイ電話 睡眠薬・聖教新聞 ・ダッチワイフ・外付けSCSI340MHDD・ネットランナー4月号 TYG02・小嶋進社長・ペプシNEX・モツ煮・ヌルポ・伊予柑・寒いギャグ ・7年ものキムチ 二年前購入した牛乳・阪神電気鉄道株・バイブレーター ・失くした思い出・ワイアレスマウス GSX250FX・ポーションの空ビン・ラクダ本
776 :
デフォルトの名無しさん :2006/04/19(水) 14:19:39
すみません。質問です。 エクセルで処理できないくらいの行数のデータをperlを使ってエクセル のようにソートしたいのですが、どうしたらよいのかわかりません。 3列で多数行のファイルなのですが、 一列目を第一優先に昇順で並べ替えて、かつ3列目を第二優先に昇順で並び 替えるというように、優先順位をつけるやり方がわかりません。
>>776 そういう処理をする比較関数を作るとイイよ!!
>>776 一つの項目で比較関数を使うやり方は略することにして(基本だから調べてくれ)、
(f($a[0]) cmp f($b[0])) or (g($a[2]) cmp g($b[2]))
というふうに、比較を優先順にorでつなげる。
>>776 perl -e 'chomp;@d=split/,/;push(@x,\@d);END{for(sort{$a->[0]cmp$b->[0]||$a->[1]cmp$b->[1]}@x){print join(",",@$_)."\n"}}' file.csv
ところでExcelって先頭文字大文字にしたり5-10-5とかのデータを勝手に日付型にしたりしてうぜぇよな
シートの全範囲を選んで書式を文字列に。 但し数式もそのままの文字列として解釈される諸刃の剣。
>>780 OpenOfficeもデフォルトの設定がそうなってて設定がどこにあるのか探すのが面倒だった。
OpenOfficeは見つかったからいいんだが、Excel見つからないんだよね。 ってか CSV読み込んだ時点でもう変わっちゃってるからどうしようもねぇ
CSV から Excel なんて自前で変換してやりゃ済む話だろ
785 :
デフォルトの名無しさん :2006/04/20(木) 09:30:08
$str="aaabbbccc";という文字列にaが何文字含まれているかを調べるには どうしたらいいんですか?
一文字ずつ調べる
787 :
デフォルトの名無しさん :2006/04/20(木) 09:55:14
それが質問者の態度か。
$str = 'aaabbbccc'; $target = 'a'; @chars = unpack('C*', $str); foreach $char (@chars) { $count{$char}++; } print $count{unpack('C', $target)}; お前が死ねよマンカスw
perl -e "print scalar(grep /a/, split'','aaabbbccc')"
スピード重視ならこれか while($str =~ /(.)/gs){ $count{$1}++; } print $count{$target};
while($str =~ /./gs){ $count{$&}++; } print $count{$target}; 遅くなったり速くなったり
$str = "aaabbbccc"; print ($str =~ y/a/a/); じゃだめなのか?
for ($i = 0; $i < length $hoge; $i++) { ++$count if $hoge[$i] eq $target; } C言語みたいな…
>>794 がベストだろ。
念のために書き直すと
my $str = "aaabbbccc";
my $count = ( $str =~ tr/a/a/ );
print $count;
だが
>>788 のようなウンコちゃんは目で数えやがれ
797 :
デフォルトの名無しさん :2006/04/20(木) 18:38:18
>>785 > perldoc -q count
とする。
ハ_ハ
(^( ゚∀゚)^) ハ_ハ
) / ('(゚∀゚∩ みんな仲良く
(_ノ_ノ ヽ 〈 みんなPerl仲間
ヽヽ_)
> だが
>>788 のようなウンコちゃんは目で数えやがれ
こんなひどいこと書いちゃダメだよ。
801 :
デフォルトの名無しさん :2006/04/20(木) 20:27:59
なんかみんな初心者っぽいな 一流プログラマーのオレはこのようにする $str="aaabbbccc"; $mozisuu=&str_mozisuu($str,"a"); print "$mozisuu"; sub str_mozisuu{ local($strlen1,$strlen2); local($str1)=$_[0]; local($str2); local($aaa); $str2=$str1; $str1=~s/$_[1]//g; $strlen1=length($str1); $strlen2=length($str2); $aaa=$strlen2-$strlen1; if(length($_[1])>=2){ $aaa=$aaa/2; } return($aaa); }
スパゲティ
パスタと言えよオッサン
変数のprintにダブルクオーテーションでくくる一流プログラマー 演算子の前後に空白を入れない一流プログラマー use strictを知らない一流プログラマー 意味不明な変数名をつける一流プログラマー localしまくる一流プログラマー 無駄に変数を作る一流プログラマー 二項演算子を知らない一流プログラマー バグったままうpする一流プログラマー KENT臭のする一流プログラマー
KENTは超一流のプログラマ
>>801 お前が一流かしらないが美しくないから却下だ
英語でもいいから、sysopenかopenをオーバーライドしてるコード例ってどっかにない?
809 :
807 :2006/04/21(金) 01:45:13
package Foo::Bar; use strict; use warnings; require Exporter; use Carp qw/croak/; use Fcntl qw/:flock/; use Symbol qw/qualify_to_ref/; our $VERSION = '0.01'; our @ISA = qw(Exporter); our @EXPORT_OK = qw(sysopen); sub sysopen (*$$;$) { my ($fh, $name, $mode, $perms) = @_; $fh = qualify_to_ref($fh, caller); $perms ? CORE::sysopen $fh, $name, $mode, $perms : CORE::sysopen $fh, $name, $mode or croak "$!\n"; flock $fh, LOCK_EX or croak "$!\n"; seek $fh, 0, 0 or croak "$!\n"; truncate $fh, 0 or croak "$!\n"; $_[0] = $fh; } 1; # 書いてみたけど、あってるかどうか自信ない。誰か詳しい奴いない?
810 :
796 :2006/04/21(金) 02:31:45
ワロタw
文字数のカウントは
>>796 の tr でやる方法が
ラクダ本かcookbook にも載ってたね。
>>811 ウルトラダーティな窮極メソッドとして語り継がれているっすね。
これぞバッドノウハウ!! (ヒステリックな哄笑)
カウントするのは、こんなのどうかな? my $s = 'aaaabbbcccababadfababa'; my $i = 0; $i++ while ($s =~ /a/g); print "$i\n";
もうこれでええやろ my $str = "aaabbbccc"; my $count = 3; print "「a」の個数は$count個です.";
だれかカリー化しる!!
suとかpasswdのような コマンドを打ち込んでから、何か聞いてくる対話型のコマンドを実行したいのだが、 どうすればいいかさっぱり分かりません。 普通のコマンドならreadpipeやexcecでできるのですが。 教えてもらえないでしょうか?
Expectでググれ
あのー 3000とかを3,000という風に コンマを付けてくれるモジュールみたいなの ありませんでしょうか
sub put_comma { my $num = $_[0]; $num = reverse $num; $num =~ s/(\d{3})(?=\d)(?!\d*\.)/$1,/g; $num = reverse $num; return $num }
823 :
818 :2006/04/21(金) 23:01:39
どうしても正規表現を使いたくないので、 下記のコードを書いたんですが これにバグってありますかね?すみません #!/usr/bin/perl $num = '1980000'; $num = int $num; @nums = unpack 'C*', $num; @nums = reverse @nums; for ($i = 0; $i < length $num; $i++) { if($i % 3 == 0 && $i != 0){ push @cnums, 44; } push @cnums, $nums[$i]; } @cnums = reverse @cnums; $cnum = pack 'C*', @cnums; print $cnum; __END__
824 :
818 :2006/04/21(金) 23:04:41
-198000000 とか与えたら変になりますね、、
何のためにPerl使ってんだ? どうせ次は少数点で躓くんだしCのコードでも探しな。
826 :
デフォルトの名無しさん :2006/04/22(土) 00:26:43
2つのスクリプトを同時に起動させ、プログラム間でデータ の受け渡しをしたいのですが、下記のようなサンプルを参考 にして実行するとエラーが出ます。 「program arguments」には何を書けばよいのでしょうか? #<受け側スクリプト:rece.pl> $pid = open(README, "program arguments |") or die "Couldn't fork: $!\n"; while (<README>) { print <README>; } close(README) or die "Couldn't close: $!\n"; #<送り側スクリプト:send.pl> $pid = open(WRITEME, "| program arguments") or die "Couldn't fork: $!\n"; print WRITEME "data\n"; close(WRITEME) or die "Couldn't close: $!\n"; 各プログラムは受け側を先に起動して、その中から送り側を shell起動してもかまいません。 ソケット間通信でやるサンプルも見つけたのですが面倒そうです。 現状はファイルでデータの受け渡しをしています。 環境はwindwos XPで、Active perl v5.8.7です。
>>827 ……(呆れている)
> 「program arguments」には何を書けばよいのでしょうか?
送り側:
受け側スクリプトが起動し、送り側からの通信を受け取るプログラムと通信するため
のプログラムとその引数
受け側:
送り側スクリプトが起動し、受け側への通信を送出するプログラムと通信するため
のプログラムとその引数
>>827 送り側: print STDOUT "data\n";
受け側: open(READ, "send.pl |");
か
送り側: open(WRITE, "| read.pl"); print WRITE "data\n";
受け側: while (<>) { ... };
かな。
あ、双方向で通信したいのか?とすると Open3 とか使わないとダメか。
127.0.0.1
epicのVer.0.3というのは3.0対応という意味っぽい。 testingの0.3.10、0.3.12というのはそれぞれ3.1、3.2対応という事 だろうと推測できる。
833 :
832 :2006/04/22(土) 17:36:04
一度図に描いて整理した方がよくね?
憧れのDANさんが最新の記事で 「それもいやなら、いっそ定数は使わないで済ませた方がましである。 私は定数はあまり使わないが、それで困った事はほとんどない。 どうしてもというときは明示的に sub DEBUG { 1 } としている。」 と書いてるんですけど sub DEBUG { 1 } って一体何なの?
>>836 PerlはConst無いから定数を返すサブルーチンで代用、という意味でしょう。
定数を扱うモジュールはあるけど、やってる事は同じ。
838 :
デフォルトの名無しさん :2006/04/22(土) 20:37:32
>>836 > と書いてるんですけど
> sub DEBUG { 1 }
> って一体何なの?
"DEBUG" がコンパイル時に "1" に定数化する。
839 :
デフォルトの名無しさん :2006/04/22(土) 20:38:57
perlsubの "Constant Functions" を参照のこと。
840 :
デフォルトの名無しさん :2006/04/22(土) 20:40:15
ってあれ? sub DEBUG () { 1 } じゃね〜の?
>>841 らくだのコブに聞けや、て優香、本を読んで卓袱台」
どっちも大して代わらないよ
perlの定数の困るところは、文字列へ埋め込んだり ハッシュのキーに使おうとしたときに変な書き方を 強要されることだな。
> 憧れのDANさんが最新の記事で 正気か
847 :
デフォルトの名無しさん :2006/04/22(土) 22:31:24
$format = "$word1 は $word2 です。"; &bbb($format); sub bbb{ my $test = shift; foreach(@ar){ ($word1,$word2) = split(",",$_); print $test; } } $format 内で変数を設定とかできますか?
>>847 sprintfのフォーマットは変数に入れることが出来る。
>>847 @arがどこから来るか知らないけど。
$format = "%s は %s です。";
&bbb($format);
sub bbb {
my $format = shift;
foreach (@ar) {
printf($format, split(",", $_);
}
}
本当に $format に変数名を入れるなら
$format = '$word1 は $word2 です。'; # <-- シングルクォート
にして、bbb() 内で evalするという方法が無くはないけど。
850 :
847 :2006/04/22(土) 22:48:22
ありがとうございます。即決ですね。感謝です。 うまくいきました。 フォーマット内に、コード埋め込んでおいて、 置換させようかなとか、考えていました・・・。 tr/_WORD1_/$word1/ てな感じでwww
tr...
リストを置換の条件にしたいのですが… $text =~ s/$Substi[$i]//g; としても置換されることなくそのまま返ってきます。 (この場合は削除ですが) なおその前後で print $Substi[$i]; とすると、望む文字が表示されるので リストが誤っているようではありません。 リストはこういう使い方はできないのですかね。 一応使われているアルファベットの数を数えようという趣旨で作ってます。
DANはI/Oのマスコット
plaggerの質問はどこに書いたらいいんですか?
コマンドラインからperlへ引数を渡すときって Trimされてるの? winで試したらどうやら引数の前後のスペース やタブは無視されてるみたいだったから unixでもそう? もしも引数の最後に空白を含む文字列を指定 したかったらどうするの? perl test.pl aiueo ←ここにスペースを含めたい
日本を代表するperlerって誰? Dan? naoya? miyagawa? orre?
>835 まずは子プロセスの実行完了ステータスを、親プロセスに 通知したかったのです。 下記の記述で動作しました。。 <親プロセス:rec.pl> if( open (CH, "perl send.pl |") ){ print <CH>; } <子プロセス:send.pl> ・・処理実行・・ print "処理終了"; 用途はWEBから大きなデータを取ってくるのに、親プロセスから 分割ダウンロードする子プロセスを複数起動して、処理を高速化 することです。 ところがここで、もうひとつ問題が発生。 上記の方法では子プロセスの処理が終了しないと親は次に進めま せん。 perlでは子プロセスに非同期処理実行をさせることはできないの でしょうか?
>>855 perl test.pl "aiueo "
>>857 >子プロセスの処理が終了しないと親は次に進めません
子が終わる前に親が終わったら子はゾンビになるよ。
最終的にはwaitするって。
パイプつかってるからそこでブロックしちゃうんじゃ?
>>852 普通にできるはず。原因は他にあると思われ。
---
my @a = qw(a b c);
my $text = 'a1 2 a3';
$text =~ s/$a[0]//g;
print $text; # 1 2 3
>>852 ブロックの中でmy使ってるってオチじゃないかな
>>857 子プロセス作る方法でもいいけど、子プロセスもperlにするなら
スレッドという方法も。
---
use threads;
main();
sub main {
my $thr = threads->new( \&thr );
# 色々な処理
$thr->join;
print "in main: 処理終了\n";
}
sub thr {
# 色々な処理
print "in thr: 処理終了\n";
}
>>859 嘘つくなよ。子を残して親が死んだら、initがその子の親になる。
ゾンビになるのは子が死んでるのに生きてる親がwaitしない場合。
>>857 ブロックするのは用意できてないファイルハンドルに対してreadしてるから。
readできるファイルハンドルをselectで調べてからsysreadするようにすれば
ブロックしない。
>>857 > 用途はWEBから大きなデータを取ってくるのに、親プロセスから
> 分割ダウンロードする子プロセスを複数起動して、処理を高速化
> することです。
非同期処理は、スレッドを使うなり、socketで通信路をopenして、
それをselectでmultiplexするなりして単一プロセスでも実行できる。
複数子プロセスを使うのなら、forkして(さらに別プログラムならexecして)行なう。
つ[POE]
866 :
デフォルトの名無しさん :2006/04/23(日) 10:38:20
>>866 言語と数字を切り分けて配列に入れて、数字でソートする。
>>867 ちょっとやってみて
そんで、結果をどっかにアップして。
結果だけ見たいから。
__, --──−、_ /::_, -‐─ ‐-、_::::`‐-、 . /::/ `‐i:::::::ヽ |:./ ',ミ::::::} }:l lミ::::::l' _!,'_ ,..-- ..、 __ !::::::::| lヽ! `i ィェッ、.i'゙"i';;;ィェッ;,`i===,、 ',.l ゙、゙゙゙゙゙,ノ ヽ_"゙゙ ゙/ r;;;;;;/ i|  ̄,' ::::ヽ `''" .,{;;;;;;/ ',. ゙`-"゛'' ,};;;;;;' ! ,_、,___, /;;;/" _,` 、 /;;r' _,, -─ '';;;;;;;;;| 、ヽ,,____,,-‐';;;;;;;;;;;\_ ;;;;;;;;;;;;;;;;;;;;;;;;;;| \ _//;;;;;;;;;;;;;;;`ヽ、 ;;;;;;;;;;;;;;;;;;;;;;;;;;| r‐ィt- '" /;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;| /,彡彡} ,!;;;;;;;;;;;;;;;;;;;;;;;;;;;; ツレマスカ [Vladimir Tzlemazka] (1915-1997 ロシア)
結果見るだけなら sortf で充分
ワロス
やさしいな
それが人に頼む態度か?
print "hello\n" の動作がWindowsとUnix系OSで結果違いますが、 Unix系にそろえることってできますか? (Windowsだと改行が余計に出力される)
あきらかに釣り。 人に時間と手間をかけさせようとしてるだけ。 華麗にスルーが一番。
…… htmlって言いたいんだろうな。
HTTPリクエストを直書きして書いてくれって意味かもしれん
>>878 binmdoe( STDOUT );
print "hello\n";
s/binmdoe/binmode/;
>HTTPにして これ流行りそうだな
>>878 できない。
Windowsの標準コマンドシェルはプロンプト表示前に改行を表示するので、
空行が1つ余分に出力されているように見える。
実際にperlが出力している改行の数は、どちらも同じ。
質問です PerlでWin32のプログラムのように ウィンドウ(コンソール?)を表示させずに起動する事は出来ますか? 宜しくお願いします
GET HTTPにして HTTP/1.1
乱数を用いて生成する四則演算の問題を5つユーザーに答えさせて、 最後に合計得点を表示するプログラムを作りなさい という課題を教えて欲しいです・・・
>>890 課題:
乱数を用いて生成する四則演算の問題を5つユーザーに答えさせて、
最後に合計得点を表示するプログラムを作りなさい
>>892 という課題に対する解答を教えて欲しいですでした。
すみません。
use Strict; srand; my @op = ('+', '-', '*', '/'); my $o = 0; my $x = 0; my $secnum = 5; for (my $i=0; $i<$secnum; ++$i) { $func = sprintf("%d %s %d", int(rand(9))+1, $op[rand(@op)], int(rand(9))+1); print "$func = "; $ans = <STDIN>; chomp($ans); $_ = eval($func); if ($_ eq $ans) { print " true\n"; $o++; } else { print " false\n"; $x++; } } print "\nRight answer: $o, Wrong answer: $x\n"; お礼は30万円でいいよ。
つ[30万円] 振り込んでおいた。 俺の口座番号に。
>>883 cygwin perlで試してみましたが、
だめぽでした。
>>887 なるほど。
どうもありがうございました
active perlで良いじゃん。 なんでcygwinなんぞ…
>>894 すげぇぇ!!!
本当にありがとうございました。
30万円分の感謝の気持ちを送ります。
my @op = ('+', '-', '*', '/') がやけに可愛い。
>>897 CygwinPerlとActivePerlはどちらも長所と短所がある
真のPerlerなら両方つかいこなすのがベストだとわかるはず
>>897 この改行問題が解決するならactive perlでもいいんですが。。
というか、これはactive perlの問題かと思って
cygwin perlをインスコ仕直した。けどcygwinでも同じだった罠。
('+', '-', '*', '/') ↑ ↑ ↑ ↑ 長 次 三 長 女 女 女 男
>>901 むっ?binmodeすればUNIXと同じにならない?
Windowsならbinmodeしない場合、printに渡した文字列中の\nを\r\nに置き換える
という小さな親切をしてくれるんだが、つまり、"hello\n"なら"hello\r\n"に置き換え。
で、binmodeすれば、その処理を行わないからUNIXと同じになるはずだけど。
904 :
デフォルトの名無しさん :2006/04/23(日) 21:54:51
いやだから\nはLFと等価でないと
そもそもPerlの問題じゃないんだからどうしようも無い気が
>>903 そもそも質問を勘違いしていると思う。もっと極端な例で書けば
C:\..>perl -e "print q|hoge|"
hogeC:\..>
となって欲しいってことかと。887の言うとおりシェルの問題だよね。
2レス続けてアホなレス
うわw いきなりレスするからタイミングずれたw
>>906 えっ?そんな問題なの?cygwinのbashでもつかえよ
>>873 天才ですね
本当にありがとうございます
ローカルに保存させていただきました
Erlang: 279 これ、なんでしょうね?
>>878 ですが、おかげで解決しました。
cygwinの環境変数がこんな感じになってました。
PS1="\n\$"
ごめんなさい、とほほ。
913 :
デフォルトの名無しさん :2006/04/24(月) 05:04:33
CygwinPerlなんですが 共有メモリって使えるのでしょうか? PerlでIPCとかセマフォとか解説してるサイトってないでしょうかね
なんで
>>894 の
> use Strict;
に誰も突っ込まないの?
じゃあなんでsrandはPerl5.004以降必要ないって突っ込まないの?
下位互換性
ApacheへhttpでアクセスしてCGIでもサーブレットでもなんでもいいんで、 そのApacheが動いているLinuxのユーザーのパスワードかえる手段ってありますかね? CGIでもサーブレットでもシェルコマンドを実行することはできますが、 Apache自体のプロセスがrootではなくApacheユーザーで実行されているので、 Linux上のユーザーのパスワードを変更するのはroot権限を持たないといけないので やっぱり無理?
>>913 > PerlでIPCとかセマフォとか解説してるサイトってないでしょうかね
Perlをインストールすると一緒にインストールされるドキュメントにあるから、
それを公開しているサイトだったらあるんじゃね?
>>917 あなたがそのlinuxマシンの管理者や適切な権限を持った
ユーザーならどうにでもやりようがある。
あなたがただのユーザーなら馬鹿が設定したwebサーバで
ないかぎり無理
>917 Webminでも使ったら?
922 :
917 :2006/04/24(月) 10:32:16
sudoでやる事にしました。 その前段階の実験としてApache上からlocalhostにtelnetでログインしてlsを実行する Expectモジュールを使用したPerlスクリプトを組みました。 コマンドプロンプト上からは./telnet.cgiで問題なく動作するのですが CGI上からはApacheに↓のように怒られます。どうすればいいのかさっぱり malformed header from script. Bad header=Trying 127.0.0.1...: expecttel.pl
923 :
917 :2006/04/24(月) 10:32:55
↓ソース #!/usr/bin/perl -- use Expect; my $timeout = 10; # Grundsatzlich 10 sec # auf Antwort warten my $host = "localhost"; my $user = "hoge"; my $passwd = "hoge"; # Telnet starten $telnet = Expect->spawn("/usr/kerberos/bin/telnet", $host); # Login $r = $telnet->expect($timeout, 'login'); die "No 'login' prompt" unless defined $r; $telnet->send_slow(0, "$user\n"); # Paswort $r = $telnet->expect($timeout, -re => '[Pp]assword'); die "No 'password' prompt" unless defined $r; $telnet->send_slow(0, "$passwd\n"); # Unix-Prompt $r = $telnet->expect($timeout, '$'); die "No unix prompt (\$)" unless defined $r; $r=$telnet->send_slow(0,"ls\r"); print $r; $telnet->interact(); # In interaktiven # Modus schalten
>>922 CGI なんだから、ちゃんと HTTP ヘッダ (Content-Type: など) やコンテンツを出力しなきゃあかんがな。
>>924 CGIなんだからちゃんとwebprog板に行けよ
927 :
917 :2006/04/24(月) 17:00:44
すまそ、ヘッダつけたら、一応動きました。ありがとうございます。 そこでhogeユーザーのパスワードを変更するPerlスクリプトを作成したのですが、 なぜか 「passwd: all authentication tokens updated successfully.」が延々に無限にでてしまう結果に。 Exceptの扱い方間違っているのでしょうか? #!/usr/bin/perl -- print "Content-type: text/html\r\n\r\n"; use Expect; my $timeout = 10; # Grundsatzlich 10 sec # auf Antwort warten my $host = "localhost"; my $user = "hoge"; my $passwd = "hoge"; # Telnet starten $telnet = Expect->spawn("sudo passwd $user"); # auf Antwort warten my $host = "localhost"; my $user = "hoge"; my $passwd = "hoge"; $telnet = Expect->spawn("sudo passwd $user"); # New password $r = $telnet->expect($timeout, 'New password: '); die "No 'password' prompt2" unless defined $r; $telnet->send_slow(0.2, "$passwd\r"); # Retype password $r = $telnet->expect($timeout, -re => 'Retype new password: '); die "No 'password' prompt2" unless defined $r; $telnet->send_slow(0.3, "$passwd\r"); $telnet->interact();
コメントがドイツ語? どこから取ってきたソース?
>>928 日本語勉強中のドイツ美少女ハッカーなんだから当たり前
どっから持ってきたのかは知らないが my $host = "localhost"; my $user = "hoge"; my $passwd = "hoge"; が2回でてきたり真面目に中身理解して使ってるとは 思えんな...
>>928 とっさに「書いたのはドイツだ?」というオヤジギャグを書けないようでは君はオヤジ失格だ。
そこは今、たまたま同じってだけじゃないか?
>>932 同じスコープ中で二度も my 宣言しなくていいよね。
-w オプション付きなら警告される。
ループ中でmyしちゃう人もいるぐらいだから珍しくも無いよ。 まあそういう意味では分ってないんだと思うけど。
>>934 my はコンパイル時に解釈されるスコープ宣言だから、
ループブロックの内部にスコープを限定する為に使う事は
何の問題も無い。例えば以下のコードは警告を吐かない。
#!/usr/bin/perl -w
use strict;
my $foo = 0;
for (1..5) { $foo = my $bar = $_ }
print $foo;
__END__
>>934 for (my $i = 0; $i < 10; $i++) {
これもループ内のmy宣言に該当する?
ループのなかで初期化しちゃいけないの?
質問です 1つのプロセスで同時に開けるファイルハンドルの数を教えて下さい どこかに書いてあったような気がするのですが…
そのループの中でしか使わない初めて出てくる変数なら何の問題もない。 しかし外側でその名前を使っていたらなるべく別の名前の方がいい。 機械はちゃんと区別してくれるけど人間はなかなかそうはいかないから 混乱のもと。
941 :
デフォルトの名無しさん :2006/04/24(月) 23:02:51
foreachの…名前分からないがローカル変数に値が代入されますよね。 普通は$_に入ると思いますが、入れ子にした場合はどうなるのでしょう? foreach(@tmp){ foreach(@tmp2){ #$_は…? } } こんな場合はどうなるんでしょうか?
>>941 各ループ内で別になる。やってみると分かる。
@tmp のループ内(@tmp2のループの外側)では $_ は @tmp の要素。
@tmp2 のループ内では $_ は @tmp2 の要素。
>>941 レスありがとうございます☆
なるほどそうなるのですか〜入れ子で使うと最初のが一時的に退避して、
$_には次のforeachの値が入ると。
となると両者を比較する場合は少なくとも最初のforeachは適当な変数に
落としてからになるわけですね。
明日試してみます☆
ありがとうございました(b^-゜)
>>943 なんかこの構文を知らなさそうな気がするので補足レスしとこう...
foreach my $outer (@tmp){
foreach my $inner (@tmp2){
# $outer eq $inner
}
}
>>938 Linux なら kernel の source に書いてあったと思う。
自分の使ってる OS のスレで聞くとよさげ。
>>938 > 質問です
> 1つのプロセスで同時に開けるファイルハンドルの数を教えて下さい
> どこかに書いてあったような気がするのですが…
わりと動的な値だから、実行時に調べるものです。
948 :
938 :2006/04/25(火) 14:20:12
>>948 むかしselect野郎だったので、ちょっと調べてみたんだが、
perlだとこの値を使う必要はないように世界が形作られているな。
関係しそうなFileCacheでさえ、投げやりに調べただけで、自分で設定した
「充分に小さな値」を使っているようだ。
ま、とにかくシステムモジュールFileCacheのPODやソースを見てみると
良いんでは?
あるいは何をしたいのか話してみるとか。
open( my $fh, "+>", undef); 最近のperlではこれで簡単に一時ファイルができる ようなんだけど これで作られた一時ファイルってどこに作成されるの? 試してみたけどスクリプトと同じディレクトリじゃないみたい かといってどんなファイル名で作られるかわからないので findしようもない
激しく処理系依存っぽい。ソースみて確認してみたら?
>>950 > かといってどんなファイル名で作られるかわからないので
> findしようもない
truss or strace は使えない?
#!/usr/bin/perl use File::Temp; $fh = new File::Temp; print $fh->filename; __END__
チョン?
>>952 > truss or strace は使えない?
で、ちょっとやってみたけど、/tmp/PerlIO<ランダム文字列>
というを作って、即unlinkしてファイルシステム上から消してるよ。
On systems where this is possible, the temporary file is anonymous (i.e. it is unlinked after creation, but held open).
>>950 UNIX系OSの場合はだいたいはファイルを作った直後にオープンしたまま
ファイル名を unlink (削除) するようになっていると思う。これで
どうなるかというと、ファイルの読み書きは可能だがファイル名が
存在しない状態になる。ファイルをクローズしたとき(あるいはオープン
しているプロセスが終了した時)にディスク上の領域が開放される。
UNIX系OS以外の場合は close() の時に削除されるようになっているんじゃないかな? 同じ方法が使えないとしたらそうなっていると思うよ。
>>950 これなかなか便利ですね。
そのうちCGI.pmでも標準になるのかな。
WindowsXPだと%temp%に排他で作成されていました。
みなさんありがとう 助かったよー〜〜
もうそろそろ次スレの準備をよろすくー。 過去スレやリンクのアドレス間違いに気をつけて!
962 :
デフォルトの名無しさん :2006/04/25(火) 22:54:56
active perl 5.8を入れていましたが、最近cygwinを入れました。 すると、activeperlでファイルをreadできなくなりました。 どなたか原因をご教授ください。
>>961 980まで建たなかったら、また漏れが行ってくる。
>>932 readってのはbuilt-in関数のreadのこと?
とりあえずActive Perlだと思って起動しているやつが
本当にActive Perlなのかperl -vで確認汁。
一行目にMSWin32-x86-multi-threadがあればActive Perl、
cygwin-thread-multi-64intになってる場合はCygwinのperlだ。
964 :
デフォルトの名無しさん :2006/04/25(火) 23:45:28
>>963 いいえ。
open(F,"text.txt");
を使ってもtext.txtの中身を読み込めないってことです。
perl -v やったら
This is perl, v5.8.7 built for MSWin32-x86-multi-thread
でした。
>>964 openは色々とエラーを起きやすいからエラートラップする習慣をつけよう。
open(F,"text.txt") or die $!;
で何かエラーメッセージ出る?大抵はこのエラーメッセージを見りゃ解決するけれど…
966 :
デフォルトの名無しさん :2006/04/26(水) 00:03:54
>>965 No such file or directory at C:\Documents and Settings\x\デスクトップ\a.pl line 1.
とでました。しかし、確かにa.plと同一ディレクトリにtext.txtはあります。
フルパスをぶち込んでみてください。
use Cwd; print Cwd::getcwd(); これやってみれ
969 :
デフォルトの名無しさん :2006/04/26(水) 00:23:04
>>967 フルパスぶち込んだらOKでした・・・。
>>968 C:/Documents and Settings/xxx
と表示されました。
>>969 原因は分からんが関連付けから起動したときに、
作業ディレクトリが別のところに行くようになっちゃってるようで。
根本的な原因はこのスレの範疇外だと思う。スクリプトの頭で、
use FindBin;
chdir $FindBin::Bin;
とでもやっておきなされ。これで作業ディレクトリがスクリプトのある場所に行く。
971 :
デフォルトの名無しさん :2006/04/26(水) 04:01:41
スレざっと読んだけどPerl6って結局どうなったの? プロジェクトが分裂してるみたいだし 本家からParrotのコードコンパイルして勉強してOKなの?
972 :
デフォルトの名無しさん :2006/04/26(水) 04:13:41
すみません、
http://hp.bird.to/さんの所の 「私書箱SP(CGI)」
を使用させて頂こうと思っているのですが
ひとつだけ中をいじりたい事があるんです。
(ちなみに、作者様はいじる事を許可されています。)
で、HTMLでサイトを作るくらいは自分も出来るんですが
Perlの知識はまったく無いので自分なりにやっても
失敗してしまいます。
どうか、知識のある方叶えて頂けないでしょうか?
973 :
デフォルトの名無しさん :2006/04/26(水) 04:16:08
sub looking_list{ ($cookie_name,$cookie_pass,$cookie_number) = get_cookie(); ($c_cook,$c_name)=split(/:/,$cookie_name); ($c_cook,$c_pass)=split(/:/,$cookie_pass); ($c_cook,$c_number)=split(/:/,$cookie_number); print <<END_OF_TEXT; <p> <font color="$titlecolor" size=6>$html_title</font><p> $error_code<p> <form method="POST" action="$script_url"> <input type="hidden" name='command' value='access'> <table border=1> <TR><TH colspan=2>自分の私書箱にアクセス!!</TH></TR> <tr><td align=right>登録名</td><td><input type="text" size=20 name="name" value="$c_name"></td></tr> <tr><td align=right>パスワード</td><td><input type="text" size=20 name="pass" value="$c_pass"></td></tr> <tr><td align=right>私書箱番号</td><td><input type="text" size=20 name="number" value="$c_number"></td></tr> <TR><TD align=center colspan=2><input type="submit" value="送信"></TD></TR> </table> </form><P>
974 :
デフォルトの名無しさん :2006/04/26(水) 04:16:49
<form method="POST" action="$script_url">
<table border=1>
<tr><th>ご用件をどうぞ!!</th></tr>
<tr><td>
<input type="radio" checked name='command' value='write'>私書箱に書き込む</td></tr>
<tr><td>
<input type="radio" name='command' value='mypost_regist'>私書箱の新規登録</td></tr>
<tr><td>
<input type="radio" name='command' value='mypost_delete'>私書箱の登録削除
</td></tr>
<tr><td align=center>
<input type="submit" value="送信">
</td></tr>
</table>
</form>
<form method="POST" action="$script_url">
<table width=90%>
<tr><td nowrap>
<input type="text" size=8 name="secret_pass">
<input type="submit" value="管理人専用">
</td>
<td nowrap align=right>
<font size=2><A HREF="
http://hp.bird.to/index.html " target="_top">私書箱SP Ver.1.45(C)HPサービス</A></font>
</td>
</tr></table>
</form>
END_OF_TEXT
}
976 :
デフォルトの名無しさん :2006/04/26(水) 04:19:18
>>973 >>974 はそのまま続いてまして
これを読み込ませると
画面には「自分の私書箱にアクセス」といったBOXと
「ご用件をどうぞ」のBOXが表示されるんです。
で、僕は
これの上下を入れ替えたいんです。
ただそれだけを変えたいんです。
「ご用件をどうぞ」のBOXが上に来て
「自分の私書箱にアクセス」のが下に表示されているといった感じに
したいんです。
でも、単純にプログラム文を上下入れ替えただけでは
駄目みたいで、、、
表示自体は上下変わってくれたんですが
送信押してもうんともすんとも動かず
機能しなくなっているのです。
どういった入れ替え方をすれば
上下変わってくれるんでしょうか?
すみません、ほんと。
977 :
デフォルトの名無しさん :2006/04/26(水) 04:20:14
>>975 え?ここじゃ駄目なんですか?
すみません、、、
<form method="POST" 〜 ・ ・ ・ </form> を上下、入れ替えるだけでいいんじゃないの?
>>975 おい
お前がこっちに誘導したから
なんか騒いでるぞコラ
今アップローダー作ってるんですけど、ふと疑問におもったんですが、 perlが処理を始めるのはデータを全て受け取った後? それとも受け取りながら?
>>976 <form>〜</form>
が計3つあるけど、上の2つを入れ替え
>>983 変なん沸いてるから気をつけた方がいいよ
986 :
963 :2006/04/26(水) 12:21:57 BE:965455889-
さて、次スレ建てて来る
乙
989 :
デフォルトの名無しさん :2006/04/26(水) 13:05:48
>>978 ,981
お前らが親切に回答してやるからこの馬鹿がwebprog板で付け上がって暴れてるんだが…
すまんが、もう少し良く考えてからレスしてくれないか
梅
竹
松
鮭
あからさまなマルチでも粘り強くやればきちんと回答が得られることがここに実証されました。 俺もこんどからこの手を使おう。
過疎板のwebprog板が活況になっていてwarata
999GET!!
個室に入り便座に座るなりパンツをおろす、でも用を足すわけではなかった・・・私は股間に手を伸ばす 「はぁぁぁ・・・あんっ」 自分で自分の大事な所を触れ・・・指を股間の割れ目に潜らせて軽くかきまわす 「あ・・・あん・・・」 瞬時に体に刺激が走り、吐息が漏れ声が出る・・・誰も居ないのをいいことに感じるまま大きな声で・・・ 私はそのまま指をかきまわしてさらに快感を貪っていく・・・ 「んん〜〜んっ・・・・んんんっ!」 ・・・そうここに来る理由・・・それは最近はまってる一人Hだった・・・
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。