- 1 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 21:17:36 ]
- "The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、 Perl の奥深さについて皆で語り合い、追求してまいりましょう。 CGI についての質問は板違いです。WEB プログラミング板でどうぞ。 CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。 (WEB プログラミング板: pc11.2ch.net/php/) CGI の質問は答えが Perl と全然関係ない話に帰着する場合が 多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。 このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。 スレ違いの質問にはスルーか、速やかな誘導をお願いします。 www.perl.org/get.html ● 2009/02/09 現在の最新版: 5.10.0 ▼ 前スレ Perlについての質問箱 38箱目 pc11.2ch.net/test/read.cgi/tech/1221967332/ リンク集は >>2-3 Perl 日本語処理の基礎の基礎 >>4 過去スレは >>5-6 あたり
- 309 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:19:50 ]
- >>306
ググる前にマニュアルを読めばいいと思うよ。 perldoc.jp/docs/perl/5.10.0/perldata.pod
- 310 名前:デフォルトの名無しさん mailto:sage [2009/03/11(水) 18:31:28 ]
- >>309
perldata読めばいいってはじめからわかってたら困らんだろ。
- 311 名前:デフォルトの名無しさん [2009/03/14(土) 10:04:59 ]
- 少しお聞きしたいのです。
以下のようなソースがありまして、 $| = 1; print "Start\n"; $i = 0; while($a = <>){ print "Loop: $a $i\n"; $i++; } print "End\n"; コマンドラインから perl test.pl などとして起動すると、 Ctrl+Z(ENTER)でEOFを渡して(よくわかってない?)中断して終了できますよね。 しかし、EOF(0x1a)を、 ファイルで渡したり(perl test.pl < test.txt)、Delphi等のプログラムから渡したりすると 上記プログラムでは終了してくれなす。 これを終了してくれるようにするにはどうしたらよいでしょうか?
- 312 名前:デフォルトの名無しさん [2009/03/14(土) 10:06:38 ]
- >>311
捕捉 > EOF(0x1a)を、ファイルで渡したり これは、バイナリエディタで 74 65 73 0D 0A 74 65 73 74 0D 0A 1A 0D 0A のように記述しました。
- 313 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 11:13:25 ]
- シグナル打ち込め
- 314 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 11:24:01 ]
- >>311
1A は関係ないと思う。 1A は有っても無くても終了するはずだよ。 でないと UNIX などは大変なことになる。 1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。 原因は何か他にあるんじゃないの?
- 315 名前:311 mailto:sage [2009/03/14(土) 12:15:10 ]
- ごめん、環境かいてなかった。
OS: Windows Vista SP1 32bit perlは体分前に入れたものなので古い This is perl, v5.8.3 built for MSWin32-x86-multi-thread (with 8 registered patches, see perl -V for more detail) >>314 ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事 maxxdelphisite.free.fr/doscmd.htm 1AってそもそもEOFじゃないんのかな?
- 316 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 12:27:16 ]
- >>315
先ず先に<>はSTDINとARGV両方を示す事を理解しろ。 プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、 ARGVがあれば、暗黙のうちに<>は<ARGV>として挙動する。 従って ==== while(<>){ print "ARGV: $_" } while( ($_=<>) !~/^$/ ){ print "STDIN: $_"} ==== をhoge.plとして保存して以下の様に実行した場合、 perl hoge.pl < hoge.pl は、ARGVの中身を全てプリントした後にSTDINの処理をする (STDIN処理は、何も入力せずにreturnで終了)。 外部ファイルにシグナルを入れて流し込むのが仮に可能だと しても、それをどのタイミングで使うかは書き手に任される訳だから、 素直に終了フラグを立てるのが普通では無いの?
- 317 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:49:03 ]
- なんか変なのが沸いた
>>プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、 へー
- 318 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:55:55 ]
- ファイルハンドルがって意味じゃねえの?
それでも言葉不足だけどw perl hoge.pl < hoge.pl は、 while(<ARGV>){ print ; } でも while(<STDIN>){ print ; } 動くよ。
- 319 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 13:57:02 ]
- 最終行「でも動くよ。」
- 320 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 14:08:58 ]
- 知ったかぶり者を論うのやめろ。荒れるから。
- 321 名前:へんなの mailto:sage [2009/03/14(土) 14:09:01 ]
- あーすまん。
言葉も変だし、5.8までと5.10で挙動が違うわ、>>316。 >>316の例とかは全面撤回(5.10では動く)
- 322 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 14:28:14 ]
- CPANやperldoc.jpでのPODトランスレータは何を使っていますか?
Pod::HTML, Pod::HtmlEasy, Pod::Xhtml, Pod::Tree::HTML, Pod::Simple::HTML, Pod::Simple::XHTML...と、色々試していますが、 L<Foo>やら=item * <Bar::Baz>やらマルチバイト文字やら、 一部に対応しているものがありますが、全部に対応したものはないように 感じました。
- 323 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 17:02:33 ]
- >>315
>ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します >プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事 結局どうなの?終了するの?無限ループするの?どっちなの? 結局、何がしたいの?どういう動作を期待してるの?
- 324 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:47:30 ]
- >>311 が使ってるOSでは、0x1a を送っても 0x1a にすぎず EOF にはならない。
どうしてもそれを望むなら OS を CP/M に換えるといい
- 325 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:48:07 ]
- I love you
- 326 名前:デフォルトの名無しさん [2009/03/16(月) 20:40:31 ]
- 二重のforeach修飾子は使えないのでしょうか?
perl -E ' @tmp=([1,2,3],[4,5,6],[7,8,9]); for (@tmp){ for (@{$_}){say} }' 出力 1 2 3 (以下略) という構文をforeach修飾子を使って、以下のように書いたのですが、 perl -E ' @tmp=([1,2,3],[4,5,6],[7,8,9]); say for @{$_} for @tmp;' コンパイルエラーになってしまいます。 このような二重のforeach修飾子は使えないのですか? それともコードが間違っているのでしょうか? perlのバージョンは v5.10.0 built for x86_64-linux-thread-multi です。
- 327 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 20:59:27 ]
- 修飾子はひとつしかつけられません。(perlsyn参照)
Any simple statement may optionally be followed by a SINGLE modifier, just before the terminating semicolon (or block ending).
- 328 名前:デフォルトの名無しさん [2009/03/16(月) 21:15:11 ]
- rand()で、0が出る確率というのはあるのでしょうか?
もしくはrand()で出る一番小さな数字というのがあれば教えて頂けないでしょうか。
- 329 名前:326 [2009/03/16(月) 21:19:15 ]
- >>327
ありがとうございます。 参考になりました。
- 330 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 21:51:39 ]
- >328
perldoc -f rand
- 331 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:58:47 ]
- $data = "19:09:34 hoge 294";
if($data =~ /\d\d:\d\d:\d\d \d*/){ print "マッチ\n"; }else{ print "マッチせず\n"; } 「数字数字:数字数字:数字数字 いくつかの数字」という文にだけヒットさせたいんですが、 何故か余計な文字の入っている上の文でもヒットしてしまいます。 どうしてヒットしてしまうんでしょうか? 環境:This is perl, v5.8.8 built for MSWin32-x86-multi-thread
- 332 名前:331 mailto:sage [2009/03/17(火) 00:01:27 ]
- *だと\dが0の場合も含まれるんでした。
*を+にしたらうまくいきました。
- 333 名前:デフォルトの名無しさん [2009/03/17(火) 00:42:36 ]
- 関数のreturn値って成功の場合1で、失敗の場合0が普通なのでしょうか?
標準関数はこのパターンが多いような気がします。 シェルスクリプトの場合だとたいてい逆ですよね?
- 334 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 07:18:18 ]
- 成功の場合に真を、失敗の場合に偽を返す
って考えれば Perlの関数の多くも コマンドの終了コードも同じ
- 335 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 08:34:52 ]
- ↑
アフォ?
- 336 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 16:16:53 ]
- >>333
そだよ だからsystem関数の使い方には注意 Perl6では、system関数の戻り値もPerlの流儀になる
- 337 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 20:36:43 ]
- 引数がAから始まって、後が全部数字かどうかチェックするのって
if($ARGV[0] =~ /^A+[0-9]$/) でいいのかな
- 338 名前: ◆TWARamEjuA mailto:sage [2009/03/17(火) 20:38:57 BE:3920966-BRZ(10001)]
- >>337
おしいかも。 /^A[0-9]+$/ でもその前にchomp入れた方がよいかも♪
- 339 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 20:47:23 ]
- おおお、なんと優しい
ありがとーw
- 340 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 23:20:12 BE:309540375-PLT(54324)]
- /\AA[0-9]+\z/
- 341 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 04:15:45 ]
- xms
- 342 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 09:46:26 ]
- \d+はダメなの?
- 343 名前:311 mailto:sage [2009/03/18(水) 10:41:45 ]
- >>316
時間が空いてすいません。 ^Z(1A)はシグナルなのでそもそもファイルからは渡せないもんなんでしょうか?(単にデータとして受け取られる) 問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる ものなのでしょうか? つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。
- 344 名前:311 mailto:sage [2009/03/18(水) 10:44:13 ]
- >>323
期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。 ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。
- 345 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 10:44:39 ]
- >>342
\d や \w はロケールや UTF-8 フラグによってマッチする文字が変わる。例えば全角数字。 $ は改行の直前にもマッチするので、"A10\n" =~ /^A[0-9]+$/ が真となってハマる初心者多し。 ^ は /m が指定されていない限り文字列先端にしかマッチしないので、\A だとやや偏執的 とも感じる。用心深いに越した事はないけれど、/\AA よりは /^A の方が見た目がスッキリ して読みやすい。 perldoc.jp/docs/perl/5.10.0/perlreref.pod perldoc.jp/docs/perl/5.10.0/perlretut.pod
- 346 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 11:35:38 ]
- >>344
1Aが入ってきたら終わるように書けばいいだけ。
- 347 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:01:22 ]
- Perl業界におけるPerl 6の立ち位置がよく分からないんですが、
雰囲気的にはどんな感じなんでしょうか?
- 348 名前:デフォルトの名無しさん [2009/03/18(水) 16:24:04 ]
- >>347
Web業界に限って言えば様子見ムード。
- 349 名前:デフォルトの名無しさん [2009/03/18(水) 16:28:27 ]
- Parrot1.0が出ましたが、これ使うと何が出来るようになるんですか?
他言語との連携が楽になるだけ?
- 350 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:40:10 ]
- >>344
CP/Mからの呪縛。 DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、 テキストモード、バイナリモードについて、ググるなりして理解するのが先。
- 351 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 18:44:37 ]
- >>345
d
- 352 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 20:17:40 ]
- >>344
だから 0x1a が EOF と思ってる時点で間違ってる まずここを理解しろよ CTRL-Z 押下は EOF を送るための特殊な操作であって、 それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって 0x1a を送れば EOF になるわけじゃない。
- 353 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 01:24:01 ]
- >>344
if (ナントカ eq "\x1a") { exit } こういう発想は思いつかんの?
- 354 名前:311 mailto:sage [2009/03/19(木) 07:08:15 ]
- >>346 >>352-353
理解しました。ありがとう。
- 355 名前:デフォルトの名無しさん [2009/03/20(金) 02:20:00 ]
- @a = ('1','2','3','4','5','6')
@b = ('2','3') という配列があった時に、@aから@bを削除して @c = ('1','4','5','6') を作りたいのです。ループ回すしか無いのでしょうか? 大崎氏(www.din.or.jp/~ohzaki/perl.htm#ArrayUnique)の、 # 配列 @array から重複した要素を取り除く { my %count; @array = grep(!$count{$_}++, @array); } みたいな華麗な手法があるなら知りたいです。
- 356 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 03:24:57 ]
- @count{@b} = @b;
@array = grep(!defined($count{$_}), @a);
- 357 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 05:09:05 ]
- @c = grep{!((join ',', @b) =~ /(?:^|[^0-9])$_(?:[^0-9]|$)/)} @a;
すごく…力わざです…
- 358 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 06:47:02 ]
- >>355
みたいなじゃなくてそれ使えよ
- 359 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 16:49:14 ]
- >>355
use Array::Utils; @a = ('1','2','3','4','5','6'); @b = ('2','3'); @c = Array::Utils::array_diff(@a, @b); # (1,4,5,6)
- 360 名前:デフォルトの名無しさん [2009/03/20(金) 16:52:41 ]
- >>359
最近ではそういうのを華麗というのか?
- 361 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:25:05 ]
- モダン(笑)
- 362 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:33:12 ]
- 教えてください。恥ずかしいんですが...
sample.html -------------------- <html> 2009-03-20 </html> -------------------- yyyy-mm-dd.pl -------------------- #!/usr/bin/perl use Time::Local; ($s, $mi, $h, $d, $mo, $y, $w) = localtime(time); $lastupdate = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d); $yesterday = sprintf("%04d-%02d-%02d", $y + 1900, $mo +1, $d-1); s/$yesterday/$lastupdate/g sample.html; --------------------
- 363 名前:362 mailto:sage [2009/03/21(土) 21:34:06 ]
- (続き)
sample.html内の2009-03-20を2009-03-21に置換したいのですが、 これじゃだめなんですよね? どうしたらいいでしょうか。 ちなみに、ワンライナーっていうんですよね、それで $ perl -i -p -e 's/2009-03-20/2009-03-21/g;' sample.html みたいにすると置換できましたが、s/foo/bar/のfoo, barの部分に 変数を使いたいんです。 目的は、社内LANで公開しているweb(html)内の最終更新日時の表示を、 ちょっとした理由から、毎朝午前5時とかに、その日の日付に変えること、です。 よろしくお願いします。
- 364 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 21:45:51 ]
- >>363
javascriptじゃだめなの?
- 365 名前: ◆TWARamEjuA mailto:sage [2009/03/21(土) 21:51:44 BE:3484984-BRZ(10001)]
- 04月01日だと、$yesterdayに04月00日が生成される伊予柑♪
- 366 名前:362 mailto:sage [2009/03/21(土) 22:00:24 ]
- しくしく。。。いじわるですね。。。というか遊ばれていますね。。。
javascriptでもいけるんでしょうか。 それから、おっしゃるとおり04月00日になりそうですね。 perlで行くとしたら、そこは勉強して、何とか回避策を考えようと思います。 WSH, perl, あと何だろう、いくつか候補を考えたのですが、perlは まったくといっていい初心者です。sedも。正規表現は理解はしている つもりですが使ったことがあまりないです。 どんな手段でもよいのですが、何となくperlがよさそうだと思って、 この板に来てしまいました。。。 あらためて、どんな手段(言語、手段、ツール)がいいかを含めて 教えてください。<(_ _)>
- 367 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:11:34 ]
- >>362
1) SSIで最終更新日時を書くのが楽 2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽 かね。 そもそも、 A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、 B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、 そのあたりの要件がはっきりしません。 更新日時についても、営業日でなくて暦日で良いのか、とか。 ちょっとまってね、これから書くから。
- 368 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:15:53 ]
- 明らかにSSIが楽。
- 369 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:19:42 ]
- # YYYY-MM-DDをその翌日に置き換える場合
# ただし13月32日とかも引っ掛かって甘いので注意 # しかも、最終更新日以外でも、くだんの正規表現に引っ掛かった値が変換されるので注意 use strict; use warnings; use File::Slurp; use DateTime; my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして my $file = read_file($file_name, array_ref => 1); LINE: foreach my $line (@$file) { $line =~ s{ (\d{4}) - (\d{2}) - (\d{2}) }{ DateTime->new(year => $1, month => $2, day => $3) ->add(days => 1) ->ymd(); }xmse; } write_file($file_name, $file);
- 370 名前:362 mailto:sage [2009/03/21(土) 22:19:54 ]
- すみません...
そもそも、から行きますと、 A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい です。 営業日ではなく暦日でOKです。 土日祝日もインフラが停止しなければ365日毎朝更新したいです。 というのは、会社のデータベースからあるまとまった形のデータを Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに アップロードし、それを地方拠点にイントラウェブで提供します。 最終更新日を更新したいというのは、そのアップロードの案内ページなんです。 データを落としてきて、パスワードをかけて、所定のフォルダにアップロード するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、 恥ずかしいうにょうにょなやり方でどうにか実現しました。 が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、 偉い人から言われまして...
- 371 名前:369 mailto:sage [2009/03/21(土) 22:22:40 ]
- Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。
ただ、>>370の書き方を見ると、 土日でもアップロードされたデータが更新されているなら、 touch sample.html してアップロード案内ページだけ最終更新日時を変えれば、 A)はB)と同じになるよね。 そうすればSSIでもやれるんじゃないかな?
- 372 名前:362 mailto:sage [2009/03/21(土) 22:22:46 ]
- >>369さんありがとうございます。
さっそく明日試してみます。 SSIについては鯖管さんに相談してみます。 そういうとこ、小回りのきかない、相談窓口も親身になってくれない 会社です。。。
- 373 名前:369 mailto:sage [2009/03/21(土) 22:26:43 ]
- うい、367=369=371れす。
鯖管は別なのか……。 まあ、SSIを検討してみてよ。日曜なのに大変だね。 もしPerlでどうしてもやりたいなら、>>369を使う場合、 DateTimeとかFile::Slurpは標準では入っていないから、 CPANから導入出来るかも聞いておいて。
- 374 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:29:14 ]
- あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら
my $file = read_file($file_name, scalar_ref => 1); して $file =~ s{略}{略}xmseg; すりゃよかったか。 しつこくてごめん。
- 375 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:33:23 ]
- さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。
チラ裏。 >>322が気になった今日この頃。比較表とかないかな?
- 376 名前:362 mailto:sage [2009/03/21(土) 22:40:12 ]
- 重ね重ね、ありがとうございます。
日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の 部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、 ここだけの形にしておかなければいけないだろうと思いました。 CPANからの導入についても明日確認してみます。 正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。 (恥ずかしながら) ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。 こんなに速くレスをいただけるとは思っていませんでした。 本当にありがとうございます。 perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、 小学生の頃はベーマガとかで勉強したクチです。 おやすみなさい。
- 377 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 22:41:04 ]
- PBPとtokuhiromの受け売りだが、
13月32日に引っかけないためにはRegexp::Commonを使おう
- 378 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 00:28:52 ]
- >>369
これはちょっとマズいんじゃないの? コメントでは YYYY-MM-DD と書いてるけど、実際の処理が \d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。 もちろん年月日かどうか完璧な判定はできないけど、 >>362 にあるようにマッチさせる文字列が昨日の日時でいいなら そういう風に限定すべき
- 379 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 01:19:26 ]
- 某所で再びFizzBuzz問題がはやっているようなのでPerlで書いてみました!添削してください!
perl -e 'for ($n=1;$n<16;$n++) {my$res;!(($n%3||($res="Fizz"))&&($n%5||($res=$res."Buzz")))||($res&&print "$res\n")||(print "$n\n");}'
- 380 名前:戦犯369 mailto:sage [2009/03/22(日) 02:48:29 ]
- >>378
thxです。 ついでに、sample.htmlのエンコードを考慮してみた。 # UTF-8(BOMなし)で保存してね use strict; use warnings; use utf8; use DateTime; use Encode::Guess; use File::Slurp; # ファイルの中身を変数に突っ込む my $file_name = q{sample.html}; # $ARGV[0]とかの引数で渡すとか好きにして my $file = read_file($file_name, scalar_ref => 1); # ファイルのエンコードを類推して、UTF-8に変換する # 決め打ちならこんなことをせず、use Encodeしてdecode, encodeする my $encoding = guess_encoding($$file, qw(cp932 euc-jp utf8)); die "Can't guess" unless ref $encoding; if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') { $$file = $encoding->decode($$file); } # 昨日のYYYY-MM-DDを得る my $yesterday = DateTime->now(time_zone => 'local') ->add(days => -1) ->ymd(); # つづく
- 381 名前:戦犯369 mailto:sage [2009/03/22(日) 02:49:50 ]
- # つづき
# >>362式なら # my (undef, undef, undef, $day, $month, $year) = localtime(); # my $yesterday = sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day - 1); # ファイルの中身で昨日のYYYY-MM-DDに合致すれば変換する $$file =~ s{ ($yesterday) }{ # ファイルに書いてある最終更新年月日(昨日)を、 my ($year, $month, $day) = split q{-}, $1; # 翌日(つまり今日)に変換する DateTime->new(year => $year, month => $month, day => $day) ->add(days => 1) ->ymd(); # >>362式なら # sprintf("%04d-%02d-%02d", $year, $month, $day + 1); }xmseg; # ファイルのエンコードを元に戻す if ($encoding->name() ne 'ascii' || $encoding->name() ne 'utf8') { $$file = $encoding->encode($$file); } write_file($file_name, $file); __END__ まあ、 SSI > テンプレート使用 > ベタ置換 の順が楽なんだろうけど。
- 382 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:57:58 ]
- なにを持って善しと成すのかわからんけど、俺も作ってみた
perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}' 添削してくだちぃ
- 383 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:12:33 ]
- 個人的には、勉強するためならいきなりCPANに頼るのはどうかと思った。
いきなりDateTimeを使わずにsprintfでやった方がいいし、 いきなりFile::Slurpを使わずにopen関数を使った方がいいと思うけど、 面倒くさすぎて放り投げられるとPerlスキーとしては寂しいので、 CPANに依存してみた。今は反省している。 FizzBuzzについては、 1. 要件を実現出来ているんなら、 2. ワンライナーなら、 3. FizzBuzzでゴルフしたり難読化選手権を開くんじゃなければ、 多少腕白でもいいと思うけどね、俺は。 敢えてPBP的に見ても、 a. C的なforでなくforeachを使おうとか、 b. $_でなくてちゃんとforeach my $num (1 .. 15)にしようとか、 c. ""で括らなくていいときは''で括ろうとか、 そんなつまらない指摘しか出来ないけど。 あとはあれか、>>379なら、C的なforをどうしても使うときは、 $n <= 15の方が直感的とかか。
- 384 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:20:37 ]
- あ、うそ、ごめん。
>>381の二つめの>>362式は、3月32日になるw ゆえに素直にDateTime使おう。
- 385 名前:379 mailto:sage [2009/03/22(日) 03:36:54 ]
- >>382-383
ありがとうございます!>>382さんのコードの方がPerlっぽくていいですね。 ぼくのはJavaとかでも使えるテクしか使ってないや。 最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
- 386 名前: ◆TWARamEjuA mailto:sage [2009/03/22(日) 10:10:15 BE:6861097-BRZ(10001)]
- 1日前ってそんなに難しいのかしら?
time - 86400 でよさそうな。。。
- 387 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:34:11 ]
- うるう秒をちゃんと扱わないシステムならな
- 388 名前:デフォルトの名無しさん [2009/03/22(日) 11:15:10 ]
- >>387
UNIX時はどれも閏秒は算定してないと思うが。 システムによって現在のUNIX時が食い違ったら困るだろ。
- 389 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:00:39 ]
- 超頭悪い会話が繰り広げられている
- 390 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:15:46 ]
- >>389
>>389
- 391 名前:362 mailto:sage [2009/03/23(月) 05:38:24 ]
- おはようございます。
ご報告が遅くなりました。 >>381さんに教えていただいたスクリプトを昨日、会社で使って (ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては うまく動いたようです。 今朝出社してうまく書き換わっているかどうか。これから出勤です。 うまくいったら引き続き使います。 ではみなさま、また縁がありましたらどうぞよろしくお願いします。
- 392 名前:デフォルトの名無しさん [2009/03/23(月) 07:49:00 ]
- >>389
仕様上はどちらでもいいことになっているが、先発製品との互換上、 どのシステムもうるう秒は算定していない。 うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、 tarファイルを移転する時とか、NTP使う時とか困るだろ。 よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
- 393 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:22:29 ]
- いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって
いるんだよね。 実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は 一定としてしまうのが楽な場合がほとんどだから設定した例は自分の 周りでは見たことない。 天文とかは過去のある時刻との間の時間みたいのをきっちり出せない と困りそうだけど。
- 394 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:23:10 ]
- うるう秒を勘案するシステムは存在しないってこと?
- 395 名前:デフォルトの名無しさん [2009/03/23(月) 13:06:04 ]
- >>394
一般的なUNIXtimeの扱いの話であって、 そういったシステムが存在しないとは誰も言ってない。 極端な話、協定世界時を管理してるシステムなんかは当然勘案しなきゃ困るでしょ。
- 396 名前:526 [2009/03/24(火) 19:51:11 ]
- ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。
debian etch の上で、perl-tk をいれて触っています。 どうにも日本語が表示されませんので、どなたか詳しい人、アドバイスをお願いします。 perlは、 v5.8.8 perl-tkは、804.027-7 です。 よろしくお願いします。
- 397 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 04:25:03 ]
- エスパーじゃないんだからさ、それじゃ答えようがないよ。
とりあえず>>4 あとやったこと書け
- 398 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:49:23 ]
- ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。
昨日から体の具合が悪いんですが、何かの病気でしょうか? どなたか詳しい人、アドバイスをお願いします。 どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・ 何科の医者に行けばいいですか? よろしくお願いします。
- 399 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 14:53:25 ]
- エスパーじゃないんだからさ、それじゃ答えようがないよ。
- 400 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:06:54 ]
- @test
赤、A、あ、 #$test{0} 黄、A、い、 #1 青、A、あ、 #2 赤、B、あ、 #3 赤、C、い、 #4 青、A、あ、 #5 例えばこういう配列があったとして 各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
- 401 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:28:24 ]
- 「こういう配列」
- 402 名前:デフォルトの名無しさん mailto:sage [2009/03/25(水) 17:36:06 ]
- >>400
my @dat = ( 'red,A,a', 'yellow,A,b', 'blue,A,a', 'blue,B,a' ) ; my @cache ; for ( @dat ){ my $cnt = 0 ; $cache[$cnt++]->{$_} ++ for split /,/ ; } printf "%s\n", sort { $_->{$b} <=> $_->{$a} } keys %{$_} for @cache ; 日本語? => 自分で考えて 同じ個数の物があったら? => 知らん。
- 403 名前:デフォルトの名無しさん [2009/03/25(水) 23:32:24 ]
- ○○.cgiのプログラムで、
「exec △△.pl $param1」とexecを使用して呼び出しても、 呼び出し先の△△.plが実行されないです。 環境が原因と思うのですが、 初心者で何が原因かわからないです。
- 404 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 12:16:36 ]
- >>400
二次元配列のようでもあるし、コメント見るとハッシュにしてるし… せめてPerlの書式で書いてくれ
- 405 名前:400 mailto:sage [2009/03/26(木) 18:21:17 ]
- >>402
レスありがとうございます。 ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、 初心者なため>>402のコードでわからない部分があり、改良することができません。 どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
- 406 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:50:35 ]
- >>405
いくら出すかも書いておくと話が早いよ
- 407 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 18:52:32 ]
- www.seshop.com/detail.asp?pid=6160
『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。 を購入しようと思っています。 この書籍が出た時点のバージョンのPerlをWindowz Vistaで 動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか? これからPerlを勉強するので詳しいことはわかりません。 なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで 少なくともVistaで動作確認済みとPHPの書籍にありました。 どなたか回答よろしくお願いいたします。
- 408 名前:デフォルトの名無しさん mailto:sage [2009/03/26(木) 19:32:34 ]
- perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。
- 409 名前:405 mailto:sage [2009/03/26(木) 20:37:12 ]
- しくしく。。。
どう書けばいいのかわからないんです、アドバイスください @array = ('マグロ','鯛','イワシ','鯛','マグロ','鯛'); &extract(@array); #一番多い要素を書き出す sub extract { foreach (@_) { $hash{$_} ++; } while (($key, $value) = each(%hash)) { push(@test, $value); } @sort = sort{$b <=> $a} @test; $shift = shift(@sort); $aa = $hash{$shift}; print "$aa"; }
|

|