Perlについての質問箱 24箱目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG"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/04/26現在の最新版: 5.8.8
● 2006/04/26現在の開発版: 5.9.3
リンク集は>>2-3
過去スレは>>4
0153デフォルトの名無しさん
2006/05/06(土) 19:59:38N分後ならtime()+60*n
N時間後ならtime()+60*60*n
N日後ならtime()+60*60*24*n
うるう秒みたいな特殊なケースを除けばこれは絶対に正しい?
0154デフォルトの名無しさん
2006/05/06(土) 20:25:23正しくないケースを伸べよ。
0155デフォルトの名無しさん
2006/05/06(土) 20:30:25「60*n」等の式が正しいとすれば(正しいだろう)
現在のエポック秒に求める秒数を足してるのだから明らかに正しい。
なんせ年月日時分の概念が無いんだから。
0156デフォルトの名無しさん
2006/05/06(土) 20:45:060157デフォルトの名無しさん
2006/05/06(土) 20:59:20ちゃんと>>155読んだ?
0158デフォルトの名無しさん
2006/05/06(土) 21:38:31阿呆は放置。
0159デフォルトの名無しさん
2006/05/06(土) 21:45:48ビーーン
0160デフォルトの名無しさん
2006/05/06(土) 21:53:29本来の要求仕様がわからんから正確にはなんとも言えんが、
「n秒後」という要求では、逆にうるう秒は考えちゃいけないだろ。
「x月y日まであと何秒?」という場合なら考えなきゃいけないが。
0161デフォルトの名無しさん
2006/05/06(土) 22:05:07規則性がないからどうしようもないけどね。
0162デフォルトの名無しさん
2006/05/06(土) 22:10:13仕様がそんなにかわるんですかね?
簡単に仕様変更を書いたサイトとかってないですかね?
0163デフォルトの名無しさん
2006/05/06(土) 22:12:430164デフォルトの名無しさん
2006/05/06(土) 22:14:090165デフォルトの名無しさん
2006/05/06(土) 22:20:460166デフォルトの名無しさん
2006/05/06(土) 22:41:470167デフォルトの名無しさん
2006/05/06(土) 22:45:260168デフォルトの名無しさん
2006/05/06(土) 22:47:150169デフォルトの名無しさん
2006/05/06(土) 23:44:57http://dev.perl.org/perl6/
Pugs含め現状どうなってるかは知らない
0170デフォルトの名無しさん
2006/05/07(日) 00:13:350171デフォルトの名無しさん
2006/05/07(日) 00:17:03my $time = expire_calc('+7y'); # 3年後のエポック秒
日付に関しちゃ年によってずれるだろう。
0172デフォルトの名無しさん
2006/05/07(日) 01:03:57なにがずれるん?
0173デフォルトの名無しさん
2006/05/07(日) 01:07:29>use CGI::Util qw( expire_calc );
いや、それ、31日ある月の計算すらしてないよ。
my(%mult) = ('s'=>1,
'm'=>60,
'h'=>60*60,
'd'=>60*60*24,
'M'=>60*60*24*30,
'y'=>60*60*24*365);
を掛けてるだけだから。
0174デフォルトの名無しさん
2006/05/07(日) 01:09:540176デフォルトの名無しさん
2006/05/07(日) 01:18:100177デフォルトの名無しさん
2006/05/07(日) 01:22:16反則技を使えばできないこともない。でも基本的にそういう言語ではない。
0178デフォルトの名無しさん
2006/05/07(日) 01:25:21要するに任意の日付までの秒数を求めようとしている人がいるわけね…
0179デフォルトの名無しさん
2006/05/07(日) 01:32:380180デフォルトの名無しさん
2006/05/07(日) 01:36:32N秒後は + N (間違いなし)
N分後は + N*60 (閏秒でズレる)
N時後は + N*60*60 (閏秒でズレる)
N日後は + N*60*60*24 (閏秒でズレる)
N月後は + N*60*60*24*30 (31日の月、閏年、閏秒でズレる)
N年後は + N*60*60*24*30*365 (31日の月、閏年、閏秒でズレる)
0181デフォルトの名無しさん
2006/05/07(日) 01:37:570182デフォルトの名無しさん
2006/05/07(日) 01:56:54ええええええ
俺がやりたいのは、市販のプログラム に乗っかって パケット解析しつつ
そのパケットをアルゴリズムで分析して(かなり原始的なアイデアはいくつかあるから実験したい)
命令出す ってのなんだけど この言語でいけるかな?
トップ企業では普通にやってるらしいが
その関係者がにちゃんでぼろっと言ってたのだと、そいつはむかしperlつかって組んだらしい
ネトゲでマクロやってて正規表現の基本とかはわかってる
ただ、ネックだったのはパケットとアルゴリズムでした。
らくだ本と、アルゴリズムの基礎を学校の図書館で借りてきた。パケットはあとまわし。
とりあえず自動ログインツールをつくることを目標にしてるけど、
exeで動かさないなら、いちいちperl login.plとか打って起動させなきゃならんの?
login.pl の末端に autorun.plを起動させる文かいたりして、
条件 しだいで buy.plとかを動かす、とかそんなふうに組んでくの?
リアルタイムでどんな処理してるかビジュアルで把握したかったら、
別のプログラムが必要なんかな?VBちょっとやったことあるけど、あれは窓をすぐにつくれるじゃん?
0183デフォルトの名無しさん
2006/05/07(日) 02:08:540184デフォルトの名無しさん
2006/05/07(日) 02:28:09>exeで動かさないなら、いちいちperl login.plとか打って起動させなきゃならんの?
>login.pl の末端に autorun.plを起動させる文かいたりして、
>条件 しだいで buy.plとかを動かす、とかそんなふうに組んでくの?
そうだよ
0185デフォルトの名無しさん
2006/05/07(日) 02:31:02localtime() 使えばいいだけじゃないの?
>>180
「閏秒でずれる」という表現がおかしいでそ。
例えば「3分後」は 3 * 60 = 180秒後であって、間に閏秒を挟んでいても
それは変わらん。
0186デフォルトの名無しさん
2006/05/07(日) 04:59:06として、間に閏秒があった場合、
(y/y/y y:y:y)−(x/x/x x:x:x) ≠ n になっちゃうか。
0187デフォルトの名無しさん
2006/05/07(日) 08:23:49次の分の同じ秒のことを言っているのかをはっきりさせないまま
話しているのでなんだかよくわからなくなってるような。
前者の意味なら常に秒数だけ気にしていればいいが後者だと閏秒が
でてくる。
DateTimeだと1分後と60秒後は区別していて、1分後は閏秒こみだから
こんな例がマニュアルにある。
# 1971-12-31 23:59:30 - our starting datetime
$dt->clone->add( minutes => 1 );
# 1972-01-01 00:00:30 - one minute later
$dt->clone->add( seconds => 60 );
# 1972-01-01 00:00:29 - 60 seconds later
$dt->clone->add( seconds => 61 );
# 1972-01-01 00:00:30 - 61 seconds later
0188デフォルトの名無しさん
2006/05/07(日) 11:13:220189153
2006/05/07(日) 12:08:48ありがとうございました
0190デフォルトの名無しさん
2006/05/07(日) 12:38:12今まで見たことないんだが。
0191デフォルトの名無しさん
2006/05/07(日) 14:09:29天文関係とか、年単位で正確な秒数が必要な科学技術計算では必須だよ。
0192デフォルトの名無しさん
2006/05/07(日) 19:01:290193デフォルトの名無しさん
2006/05/07(日) 20:48:34地道にindexとsubstrやれば出来そうですが。
0194デフォルトの名無しさん
2006/05/07(日) 20:55:08楽チンチン
0196デフォルトの名無しさん
2006/05/07(日) 21:34:12use bignum 入れて速度保とうとすると面倒だしさ。
>>190
閏病を調整する人が使えば当然必要だーね。
0197デフォルトの名無しさん
2006/05/07(日) 23:13:33crackmeのkeygen作るのに、Math::BigInt使って、Perlで16進数16桁の平方を求めるとかはやったことあるけどね。
0198デフォルトの名無しさん
2006/05/08(月) 07:21:37という表現があるようなんですが
これは何でしょうか?
eは置き換え後文字列部分を式評価するという意味
ですが、なんで二つ並んでいるの?
0199デフォルトの名無しさん
2006/05/08(月) 08:04:030200デフォルトの名無しさん
2006/05/08(月) 08:24:43式評価した結果を更に式評価したいから。
0202デフォルトの名無しさん
2006/05/08(月) 10:19:37$_ = "aXb";
s/X/"1+1"/ => a"1+1"b
s/X/"1+1"/e => a1+1b
s/X/"1+1"/ee => a2b
まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね
とりあえずFAQ
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_can_i_expand_variables_in_text_strings
0203デフォルトの名無しさん
2006/05/08(月) 11:00:38>>147
ありがとうございます。結局こちらでは、
use encoding "cp932";
use open ":encoding(cp932)";
use open ":std";
と、最後に use open ":std"; を追加することで対応できました。
確かにencoding、馬鹿ではよく理解できない。。。
>>148
確かにcp932の問題ではなかったですね。失礼しました。
use openを付けたのは、実際の処理の際には、
テキストファイルを読み込む場合が多いので、
その状況も検証したかった、というのが理由です。
>>149
jperl時代のお手軽さに慣れてしまってたので。。。
0205デフォルトの名無しさん
2006/05/08(月) 16:36:55> まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね
う〜む、具体的に思い出せないが、かつて「あれってこのためにあったのか!!」と
驚愕した記憶がある。
0206デフォルトの名無しさん
2006/05/08(月) 17:39:21それでは本質的にできないようなことなのだろうか?
0207デフォルトの名無しさん
2006/05/08(月) 17:57:020208デフォルトの名無しさん
2006/05/08(月) 19:31:36> まともなコーディングで二重評価する必要性のある例がなかなか思い浮かばないけど…何か良い例あるかね
どっかのカスCGIで、HTMLテンプレート展開ルーチンに
そんなのが使われてたのを見た記憶が。
0209デフォルトの名無しさん
2006/05/08(月) 21:15:570210ヽ(´ー`)ノ ◆.ogCuANUcE
2006/05/09(火) 02:05:12s/%([[:xdigit:]]{2})/pack('H2', $1)/ge;
0211デフォルトの名無しさん
2006/05/09(火) 02:46:04一重じゃん。
0212デフォルトの名無しさん
2006/05/09(火) 03:05:350213デフォルトの名無しさん
2006/05/09(火) 07:53:18>ヽ(´ー`)ノ ◆.ogCuANUcE
>ヽ(´ー`)ノ ◆.ogCuANUcE
0214デフォルトの名無しさん
2006/05/09(火) 12:37:33企業気分になれるんだよ。
0215デフォルトの名無しさん
2006/05/09(火) 13:32:270216デフォルトの名無しさん
2006/05/09(火) 14:49:57http://www.yukinko-net.jp/computer/download/downloadlist.htm
0217デフォルトの名無しさん
2006/05/09(火) 19:47:300218デフォルトの名無しさん
2006/05/09(火) 19:57:06ラリってる奴が作ってるから。
0219デフォルトの名無しさん
2006/05/09(火) 20:09:59脳内麻薬物質が出てくるからです。
0220デフォルトの名無しさん
2006/05/09(火) 20:11:150221デフォルトの名無しさん
2006/05/09(火) 20:17:280222デフォルトの名無しさん
2006/05/09(火) 20:59:170223デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
2006/05/10(水) 00:52:210226デフォルトの名無しさん
2006/05/10(水) 05:43:21/e の多重評価って確か、意図した仕様じゃなくて、開発側も当初は気づかなかったけど結果として可能になっちゃってた、というモノだったと思ふ。
「面白いからそのまま feature にしようぜ」、というノリが Perl 流か。w
0227デフォルトの名無しさん
2006/05/10(水) 07:29:35use Cwd;
chdir('~');
print Cwd::getcwd();
しても変化なし
0228デフォルトの名無しさん
2006/05/10(水) 07:38:56@list = glob('*');
print @list;
とすると
a.plb.plc.pl
となる
また、
$list = (glob('*'))[0];
print $list;
とすると
a.pl
これを
$list = glob('*');
print $list;
とすると
a.pl
となる
どうしてc.plにならないの?
たとえば
$str = qw(a b c);
print $str;
とするとcになるのに
0229デフォルトの名無しさん
2006/05/10(水) 07:48:24chdir($ENV{'USERPROFILE'});
0230デフォルトの名無しさん
2006/05/10(水) 08:53:51readlineと同じでスカラコンテキストではイテレータになるから
ドキュメントではファイル名グロブ<>の方かな
0231デフォルトの名無しさん
2006/05/10(水) 09:29:04さんくす!
でもこのUSERPROFILEっていう環境変数は誰が
セットしているの?
マイコンピュータ→環境変数とたどって一覧みたけど
USERPROFILEなんてなかったよ
win2000proですけど。
0232デフォルトの名無しさん
2006/05/10(水) 09:37:17print "hello, " && print "goodbye.";
が
goodbye1
になるのはなぜ?
print "hello, " and print "goodbye.";
ならきちんと
hello, goodbye
となる
andと&&の優先順位の違いが原因だろうとは
思うんだけど具体的に何が起こっているのかわからない
0233デフォルトの名無しさん
2006/05/10(水) 09:47:06chdir の引数を省略するとホームディレクトリに移動する。参考まで。
HOME が未設定の環境でどうなるかは知らん。
0234デフォルトの名無しさん
2006/05/10(水) 10:21:06explorer.exe
0235デフォルトの名無しさん
2006/05/10(水) 10:23:32優先順位の問題。
print は引数にリストを取るので、連続したリストに見える後続の全てを引数として飲み込む。ひとつの文中で、print のようなリスト演算子モドキの後に何か別の処理を書く時にはこの動作に注意しなくてはいけない。
引数をそれぞれ () で括るのが最も万能の対策。() を使わずに何か後続させようとする場合は、より優先順位の低い not、and、or、xor のいずれか、あるいは制御構造修飾子を使うべし。
最初の && を用いた文は次のようにパースされる。
print( "hello, " && print( "goodbye.") );
perl はまず && の左辺 "hello, " を評価する。リテラル "hello, " は Perl の有効な真値であるため、次に右辺の print() が評価される。
print は出力に成功すると真値 '1' を返すのでこれも真と評価される。よって && の両辺が真となり、最後に評価された値である '1' が、最初の print の引数として渡され、それが出力される。
てな感じ。
0236デフォルトの名無しさん
2006/05/10(水) 10:24:53>print "hello, " && print "goodbye.";
print ("hello, " && (print "goodbye."));
>print "hello, " and print "goodbye.";
(print "hello, ") && (print "goodbye.");
0238デフォルトの名無しさん
2006/05/10(水) 15:03:45C:\>perl -MCwd -echdir(); -eprint(Cwd::getcwd());
C:/Documents and Settings/Administrator
おーう、知らなかったぜ
0239デフォルトの名無しさん
2006/05/10(水) 16:03:16なんだ単にchdirの引数省略すりゃよかったのか
どうもありがとうもー
0240デフォルトの名無しさん
2006/05/10(水) 16:13:07my %hash = (a=>1, b=>2, c=>3);
foreach (each %hash)
{
print $_ , "\n";
}
この結果が
c
3
になるんだけど意味わからんのです
perldoc -f each
で読んでみると
eachはスカラーコンテキストで呼ばれると次のキーのみを返すとあります
foreach ()の()の中はスカラーコンテキストですよね?
なのにどうしてprint $_ , "\n";
の結果が
c
3
なんかになるのだろう
それと、どうしてハッシュ全体が$_にセットされないの?
foreach (each %hash)としたら
まず一回目のループでeach %hashされて一つ目がとりだされて
つぎのループでまたeach %hashされて二つ目がとりだされて
っていうふうにならないのはなぜ?
ループ一回しか回らんのですが
どういうからくりか教えてくださ・・・い
0241デフォルトの名無しさん
NGNGforeachに使う配列がeachで取り出した(c,3)になってる
ここでも参考にしてコード書き直せ
http://perl.misty.ne.jp/function01/each.html
0242デフォルトの名無しさん
2006/05/10(水) 16:19:33超わかりやすかった
さんくふぉーゆー
0244デフォルトの名無しさん
2006/05/10(水) 16:57:590245デフォルトの名無しさん
2006/05/10(水) 17:19:500246デフォルトの名無しさん
2006/05/10(水) 18:01:55$i = 0;
for $n (1..100) {
$a[$i] = $n;
$i++;
}
Perl の心を伝えるのは難しいものよのう。
0247デフォルトの名無しさん
2006/05/10(水) 19:13:29pritn for 1
これが構文的にはOKだしね
0248デフォルトの名無しさん
NGNG0249デフォルトの名無しさん
2006/05/10(水) 20:25:03Unquoted string "pritn" may clash with future reserved word at - line 1.
Useless use of a constant in void context at - line 1.
- syntax OK
ほんとだ。syntax は OK らしい。
0250デフォルトの名無しさん
2006/05/10(水) 20:49:17そっかforeach(...)のカッコ内はリストコンテキストだったんだね
0251デフォルトの名無しさん
2006/05/10(水) 23:16:03配列を返す関数get_array()でforeachは(get_array() ){...}
とか書いてもget_array()一回分の配列しか取らない。
eachで取り出した配列であるキーと値が一回分出てきている。
全ての値が見たいなら
print $_ , "\n" foreach (%hash);
とかでオケ
0252デフォルトの名無しさん
2006/05/10(水) 23:20:26print join( "\n", %hash, "\n");
デバッグ目的なら
use Data::Dumper;
print Dumper( \%hash );
■ このスレッドは過去ログ倉庫に格納されています