"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://pc11.2ch.net/php/ )
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html ● 2009/02/09 現在の最新版: 5.10.0
▼ 前スレ
Perlについての質問箱 38箱目
http://pc11.2ch.net/test/read.cgi/tech/1221967332/ リンク集は
>>2-3 Perl 日本語処理の基礎の基礎
>>4 過去スレは
>>5-6 あたり
# [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 # まず、以下の行を先頭に入れて下さい。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
7 :
1 :2009/02/09(月) 21:24:29
遅らせながら無いと寂しいので立てました。
1おつ
9 :
デフォルトの名無しさん :2009/02/10(火) 16:19:34
下記のような配列を値として持つハッシュがある時 %hoge = { "A" => [ 100, 300, 800 ], "B" => [ 150, 50, 320 ], "C" => [ 160, 220, 500 ] }; 配列n番目の値をソートしてハッシュからKey値を取り出したい。 たとえば、配列2番目(配列[1])の昇順に、ハッシュKeyを "B", "C", "A" の順番に取り出す、ってなことをやりたい場合 どういうコーディングをすればいいのでしょうか? よろしくお願いいたします。
>>9 sort命令使えば一行でできるよ。
my @sortedkeys = sort { /* ここに配列の二番目を比較する方法を書く */ } keys(%hoge);
11 :
デフォルトの名無しさん :2009/02/10(火) 21:40:03
>>10 その配列の二番目を比較する方法の書き方を知りたいっていうのが質問の主旨なんじゃ・・・
12 :
デフォルトの名無しさん :2009/02/10(火) 21:51:32
$hoge{$a}[1] <=> $hoge{$b}[1]
糞スレ立てんな、ほげ
14 :
デフォルトの名無しさん :2009/02/11(水) 12:57:48
調べてもよくわからなかったので質問です。 perlを用いてexcelデータから行、列ごとにデータを取りこみ、計算処理した後データをファイルに出力することは可能ですか?
Yes, we can CPANで探したらそれっぽいモジュールがあると思うよ
16 :
デフォルトの名無しさん :2009/02/11(水) 13:13:05
>>15 即レスありがとうございます。
ちょっと自分で調べてみますね
ブックマークや直接入力したときでも、直前のURLを取得するには どうしたらよいでしょうか?
20 :
デフォルトの名無しさん :2009/02/12(木) 15:40:13
Catalyst-Plugin-FormValidator-0.02 で困っています。 全てのエラーチェックをエラーを表示するように設定しているのですが、 エラー項目が出力されず、かといって先に進めません。 エラーチェックは if(not $result->has_error){ $c->stash->{template} = "form/cfm"; $c->detach("cfm", $item_id); のようにして、エラーがなければ次へ行っているのですが$result->has_errorはなぜか真です。 どこがエラーしたか分かる方法とかありませんか? すみませんがよろしくお願いします。
21 :
デフォルトの名無しさん :2009/02/12(木) 15:45:14
name属性のヴァリデート > name => [qw/NOT_BLANK/, [qw/LENGTH 0 20/] ], を外したら正常動作しました。不思議なのは、ブランクにすると エラーが出ますし値を埋めても正常動作しない点です。 どなたか助けてください。
22 :
デフォルトの名無しさん :2009/02/12(木) 15:58:39
$result->invalidで調べると、間違ってもないのに nameがinvalidになってます。何故なんでしょう・・・。
23 :
デフォルトの名無しさん :2009/02/12(木) 16:00:28
> name => [qw/NOT_BLANK/, [qw/LENGTH 0 20/] ], の20を40にすると動きました。お騒がせしました。急いでいたので荒らし気味になってスマソ。
24 :
デフォルトの名無しさん :2009/02/12(木) 18:20:56
7文字で3x7=21でオーバーしてたのね・・・・。 しかも半角文字もUTF-8扱いで困った。
以前、perlに詳しい人にソースを見てもらったときに 「もっと短くできる。とにかくperlは文字量、行数を節約して書くものだ」と言われました。 有名なperlの参考書にもそう書いてあります。 とにかくあらゆるテクニックを駆使して短く書くのがperlの美学のように書いてあります。 私は、他の言語では行数にこだわらず可読性を重視してソースを記述していました。 今、perlでやや大きめのプログラム(個人で使うツール)を作ろうとしています。 テクニックや行数圧縮にこだわらず自分が保守しやすい読みやすいコードを書きたいと 思っていますが、それはperlでは許されないのでしょうか。
あまりにトリッキーなのはあれだけど 基本的にはシンプルに書けるなら 短い方がわかりやすいものだと個人的には思っている
誰が許さないんですか? 言語仕様が許さないんならともかく、 書けるんなら自分が書きたいように書けばいいじゃないですか。 There's more than one way to do it っていう言葉もありますよ。
「 可 読 性 」 は 禁 句 このスレの掟。
ひとつの事をするのにいくつものやり方があるのがPerlの哲学 自分の好きなように書けばおk
32 :
デフォルトの名無しさん :2009/02/13(金) 17:31:37
長く書いても短く書いてもどっちでもいいけど、 abc => "cde" 1 while or die $flag and $_=$flag /abc/ and 処理 /cdf/ and 処理 /ghi/ and 処理 $name->firstname->camel->output 辺りは知っといて欲しい。
perlは簡潔に書いたときに可読性が増すように設計された言語だと思う。 ほかの言語だと、したい処理を表現するのに余計なことを書き込まなくてはいけない。 その余計なことはプログラムの流れにとって不自然なので注釈が必要になる。 25はほかの言語の仕様に毒されていてプログラムに無駄が多いんだろうね。 perlが可読性に乏しいと主張する人は単にperlについての知識が乏しいだけだ。
Perlをよく知ってる人はより完結に書けるけど、あまり知らなくても 知ってる知識だけでプログラムが出来ちゃうところがPerlのいいところだと思う
35 :
デフォルトの名無しさん :2009/02/13(金) 21:28:43
でもuse strictしてないのとか、goto使ってるのとか、 ファイル1枚で絵巻物みたいに長いのは勘弁してください。
Active perl にてwperlを使用してコマンドプロンプトを開かないようにしたいのですが ソース内でシステムコマンド(たとえば`tasklist`とか)を使うとプロンプトが一瞬開きます。 これを開かないようにする方法ってありますか?
37 :
9 :2009/02/15(日) 00:40:34
>>10 >>12 ずいぶん亀になってしまいましたが・・・
ありがとうございます。
おかげさまでうまくいったデス。
38 :
デフォルトの名無しさん :2009/02/15(日) 05:33:13
Perl で、バイナリーデータを検索するにはどうしてますか? 1Mぐらいのデータを読んで、特定のデータを検索するのですが、 最初、index を使っていたら、これは、\r\nを1文字と解釈するようで、 位置がずれてしまいます。 代わりになる関数を探したけど、見つからないです。
39 :
デフォルトの名無しさん :2009/02/15(日) 08:14:08
>>38 Windowsで使ってるでしょ?
特殊変数の$/に「\n」を代入してから検索してみ?
41 :
デフォルトの名無しさん :2009/02/15(日) 12:08:27
>>40 1行目は重箱の隅で本件とは関係なし。
2行目はなんなの?
$/ = "\n";
print index($a,$b);
で済む問題。
42 :
デフォルトの名無しさん :2009/02/15(日) 13:07:18
Perl始めて数日の初心者です
ActivePerlでWindowsでやっているのですが、Webで見つけたサンプルが
use strict;
use warnings;
use HTML::ExtractContent;
use LWP::UserAgent;
となっているのですが、モジュールのインストールの方法がまったくわかりません。
HTML::ExtractContentというのは
http://search.cpan.org/dist/HTML-ExtractContent/ ここからダウンロードできたのですが、その先をどうしたらよいのでしょうか
LWPというのはとりあえずppmからインストールできました
43 :
デフォルトの名無しさん :2009/02/15(日) 13:08:54
>>42 >su
>password: ********
> cpan
:
:
[1]cpan>install HTML::ExtractContent
おしまい。
44 :
42 :2009/02/15(日) 14:45:18
コマンドプロンプトを開いて install HTML::ExtractContent と入力しエンターを押すとたくさんズラーっとでてきて最終的に NMAKE : fatal error U1077: 'C:\WINDOWS\system32\cmd.exe' : return code '0xff' Stop. TARAO/HTML-ExtractContent-0.05.tar.gz nmake test -- NOT OK //hint// to see the cpan-testers results for installing this module, try: reports TARAO/HTML-ExtractContent-0.05.tar.gz Running make install make test had returned bad status, won't install without force Failed during this command: ROBIN/Want-0.18.tar.gz : make NO RCLAMP/Class-Accessor-Lvalue-0.11.tar.gz : make_test NO TARAO/HTML-ExtractContent-0.05.tar.gz : make_test NO cpan > と表示されました。 インストールが完了したと思ったのでサンプルプログラムa.plを実行すると C:\Documents and Settings\SX3WX06MA\デスクトップ>perl a.pl Can't locate HTML/ExtractContent.pm in @INC (@INC contains: C:/Perl/site/lib C:/ Perl/lib .) at a.pl line 3. BEGIN failed--compilation aborted at a.pl line 3. となってしまいました これはインストールが失敗したということでしょうか もしかして、ダウンロードしたモジュールを特別な場所に移動してから cpan>install HTML::ExtractContent をしなければいけないのでしょうか
>>44 > これはインストールが失敗したということでしょうか
そう書いてありますが。
46 :
デフォルトの名無しさん :2009/02/15(日) 15:33:12
>>44 cpanのログを読んでどこでcpan installがつまづいたか自力で探すしかないね。
47 :
デフォルトの名無しさん :2009/02/15(日) 15:36:46
追記。
http://d.hatena.ne.jp/KNOPP/ の一番最後の方を読むと幸せになるかもしれん。
ただWindowsだからどうなのかは知らん。
> Class-Accessor-Lvalue
> File-Slurp
> をPPMであらかじめいれておき、
そのあと cpan >installしてみたらどーなる?
48 :
デフォルトの名無しさん :2009/02/15(日) 15:39:14
もしかしてコンパイル環境がないからコケてるのか? ぽつぽつとスマソ。
49 :
38 :2009/02/15(日) 21:14:22
>>39 ありがとうございました。
$/なる変数は、初めて知りました。
しかし、どうやら原因は、ほかでしたw。
FTP転送の際に、改行を勝手に変換してたため、\r\nが、\nだけになってたことでした。
これで、2文字が1文字扱いされてるなってw
>>38 indexや正規表現を使ってる。
文字列がutf8に汚染されないように気をつけている程度かな。
51 :
デフォルトの名無しさん :2009/02/15(日) 21:22:34
>>50 それだとバイナリにindexや正規表現を使っちゃいけないように読める。
52 :
50 :2009/02/15(日) 21:56:57
しまった元ファイルが壊れていたってオチか。
>>51 言われてみればそう読める。
指摘tnx.
ついでに
>>36 方法はあるけど、それなりに難しそう。
GUIアプリからコンソールアプリを実行 でググると吉。
もしかしたら既存モジュールがあるかも。
53 :
42 :2009/02/15(日) 23:00:58
>>47 ついさっきまでCentOS5をインストールしてCPANで試してもうまくいかず絶望していましたが、
書き込みを見てリンク先の指示通りにやったら無事プログラムが動きました。
本当にありがとうございました。いくら感謝しても感謝し切れません。
54 :
デフォルトの名無しさん :2009/02/16(月) 11:55:30
>>53 おお動いたか、よかったな。少し心配してたw
>>36 >>50 僕もよく知らないのだが、下のはどうかな?
use Win32::OLE;
my $WshShell = Win32::OLE->CreateObject("WScript.Shell");
$WshShell->Run('tasklist', 0);
パッケージの外から変数を覗き見たいです ググったところ、グローバル変数ならシンボルテーブルとかいうものを検索すれば見られそうな感じですが、 レキシカル変数は無理なのでしょうか
57 :
デフォルトの名無しさん :2009/02/17(火) 09:16:53
>>56 なぜそんなことが必要な状況になったかが問題だと思う。
>>57 デバッグのときにあまり本体を汚さずに中の変数を覗きたいんですよ
最終的には一行書くだけで自動的に変数をトレースしたいです
>>58 それ素晴らしく完璧ですね
ありがとうございます
61 :
デフォルトの名無しさん :2009/02/17(火) 14:25:23
知ってるがお前の態度が気に入らない。
63 :
デフォルトの名無しさん :2009/02/17(火) 15:42:16
65 :
デフォルトの名無しさん :2009/02/17(火) 16:31:29
66 :
デフォルトの名無しさん :2009/02/17(火) 17:50:44
67 :
デフォルトの名無しさん :2009/02/17(火) 18:40:21
68 :
デフォルトの名無しさん :2009/02/17(火) 18:41:46
キモイ、粘着、IDストーカー、 もう返信しないで下さい。キモいです。
なにこのスレ
文字列取得の質問です "a,b,c:ABC,d,e,DEF"ghi のような文字列があった場合に、 ABC(コロンとカンマの間) DEF(カンマとダブルクオテーションの間) の文字を取得するにはどのようにすればよいでしょうか? indexとsubstrを駆使してみましたが、 カンマやダブルクオテーションが複数あるため indexの位置が正しく取得できずに断念しました。
72 :
デフォルトの名無しさん :2009/02/18(水) 00:29:51
>>71 ありがとうございます。
$tmp =~ /:(.+)\,/;
のようにやってみましたが、下記の結果になってしまいました。
$1⇒「ABC,d,e」
後ろのカンマのマッチを無視するにはどのようにすればよいでしょうか?
>>73 ABC ⇒ /:(.+?)\,/
DEF ⇒ /.+\,(.+?)"/
↑で、うまくいきましたー。
ありがとうございました
呼び出したモジュールから、本体の出力命令 ( print とか die とか )を察知して 内容を置換して出力し直すことは可能でしょうか
76 :
デフォルトの名無しさん :2009/02/18(水) 07:48:50
可能です。
78 :
75 :2009/02/18(水) 23:09:04
どうやら print をオーバーライドするのが一番手っ取り早そうですね ですが、perl はサポートしてないんですよね 実現してるモジュールなんかはありますでしょうか
>>78 親切な僕が変態 ReplacePrint.pm をそれっぽく書いたげたお。
die のほうはせっかく例外投げてんだから catch してあげて。
使い方:
use ReplacePrint;
print "string\n";
# ここから ReplacePrint.pm
package ReplacePrint;
use strict;
sub TIEHANDLE { bless [], $_[0] };
sub PRINT {
my $self = shift;
my @str = @_;
for (@str) {
s/$/ is replaced/;
print STDOUT;
}
}
my $out;
open *OUT, ">", \$out;
my $stdout = select(OUT);
tie *OUT, "ReplacePrint";
1;
ありがとうございます まだファイルハンドルあたりやtaiについての知識が薄いので、 ここ2,3日で実験しながら学びたいと思います また何か分からないことがあると思うので、 よろしくお願いします
81 :
79 :2009/02/19(木) 22:56:32
>>80 正直、想定外の好反応にあわててる僕がいるお。
外野からの「こんなひどいことするくらいなら設計見直したほうがいい」系のツッコミを期待してたので。
>>79 は猛烈にやっつけで、行儀の良くないことをいくつもやっている点が「変態」の所以。
なのでこのまま流用したりすると後でひどい目にあうことうけあい。
ヒント程度にしておくのが吉です。
Mooseっていったん適当なクラスにrole付加したら、あとでそのrole使わないようにってできないの?
:
>>81 :viaレイヤ使うといいのかもしれない。使ったことないけど。
StringRandomモジュールを使用せずに2chのIDのようにランダムな文字列を生成するにはどうすればよいでしょうか?
その程度のプログラムも書けないのは全くプログラミングの勉強が 不足しているのでもうすこし勉強しましょう。
解決しました。ありがとうございました。勉強してきますorz
88 :
デフォルトの名無しさん :2009/02/20(金) 18:27:25 BE:1369512858-2BP(150)
UTF-8のテキストファイルから">"一文字を正規表現で検索して置き換えたいのですが、 s/>/test/g とやってもうまく検索できません EUC-JPへのエンコードなどしてみたのですが、そうすると他の文字が一部文字化けなどしてしまい更に 面倒なことになったので、できれば文字のエンコードなしで日本語の置き換えをしたいです Dumpで表示した\xxxなどの形式で検索もしてみましたが、うまく置き換えできませんでした 日本語の置き換えに何かいい方法はないでしょうか? 置き換えしたい文字は">"だけです。
なんといういやがらせ
90 :
88 :2009/02/20(金) 18:56:00
自己解決しました index関数とsubstr関数で置換できました
とあるプログラムの一部に書かれてたんですが これはどういう意味なんでしょう? # untaint $0 =~ /^(.+)$/; my $self = $1; $0でスクリプト自身のファイル名を取ってきて 正規表現に掛け、マッチしたものを別の変数に入れてますけど、 これだと$0と$selfは一緒なものが入る気がするんですが・・・。
>>91 志村〜、コメント、コメント
汚染されたデータからパターンマッチで部分文字列を取り出すことで
汚染を取り除いている(=untaint)のだが、汚染とは何かとか言い出すと
長くなるので「perl 汚染」でぐぐっていろいろと調べてみるといいよ。
$0が汚染されてたらスクリプト自体が実行出来ないもんじゃねえの? (汚染チェックの重要性は十二分に解ってはいるんだけど)
94 :
91 :2009/02/20(金) 21:38:11
>>92 レスありがとうございます。
なるほど、不正なコマンド含んでたりするものを取り除いてるわけですね。
でもこの正規表現だと任意の文字列にマッチしてしまって取り除いたりは
できないような気もしますが・・・。一回正規表現を通して見かけだけ汚染を
取り除いたとみなしてるんでしょうか。
まぁ調べる方針はわかったのでもう少し調べてみます。どうもでした。
.*は何にでもマッチしちゃうので、全くその通り。無理矢理に汚染フラグを 取り除いただけです。よい子は真似しないこと!
96 :
デフォルトの名無しさん :2009/02/21(土) 18:23:38
perl -e 'use strict;my%H;sub A{@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"' perl -e 'use strict;my%H;sub A{my %H@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"' この二つ 上は何故かコンパイルも通り、意図したようにデータも返すことが出来る 下は一見すると正しい文法だし問題もないように見えるけどなぜかデータを取得できない 原因がわかる人いますか?
97 :
デフォルトの名無しさん :2009/02/21(土) 18:24:12
下は perl -e 'use strict;my%H;sub A{my %H;@H{qw/A B C/}=(1,2,3);return \%H};*H=A();print "$H{C}\n"' の間違いです。スマソ
>>96-97 スコープが違うから。
上はサブルーチンの外側で宣言した %H に代入している。
下はサブルーチンの内側で宣言した %H に代入している。
型グロブはパッケージ変数。
>>98 なるほど
パッケージレベルのmy変数はどの関数からも見えるんですね
あと型グロブはmy変数とは異なるパッケージ変数と。勉強になりました
ここ(
http://kage.monazilla.org/system_DOLIB100.html )を参考に
●ログインするプログラムを書いてみました。
しかし、認証に失敗して、以下のセッションIDが返ってきます。
SESSION-ID=ERROR:ppppppppppp
何かアドバイスお願いします。
※IDとパスワードはここではダミーのものとしていますが
実際には自分自身のIDとパスワードを使用しています。
use strict;
use Socket;
use FileHandle;
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
my $id='id';
my $pw='password';
my $ua = LWP::UserAgent->new;
$ua->agent('DOLIB/1.00');
$ua->default_header('X-2ch-UA' => 'Hoge/1.00');
my $url='
https://2chv.tora3.net/futen.cgi ';
my %form = ('ID'=>$id,'PW'=>$pw);
my $req = POST($url,[%form]);
>>100 手元で検証してみたが、サーバ側のバグかもしれない
IDパラメータの「@」が「%40」にエンコードされていると認証に失敗した
102 :
101 :2009/02/22(日) 12:58:44
さっきのレスがわかりにくいかもしれないので…
futen.cgiに渡すパラメータは通常
[email protected] &PASS=password
って風になるんだけど、これが
ID=mail%40domain.jp&PASS=password
という風に渡すと、なぜか認証に失敗する。
本来は後者でも%40が@にデコードされた結果、認証が成功していないといけないのだが…
あ、
>>100 のコードでおかしいところ発見。
my $req = POST($url,[%form]);
↓
my $req = POST($url,\%form);
>>102 ・エンコードしない。
・[%form]→\%formに修正。
再度実行してみましたけど、認証に失敗・・・orz
104 :
101 :2009/02/22(日) 13:20:31 BE:1092302674-2BP(1)
お〜っ、勃ってる。 辛抱強く DAT 落ちしたログ持って待ってた甲斐があった。 …単なるログコレクターみたいなもんなんだけど…。
大昔から知られてる問題
↑ すぐそういうことを言う・・・ たまたま知ってたから自慢したいだけやろ。
>>107 そういう風に嫉妬むきだしの解釈するのは感心しませんね。
>>106 さんは、自分がたまたま読んでいなかったばかりに、素早く問題点を
指摘してあなたがたに無駄働きさせないことが出来なくてすいませんと
言いたかったんですよ。
後出しジャンケンみっともない
>>104 解決しました。
ありがとうございました。
仮想配列の中に'abc'が存在するかどうか確認する方法はありますか?
exists
仮想配列って何ですか
「仮想配列」
先っぽの皮が半分だけ剥けてるヤツだろ。 手で引っぱって全部剥けるなら心配いらん。
>>106 >switch.layer3.asia が稼動してる際に SNMPv2c の一般的な読み取りコミュニティ名で
>リクエストを送ると、どこかのツリーの下に私の携帯電話番号が現れますよ
http://layer3.asia/ 痛いw
117 :
デフォルトの名無しさん :2009/02/24(火) 03:02:56
perlに限った事じゃないかも知れない(前置き) klassというのをたまに見掛けるけど、これはどういった意図で使ってるの? ある程度の頻度で見掛けるので、一定の合意があるのかと思って聞いてみました。
classが予約語の言語でclassの類似物を作った場合とか funktionなんてのもよく見るね
フォームから読み出したデータを処理したいのです。 読み出したデータの名前はa1からa10までで、それを$a1から$a10に入れたいのですが、 $form = new CGI; $a1 = $form -> param('a1'); $a2 = $form -> param('a2'); …と、a10まで順番に書いていかなければならないんでしょうか。 すっきりした書き方があれば、教えて下さい。
>>119 そもそも変数名に通し番号をつけるセンスをなんとかすべきだな。
配列使えよ。
121 :
デフォルトの名無しさん :2009/02/24(火) 13:32:09
$form = new CGI; foreach(0..10){push(@a, $form->param('a' . $_))} でいいんじゃね?ゼロからだけど@aの添え字にあわせるため。
>>119 ${"a$_"} = $form->param("a$_") for 1..10;
123 :
デフォルトの名無しさん :2009/02/24(火) 14:13:51
変態が好きなら0-9にしようぜ push(@a,$form->param($_))for a0..a9;
というか、パラメタにつく数字は2桁超えるならa00-a10と言う風に桁をそろえようぜ。 ソートする時とか上のような技法が使えないから。
125 :
119 :2009/02/24(火) 14:41:12
>>120-124 配列なんて考えもしませんでした…思いついたところで、
今度は「配列に入れたいんですが」と泣きついていたように思いますが。
桁数にも気をつけます。
ありがとうございました。
126 :
デフォルトの名無しさん :2009/02/24(火) 14:45:13
129 :
デフォルトの名無しさん :2009/02/24(火) 17:06:30
BigFloatで以下などが正確に計算出来ないのですが、何故なのでしょうか? print Math::BigFloat->new('436611485')->fdiv('2074', 3)->bstr, "\n"; # 211000 と表示されてしまう
つprint Math::BigFloat->new('436611485')->bdiv('2074')->bstr, "\n"; fdivじゃなくてbdivだよな。bdivの二番目の引数は精度だから精度3桁で計算合ってるよ。
jcode(ver 2.7) で誰か知ってたらおしえてください。 utf8の文字列(フラグ付き)で、 'あ' という文字を 650字程度より 多い状態で、sjis に変換すると 途中から、????? と文字化けします。 Jcode.pm ってバイト数の制限があるのでしょうか。 どなたか知っていたら教えてください。
133 :
デフォルトの名無しさん :2009/02/24(火) 23:21:18
Perlの実行エラー時に、エラーの発生したファイル名と行番号が表示されますが、 それに加えて、呼び出し元(さらに呼び出し元の呼び出し元なども)の関数を表示できるような機能ってありますか? &aaa(); sub aaa{ &bbb(); } sub bbb{ &ccc(); } sub ccc{ &ddd(); } #ここでエラー たとえば、上のようなプログラムで、関数 ddd が定義されていないとき、 「Undefined subroutine &main::ddd called at test.pl line XX.」というエラーが出ますが、 このエラーの呼び出し元が bbb でさらにその呼び出し元が aaa であることが エラーメッセージで表示されると助かります。
134 :
デフォルトの名無しさん :2009/02/24(火) 23:52:07
>133 自前でエラー出すなら perldoc carp 参照。 そうじゃなきゃ、perl -d hoge.pl でデバッガ上で実行すれば?
>>134 増田に聞けば?
はてなでもいいけど
とりあえず自分がどこまで理解しているのかくらいは書けよ
環境とか
137 :
デフォルトの名無しさん :2009/02/25(水) 00:13:10
>>136 すんません
プログラミング経験はありません
環境はwindows vistaです
140 :
デフォルトの名無しさん :2009/02/25(水) 00:31:02
>>138 その知識を分けてください
>>139 もしかしたら
>>134 の1,2,の回答だけじゃ俺には無理かもしれないけど
最低限それだけあれば頑張れそうな気がする
要するにエロい思いしたいからです。
えっちなのはいけないと思います。
正直者め
ワラタw何という見当外れな回答 その上、読んでない本すすめてるし ちょっと興味もって調べたら著者はこぼら
4Uは、Gigazineの記事を読んだだけでスルーしてたけど、二次元版も出来てたんだな さっそく登録した
147 :
デフォルトの名無しさん :2009/02/26(木) 06:13:13
Sort::Fields - 区切られたフィールドを持つ行のソート
http://fleur.hio.jp/perldoc/mix/Fields.ja.html フィールドソートをしたいのですが、
use Sort::Fields;
これを書くとエラーになります。インストール先ディレクトリをみると
sort.pmやfields.pmがperl本体と同じディレクトリに置かれています。
本来は perl本体のディレクトリ直下から /sort/の下に存在するべき物でしょうか?
インストール場所が悪いと手直しをお客に依頼する必要があるのですが、
作業は大変でしょうか?
環境はlinux Red Hatなのでsortで頑張った方が良いですか?
sort に詳しくありません。
「エラーになります」 大爆笑
ぞっとした
150 :
デフォルトの名無しさん :2009/02/26(木) 09:21:40
みんなで仲良くね
>>147 確かにuse Sort::Fieldsがアクセスするのは"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)だと思うけど、
なんかファイル名が小文字でperl本体と同居してるとかなってるなら
もはやカオスとしか言いようが無い。
CPAN行ってインストールをやり直した方がマシじゃね。
もちろん、使うコマンドは"perl -MCPAN -e shell"で。
152 :
デフォルトの名無しさん :2009/02/26(木) 10:27:07
sortで出来るかどうかもわからないなら、もはやらくだ本からやり直してもらうしかない。 第三フィールドでソートしたいとかなら配列の配列使えば出来るよ。
>>151 バカに引っ張られて自分もバカになるなよ。
154 :
デフォルトの名無しさん :2009/02/26(木) 13:04:39
正規表現スレとどっちかと思ったんですが、perlで組んでいるので ひとまずこっちに質問させてください。 XMLっぽいタグを解析してるんですが、 <AAA BBB=CCC> にマッチさせるのに /<.*?>/ と書いています。一応これでマッチするのですが、CCCに例えば <AAA BBB="XXX>=YYY"> のような大小比較式がダブルクオートで囲まれて入っている場合があって、 このときは上の書き方だと <AAA BBB="XXX> にマッチしてしまいます。ダブルクオート内を無視して<〜>にマッチさせる にはどう書けば良いのでしょうか? よろしくお願いします。
誰かがゴリゴリ書いてるだろうと想像して傍観。"....\"...."とかは許されるんだっけ?
XML タグ 正規表現 でググったら変態正規表現がけっこうヒットするな。
157 :
154 :2009/02/26(木) 13:34:51
ども
158 :
デフォルトの名無しさん :2009/02/26(木) 17:04:37
誰もゴリゴリ書かなかったな。 /(<[^>"]*?(?:(?:".*?){2}|)>)/
159 :
147 :2009/02/26(木) 22:26:27
>>151 >use Sort::Fields
>"[モジュールの検索パス]/Sort/Fields.pm"(大文字小文字の区別有り)
やっぱりそうでしたか。
エラーにはperlのインストール環境と思われるパスが出力されました。
>なんかファイル名が小文字でperl本体と同居してる
今日も確認しましたが、小文字でperl本体と同居になっていました。
お客の環境を使っているので、指摘や説明をするのが大変なので諦めます。
有り難うございました。
全力でスルーしてたが… sort.pm, fields.pm => pragma Sort::Fields => 外部モジュール 「人間はタマゴから生まれる」レベルの気違い理論を展開してる事に気付け。
よくそれで仕事にしてるよな・・・。
がまんしてスルーして
Windows 2000 / XPでは$SIG{'QUIT'}を設定することで、Windowsのシャットダウン時に 終了処理ができたんですが、Vistaでは終了処理が実行されずに、問答無用で停止し ているようです。Vistaで終了処理を実行するヒント等、ありますでしょうか? ActivePerl 1004で、以下のようなスクリプトでテストしています。 $SIG{INT} = $SIG{HUP} = $SIG{TERM} = $SIG{KILL} = $SIG{QUIT} = sub { # 終了処理 } while (1){ print "a"; sleep 1; }
ループでひとつの配列を使いまわしているのですが、次のループ時も前のループのときの配列のデータが残っていて都合が悪いです 配列を空っぽにする方法はありますか?
166 :
164 :2009/02/27(金) 17:31:23
ありがとうございました うまく空っぽにすることができました
>>166 できれば仕組みも理解してね。応用利くから。
168 :
デフォルトの名無しさん :2009/02/28(土) 23:31:59
複数のテキストファイルから1行目だけを抜き出すスクリプトって かけないでしょうか。
>>168 #!/usr/bin/perl
foreach my $fn (@ARGV){
open my $fp, "<", $fn;
print scalar(<$fp>);
}
ところで、headコマンドつかっちゃダメなの?pure perlでやらなくちゃダメなの?
>>169 まだ冗長だね。
#!/usr/bin/perl
while(<>){
print $_;
close(ARGV);
}
え?
PERLっていくら学んでも知らない書き方が出てくるな・・w
>>175 close(ARGV)ってclose($ARGV)やclose(@ARGV)とはどう違うん?
とりあえず、printの後の$_は省略出来るぜ
>>175 おお、d>printの後の$_
close(ARGV)はコマンドラインで指定されたファイルのうち今開いてるファイルを閉じる。
次の<>では次のファイルを開く。
#!/usr/bin/perl -n print ; close ARGV;
% perl -ne 'print;close ARGV'
perl -pe 'close ARGV' *
perl -pe'close ARGV' *
head -n 1 -q *
184 :
デフォルトの名無しさん :2009/03/01(日) 08:33:59
#!/usr/local/bin/radin; print $musabetsutero;
>>181 先にcloseしちゃうからダメじゃん。
>>186 closeする前に1行分が読み込まれてるから大丈夫。
日本語でおk
openで開くファイル名に使えない文字コードってありますか? Shift-jisでスクリプトを書いていてShift-jisのファイル名でファイルを作成しようとするとエラーは出ないのですがファイルが作成できません 英数字のファイル名だとファイルが作成できます
>>190 システムがShift-JISのファイル名に対応してなかったら当然作れない。
あと""で囲むとメタ文字が発動するかもな。
使用環境はWindows+ActivePer5.10.0lです $file = "テスト"; open FH, ">$file"; →失敗 open FH, '>$file'; →書き込めるが当然変数展開がされない open FH, ">テスト"; →成功 open FH, '>テスト'; →成功 ファイル名を変数を使わずに直接記述するとうまくいきました 変数に格納されている文字列の形式がおかしいのかな…
>>192 調べてないけど、2回""で囲ってるからメタ文字が二度発動してるんだと思われ。
まあ、Shift_JIS文字列はいかなる場合でもメタ文字に気をつけるのが吉。 ダメ文字という言葉は知っておいた方がいい。
時々ファイル名にもIOレイヤみたいな仕組みが欲しくなるね。
ダメ文字の対処法としてメジャーなのが $a = '十\'; だと思うが、探すのもメンテも面倒だしなんかイラッとくるから、 $a = <<'EOF'; 十 EOF chop($a); とするようにしてる。
つーかそんな面倒なことしなくてもqwで何とかなるような気がしてきた。 昔はqwなかったからその時の流儀をそのまま使ってる。
あー久しぶりにこのコード書くなと思ったら、最近はUTF-8でコード書いて出力時変換だな。 連投スマソ
200 :
190 :2009/03/01(日) 19:41:26
open ">$file"; ならファイルが作成できるんですが、 open ">$file.txt"にするとだめでした 事前に$file .= ".txt"; で文字結合してもだめでした
file="テスト"なんだよね? ソースファイルのエンコーディングは何? もしSJISでなければSJISにしてみては?
ってSJISって書いてあった。すまん
203 :
190 :2009/03/01(日) 19:53:45
ソースファイルのエンコーディングはSJISです open ">テスト.txt";はできます 末尾に.txtを文字結合すると書き込めなくなるようです
204 :
190 :2009/03/01(日) 20:00:43
Dumpしてみたら原因がわかりました 改行コードを含んでいたようです スレ汚し失礼しました
Perrrrrrrrrrrrrrrrrrrrrrrrrrrrnrrrrrrl
206 :
デフォルトの名無しさん :2009/03/03(火) 13:58:07
オブジェクト指向の勉強中なんだが… my(%ch, $i); $i = 0; sub new{ my($pkg, $data) = @_; $ch{$i} = $data; my $self = {obj_num => $i ++}; return bless $self, $pkg; } sub DESTROY{ delete $ch{$_->{obj_num}}; } カプセル化ってこんな感じでいいの? 自分で動かした感じは問題なさそうだけど普通のオブジェクトとアクセサしか使えないだけで同じ動作する?
207 :
1/2 :2009/03/03(火) 17:18:15
$iがゴニョゴニョとか$_って何よ?とかあるが…それを差し引いて どのレベルでのカプセル化を言っとるんだ? その例だと、呼出元にて、$obj->{obj_num} = 10 ; とかしてobj_numに 直接代入可能だから、その点ではカプセル化されたとは言えん。 只、編集とか継承とかしない限りにおいて、$ch{$obj->{obj_num}} には アクセス出来ん事だけは確かだ。ゲッタねえし。 インサイドアウトオブジェクトレベルの意味ならば以下に簡単な例。 Hoge2は(恐らく)貴方の目指してた物をインサイドアウトで実現してる。 new時に投入した'hoge'がアクセサを介さず変えられるか?がポイント。 package Hoge; #=== カプセル前 === sub new { bless { data => pop }, shift ; } sub setter { shift->{data} = pop ; return ; } sub getter { shift->{data} } 1; package Hoge2; #=== カプセル後 === use Scalar::Util qw(refaddr) ; my %hash ; sub new { my $obj = bless \do{''}, shift ; $hash{ refaddr $obj } = shift ; $obj ;} sub getter { $hash{ refaddr shift} ; } sub setter { $hash{ refaddr shift} = pop ; return ; } sub DESTROY { delete $hash{ refaddr shift } ; } 1;
208 :
2/2 :2009/03/03(火) 17:18:54
package main ; #=== 実行 === use Data::Dumper ; use Hoge; use Hoge2; my $obj = Hoge->new('hoge') ; print Dumper $obj ; # ほら丸見えだし、 $obj->setter('fuga') ; # 折角セッタでセットしても $obj->{data} = 'bar' ; # カプセル化出来てねえよ。 print $obj->getter . qq{\n} ; # ほらね、変えられちゃった my $obj2 = Hoge2->new('hoge') ; print Dumper $obj2 ; # bless先がdo{ }で弄り様もねえしなあ。 printf "%s\n", $obj2->getter; $obj2->setter('fuga') ; # 専用のセッタを用いて漸く変更可能。 printf "%s\n", $obj2->getter; #Hoge2を以下の様に書いてるサイト(有名所)もあるが、大ポカだから注意! #package Hoge2; #my %hash ; #sub new { my $obj = bless \do{''}, shift ; $hash{ $obj } = shift ; $obj ;} #sub getter { $hash{ shift } ; } #sub setter { $hash{ shift } = pop ; return ; } #sub DESTROY { delete $hash{ shift } ; } #1; 長文失礼
209 :
デフォルトの名無しさん :2009/03/03(火) 19:46:08
>>207 それそれ、それ完璧
Scalar:Util の refaddr がよく分からんけど、Dumper に見てもらった限りだとオブジェクトごとに固有の数字を割り振ってくれる感じなのかな?
とりあえずゲッターとセッター書いたのに、
使わなくても自由に書き換えできるなら書く意味ないじゃんってのが気持ち悪かったから、
それが解消できればよかった
$iゴニョゴニョはrefaddrの代わりにオブジェクトごとに固有の数字を割り当てるために使ってたつもり
$_はミスです
後でScalar::Utilについては色々詳しく調べてみます、丁寧にありがとう
助かりました
ゥーperlーパー
Perlかわいいよ
*Hoge::huga = /&hogehoge('hugahuga'); としたときに引数が設定されたメソッドが生えると思います ですが Hoge::huga('hogehoge'); としてもhogehogeは無視されるようです 設定した引数に加えて更に引数を追加する方法は無いでしょうか
>213 > *Hoge::huga = /&hogehoge('hugahuga'); > としたときに引数が設定されたメソッドが生えると思います 本当? > 設定した引数に加えて更に引数を追加する方法は無いでしょうか *Hoge::huga = sub { hogehoge('hugahuga', @_); };
216 :
デフォルトの名無しさん :2009/03/07(土) 13:32:36
SUPERAntiSpywareでスキャンしていたら、 Adware.Vundo/Variant [ 4 items ] Files C:\PERL\LIB\AUTO\FCNTL\FCNTL.DLL C:\PERL\LIB\AUTO\LIST\UTIL\UTIL.DLL C:\PERL\LIB\AUTO\MIME\BASE64\BASE64.DLL C:\PERL\LIB\AUTO\SOCKET\SOCKET.DLL と検出されていました。 昔、perlをインストールした憶えはあるのですが、入れた経緯は忘れてしまいました。 これって誤検出ですよね? 誰かSUPERAntiSpyware入れてる方で、検出された方いますか?
217 :
デフォルトの名無しさん :2009/03/08(日) 12:29:04
perlとawkの使い分けってどうするんでしょうか? perlが使えればawkでできることは全てできる、それはわかってるんです。 でも、awk使う人ってawk単独で使うわけじゃなくてbash,sed,grepなんかも使えるから 結局出来ることに違いはないですよね。 むしろやる内容によってはawkのほうがスッキリ書けますし。 どういった場合にどちらを使えば良いのか教えて下さい。 ※awkは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。 純粋に有用性の観点のみでお願いします。
自分が楽だと思う方でいいと思うよ
>>218 やっぱり楽なほうを選ぶのが賢明ですか。
Windowsだとperl単独のほうが環境を整えやすいでしょうね。
UNIXやLinuxだったら最初から色々入ってるのが普通ですけど。
Cygwinとか入れてよければどちらでも手間は変わらない気がしますけど、
学校や会社のPCなんかだと、何かインストールするのに許可が必要だったりしますし。
>>217 元awk使いだけど。言語的なメリットはないと思うよ。
Perlはawkの後方互換を目指した言語だからね。awk2perlっつって
awkスクリプトをPerlスクリプトに置換するものがあるのは最近の人は知らなさそう。
ちなみにPerlにはawk互換のためだけに作られた機構がいくつかある。
awkのメリットは必ずプリインストールされているから
root権限持ってない場合でも必ず動くってとこだけど、
今日びデフォルトでPerlが入らないケースは稀だろうから、
このメリットも失われつつある。
長いことCGIプログラマをやってきたけどPerl覚えてからawkを使う機会は
上記のようなケースを除いてゼロになったな。特にここ10年は全く書いてない。
>>220 a2pで変換すると長〜いスクリプトに変換してくれますよね。
あれってどうにかならないでしょうか。
あれ見るとawkのほうが簡単じゃん、って思ってしまうんですよ。
>>221 いやいやa2pは人工知能じゃないし、最適化とかはしないから
長くなるのは仕方ない。
awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
色々制約あるし、書くのもPerlの方が楽だよ。
>>222 >いやいやa2pは人工知能じゃないし、最適化とかはしないから
>長くなるのは仕方ない
私もそれはあるだろうなぁ〜、と思ってましたけど、やっぱりそうですか。
>awkはバイナリ扱えないとか(今は知らんけど)文字コード変換が大変とか
>色々制約あるし、書くのもPerlの方が楽だよ。
シェルスクリプトでバイナリは扱えますよね。
nkfとかconvmvとか使うと文字コード変換できますね。
でも、やっぱりperlのほうが楽なのですか?
もし楽ならperlを学んでみたいなぁ、と思います。
>>223 でもやっぱりPerlが楽ですね。awkより短く速く書けるよ。
何しろLarry Wallがawkの弱点に音を上げて、awkの欠点弱点を 補うべく作られた言語だからね。そもそもは。
awkはできることが少ない。 でも当たり前だよな。 sedはできることが少ない。 grepはできることが少ない。 wcは、mvは・・・ って、言えばその通りだが、 単独で使うわけじゃないから気にするようなことでもない。 一つで何でもやれるようになんていうLarry Wallがバカなだけ。
perlとsedの使い分けってどうするんでしょうか? perlが使えればsedでできることは全てできる、それはわかってるんです。 でも、sed使う人ってsed単独で使うわけじゃなくてbash,awk,grepなんかも使えるから 結局出来ることに違いはないですよね。 むしろやる内容によってはsedのほうがスッキリ書けますし。 どういった場合にどちらを使えば良いのか教えて下さい。 ※sedは古いからダメとか、ダサいとか、そういうのは抜きにして下さい。 純粋に有用性の観点のみでお願いします。
>>227 perlとperl以外で同じことをやってみれば違いがわかるだろう。
大雑把な傾向として、シェルスクリプトのほうが覚えることが少なく、
簡単なことは簡単にかける。
日本刀があれば包丁は要らないわけではないのと同様、
Perlがあってもsedは必要。
sed 's/nae/moe/g' akiba.txt
perl -pe 's/nae/moe/g' < akiba.txt
----------------------------------------------
awk 'BEGIN{FS=","}$2 == $3{print $1}' hoge.csv
perl -F',' -alne 'print $F[1] if $F[2] ne $F[3]' hoge.csv
でも、ある程度以上の規模のスクリプトを組んだり、
C言語に近いようなことをしたいならPerlを選びましょう。
>>228 絶対必要ってわけじゃないだろ。Perlが入ってないマシンいじる
機会があるならともかく。覚えといて損はない程度だと思うが。
日本刀でも料理は出来る。
>>226 インストーラがPerlを要求するご時勢にこんな事言う人がいるとは。
昔はそうやって批判する人もいたけどね。
>>230 日本刀で料理w
そこまでムキになって否定しなくてもいいんでない?
世の中シェルスクリプトはできるけどPerlはできない人なんてゴロゴロいるし、
Perlが出来ても使い捨てスクリプトはシェルスクリプトでやる流儀の人もいる。
どうあがいても完全にシェルスクリプトを駆逐するのは無理だよ。
自動車の優位性をいくら説いても原チャリや自転車はなくならないのと同じでさ。
>>231 不要とは言ってない。Perlでブートするわけにはいかんだろw
ただマの知識として必要かというとPerlで事足りる人もいるだろう。
>>231 お前こそムキになってPerlは必要ないって言ってるじゃん
>>232 エンドユーザの立場から一言。
プログラマの方のお考えはごもっともです。
しかし、「高層建築にカンナやカナヅチなんて要らない」的発想が
今日のエンドユーザー・コンピューティングの惨状を招いたのではありませんか?
たかだかちょっとした自動化、文書検索、集計程度も自分で書けない人だらけにしてしまったのは
「素人は言語なんて使わなくていい」という発想のせいだと思えるのですが。
自分の目的を達成できれば言語なんて何使ったっていいんだよ。 特にスクリプト系言語を使うってことは、大体が小物でしょう? 自分がサッと書けること。これが重要。
>>234 時代のせいだと思います。
例えば自分はWebプログラミング畑だけど、全てのWebアプリケーションを
全部Cで書くことは納期的にほとんど不可能です。awkでは完成すらしない
ものも出てきます。
自分も昔はquick sortくらいは空で書けたけど、Webに足を
突っ込んだ今ではそれすら忘れてしまいました。
>>236 quicksortなんてlibcに任せときゃいいんですよ。気に病むことでもない。
>>236 quick sortもできないの?
ププ
>>237 だね。
>>238 みたいになんでも自分で作るとたまに間違うことがあるし、
馬鹿馬鹿しいプライドで心がねじ曲がってしまう。
エンドユーザの立場から一言。 プログラマの方のお考えはごもっともです。 しかし、sortコマンド打つのが簡易で合理的な発想だと思えるのですが。 たかだかちょっとしたソートも自分で書けない人だらけにしてしまったのは 「素人はソートなんてやらなくていい」という発想のせいだと思えるのですが。
単純なテキストファイルで単純なソートなら sort(1) でもいいんだろうけど
そーっとしといてやれよ。
244 :
デフォルトの名無しさん :2009/03/08(日) 20:19:13
>>230 シェル言語ってのは地味に需要がある。
MSがUNIX/Linuxへの対抗心むき出しでWindows PowerShellなんぞ作ってるくらいだから。
UNIX/Linuxを普段使ってる人ってのはシェルを対話的に利用するのに慣れている。
だから、さて何か組もうかって時もシェル言語が第一選択になる。
それでダメな時に別の言語を選ぶ。
UNIXの世界ではシェルでできることはシェルで、というのが昔から暗黙の了解なので
いきなりPerlやPythonでやろうとするのは、コンピュータの世界にWindowsから入った人くらいだろう。
それは例えて言うなら、自家用車を持ってるのにリムジンをレンタルしてドライブするようなもんだ。
ワンライナーはsed,awk,sortの方が楽なことが 多いな。例えばいくらオプションでsplitを暗黙 にさせても[]書かされる時点で、$1,$2でいい awkにはかなわない。 もちろんガッツり書くならスクリプト言語。
>>244 1行目は同意だが、あとはいつの時代の話だよと思うな。
そりゃ配布物配ろうとか思ったらまずshを選択するだろうが、
例えばWebアプリケーション作る時にshを第一選択肢に上げるか?
hello world以外は特にsh使う場面って思いつかないんだが。
>>246 普通にファイル処理やテキスト処理には使うし、
処理を自動化するのにも使うし、
定期的にどっかのサイトにアクセスして、特定の情報だけを記録するとか、
その程度の用途には当たり前に使うと思うが。
本格的なプログラミングか、ワープロとか表計算みたいに出来合いのアプリで済ませるか、
二者択一だったらパソコンライフなんて送れねーよ。
それとも、プログラミングってのはアプリとwebの開発のためだけにあんのか?
小規模ならまずシェルで出来ないか考えるよな
>>247 例外は認めないのかよw
普遍的な事のように書くから変な誤解受けるんだろ。
んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
「UNIXの世界ではふつー」とかじゃ理由にならんだろ。
例えば毎秒起動とかだったらさすがに少々面倒でもshを第一選択とするのが吉だと思うが。
>>249 >んで、それらの用途にシェル使わない人もいると思うが何かデメリットでもあるのか?
同じことができるならそれでいい。
ただし、より面倒臭くなることはあるだろう。
何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
トリッキーなことしなくても普通にシェルでできるなら、それが一番簡単なんじゃね? コマンド並べれば動くから 難しいナンチャラ理論やらウンタラ指向やらも考えなくて済む プログラマでないエンドユーザや管理者にも使えるのは大きなメリットだと思うな
>>250 要するに余計面倒な時だけsh使うでもいいわけね。
>>244 はとてもそういう論調には見えないけど。
そういう俺はよくshスクリプト書くがな。
>>250 > 何も難しくないワンライナーでできることに他の物使うとか、そういうのは単なるアホだろ。
Perlプログラミングに没頭してる合間とかだったら、AWKの方が少々短くても
Perlのワンライナーを選択することはあるな。
短く書けるっつったってせいぜい数バイトだろ
>>228 。頭切り替える方が面倒だわ。
>>254 Perlに没頭してるあなたにとってはPerlでやるほうが簡単なんでしょうね
別にそれはそれでいいのでは?
だからといって、それはあなた個人の特殊事情で簡単に感じるだけなのだから、
シェルでやるほうが手間が少ない人にまで強要すべきことではないでしょう
>>255 いつ強要したんだよww俺はこうだって言っただけじゃん。
逆に
>>244 なんかshで出来ることにPerl使う奴は外道みたいな書き方じゃん。
この人論点が分かってないからトンチンカンな事を言うのかね。 「何事もshが第一選択にするのが普通、じゃなきゃ外道」 みたいな主張がおかしいと言ってるだけなんだが。
>>257 話がかみ合わない理由って案外簡単なんじゃない?
普通にUNIX系OS使ってる人にとってshって標準的な道具だから、
シェルで作業するってのは鉛筆で文字を書くのと同じくらい簡単で当たり前なんだよ。
だから、どうしても他の物を試す前にshで、っていう発想になるだけでしょ。
いったい、シェルの話をしているのかシェルスクリプトの話をしているのか はっきりさせてくれ。
つーかPerlの話しようぜ
この現代に、WEBアプリ以外に何があるの? 世界じゅうどこを見て回っても、WEBアプリしか無いんだから awk も sh もいらん。perl しか選択の道は無いだろ。
最近の家庭電化製品はマイコン内臓でずいぶん賢くなった。 しゃべる電子レンジのファームウエアを awk や sh で書けると思ってんの?
宗教の勧誘みたいw
shのほうが慣れてるからsh使うという人が、昔は多かった。 イマドキのPerlerには、Perlのワンライナーのほうが慣れてる人が多いんだろうね。
>>265 perlの人は
ls
と打たずに
opendir(DIR,'.');
@file = sort readdir(DIR);
foreach(@file){
$time = localtime ((stat($_))[9]);
print "$time"."\t"."$_\n";
}
closedir(DIR);
とやるわけですね?
簡単なことをいちいち
perl ふがほげ
perl うんたらかんたら
ってやるのは不自然なんですけど
lsで済むことならlsじゃねえの普通 Windowsユーザならlsなんぞ打たずにファイラとかエクスプローラだろうしな でも、スクリプトの話じゃなかったのか
ファイルの行数調べるのも「Perlでどうやろうか」とか考えちゃうのね cat hoge | wc -l とせずに
そこは wc -l <hoge catとか使わないな
>>267 シェルとシェルスクリプトに何の違いがあんの?
コマンドが単発か複数かの違いだけじゃん?
ファイルに記述するか その場でうちこんで終わりかの違いじゃね
シェル言語の有用性認めないなら シェル言語使わなけりゃいいじゃん そこまで言うならPerlだけで暮らせ
bashのコマンド使わないでperlだけで暮らしたらさぞ便利だろうねw
Windowsユーザの9割はbashなんて使ってないけどね
>>274 この話ではWinユーザは無関係と思われ
UNIXの操作ではシェルが母国語みたいなもんなのに
簡単な用事でも外国語使いたがる変人だけが対象
それって、いもしないキャラを作り上げてない?
awk '/UNIX/ || /Linux/' hoge perl -ne 'print if /UNIX/ || /Linux/' hoge シェルを普通に使いこなしてる人なら最初の方が明らかに簡単だろ? 打鍵数だけじゃなく、構文的にも。 「何でもPerl」ってやりかたが変だってのは、そういうこと。 shは古い、awkやgrepは低機能だと文句言いながら、より難しくやってる人たちを変だと言ってるだけさ。 で、シェルとシェルスクリプトをやたらに区別したがってる奴がいるが、本質は同じだろ。 シェル使って作業して、コマンドを複数使って仕事しようとすると、シェルスクリプトと言われるだけで。
>>277 その例なら
grep '(UNIX|LINUX)' hoge
かなあ
awkなんて使わないよ
my @textfiles = grep /txt$/, qx|ls -l|; でもえぇやん。。。
>>278 環境によって動かないとおもいまつ
GNU grep 2.5.3
では少なくとも×
grep -e UNIX -e Linux hoge
これなら動きます
ただし、awk使うのと難しさに大差ありません
例を挙げれば挙げるほど Perlより簡単な方法が出てくる件
ここまでの流れを見た率直な感想 Bシェルとかgrepとかawkとかsedなんて前時代の遺物だと思ってたけど・・・ 今でも十分に使えんじゃん
結局どうやるのがもっとも効率的かを的確に判断できるように あらゆるスキルを磨いとけってこった。
専用のコマンドの方が使い勝手がいいのは当然だよね それでも sed や awk を使うのでは1行で済まない場合は (シェルスクリプト組むような場合は)、Perl の方がシンプルになってくる
ワンライナーの話をしてるのに なんでshのコマンドラインとワンライナーを比べるんだか・・・。 ネジ緩んでるの?後者は一応スクリプトだぞ。 コマンドはスクリプトで書くのが大変or不可能なことをするために 存在するんだからwcとか例に持ってくるのは愚の骨頂。
288 :
デフォルトの名無しさん :2009/03/09(月) 23:24:23
>>286 簡単なことだけならシェルスクリプトの方がシンプルだと思うが
>>287 それって自分の首絞めてないか?
コマンド単体で強力ならそれを利用したスクリプトも強力なわけで
>>287 ワンライナーってコマンドラインの延長じゃねーの?
質的な違いなんてねーよ
質問です! Perlとsedとawkとbashはどれがいちばんつおいのですか?
perlで話題が無いからって、そこまで引っ張ることないだろ(w
293 :
292 :2009/03/10(火) 00:08:22
ちなみに、 sed 's/ /+/g' | sed 's/ /+/g' の部分は sed 's/[ ]/+g' でも同じですが、 全角スペースと半角スペースを列記すると見た目にわかりにくくなるので、 問題文ではあえて別々に処理しとります。
sedやw3mがシェルスクリプトの一部だというなら perlも仲間に入れてあげなよ
perlだけは絶対入れない。絶対ニダ
sedとかawkでやると楽な事とperlでやるのが楽な事の境界線を 判断するのは難しいよな
297 :
デフォルトの名無しさん :2009/03/10(火) 01:53:00
まーあれだ、シェルがどーこーとかほざいてる奴らが言ってるのはどうせbashだろ。 糞linuxごときの標準シェルなんぞどーでもえーわ
どーでもえーことに熱くなれるっていいネ!!
Linux板のシェルスクリプトスレはここほど釣れなかった からといってここに八つ当たりしなくてもねえ。
300 :
デフォルトの名無しさん :2009/03/10(火) 22:07:54
RSSから指定期間の祝日を取得するスクリプトを書いてる。
ある程度の日付の範囲をもって複数の祝日を取得するときは問題なく動作するんだけど、ある特定の祝日を一つに絞って実行すると上手く動作しない。
printをあちこちかませて調べてるんだけどどうも$keyが上手く取れてない様子。通常はURLが入るんだけどNGの場合はXMLのタグ名がなぜか入ってきてNGになってしまう。
上手く動かすには何が足らないんだろ?
use LWP::UserAgent;
use XML::Simple;
&Holiday ("2009-02-01", "2009-04-01"); # OK
&Holiday ("2009-03-20", "2009-03-21"); # NG
sub Holiday {
my $feed_base = '
http://www.google.com/calendar/feeds/[email protected] /public/full ';
my $sdate = $_[0]; # この日を含む開始日
my $edate = $_[1]; # この日を含まない終了日
my $query = "start-min=${sdate}&start-max=${edate}";
my $feed_url = $feed_base . '?' . $query;
my $ua = LWP::UserAgent->new;
my $res = $ua->get( $feed_url );
if( $res->is_success ){
my $xml_parser = XML::Simple->new();
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
my $holidays_data = $xml_parser->XMLin( $res->content );
foreach my $key ( keys %{ $holidays_data->{ entry } } ){
#print "$key\n";
my $holiday_day = $holidays_data->{ 'entry' }{ "$key" }{ 'gd:when' }{ startTime };
print $holiday_day , "\n";
}
}else{
die $res->status_line;
}
}
質問です。 以下のコードを実行するとhoge_fooという出力を期待していたのですがfooとしか表示されません。 おそらく_が何か演算子としての働きをしているんだと思いますが、 一体これはどういう意味を持つ演算子なんでしょうか?教えてください。 Perlのバージョン:This is perl, v5.8.8 built for MSWin32-x86-multi-thread $hoge="hoge"; $foo="foo"; print "$hoge_$foo\n"; # 出力:foo print "$hoge\_$foo\n"; # 出力:hoge_foo
302 :
301 :2009/03/10(火) 23:10:45
$hoge="hoge"; $foo="foo"; $hoge_="まさか・・"; print "$hoge_$foo\n"; print "$hoge\_$foo\n"; どうみても誤解釈です。ほんとうにありがとうございました。
>>301 3行目で$home_ を展開してる。
サンプルコードの最初に
$hoge_ = "HOGE";
て入れてみると、3行目の出力が「HOGEfoo」になる。
305 :
301 :2009/03/10(火) 23:17:29
>>303 ,304
レスどうもありがとうございました。
くだすれスンマセン ($self->{year},$self->{month},$self->{day}) = ( gmtime time + $time_difference * 3600 )[5,4,3] この [5,4,3]っていうのはどういうことなのですか? こういう書き方の呼称がわからないのでググれなくて
slice
list
>>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 のように記述しました。
シグナル打ち込め
>>311 1A は関係ないと思う。
1A は有っても無くても終了するはずだよ。
でないと UNIX などは大変なことになる。
1A は Windows だけの習慣。UNIX のテキストファイルには普通 1A は無いからね。
原因は何か他にあるんじゃないの?
315 :
311 :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送っても無限ループが続く幹事
http://maxxdelphisite.free.fr/doscmd.htm 1AってそもそもEOFじゃないんのかな?
>>315 先ず先に<>はSTDINとARGV両方を示す事を理解しろ。
プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、
ARGVがあれば、暗黙のうちに<>は<ARGV>として挙動する。
従って
====
while(<>){ print "ARGV: $_" }
while( ($_=<>) !~/^$/ ){ print "STDIN: $_"}
====
をhoge.plとして保存して以下の様に実行した場合、
perl hoge.pl < hoge.pl
は、ARGVの中身を全てプリントした後にSTDINの処理をする
(STDIN処理は、何も入力せずにreturnで終了)。
外部ファイルにシグナルを入れて流し込むのが仮に可能だと
しても、それをどのタイミングで使うかは書き手に任される訳だから、
素直に終了フラグを立てるのが普通では無いの?
なんか変なのが沸いた >>プログラム引数に何か渡されたら、< であろうが、ARGVとして扱われ、 へー
ファイルハンドルがって意味じゃねえの? それでも言葉不足だけどw perl hoge.pl < hoge.pl は、 while(<ARGV>){ print ; } でも while(<STDIN>){ print ; } 動くよ。
最終行「でも動くよ。」
知ったかぶり者を論うのやめろ。荒れるから。
あーすまん。
言葉も変だし、5.8までと5.10で挙動が違うわ、
>>316 。
>>316 の例とかは全面撤回(5.10では動く)
CPANやperldoc.jpでのPODトランスレータは何を使っていますか? Pod::HTML, Pod::HtmlEasy, Pod::Xhtml, Pod::Tree::HTML, Pod::Simple::HTML, Pod::Simple::XHTML...と、色々試していますが、 L<Foo>やら=item * <Bar::Baz>やらマルチバイト文字やら、 一部に対応しているものがありますが、全部に対応したものはないように 感じました。
>>315 >ファイルをつっこむと、1Aで終了せずに、ファイル全部読み込んだら終了します
>プログラムで(というか以下のライブラリ)で読むと、1A送っても無限ループが続く幹事
結局どうなの?終了するの?無限ループするの?どっちなの?
結局、何がしたいの?どういう動作を期待してるの?
>>311 が使ってるOSでは、0x1a を送っても 0x1a にすぎず EOF にはならない。
どうしてもそれを望むなら OS を CP/M に換えるといい
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 です。
修飾子はひとつしかつけられません。(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 ありがとうございます。
参考になりました。
>328 perldoc -f rand
$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 :2009/03/17(火) 00:01:27
*だと\dが0の場合も含まれるんでした。 *を+にしたらうまくいきました。
333 :
デフォルトの名無しさん :2009/03/17(火) 00:42:36
関数のreturn値って成功の場合1で、失敗の場合0が普通なのでしょうか? 標準関数はこのパターンが多いような気がします。 シェルスクリプトの場合だとたいてい逆ですよね?
成功の場合に真を、失敗の場合に偽を返す って考えれば Perlの関数の多くも コマンドの終了コードも同じ
↑ アフォ?
>>333 そだよ
だからsystem関数の使い方には注意
Perl6では、system関数の戻り値もPerlの流儀になる
引数がAから始まって、後が全部数字かどうかチェックするのって if($ARGV[0] =~ /^A+[0-9]$/) でいいのかな
>>337 おしいかも。
/^A[0-9]+$/
でもその前にchomp入れた方がよいかも♪
おおお、なんと優しい ありがとーw
/\AA[0-9]+\z/
xms
\d+はダメなの?
343 :
311 :2009/03/18(水) 10:41:45
>>316 時間が空いてすいません。
^Z(1A)はシグナルなのでそもそもファイルからは渡せないもんなんでしょうか?(単にデータとして受け取られる)
問題は、通常のプログラムから標準入力を渡した場合なのですが、これもファイルから渡したのと同様になる
ものなのでしょうか?
つまり、何かのデータをフラグと見立てて、それを検出したら終了、というような作業が必要なものか、と。
344 :
311 :2009/03/18(水) 10:44:13
>>323 期待する動作は、プログラムで1Aを送ると終了して欲しい、ということです。
ターミナルやコマンドプロンプトなどで、^Zを送ったときと同じような動作を期待しています。
>>344 1Aが入ってきたら終わるように書けばいいだけ。
Perl業界におけるPerl 6の立ち位置がよく分からないんですが、 雰囲気的にはどんな感じなんでしょうか?
348 :
デフォルトの名無しさん :2009/03/18(水) 16:24:04
>>347 Web業界に限って言えば様子見ムード。
349 :
デフォルトの名無しさん :2009/03/18(水) 16:28:27
Parrot1.0が出ましたが、これ使うと何が出来るようになるんですか? 他言語との連携が楽になるだけ?
>>344 CP/Mからの呪縛。
DOS(Windows)とUNIXそれぞれの、改行コード、終端コード、
テキストモード、バイナリモードについて、ググるなりして理解するのが先。
>>344 だから 0x1a が EOF と思ってる時点で間違ってる
まずここを理解しろよ
CTRL-Z 押下は EOF を送るための特殊な操作であって、
それが歴史的な理由で CTRL-Z (0x1a)になってるだけであって
0x1a を送れば EOF になるわけじゃない。
>>344 if (ナントカ eq "\x1a") { exit }
こういう発想は思いつかんの?
354 :
311 :2009/03/19(木) 07:08:15
355 :
デフォルトの名無しさん :2009/03/20(金) 02:20:00
@a = ('1','2','3','4','5','6')
@b = ('2','3')
という配列があった時に、@aから@bを削除して
@c = ('1','4','5','6')
を作りたいのです。ループ回すしか無いのでしょうか?
大崎氏(
http://www.din.or.jp/~ohzaki/perl.htm#ArrayUnique )の、
# 配列 @array から重複した要素を取り除く
{
my %count;
@array = grep(!$count{$_}++, @array);
}
みたいな華麗な手法があるなら知りたいです。
@count{@b} = @b; @array = grep(!defined($count{$_}), @a);
@c = grep{!((join ',', @b) =~ /(?:^|[^0-9])$_(?:[^0-9]|$)/)} @a; すごく…力わざです…
>>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
モダン(笑)
教えてください。恥ずかしいんですが... 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 :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時とかに、その日の日付に変えること、です。 よろしくお願いします。
04月01日だと、$yesterdayに04月00日が生成される伊予柑♪
366 :
362 :2009/03/21(土) 22:00:24
しくしく。。。いじわるですね。。。というか遊ばれていますね。。。 javascriptでもいけるんでしょうか。 それから、おっしゃるとおり04月00日になりそうですね。 perlで行くとしたら、そこは勉強して、何とか回避策を考えようと思います。 WSH, perl, あと何だろう、いくつか候補を考えたのですが、perlは まったくといっていい初心者です。sedも。正規表現は理解はしている つもりですが使ったことがあまりないです。 どんな手段でもよいのですが、何となくperlがよさそうだと思って、 この板に来てしまいました。。。 あらためて、どんな手段(言語、手段、ツール)がいいかを含めて 教えてください。<(_ _)>
>>362 1) SSIで最終更新日時を書くのが楽
2) Perlでやるなら、File::Slurpで読んでDateTimeで計算するのが楽
かね。
そもそも、
A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいいのか、
B) sample.htmlの最終更新日時をただ表示すればよいのか(上記1.でよい)、
そのあたりの要件がはっきりしません。
更新日時についても、営業日でなくて暦日で良いのか、とか。
ちょっとまってね、これから書くから。
明らかにSSIが楽。
# 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 :2009/03/21(土) 22:19:54
すみません... そもそも、から行きますと、 A) sample.htmlにベタ書きしてある最終更新日時の翌日を書けばいい です。 営業日ではなく暦日でOKです。 土日祝日もインフラが停止しなければ365日毎朝更新したいです。 というのは、会社のデータベースからあるまとまった形のデータを Excel形式で落としてきて、それにパスワードをかけて、所定のフォルダに アップロードし、それを地方拠点にイントラウェブで提供します。 最終更新日を更新したいというのは、そのアップロードの案内ページなんです。 データを落としてきて、パスワードをかけて、所定のフォルダにアップロード するところまでは、マクロとMS-DOSのバッチファイルとタスクスケジューラと、 恥ずかしいうにょうにょなやり方でどうにか実現しました。 が、そうしたところ、案内のhtmlファイルも自動で日付を変えられるだろうと、 偉い人から言われまして...
371 :
369 :2009/03/21(土) 22:22:40
Template-Toolkit(Template)とかHTML::Templateを使う手もあるね。
ただ、
>>370 の書き方を見ると、
土日でもアップロードされたデータが更新されているなら、
touch sample.html
してアップロード案内ページだけ最終更新日時を変えれば、
A)はB)と同じになるよね。
そうすればSSIでもやれるんじゃないかな?
372 :
362 :2009/03/21(土) 22:22:46
>>369 さんありがとうございます。
さっそく明日試してみます。
SSIについては鯖管さんに相談してみます。
そういうとこ、小回りのきかない、相談窓口も親身になってくれない
会社です。。。
373 :
369 :2009/03/21(土) 22:26:43
うい、367=369=371れす。
鯖管は別なのか……。
まあ、SSIを検討してみてよ。日曜なのに大変だね。
もしPerlでどうしてもやりたいなら、
>>369 を使う場合、
DateTimeとかFile::Slurpは標準では入っていないから、
CPANから導入出来るかも聞いておいて。
あー、LINE:も要らないし(逐行処理の名残)、そもそもよく考えたら my $file = read_file($file_name, scalar_ref => 1); して $file =~ s{略}{略}xmseg; すりゃよかったか。 しつこくてごめん。
さらにしつこいが、scalar_refするなら$$fileを置換に突っ込むんだった罠。
チラ裏。
>>322 が気になった今日この頃。比較表とかないかな?
376 :
362 :2009/03/21(土) 22:40:12
重ね重ね、ありがとうございます。 日付を表記するのに、yyyy-mm-ddは、そのhtmlファイルでその更新日の 部分だけにしてあります。よくわからないなりに、ここだけは見つかるように、 ここだけの形にしておかなければいけないだろうと思いました。 CPANからの導入についても明日確認してみます。 正規表現の本もperlの本も、いつか勉強しなければと積ん読になっています。 (恥ずかしながら) ところで私、普段はぜんぜん違う板の住人です。切羽詰まってここに来ました。 こんなに速くレスをいただけるとは思っていませんでした。 本当にありがとうございます。 perl、勉強しますね。今はお金とか在庫とかの勘定ばかりやっていますが、 小学生の頃はベーマガとかで勉強したクチです。 おやすみなさい。
PBPとtokuhiromの受け売りだが、 13月32日に引っかけないためにはRegexp::Commonを使おう
>>369 これはちょっとマズいんじゃないの?
コメントでは YYYY-MM-DD と書いてるけど、実際の処理が
\d{4}-\d{2}-\d{2] では、全然年月日じゃない文字列にもマッチしかねない。
もちろん年月日かどうか完璧な判定はできないけど、
>>362 にあるようにマッチさせる文字列が昨日の日時でいいなら
そういう風に限定すべき
某所で再び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");}'
>>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();
# つづく
# つづき
#
>>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 > テンプレート使用 > ベタ置換
の順が楽なんだろうけど。
なにを持って善しと成すのかわからんけど、俺も作ってみた perl -e 'for(1..15){my$r;$_%3or$r="Fizz";$_%5or$r.="Buzz";$r or$r=$_;print"$r\n"}' 添削してくだちぃ
個人的には、勉強するためならいきなり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の方が直感的とかか。
あ、うそ、ごめん。
>>381 の二つめの
>>362 式は、3月32日になるw
ゆえに素直にDateTime使おう。
385 :
379 :2009/03/22(日) 03:36:54
>>382-383 ありがとうございます!
>>382 さんのコードの方がPerlっぽくていいですね。
ぼくのはJavaとかでも使えるテクしか使ってないや。
最近Perlはワンライナーしか書かなくなってさっぱり鈍ってしまった。
1日前ってそんなに難しいのかしら? time - 86400 でよさそうな。。。
うるう秒をちゃんと扱わないシステムならな
388 :
デフォルトの名無しさん :2009/03/22(日) 11:15:10
>>387 UNIX時はどれも閏秒は算定してないと思うが。
システムによって現在のUNIX時が食い違ったら困るだろ。
超頭悪い会話が繰り広げられている
391 :
362 :2009/03/23(月) 05:38:24
おはようございます。
ご報告が遅くなりました。
>>381 さんに教えていただいたスクリプトを昨日、会社で使って
(ファイル名など一部変えました)、まだ1日(1回)だけですがテストとしては
うまく動いたようです。
今朝出社してうまく書き換わっているかどうか。これから出勤です。
うまくいったら引き続き使います。
ではみなさま、また縁がありましたらどうぞよろしくお願いします。
392 :
デフォルトの名無しさん :2009/03/23(月) 07:49:00
>>389 仕様上はどちらでもいいことになっているが、先発製品との互換上、
どのシステムもうるう秒は算定していない。
うるう秒はいつ発生するか算定できないからどっかから情報取得する必要があるし、
tarファイルを移転する時とか、NTP使う時とか困るだろ。
よほど金融系のシステムとかでなければ、NTPクライアントを随時走らせておけば大きな支障はない。
いちおうtzfile(5)とか見ればわかるけどうるう秒扱えるようにはなって いるんだよね。 実用上はうるう秒のたびに時計を進めたり戻したりして1日の秒数は 一定としてしまうのが楽な場合がほとんどだから設定した例は自分の 周りでは見たことない。 天文とかは過去のある時刻との間の時間みたいのをきっちり出せない と困りそうだけど。
うるう秒を勘案するシステムは存在しないってこと?
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 です。 よろしくお願いします。
エスパーじゃないんだからさ、それじゃ答えようがないよ。
とりあえず
>>4 あとやったこと書け
ここで聞くのが適切かどうか心配ですが、違ったら誘導願います。 昨日から体の具合が悪いんですが、何かの病気でしょうか? どなたか詳しい人、アドバイスをお願いします。 どんな薬を飲めばいいですか?医者に診せたほうがいいですすかね・・・ 何科の医者に行けばいいですか? よろしくお願いします。
エスパーじゃないんだからさ、それじゃ答えようがないよ。
@test 赤、A、あ、 #$test{0} 黄、A、い、 #1 青、A、あ、 #2 赤、B、あ、 #3 赤、C、い、 #4 青、A、あ、 #5 例えばこういう配列があったとして 各項目ごとに一番多い文字列(赤 A あ)をそれぞれ取り出したいんですがどのようにすればいいんでしょうか?
「こういう配列」
>>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が実行されないです。 環境が原因と思うのですが、 初心者で何が原因かわからないです。
>>400 二次元配列のようでもあるし、コメント見るとハッシュにしてるし…
せめてPerlの書式で書いてくれ
405 :
400 :2009/03/26(木) 18:21:17
>>402 レスありがとうございます。
ただちょっと仕様を変更したので、普通の配列の中から一番多い要素を取り出すものに変えようと思ったのですが、
初心者なため
>>402 のコードでわからない部分があり、改良することができません。
どなたか配列の中で一番多い要素を取り出すサブルーチンを書いていただけないでしょうか。
http://www.seshop.com/detail.asp?pid=6160 『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。
この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。
なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。
どなたか回答よろしくお願いいたします。
perl タダなんだから、自分でダウンロードして確かめてみればいいじゃん。
409 :
405 :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"; }
っ「List::Utilのmax」
>>409 初心者をあまりいじめるのも可哀想なのでとりあえず書くけど、正直なところもっとちゃんと自分で調べてほしい。
>>402 のヒントがあれば本を読むなりウェブでリファレンスを引くなりして調べようがあるとおもう。
人のコードを盲目的にコピペするのではなくて、ちゃんと一行一行やってることを理解するようにしないと上達しないよ。
シンタックスシュガーはあえて封じた。
use strict;
use List::Util qw(max first);
my @data=('foo','bar','poo','foo');
my %cache;
foreach my $entity(@data) {
$cache{$entity}=$cache{$entity}+1;
}
my $maxval=max(values(%cache));
my $res=first(sub{$cache{$_}==$maxval},keys(%cache));
print $res."\n";
>>409 #一番多い要素を書き出す
sub extract {
foreach (@_) {
$hash{$_} ++;
if($max < $hash{$_}){ $max = $hash{$_}; } #追加
}
while (($key, $value) = each(%hash)) {
if($value == $max){ print $key,"\n"; } #追加
}
}
sub extract{ my %hash; my $res = $_[0] ; for ( @_ ){ next if ++ $hash{$_} < $hash{$res} ; $res = $_ ; } return $res ; }
414 :
デフォルトの名無しさん :2009/03/30(月) 04:58:54
リストの略記法って (1..10) しかないんでしょうか (1がずっと続くよ) みたいな書き方が知りたいです
(1) x 10
DB_Fileってundefは保存できないんですか ""とundefどうやって区別したらいいんでしょうか
分類と項目が並んでいるリストがあったとして 各項目はいくつかの分類のどれかに属していて、 分類ごとにまとめて処理をしたいので、 項目のリストを分類別に作りたい for (keys %class) { for (@items{$_}) { みたいに配列の連想配列が使えるといいのだけれど 何かスマートな解決法はありますか
PerlでWebからのレスポンスを標準出力すると文字化けが発生してしまいます 色々とエンコードも試したのですが解決しませんでした 文字コード判別もなぜか失敗しました ↓がDumpした結果ですが、文字コードは何なのか教えてくれませんか SV = PV(0x1cffd24) at 0x1bbe7e4 REFCNT = 1 FLAGS = (POK,pPOK) PV = 0x1832f24 "G\"\22w\221U\207L\241\300\361l\16\326ao\352d\351\30\265m\303Ox \203\24\213\2262\273\271\274\5\273S\307\323\367b\372\277\340\17\254#\257\206D\24 3\243\243\265\342{4_\254j@\213\266gV\3417\236\237\265\331U\370\266\300\2477\227\ 357\324D!\362&\32\204\233h\325\36l\301S\370\210n\0366\242\373\205lX\203\317\225\ 375\fm\324\322\213\347\324\223\270\360\203'e\253UB\221\"\360l\340\305\211\357Q|u \377\1\24yz\316\302\3\0\0"\0 CUR = 143 LEN = 676
>>416 defined
>>418 ハッシュのキーに分類の名前
ハッシュの要素に項目の配列リファレンスとか入れたらどうだろう
$item{分類} = [qw/項目 項目 項目/];
みたいに
$str =~ s/<hoge>//; という正規表現を使って複数回文字を削除しようとしています while($str =~ /<hoge>/){ $str =~ s/<hoge>//; } とすると無駄な処理が入るので、ループの判別のところだけで処理したいんですが、 そういう書き方は可能でしょうか while($str =~ s/<hoge>//); と書くとエラーを吐かれました do{''} while($str =~ s/<hoge>//); や while($str =~ s/<hoge>//){} だとうまくいきますが、なんか気持ち悪いです
1 while $str =~ s/<hoge>//g; かなぁ
>>421 1 while $str =~ s/<hoge>//; とか
$str =~ s/<hoge>//g; とか
>>420 $class と $itemのセットを記憶するのに、
push(@{$items{$class}}, $item);
でいけました
@$items{$class} ではないという部分で引っかかりました
念のため[]で初期化したけど、外しても問題なく動くあたりが流石
>>423 上では無駄な1が気持ち悪いです
下では $str = '<h<hoge>oge>' のときに削除できません…
>>425 リャマ本に似たようなコード載ってるから、じゃ気持ち悪くならない理由にならない?
上の方は定数式(1)は最適化で取り除かれるんだとさ
>>426 見た目が気持ち悪いのと処理的に気持ち悪いのは違うんですよ
「全部取り除く」って処理に全く関係ない1なんかがあるのは生理的に気持ち悪いです
{}で終わるのも一文なのに;がないから処理が終わってない感じがいやらしいです
リャマ本に上が載ってるなら、他にやり方はないんですかね…
もしかしたら正規表現で再帰的に検索してくれるオプションがあるかもと思ってたんですが…
>>427 再帰的にやるなら
my $hoge;
$hoge = qr/<(??{$hoge})?h(??{$hoge})?o(??{$hoge})?g(??{$hoge})?e(??{$hoge})?>/;
$str =~ s/$hoge//g;
とか? もっと綺麗に書けそうだが。
5.10以降ならキャプチャバッファ(see perl5100delta)使って一行でしかも効率良く書けるはず。
>>428 トン
キャプチャバッファについてググってみます
>>427 my $str = '<h<hoge>oge>' ;
L:{ $str =~ s/<hoge>//g and redo L; }
1 while COND の方が断然気持ち良いけどさ。
「 気 持 ち 悪 い 」 ・・・か。それじゃC言語の if (a == 1) { hoge(); } なんか、気持ち悪さ1000%だな。 なぜ「等しい」の判定に () が必要なのか。 なぜ hoge を呼び出すのに { } が必要なのか。 なぜ hoge のうしろにも () がくっついてるのか。 アメリカ人は苗字と名前を逆に言う。 住所も番地から逆に言う。 日付も逆に言う。 実に「気持ち悪い」。 だが、そういうもんだ。いちいち疑問にしてたらキリが無い。 順応しろよ、順応。
自分で拡張すればいい
アッー
activeperl 5.8.8を使っています -d でフォルダかどうか判断する時に、 5Cで終わっているフォルダ名を正しく扱えません どうやったら回避できますか
5Cでエスケープしてみては?
ちょっと意味が判らないのですが、 -d "$file\\" という書き方でも結果は同様です
必ず失敗するかというとそうでもないようで、 opendir(dir, '.'); for $file (readdir(dir)) { if (-d "$file") {print "$file is directory.\n"} else {print "$file is file.\n"} } これを aaa aaa2― aaa― こんな状況で実行すると . is directory. .. is directory. aaa is directory. aaa― is directory. aaa2― is file. test.pl is file. _ is file. こうなります
で、何が問題なの?
aaa2―はフォルダなのに aaa2― is file. となってしまうことが問題
-dの返り血をちゃんと調べたのか?
-dの戻り値なんて1か0しか無いのでは
>>431 至極真っ当
理に叶ってる
()の中はbooleanが必要とされてる
{}の中は場合によって処理されるか否かなんだからブロックで囲まれてて当然
だけどwhile(〜){}は関数的に使われてるのにセミコロンがない
これが問題
気持ち悪い原因
つまりwhile(〜);と書ければ万事解決なんだよ!!!!
順応と思考停止と信者脳って紙一重だなぁ、って
>>431 見ると思うね。
>>443 while(~){}は
while(~){
();
}
の省略記法だよ?B::Deparseで確認してみ?
勝手に省略して、省略してしまった部分について気持悪がられても…
「();が気持悪い!」って言われたら、
「そりゃごもっとも、俺もそう思う。」と言わざるを得ないけどさ。
-f -d -eについても調べたところ、-eにすら通っていない aaa: -f, -d1, -e1 aaa―: -f, -d1, -e1 aaa2―: -f, -d, -e ディレクトリを再帰的に辿って全部のファイルに対して云々、みたいな 処理をさせると、フォルダの末尾が5Cかもしれない問題は必ず発生すると思うんだけど、 どうやって回避してるの?
省略記法てーのは正しくないな。 perlではこう解釈されるってのが正しいのか。
>>446 あなたの環境が何か解らないからスルーしてたけど、
スクリプトのエンコーディングとディレクトリのは合ってるの?
winなら
>>4 とかそこらへんの問題じゃないの?
私の環境だと問題が出ないから力にはなれません。
>>4 を入れても改善しないようです
aaa: -f, -d1, -e1
aaa?\: -f, -d, -e
aaa?Q?\: -f, -d, -e
むしろ悪化しています
環境はwindowsXPです
なんで""つけるんだよ
>>4 に答えが書いてあるじゃん。なぜそうしない?
>>4 は、表示で化けるとか、検索とか正規表現がうまく行かないとかの、
日本語の文字列としての取り扱いを完璧にする方法だけど、
ファイルシステム絡みは何も改善しないように見える
唯一、ファイル名をcp932でencodeするように注意はあるけど、
それは必要な処理であって、今回のケースを解決しない
cygwinと同じ問題じゃないの? ActivePerlがMultiByte系のW32API使ってないんじゃ
activeperlではどうやっても無理、というはっきりした結論があれば、 他の言語も含めた別の解決法を探すんだけど、 ぐぐってもそのへんを断言した文章は見つからない 逆に、このスレでは口を揃えて出来る出来ると言っている サンプルは1バイトも出てこないけど
Perlでは出来ないし、ここにいるやつらは知ったかぶりの初心者ばかりだから、 PerlはあきらめてPythonでやるといいよ!!
>日本語の「ファイル名」のファイルは開けない
というのはそのサイトの人がUTF-8のままで処理しようとしているからでは?
別のサイト
ttp://www.aritia.org/hizumi/perl/perlwin.html では内部コードはUTF-8でもファイル操作時はShift_JISに
戻せみたいなことが書いてあるが
open(IN,encode('cp932',"<表.txt")) or die "open(表.txt):$!\n";
少なくともまったくできないってことはないだろ
単に説明が面倒だから、全部できないことにしとけ、という手抜きだろ
PHPにはPEAR::Text_Passwordっていう便利なモジュールがあって、 <?php require_once "Text/Password.php"; $a=new Text_Password; $b=$a->create(8, 'unpronounceable', 'alphanumeric'); echo $b ; ?> このコードを書くだけで、ランダムなパスワードを 自動で生成してくれる。 同じことをperlでやったら65行は書かないといけない。
その65行をライブラリとして使えば変わらん
そのText/Password.phpの中身は何行だよ
PerlにはString::Randomっていう便利なモジュールがあって、 use String::Random; print $a=String::Random->new->randregex('[A-Za-z0-9]{8}'); このコードを書くだけで、ランダムなパスワードを 自動で生成してくれる。 同じことをphpでやったら6行は書かないといけない。
>>449 >
>>4 を入れても改善しないようです
>>4 には
> # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、
> # この例のように cp932 でエンコードする必要があります。
と書いてあるが、なぜそんなことが必要なのか、よく考えてごらんよ。
すると、OS からもらった文字列は逆にcp932 からutf8 にデコード
しなきゃならない、という事にも気づけるだろう。
>>463 問題を勘違いしてる
0x5Cがエスケープ文字だからトラブってるのではなくて
Windowsのディレクトリセパレータなのが問題
>>464 > Windowsのディレクトリセパレータなのが問題
へ〜、そうなんだ。
>>4 に書いてあるとおり、教科書的な書き方をすれば、こうなる。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
opendir dir, encode('cp932','.');
@files = readdir dir;
for (@files) { $_ = decode('cp932', $_) }
for $file (@files) {
if (-d encode('cp932',$file)) {print "$file is directory.\n"}
else {print "$file is file.\n"}
}
ポイント
・OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、utf8 → cp932 に変換すること。
・逆に OS からもらう文字列(readdirなど)は cp932 → utf8 に変換すること。
下記のように1〜5万の数をランダムに表示していき、かつ一度表示した数は表示しないというコードをゴリゴリ書きました。 しかしこれは何故か3万回を超えた辺りから重複による何十回ものスキップ処理が入ってしまいます。 3万回数字を表示した時点でスキップが起こる確率は3/5=60%なので何十回ものスキップが頻発するというのはおかしいです。 (例えば10回のスキップ処理が連続で起こる確率は0.6^10でたった0.6%であるにも関わらず、こういう規模の事象が頻発する。3桁レベルのスキップも起こったりする。) Perlのランダム関数がおかしいとは考えにくいのですが、何故こういう事が起こってしまうんでしょうか?教えてください。 $starttime = (times())[0]; $sessionstarttime = (times())[0]; $count=1; $skipcount=0; @triedNumbers=(); print " count skip num total this\n"; while(1){ $number = int(rand(50000))+1; $new = 1; foreach(@triedNumbers) { if($number == $_) { $skipcount++; $new = 0; last; } } if($new==0){next;} push(@triedNumbers,$number); $endtime = (times())[0]; $totaltime = $endtime-$starttime; $sessiontime=$endtime-$sessionstarttime; printf "%6d %4d %6d %3ds %3ds\n", $count, $skipcount,$number,$totaltime,$sessiontime; $sessionstarttime = (times())[0]; $skipcount=0; $count++; }
環境は以下です。 This is perl, v5.8.8 built for MSWin32-x86-multi-thread WindowsXP SP3
Win32::APIガリガリ叩いてやればできたはずなんだけど、英語の記事だったから読んでないしどこでみたかも覚えてない
>>468 This is perl, v5.8.9 built for i386-freebsd-64int
だと以下のようになるが。
32264 3 48037 119s 0s
32265 4 43101 119s 0s
32266 2 38633 119s 0s
32267 2 31075 119s 0s
32268 0 8513 119s 0s
32269 1 49402 119s 0s
32270 1 27972 119s 0s
32271 0 32400 119s 0s
32272 3 28045 119s 0s
32273 0 35972 119s 0s
32274 0 22672 119s 0s
32275 1 44140 119s 0s
32276 2 32443 119s 0s
32277 2 41433 119s 0s
32278 2 33357 119s 0s
32279 0 6772 119s 0s
32280 2 26341 119s 0s
472 :
468 :2009/04/02(木) 19:03:40
当初の目的は下のコードでさくっとできるようになりました。
>>468 のスキップ多発については原因が分かりません。
@numbers=();
for my $i (1..50000){
push(@numbers,$i);
}
for my $i (0..$#numbers){
$rand = int(rand(@numbers));
$tmp = $numbers[$i];
$numbers[$i] = $numbers[$rand];
$numbers[$rand]=$tmp;
}
for my $i (0..$#numbers){
print "$i:$numbers[$i]\n";
}
>>468 所詮線型合同法だろ? 偏りあるしそんなもんよ。
List::Utils::shuffle(1..50000) じゃダメなのか。
>>472 それは偏りが出るまずいアルゴリズム。
っ「Fisher-Yates shuffle」
>>468-469 その環境での乱数の有効ビット数が15だから。
rand(1)が返す数の種類が32768通りしか存在しないので、3万時点のskip確率は90%以上。
乱数のビット数は use Config して $Config{randbits} で確認できる。
>>467 でも結果は同じ
aaa is directory.
aaa― is directory.
aaa―2 is directory.
aaa2― is file.
テスト結果で書くと
aaa: -f, -d1, -e1
aaa―: -f, -d1, -e1
aaa―2: -f, -d1, -e1
aaa2―: -f, -d, -e
こんなん
aaa―2みたいに途中に5cを含む場合はエスケープとか無しに普通に扱える
aaa―が何で通るのかが謎だけど、
aaa2―みたいなのは、aaa2―/hoge みたいにフォルダ内のファイルを
直接指定してもエラーになる
結論としては、そんなフォルダ名を使うな、ということになる
ファイル名もNGなんだけど、大抵は拡張子があるので、問題になることがない
477 :
468 :2009/04/02(木) 20:08:30
>>471 ,473,474
乱数の有効ビット数というのが原因のようですね。
手持ちのWindowsだと15でしたがLinuxでは48でした。
Fisher-Yates法では偏りが出る様なので
>>473 の方法でやってみようとおもいます。
レスありがとうございました。
478 :
468 :2009/04/02(木) 20:10:03
>>476 aaa― が通るのは aaa があるから。
aaa2―/hogeの失敗は、何らかの単純ミスの可能性が高い。
>>446 >どうやって回避してるの?
@dirs=split /[\r\n]+/,`dir /s/b/aD`; とか?
再帰? 再帰って何だ?
ファイルテスト演算子内から呼ばれるwin32_stat()内で終端の\を加工してるのが直接の原因。
なんでも FindFirstFile() and stat() are buggy with a trailing backslash, なので、
so change it to a forward slash (〜5.8.7.815)とか、
remove additional trailing slashes (5.8.8.816〜)という対策をしてるとの事。
-dを使う限りstatを避けることは出来ないが、There's More Than One Way To Do Itという
決まり文句を持ち出すまでもなく回避するには数多くの方法がある。
1.くどいけど @dirs=split /[\r\n]+/,`dir /b/aD`;
2.Win32::FileにGetAttributesがあるのでソレを使う
3.Win32API::FileやWin32::APIで好き勝手にやりたい放題?
4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
X. グロブ(<*>)を使うと、statに通らないファイル名は入ってこない
正しい対応.バグレポートを出し、余裕があればパッチも投稿する。
例えば、WideChar化してから終端加工して再度MultiByteに戻すとか。
楽な対応.そんなフォルダ名は使わない、見つけたら即リネーム
>>467 の
> if (-d encode('cp932',$file)) {print "$file is directory.\n"}
がおかしいんじゃないの?
エンコードするから、sjis の2バイト目の0x5Cが復活する。
if (-d $file) {print "$file is directory.\n"}
でうまくいくと思うが。
>>479 詳しくd
-d 以外にテストの方法があったとしても、
次にそこに対してopendirすると失敗するので、結局目的は果たせない
例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
5.10.0 とか 5.8.9.825 では直っているかしら
>>462 お前は何か勘違いしているようだな、、、
PHPでは
「発音できないパスワードを生成する」
とか、そういうことができるんだぞ
ここって教えてくれる人がたくさんいていいな・・・ VBAスレなんて、、、
→
VBAを使う人というのは、VBAを使っても 嘔吐感、嫌悪感が生じない人なんだろ? なら、数が限られてくるわな。
>>481 最初に479に間違いがあったので訂正。
誤 4.面倒だから -e "${fn}/." で代用 (chdir/opendirにも使える/-fはopenで代用)
正 4.面倒だから -e "${fn}/./" で代用 (chdir/opendirにも使える. -fはopenで代用)
末尾への/.追加だけだと5.8.8以降ではchdirには使えなかった。
chdirの確認を常用してる5.8.7.813でしかやってなかったという単純ミス
>次にそこに対してopendirすると失敗するので、結局目的は果たせない
>例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
そんなに難しいことをやっているの? ツリー表示程度なら
sub tree {
# my(@dir,$ent) = map { chomp;$_ } `dir "$_[0]" /b/aD`; # ,`dir "$_[0]" /b/aDH`;
#↓は↑の手抜き変形でほぼ同内容
my(@dir,$ent) = eval { opendir my $h,"$_[0]/.";grep {-d "$_[0]/$_/." and !/^\.+$/} readdir $h };
while(defined($ent = shift @dir)) {
print "$_[1]+${ent}\n";
&tree("$_[0]/${ent}",@dir ? $_[1].'| ' : $_[1].' ');
}
}
&tree('.');
みたいにopendir無しでも書ける気がするし、opendirも成功しそうな気がするんだが。
opendirに関しては最悪DLL違いでの挙動差もありえなくは無いけどね。
opendirはできなくても、中にあるファイルをopenは出来る だからうまいことすれば大抵のソフトは回避できると思うけど、 そんな僅かなリスクの為に常時opendir禁止というのは辛すぎる
>>486 >例えば、ディレクトリ構造のツリーを表示するとかそんなプログラム
長いよ。長すぎるよ。そんなん書いたら保守性が悪いだろ。
いいかい?
system("tree");
ほら、たった一行でできただろ。
treeコマンドのあるOSだけじゃないし
5C が問題になるOSには、たいてい tree コマンドはあるよ。
Perlを使う人というのは、Perlを使っても 嘔吐感、嫌悪感が生じない人なんだろ? なら、数が限られてくるわな。
優越感と陶酔感が生じますよ
>>432 田植えならしかるべきとこでやっていただきたい
あーゲシュタルト崩壊してきた
Perl使ってるひとはいつもこんな主張 "他の言語は使えないから、Perlが一番いい" Perlの良いことを一言も言えない
ポテンシャルを語るのに飽きたひと いわゆるYAGNI みたいな?
良い点なんて他との比較でしか論じれないからな とりあえずperlが使えれば、好奇心以外に他の言語に乗り換える動機が発生しにくいので、 perlしか使わない人がおおい
Perlの世界って閉じて荘
そもそもどんな人なら「Perl使ってるひと」を名乗ってもいいのだろうか。 もしかすると>495に答えを授けた自称「Perl使ってるひと」も >497の「perlしか使わない人」も「Perl使ってるひと」ではないかもしれない。
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){ $str =~ /hoge\((.*?)\)/; $hoge=$1; $str =~ /foo\((.*?)\)/; $foo=$1; } これをもっと綺麗に書くことってできませんか?できたら教えてください。 hogeとfooの位置が前後する事があるのでこういう書き方にしました。 ・やりたいこと 文中のhoge(あいうえお)とfoo(かきくけこ)から $hoge="あいうえお"; $foo="かきくけこ";という変数を生成したい。
中のブロックだけでいいのでは(1行目要らないのでは)
>>500 例えばこんな感じ?
@pair = $str =~ /((?:hoge\([^)]*)|(?:huga\([^)]*))/g;
foreach my $pair(@pairs){
my($name, $value) = $split '\(', $pair;
$name = 'hoge' ? $hoge = $value
: $name = 'huga' ? $huga = $value
: 1
;
}
×$name =
○$name eq
確かに
>>501 の通り
ハッシュを使うのが手っ取り早いと思う。$foo, $hoge を残したいなら my $foo, $hoge; my %refhash = ( foo => \$foo, hoge => \$hoge ); ...行ごとのループとか if (/(hoge|foo)\((.*?)\).*(hoge|foo)\((.*?)\)/) { $r1 = $refhash{$1}; $$r1 = $2; $r2 = $refhash{$3}; $$r2 = $4; ... $foo, $hogeを使った処理 }
ハッシュの例 my %hash = $str =~ /(hoge|foo)\((.*?)\)/g ; my $hoge = $hash{hoge} ; my $foo = $hash{foo} ; >1行目要らないのでは の例 my ($hoge) = $str =~ /hoge\((.*?)\)/ ; my ($foo )= $str =~ /foo\((.*?)\)/ ;
変態の例 my $hoge ; my $foo ; 1 while $str =~ /(hoge|foo)\((.*?)\)(?{ ($1 eq 'hoge' ? $hoge : $foo )= $2 })/g ;
Singletonパターンってこれでいい? package Foo; my $singleton; sub new { my $class = shift; return $singleton if $singleton; return $singleton = bless {}, ref $class || $class; } 1;
508 :
500 :2009/04/06(月) 23:52:45
# 最初はこうだったんですが
if(($str =~ /hoge\((.*?)\).*foo\((.*?)\)/)){
$hoge=$1;
$foo=$2;
}
# 位置関係が前後した場合に対応できない事が分かったので書き直して以下に
if(($str =~ /hoge\((.*?)\)/) && ($str =~ /foo\((.*?)\)/)){
$str =~ /hoge\((.*?)\)/;
$hoge=$1;
$str =~ /foo\((.*?)\)/;
$foo=$1;
}
これを前者と比べるとゴテゴテしてしまったなというところでした。
>1行目のif文
万が一hogeが含まれfooが含まれていないという場合
if文が無いとhogeの値がfooの値にも入ってしまい、それはマズいので入れてます。
ワンライナーな方のコードも読んでみました。$hoge = ($1 eq 'hoge' ? true : false)みたいな用法は知っていましたが、
この方法を右辺にも使えるんですね。自分には新しいです。(?{})というのは知りませんでした。
見た感じ正規表現の中で処理を実行する際に使うんでしょうが調べてみてもうまくヒットさせられませんでした。
もうちょっと知りたいのでキーワードとかあれば教えてください。
$hoge = ($str =~ 正規表現)での代入方法。これ知りませんでした。
あと右辺がリストで左辺もリストだと配列、右辺がリストで左辺がハッシュだと
キー、値、キー、値というハッシュになるというのも便利ですね。
この用法自体は知っていましたが、実際こういう使い方ができるんだなあと。
>>505 さんのコードがわかりやすかったのでこれ使っていこうと思います。
>>501 ,502,503,504,505,506さんレスどうもありがとうございました。色々勉強になりました。
実験的とはいいつつ5.6.0のころからずっとある機能だから勉強しといてもいいだろ とはいえそう使うことのあるものとも思えんが
>>507 >ref $class
これ真になる事無いだろ。
インスタンスメソッドとしても機能させたいんだったら
もう一工夫必要じゃね?
あー、そっか。インスタンスからnew呼んだら return $singleton if $singleton; で抜けるんだな クラスからでもインスタンスからでも同じもの返して欲しいからそこだけ削除して sub new { my $class = shift; return $singleton if $singleton; return $singleton = bless {}, $class; } こうするだけでいいのか?
ああ、一工夫もへったくれもなかったねw スマン。
>>506 ど変態の例
sub hoge { $hoge = shift }
sub foo { $foo = shift }
$str =~ s/((?:hoge|foo)\(.*?\))/$1/eeg;
Perlのコードを配布する際ってCPANからインストールして 使用したモジュールってどのように付属すれば良いのでしょうか? それともReadmeなどにCPANからこのモジュールをインストールしてくださいと 書いておくのでしょうか
それとも
>>515 CPAN モジュールやその他のよく知られたライブラリ類は、特に事情がなければユーザに揃えてもらった方がよいでしょう。
ユーザ環境のモジュール配布元へのアクセスが制限されていたり、配布スクリプトがモジュールの特定のバージョンに依存するなどの事情がある場合は、その旨明記した上で各モジュールのライセンスが許せば同梱することもできます。
インストールスクリプト中で依存モジュールを CPAN からインストールさせることもできますが、大抵の単体配布では単に依存関係(必要なモジュールのリスト)を(できれば POD に)明記しておくだけで充分です。
なるほど、やはりユーザーにもある程度の技術力は求められるのですね。 ありがとう御座いました
$hogeの中の「\/:*?"<>|」を全て半角スペースに置き換えるのはどうすればいい?
>>519 $hoge =~ s,\Q\/:*?"<>|\E, ,sg;
質問です。 Class::Accessor::Fastを使用して ハッシュのアクセサって作れるのでしょうか? いろいろ試してみたのですがうまく行きませんでした… ↓イメージ的にはこんな感じ package My::Class; use base qw(Class::Accessor::Fast); __PACKAGE__->mk_accessors( qw(hoge) ); package main; my %hash = ( "a" => 'aaaaa', "b" => 'bbbbb', ); my $obj = My::Class->new(); #$obj->hoge(\$hash);
s/ で / が使えない時の第一選択って何にしてる?
{}
>>524 PATTERN か REPLACEMENT がある程度長ければ、/ の有無に関わらず {} 。
短ければ PATTERN にも REPLACEMENT にも現れない棒状の文字… | か ! か # 。
>>522 $obj->hoge(\%hash);
> 「Pelは大規模Webサービスを支え,今も進化している。しかしそのことが広く知られていない」 確かに「Pel」は知られていないなw 冗談はともかく、日曜プログラマの自分からするとめちゃめちゃ知られてるような気がするんだ けど。「Perl技術者の雇用を増やしたい」とは言ってるけど、それでも何がしたいのかよくわから ない。まだ安定した地位を得ていないRubyとかならまだわかる。 まったくの妄想だけど、Ruby on Railsに仕事を奪われがちになってるとか? でもそれなら そっちも覚えればいいだけだしなあ。
{}なんて使えるんだ うちだと、 $str =~ s{}a{}A{}; みたいにしてもエラーになる
>>530 本気なのかネタなのか判断に苦しむなそれw
$str =~ s{a{b{; 普通に考えたらこんな感じ? 変な感じ… 家帰ったら試してみよう
>>532 それはNG
$str =~ s}a}b};
こっちはok
一般的な正解 $str =~ s{a}{A};
1と9を4つとを四則演算で計算結果が10になるものを出力したいのですが、 @a1 = (1,9); @a2 = (1,9); @a3 = (1,9); @a4 = (1,9); foreach $a1 (@a1){ foreach $a2 (@a2){ foreach $a3 (@a3){ foreach $a4 (@a4){ if ($a1 + $a2 + $a3 + $a4 == 10){ print $a1.'+'.$a2.'+'.$a3.'+'.$a4."\n"; } if ($a1 + $a2 + $a3 - $a4 == 10){ print $a1.'+'.$a2.'+'.$a3.'-'.$a4."\n"; (中略) if ($a1 / $a2 / $a3 * $a4 == 10){ print $a1.'/'.$a2.'/'.$a3.'*'.$a4."\n"; } if ($a1 / $a2 / $a3 / $a4 == 10){ print $a1.'/'.$a2.'/'.$a3.'/'.$a4."\n"; }}}}} こんな感じで記述する手間がとても大変です こういう場合に少ない記述で全組み合わせを試すいい方法はありますか?
@a1 = (1,9); @a2 = (1,9); @a3 = (1,9); @a4 = (1,9); @op = ('+', '-', '*', '/'); foreach $a1 (@a1){ foreach $op1 (@op){ foreach $a2 (@a2){ foreach $op2 (@op){ # 中略 $fomulae = $a1.$op1.$a2.$op2.$a3.$op3.$a4; print "$fomulae \n" if (eval $fomulae == 10); }}}} こんな感じかな。
>>537 演算子を変数に入れておkだと初めて知りました!
ありがとうございました
なぜ複数形
誰か助けて下しア 環境がPERL5.8.* Jcode 2.6.5 PERL5.6.1 Jcode2.0から移したら 今までCGIで文字化けしなかったものが化けました。 $str = '莞ゲマン'; $hoge = Jcode->new($str, euc)->h2z->euc; print "$hoge"; 今までは 潟zゲマン と表示されていたのに、 ?ホゲマン となります。 原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。 これを 潟zゲマン となるように 解決したいのですが、どなたかご教授ください。
すみません 他で聴くためこちらの回答は不要です 失礼しました
541は540とは違います。 引き続き回答お願いします。
コードをeucで書いて、sjisで読んでeucに変換して処理して、 ということをよくやるけど、ローマ数字が元に戻せなくなるんだよな
euc-jp-msでも?
そんなencodeは知らんと言われる
ppm install Encode::EUCJPMS みたいなことをしても、見つからない
5.8.xならactivestateのリポジトリにあるみたいだけど。 ppm install Encode-EUCJPMS
それもやったんだけどな 無いってよ
普通に入ったぞ。見りゃわかるだろうが手元はwindowsな I:\> ppm i Encode-EUCJPMS ==================== Install 'Encode-EUCJPMS' version 0.07 in ActivePerl 5.8.8.817. ==================== Files found in blib\arch: installing files in blib\lib into architecture depende nt library tree Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.dll Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.exp Installing C:\Perl\site\lib\auto\Encode\EUCJPMS\EUCJPMS.lib Installing C:\Perl\site\lib\Encode\EUCJPMS.pm Successfully installed Encode-EUCJPMS version 0.07 in ActivePerl 5.8.8.817.
D:\>ppm i Encode-EUCJPMS ppm i failed: Can't find any package that provide Encode-EUCJPMS なーにが違うんだろう D:\>perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread (with 18 registered patches, see perl -V for more detail)
I:\> perl -v
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
Binary build 817 [257965] provided by ActiveState
http://www.ActiveState.com Built Mar 20 2006 17:54:25
ppm repは?もしかしてactivestateのリポジトリ無効にしてるとか無いよな?
D:\>ppm rep レトトトトツトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトソ ウ id ウ pkgs ウ name ウ テトトトトナトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトエ ウ 1 ウ 9817 ウ ActiveState Package Repository ウ タトトトトチトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトル (1 enabled repository) 大丈夫なのか、この画面は
んー、ppmのバージョン違うのか?その表示は覚えが無いぞ… > ppm version PPM 3.4 > ppm rep Repositories: [1] tcool [2] ActiveState Package Repository
D:\>ppm version
ppm 4.01
Copyright (C) 2007 ActiveState Software Inc. All rights reserved.
ここがはっきり違う
Binary build 822 [280952] provided by ActiveState
http://www.ActiveState.com Built Jul 31 2007 19:34:48
ここ?
D:\>ppm rep add trouchelle
http://trouchelle.com/ppm/ Downloading trouchelle packlist...done
Updating trouchelle database...done
Repo 2 added.
D:\>ppm i Encode-EUCJPMS
Downloading Encode-EUCJPMS-0.07...done
Unpacking Encode-EUCJPMS-0.07...done
Generating HTML for Encode-EUCJPMS-0.07...done
Updating files in site area...done
7 files installed
流石は名探偵
でもローマ数字は駄目だった
と思ったら、shiftjisじゃなくてcp932にしたら上手く行った
サンプル #written in EUC use Encode; use Encode::EUCJPMS; $str = "つI"; print e2s($str); sub e2s() { my $str = shift; return encode('cp932', decode('euc-jp-ms', $str)); }
formula 単数形 formulae 複数形 ってことでしょ。
Perlでは一行の長い行を複数行に分けて書くにはどのようにすれば 良いのでしょうか? じつは非常大きい数値をもじれつとして扱いたいのですが数値が12行ほど有りますので 行ごとに" "で囲み . で連結という方法以外に何か効率的な方法が無いかと思い よろしくおねがいします。
そりゃ perl 以外でも難しいな。
$str = <<"EOF"; 123 456 789 EOF $str =~ s/\n//g; print $str;
$ perl my @numbers = qw/ 123456789012 123456789012 123456789012 123456789012 /; my $joined_number = join "", @numbers; print "$joined_number\n"; __END__ ^D 123456789012123456789012123456789012123456789012
566 :
500 :2009/04/10(金) 22:32:16
>>565 わざわざ変数2個用意せんでも
my $num = join '', qw(
123456789012
123456789012
123456789012
123456789012
);
print $num . "\n";
でいいと思うんだけど
変数ゼロがいいんだけどな 元々は、定数としてコード中に書いてあるもんなんだし
その定数はどうやって使うんだ?変数に代入しないで、ただ飾っとくだけなの?
式の中に組み込まれる
可読性のためにも式の中で使うときには何か名前を付けた方がいいと思うが。これなら満足? use constant LENGTHY_NUMERAL => 1234567890 . 1234567890; print LENGTHY_NUMERAL . " has " . length(LENGTHY_NUMERAL) . " digits\n";
>>568 print join '', qw(
123456789012
123456789012
123456789012
123456789012
);
こういうことですか?
分かりません><
>>573 * 2 したきゃ勝手に *2 すりゃいいだろ!
print join('', qw(
123456789012
123456789012
123456789012
123456789012
) ) * 2;
少しは頭使えよ
そういや、Perlではいつの間にか $a = "aaa" "bbb"; # => 昔だと"aaabbb"になる の構文はエラーになったんだな。
Windows XP を使っています 今までjperlを使ってきたのですが いい加減perlの新しいものに変えようかと思っています 乗り換えるにはソースをUTF-8に変える(日本語の正規表現使っています) データファイルはsjisのままでいい と思っているのですが、それでいいでしょうか?
577 :
576 :2009/04/11(土) 21:28:27
すいません。出力の漢字コードは何になるんでしょうか?
どんな文字コードで出力するかはPerlで選べる。 コマンドプロンプトに出力される文字コードはsjisじゃ無いと化ける。
Perlで選べるというのはソースコード内で指定できるって事ね。 データはSJISで書きたいソースはUTF8で書いてという事だけど、普通に出来るよ。というか俺もそういうコード書いた事がある。 データ読み込み時にSJISからUTF8へ変換し、正規表現を使い色々な処理をし、 データ書き込み時にUTF8からSJISへ変換する。
utfで書かなくても、eucでもなんとかなる そもそも、うちのエディタがutfに対応しとらん あんまりがちがちの体制にすると、perlの手軽さがどんどん無くなっていく
581 :
576 :2009/04/11(土) 22:34:01
すいません。ソースもsjisでいいんでしょうか? それだと一番楽なんですが
sjisでも良いけど正規表現がうまく動かずエラー吐く時がある。
5cが入るのはなんとかエスケープできても、 正規表現の中の'ー'とかの5bがどうしようもない
584 :
576 :2009/04/12(日) 12:38:51
昨日jperlから新しいperlへの乗り換えを質問した者です
ttp://www.aritia.org/hizumi/perl/perlwin.html ここを見てスクリプトの先頭をこうゆう風に変えました
use utf8;
binmode(STDIN,":encoding(sjis)");
binmode(STDOUT,":encoding(sjis)");
binmode(STDERR,":encoding(sjis)");
$dbx_flag=1;
if($dbx_flag){
open(DBX,">:encoding(sjis)", "Make_Table.dbx");
}
こういうワーニングがいっぱい出ます
"\x{0082}" does not map to shiftjis at Make_Table.pl line 98, <> line 519.
対応すると思われるコードは次みたいな部分です
print DBX $_;
ディバッグの出力を見てみるとこういう分岐が全然正常に働いてないみたいです
if(/^[\s]*朝食[\s]*$/){
$eat_sw=$eat_asa;
next line;
}
どういう風に書き換えたらいいのでしょうか?
必要でしたらソースとデータをuploadします
>584 スクリプトの文字コード UTF-8 で書いてる?
586 :
576 :2009/04/12(日) 13:34:01
>>585 サクラエディタで変換しました
一応エディタもUTF-8と認識しています
587 :
576 :2009/04/12(日) 14:21:43
すいません
ttp://hardsoft.at.webry.info/200604/article_2.html との折衷案を採って
use utf8;
use encoding "shiftjis";
use open ":encoding(shiftjis)";
use open ":std";
map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/;
$dbx_flag=1;
if($dbx_flag){
open(DBX,">Make_Table.dbx");
}
としたら正常に働きました
589 :
576 :2009/04/12(日) 23:30:13
>>588 その意見に賛成します
新しいperlがあればjperlは使う必要が無いという意見をネットでよく見ましたが
jperlの方がよほど移植性の高いコードが書ける気がします
>>589 あ、違う違う
スクリプトへのリンクのすぐ上ね
そのサイト、テンプレの内容もほとんど同じだし、問題点や対処法も自分がやってきたのとほぼ重なっているし
運用でカバーするのに限界を感じているのも一緒だし
10年以上Perlを使ってきたけど、そろそろいいかなあ、と
shiftjis じゃなくて cp932 だろ。 このへんの違いを理解していない時点でダメ。
eucでは不可能でutf-8でないと書けないコードってある?
「にょろ」 とか
☟ ☟ ☜ ☜ ☜ ☜ ☜ ☜ ☜ ☜ ☟ ☟ ☟ ☜ ☜ ☜ ☜ ☜ ☜ ☝ ☟ ☟ ☟ ☟ ☜ ☜ ☜ ☜ ☝ ☝ ☟ ☟ ☟ ☟ ☟ ☜ ☜ ☝ ☝ ☝ ☟ ☟ ☟ ☟ ☞ ☝ ☝ ☝ ☝ ☝ ☟ ☟ ☟ ☞ ☞ ☞ ☝ ☝ ☝ ☝ ☟ ☟ ☞ ☞ ☞ ☞ ☞ ☝ ☝ ☝ ☟ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝ ☝ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☞ ☝ とか
dat見たら判るけど、そういうのutf-8として取り扱ってないがな
597 :
576 :2009/04/13(月) 08:08:16
>>591 最初のHPにそれも書いてありましたけど
機種依存文字とか使っていないのでsjisにしました
>>597 一気に移行しようとすると、大変だよ。
「手間」ということでは大したことはないが、ActivePerl の
知識がなければ、どこをどのように変えればいいのか解らないから。
オレは数年前に移行を済ませたが、その時はjperl と ActivePerl
を両方動くようにして、ActivePerlに少しづつ移行していった。
599 :
576 :2009/04/13(月) 09:30:41
>>598 ActivePerl 5.10 と ActivePerl 5.6 依存のjperl が共存できるのですか?試していませんでした
まあ、毎日使っていたスクリプトはawkの代用品を用意しての移行だったわけですが
perl でしか動かないようなスクリプトも有りますが、
perl 初心者でそういうものはごく少数なので
600 :
デフォルトの名無しさん :2009/04/13(月) 12:39:44
601 :
デフォルトの名無しさん :2009/04/13(月) 13:42:30
>>600 CGIをやろうとしているのならば、ActivePerlを選ぶとよい。
>>602 確かに ActivePerl のリンク *も* あるが、
他にも Strawberry Perl など10種類以上あるだろ。
正規表現の先読みを調べていたのですが質問があります。以下のコード、どちらもスカになるだろうと思っていたんですが― "hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n"; "hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n"; 実行してみると、確かに前者はスカなんですが後者は何故かHITしてしまいました。これ何故なんでしょう。 自分なりに考えてみたのですが、この先読み機能というものは先読み以外の部分で何かヒットした場合にのみ動くという仕様で 前者はhがヒットしたから先読みが始まった反面、後者は何もヒットしなかったので先読みが始まらず結果ヒットしてしまったという感じなんでしょうか? しかし前者についてhがヒットしたのでその"前"に記述されてある(?!hoge)に判断が戻るというのはなんだか変な感じがします。 (後者の何もヒットしなかったから真というのも何か変な感じがします) その辺りどうなっているのでしょう。上の推理は当っているんでしょうか。どなたか教えてください。
"hoge" =~ m/hage/ ? print"HIT!\n": print "スカ\n"; "hoge" =~ m// ? print"HIT!\n": print "スカ\n"; 基本に返ってみよう
"" =~ m// ? print"HIT!\n": print "スカ\n"; この方がわかりやすいかな
前者:後続のhogeを伴わない空文字列 + h を満たすもの 後者:後続のhogeを伴わない空文字列 かな $hoge = "hoge"; $hoge =~ s/(?!hoge)/@/g; print $hoge; #=> h@o@g@e@
>>605 "hoge" =~ m/(?!hoge)/ がマッチするのは "hoge" =~ m/o/ がマッチするのと全く同じ理由。
>>606-607 m//等の空パターンは特別扱いされる事を思い出して。
同じだといったり特別だといったり 書き込む前に矛盾に気づいてくれ
>>605 hとoの間の空文字列にマッチしているだけのこと。
print $`, ':', $&, ':', $', "\n";
とかしてみりゃわかる。
612 :
605 :2009/04/15(水) 23:01:47
みなさんレスありがとうございます。hogeの中の空文字列を@を使って表すと@h@o@g@e@となるようです。
そこで
>>605 を実行すると1つ目の@に逹っした時点で先読みが行われhogeが検出されてしまい、
結果スカが表示されるのではないでしょうか?
デバッグの方法を伝授してやろう。 "hoge" =~ m/(?!hoge)h/ ? print "HIT!\n": print "スカ\n"; "hoge" =~ m/(?!hoge)/ ? print"HIT!\n": print "スカ\n"; $x = "hoge"; $x =~ s/(?!hoge)h/-/; print "'$x'\n"; $y = "hoge"; $y =~ s/(?!hoge)/-/; print "'$y'\n"; - に置換された部分にマッチしているんだょ。 気取って3項演算子でスマートに書いたりしないで 初心者っぽく書けばハマらずに済んだんだよ。
use re 'debug'
3項演算子ってどんな時に便利なの
616 :
605 :2009/04/16(木) 02:28:52
理解しました。 ありがとうございました。
>615 んー、人によるとは思うけど…… 例えば、 Func ( $foo ? 1 : 2 , $bar ? 1 : 2 ) ; みたいに、引数として使う時とか。 あとは my $hoge ; if ( $foo ) { $hoge = "TRUE"; } else { $hoge = "FALSE"; } みたいな時にだいぶ短くなるんじゃないかな。
昔でかつC言語の話だけど if文より参考演算子+関数呼び出しのほうが CPUが先読みし易くて早くなるって言ってた人がいたな コンパイラの種類やら最適化でも変わってきそうだけど・・・
619 :
605 :2009/04/16(木) 04:08:32
ちなみになんですがもともとは3項演算子は使わずif文で書いていました。 投稿する際に3項演算子だと色々都合が良いかなと思い使いました。
620 :
デフォルトの名無しさん :2009/04/16(木) 06:35:25
変数の文字コードを変換するのにいちいち $TO = encode "To文字コード", decode "From文字コード", $FROM; みたいなこと書かないといけないの?
$hoge = $foo ? "TRUE" : "FALSE"; と書いた時の可読性の悪さだよな 単に値を返すだけならいいけど、むしろそういうのは稀で、 結構な長さの文を書いたり、入れ子にしたりする
622 :
デフォルトの名無しさん :2009/04/16(木) 12:08:48
ローカルで動いたはずのプログラムがサーバーで動かず。 症状は変数の中身があり得ないことになっている 計算上 1000-100になるのが 0-100になってる。 何度読み返しても計算上はそうはならない。 一度サーバー上のデーターを全部消してアップしなおしたら直った。 サーバーがバグって正常に変数計算が無茶苦茶になるってことがあるのでしょうか?
>>622 99.99999999999999%あなたのミス
その消したデータとやらのせいでしょ。
624 :
デフォルトの名無しさん :2009/04/16(木) 13:12:51
>>623 すみません消したデータと再uPしたデータが微妙に違っていましたorz
なんで技術者って 自分は間違ってない、サーバがおかしい、処理系がおかしい から入る人が多いんだろうね
>625 ねーよw
>>625 ちゃんとした技術者なら少ないよ
偏差値低い技術者・一般人に多いだけだよ
なにかと「周りのせいで」って言ってる奴 よくいんだろ
>>625 逆じゃない?
一般人はそういう風に思いがちだけど(定番の「何もしてないのにPCが壊れた」とか)、
技術者は通常、そうではない。
だからこそ、たまに
>>622 みたいのが居ると、すごーく目立つ、ってことだと思う。
pentiumのバグを発見した人は偉いよな
浮動小数点のやつ? あれって回収されたんだっけ?
631 :
デフォルトの名無しさん :2009/04/19(日) 01:23:10
XML::LibXMLについて質問させて下さい。 XMLを読み込んだ後に、getElementsByTagNameで取得したノードについて toStringで内部のXMLを取得しようとすると、文字化けしてしまいます。 現在以下のテストコードを書いてみたのですが、文字化けの理由がさっぱり分かりません。 ソースコードは文字コードはUTF8で改行コードはLFで保存しています。 環境はosx上のperl5.8.8で、XML::LibXMLのバージョンは1.69です。 またperlとlibxmlのバージョンを揃えた環境を、linux(CentOS)上で作成して、 同じコードを走らせてみると、文字化けは発生しませんでした。 何処が間違っていますでしょうか。また他に何を確認すれば良いのでしょうか。 よろしくお願いします。 --- #!/usr/bin/perl use strict;use warnings;use XML::LibXML;use Encode; my $parser = XML::LibXML->new; my $xmlStr =<<XML; <?xml version="1.0" encoding="utf-8"?> <root><item>あいうえお</item><item>abc</item></root> XML # LibXML::Documentは文字化けしない my $xmlObj = $parser->parse_string($xmlStr); print $xmlObj->toString, "\n"; # これは問題なし # 問題の箇所 my ($item1, $item2) = $xmlObj->getElementsByTagName("item"); print( $item1->toString . "\n"); # これが文字化けする print( $item2->toString . "\n"); # 英字はOK ---
use utf8
633 :
デフォルトの名無しさん :2009/04/19(日) 17:47:18
スレッド利用時の共有変数についてどなたかご教示ください。 (環境5.8.8にて実行) shared変数をハッシュリファレンスの配列としたく、下記のような コードを組んだのですがうまくいきません。push直後、join直後に Dumper見てもセットされてません。 配列の各要素に対してハッシュのリファレンスである旨を事前に &share({}); みたいな形で伝えてあげなければならないのかな?と想像はして いるのですが、どのようにすればよいかわかりません。 よろしくお願いします ----------------- use threads; use threads::shared; use Data::Dumper; my @array : shared; my $test_sub = sub { foreach my $i (0..3) { push(@array, {'val1'=>$i, 'val2'=>$i}); } }; my $th1 = threads->new(\&$test_sub); my $th2 = threads->new(\&$test_sub); $th1->join; $th2->join;
5.10で調べたので違ってるかもしれないけど threads::sharedのドキュメントに、配列の要素も共有されたもの じゃないとダメって書いてある >>Shared variables can only store scalars, refs of shared variables, or >>refs of shared data (discussed in next section): : >> # The following are errors: >> # $var = \$bork; # ref of non-shared variable >> # $hash{'bork'} = []; # non-shared array ref >> # push(@array, { 'x' => 1 }); # non-shared hash ref で、これに書いてあるように shared_cloneを使えばいいみたい。 push(@array, shared_clone({'val1'=>$i, 'val2'=>$i}));
635 :
631 :2009/04/19(日) 19:54:45
>>632 ありがとうございます。
ただuse utf8を追加しても、文字化けしてしまいます。
631のテストコードに以下のコードを追加してみたのですが、
どうもutf8フラグの問題では無いような気がします。
---
# UTF8フラグのテスト
my $text1 = $item1->toString;
print utf8::is_utf8($text1), "\n"; # これはTRUE
print $text1, "\n"; # 文字化け
utf8::decode($text1);
print utf8::is_utf8($text1), "\n"; # これはFALSE
print $text1, "\n"; # やっぱり文字化け。出力に変化なし
---
またXML::Simpleを試してみたところ、問題なく動作しました。
自信は無いですが、ちょっとソースコードを読んでみます。
637 :
633 :2009/04/20(月) 22:55:29
>>634 ありがとうございます!うまくいきました。
638 :
デフォルトの名無しさん :2009/04/21(火) 19:02:51
以下のソースでinput.txtのファイルから"test[1]"という 文字列が含まれる行を抽出して 行番号とともに表示させたいのですがうまくいきません。 どこをいじればよいのでしょうか? ソース########################### #!/usr/bin/perl $key="test[1]"; $i=0; open(IN,"input.txt"); while(<IN>){ $i++; if($_ =~ /$key/){ print "$i :$_"; } } close(IN); $input=<STDIN>; ################################ input.txtの中身 test[0] test[1] test[2] test[3]
メタキャラを抑制する
>>639 $key="test\[1\]";
これじゃだめでした・・・。
/\Q$key\E/ どーでもいいけど $. も覚えたら?
$i=0; open(IN,"input.txt"); while(<IN>){ $i++; if(/test\[1\]\n$/){ print "$i :$_"; } } close(IN);
$key=quotemeta "test[1]"; $i=0; open(IN,"input.txt"); while(<IN>){ $i++; if($_ =~ /$key/){ print "$i :$_"; } } close(IN);
メタかどうかは使われる時でなく作られた時に決まるのか
646 :
デフォルトの名無しさん :2009/04/22(水) 13:28:36
最近perlを勉強し始めまして、ちょっと躓いてしまいました。 下記のようにプログラムを書いて、 出力を100にすることはできないのでしょうか? $b=10; $a10=100; print ('$a'.$b); ご教授お願いします。
すごい!! 自分でマニュアルを読むのをいやがる人のみならず、 自分で実行してみるのをいやがる人まで出現したぜ。
>>646 質問のこたえ・・・できません。
646のプログラムがいったい何を意図しているのか、さっぱりわからん。
何をしたいのか、ぜんぜんワカラン。
もしかしたら、こういう事がしたいんじゃないかな、とエスパーしてみる。
$b=10;
$a[10]=100;
print $a[$b];
・・・だとしたら、マニュアルも入門書も解説サイトも、全く読んでなさそうだな。
ああ、そういうことか print(eval('$a'.$b)); とかw
650 :
デフォルトの名無しさん :2009/04/22(水) 14:46:54
646です。説明へたですみません。。。 実行したところ、出力が$a10になりました。 私の求める出力は100なんです。。。 print ('$a'.$b); の'$a'.$bの部分で$a10となり、 print $a10となって、プリントされるのが100になって欲しいのです。
651 :
デフォルトの名無しさん :2009/04/22(水) 14:54:39
646です。 求めている答えになりました! 649さんありがとうございます。すっきりしました。 ちなみに私の入門書にeval載って無かったです(涙
652 :
646 :2009/04/22(水) 15:32:30
またまた質問です。 ちょっと形を変えたのですが、 $a="$a"; $b=10; eval($a.$b)=100; print $a10; と書いて実行してもエラーが出るのですが、 100を表示させたい場合どのようにすれば宜しいでしょうか? ご教授お願いします。
eval($a.$b.'=100'); とか。 添え字じゃだめなんか
654 :
646 :2009/04/22(水) 15:52:12
653さん有難う御座います。 駄目でしたorz なにも表示しないです。
その前に $a="$a"; の$aの中身見てみ。 $a='$a' ; でどうか
656 :
デフォルトの名無しさん :2009/04/22(水) 16:02:22
>>652 すこしはデバッグしろ。
変数に何が入っているか一つ一つチェックするくらいやれ!
657 :
646 :2009/04/22(水) 16:14:18
みなさん有難う御座います。 解決できました。ご迷惑お掛けしました。 656さんのおっしゃる通りです。 自分でやれることはやらんないかんですね。。。
>>649 あったまいいなぁ。よくわかったな・・・
>>657 >自分でやれることはやらんないかんですね。。。
( ゚д゚)ポカーン
eval使わずにこう書くかな $b=10; $a10=100; print ${'a'.$b};
$hogeの中にあるURLを見つけてリンクをつけるにはどんな風に書けばいいですかおしえてください
(´-`).。oO(WebProg板かとおもた。。。)
ファイルテスト演算子の、-r と -R の違いがよく分かりません。(他に -w -x -o も) 実際にコードを書いて試してみたけど違い見つかりません。 おそらく「きちんとUNIXを勉強しなさい」っていうラリー先生からのメッセージなんだとは思うのですが…。
>>664 例えばrootで実行したプログラムの中で一般ユーザーhogeにset uidしてrootしか読めない
ファイルを-rで調べるとfalse、-Rならtrue。
UNIXのお勉強頑張って下さい。
>665 なるほど。なんとなくだけど分かった。ありがとう。
667 :
デフォルトの名無しさん :2009/04/25(土) 06:21:29
perl の練習でチャットを作っているのですが。 発言、リロードが無い場合30秒でチャットルームをたたき出すって機能を作ろうと して30秒計るタイマーをまず作ろうとしてそこでつまずきました。 alarm って命令語の使い方がさっぱり判りません。
668 :
デフォルトの名無しさん :2009/04/25(土) 06:23:09
拾ってきたサンプルプログラムをローカル動かしたら動くのですが。サーバー上では動きません。 $SIG{ALRM} = \&time_out; eval { my $alarm_time = 5; printf "%d秒以内に何か入力して下さい。\n", $alarm_time; alarm $alarm_time; my $input_string = <>; alarm 0; chomp $input_string; printf "%sが入力されました。\n", $input_string; }; sub time_out { print "時間切れのため終了します。\n"; exit 1; }
669 :
667 :2009/04/25(土) 06:27:19
↓こうやってサーバーに乗せたのですがエラーになります。 #!/usr/bin/perl print "Content-type: text/html\n\n"; $SIG{ALRM} = \&time_out; eval { my $alarm_time = 30; printf "%d秒以内に何か入力して下さい。\n", $alarm_time; alarm $alarm_time; my $input_string = <>; alarm 0; chomp $input_string; printf "%sが入力されました。\n", $input_string; }; sub time_out { print "時間切れのため終了します。\n"; exit 1; }
>>668 チャットサーバー作ろうとしてるんですか?
CGIやmod_perlで作ろうとしてるんだったら無駄ですよ、
良く考えましょう。
alarmの使い方はそんなもんかな?
チャットCGI作るんなら、前回発言時のタイムスタンプを
取っておいて、それと比較するしかない。
というか、初心者のお題としてチャットはちょっといかがな
ものかと思うよ。サーバー作るんじゃなきゃ汚い実装しかできないし。
掲示板の方がまだいい。
671 :
667 :2009/04/25(土) 08:18:25
>>671 無理ではないが、向いてない。
HTTPは基本的にはストリーム通信じゃないから。
673 :
667 :2009/04/25(土) 08:28:38
チャットはあきらめます。 ところでCGIで一定時間たつとファイルの中身を書き換えるタイマーみたいなものが作りたいのですが どうすればいいですか? たとえば time.txt というファイルの中身を 0 にしておいて フォームか何かの送信を受けて 1 に書き換えた場合その1分後に自動的に0にもどるみたいな
>>673 そういうのもCGIは向いてない。
一応forkしてCGIスクリプトを1分間走りっぱなしにすれば
可能だが、システムの負荷が高くなりそう。
そういうのはUNIXシステムならcronを使うべき。
いや別にsleepしてれば負荷かからないが・・・
>>673 system "sh -c 'sleep 60; echo 0 > time.txt' & ";
676 :
667 :2009/04/25(土) 09:45:56
了解しました。 似たような用途のときはフォームの送信を受けた時に1に書き換えられた時間を記録して 次に呼び出した時、記録と現在時間を照合して1分たってたら0に書き換えるようにすればいいのですね?
677 :
667 :2009/04/25(土) 09:47:35
>>673 の「一定時間たつとファイルの中身を書き換える」は
そういうことだと読んだんだが
680 :
デフォルトの名無しさん :2009/04/25(土) 19:36:46
perl初心者なのですが、sendkeyのコマンドを指定した時間押し続けることってできますか?
>>680 ボタンイベントはDownとUpの2回発行で1セット
複数あるリスト(配列)にユニークな名前を付けて、その名前でソートしてから リストの内容を順番に出力したいのですが、どうすればできますか? よろしくお願いします。
変数名でソート?
>>682 配列をハッシュにぶら下げればいいだけ。
685 :
682 :2009/04/26(日) 11:54:34
実はハッシュに入れたリストの取り出し方がわからないのです。これだとスコープ外なのでしょうか? open(TXT, "x.dat"); $status = 0; my %hash; foreach (<TXT>) { chomp; if ($status == 0) { if (/^start (\S)/) { my @list; $hash{$1} = \@list; $status = 1; } } elsif ($status == 1) { if (/^end;/) { $status = 0; } else { push(@list, "$_"); } } } my @k = sort keys(%hash); foreach (@k) { my $lst = $hash{"$_"}; # リストをを取り出したい print @$lst; } -------------- x.dat start C CCC end; start A AAA end;
close(FH); と書くべきところを省略して close; だけにしてたら、なんかハッシュがクリアされたけど、 そういう仕様?
>>685 #!perl -w
use strict;
my $key;
my %hash;
open TXT, "x.dat" or die $!;
while (<TXT>) {
chomp;
if (/^start(\S)/) {
$key = $1;
} else {
push @{$hash{$key}}, $_ unless /^end;/;
}
}
for my $key (sort keys %hash) {
my $lst = $hash{$key};
print "@$lst\n";
}
俺が書くとこんなんなっちゃったけど
@list はスコープ外だと思う
/^start(\S)/ → /^start (\S)/
@{$hash{$key}} こんな書き方ができるとは…勉強になりました。 ありがとうございました。
perlのよいところって ルーズにも書ける、かっちりも書ける ってところなのか?
>>690 そして悪いところは
ルーズにも書けるし、かっちりも書けるところだ。
つか書く人がどう使うかじゃね perlゆえの弱点とかあんまないと思う
いや、書く人によって ルーズにも書けるし、かっちりも書けるということ。
>>675 そんなことしたらプロセスが山ほどできるがそういうのを負荷に含めない人?
>>694 場合によって、っつーのもある。
1回しか使わないような文書処理とかは超ルーズに書く。use strictなんてしない。
blessするのとデータベースからfetchするのはどっちが早いかな
use strict; use warnings; sub print_data{ my @lines; my $data_line; my $data_file = "/hoge/fuga/.foobar"; my $fp; open($fp,"< $data_file") or die "Can't ope data file!"; @lines = $fp; foreach $data_line(@lines){ print "$data_line"; } close($fp); } こういうサブルーチンをかいて&print_dataを呼び出すと GLOB(0x80014)とかいう文字が出力されるだけでファイルの内容が表示されないのですが 何処を修正すべきでしょうか? ちなみに上の.foobarの中身は Hello となっています。
>>699 @linesにファイルハンドル突っ込んでね?
>>700 ありがとう御座います。
<$fp>という表記が正しくない物だとおもっていました。
Perlはもっと直感的なかんじで書いて、ちゃんと展開されるんですね。
ありがとう御座います、無事かいけつしました。
ちなみにそれ$datefileがでかいファイルだともりもりメモリ食うぞ
そのためのメモリですから〜w
メモリをもりもり食わせた方が速くていい
まあ、むかし(Perl4/主記憶16MBのマシンを5人とかで使ってた)、 同時に一行以上読み込ませるのは御法度だった時代があるからな。
主記憶128KBのUNIXマシンのRS-232Cポートに端末9台ぶらさげてCAD使ってたころは まだperl自体が存在していなかったな・・・
ワシが若い頃はな、主記憶256バイト (kもMも付かない正真正銘の256バイトじゃ) のワンボードマイコンを工夫しながら使っておったんじゃ。 それをなんじゃ、今の若いもんは。 2Gじゃ足りんから4G乗せろ、などと.......フガフガ
TK-80の512バイトより前の歴史はさすがに知らん
現在に通じる教訓を含まない老人の昔話禁止
自分がわからない話は禁止
妬むなよ
俺がガキの頃組み立てて遊んだ4bitマイコンは64バイトだった希ガス。
まあ、perlは導入当時(awk, sed, shellと比べて)遅い重い邪魔というのが最大の欠点だった。 だから、rubyなどに対して、perlerの「遅い」とかいう悪口を見ると、ちょっと微笑ましくなる。
起動コストの話なんだろうけど、shellは結局他のアプリケーションを 立ち上げてナンボの言語だから、shellより重いってのも眉唾だな。
>>714 処理系が「巨大」だからだよ。上の他のやつのレスとかまったく目に入ってないんだな、あんたは。
ああ、perlを走らせると、まずperl以外をみんなswapoutさせるんだよな。
>>716 awkとperlの起動コストって言うほど変わらなかったと思うぞ。
一旦起動したらperlの方がサクサクなのは言うまでもない。
>>718 >awkとperlの起動コストって言うほど変わらなかったと思うぞ。
>一旦起動したらperlの方がサクサクなのは言うまでもない。
いずれも違うね。
まあ、昔のUNIXマガジンのバックナンバーでもめくってみてくれ。
ヴァージョンいくつの時代の話をしてるんだ?
80186でJGAWK.EXEやJPERL.EXEを今でも動かすことがあるけど、 perlは止まったかと思うほど起動に時間かかる
もはやパソコンプログラミングにエコは必要ないか・・・
巨大行列の逆行列とか計算してるスパコンは、メモリ足りてるんだろうか
足りてるから動いてんだろう
>>723 人からすると一見どうってことない行列計算が、すぐ爆発しちゃうからねえ。
2年でメモリが倍増するとすると、20年後にようやく10^3倍。
あの分野のプログラムがもっぱらメモリ削りに注力する状況は、
とてつもないブレークスルーがないと変わらないね。
>2年でメモリが倍増するとすると、20年後にようやく10^3倍。
仮想記憶で足りてんだろ
なら、16MBのSUN3でもスワップさえ十分用意しておけば、 100MBのファイルを丸ごとくわえ込むPerl scriptを書いても、 何の問題もないな。
16MBレベルの話してたっけかw
>>723 > 巨大行列の逆行列とか計算してるスパコンは、メモリ足りてるんだろうか
足りるように圧縮する。足りなかったら部分問題に分解する。
ということは、処理系依存なコードをその都度書くのかな 分解を自動化させてたら、その分遅くなるだろうし
さげ
どうせ、新しいCPUでたら重さも気にならなくなるものさ
早くなったら格子を大きくしたりタイムステップを短くとるのさ
質問よろしいでしょうか。 v5.8.8 build817のWindows環境において、ImageMagickを導入したいと考えています。 ppmからはインストールできないみたいなのでImageMagickの公式からインストーラを落とそうと思うのですが、 配布されているものが多すぎて、どれを導入したら良いのか見当が付きません。 (Q8、Q16とは?dllとstaticのインストーラの違いとは?) また、インストーラーによっても対応するPerlのバージョンも違うらしいのですが、 上記のバージョンのPerlでImageMagickを使用していらっしゃる方はいないでしょうか?
すみません、多分自己解決しました。
738 :
デフォルトの名無しさん :2009/05/02(土) 12:50:36
print "Set-Cookie: NAME=hogehoge; expires=hogehoge; path=/\n"; とクッキーを食わせてるんですが、半角英数字ならまったく問題ないのですが 日本語だとなぜかIE以外のブラウザでは文字化けして取得されてしまいます。 どのようにすれば文字化けせずにちゃんと取得させるようにできるのでしょうか?
740 :
デフォルトの名無しさん :2009/05/02(土) 14:05:42
メソッドのオーバーライドを禁止したいんですが、可能でしょうか
>>741 Attribute::Finalかな?
あるいは、
my $class = ref $self; # Scalar::Util::blessedでも可
croak 'オーバーライドしちゃいやん'
if $class ne 'SampleClass'; # __PACKAGE__ではなくベタ書き
それはそうと、Win32環境で、他のプロセスから
メッセージを受けるにはどうしたらいいですか?
>>742 なるほど、Scalar::UtilではBGINブロックと実行ブロックの時間差を利用してパッケージをチェックするわけですね
頭いいなぁ、ありがとうございます
まだまだ駆け出しですが、ゆくゆくはcpanのauthorのひとりになってみたいです cpanにうpできるようになるまでの流れってどんな感じなんですかね?
まずうpする物を作ります
>>744 うpするレベルのものを作ればいいだけ。
少々コードが下手でも誰も作ってなくて需要があるものならおk。
あとは他の人がサポートしてくれるさ。
>>765 ガラクタでいいなら作ってるんですが、まだ人に評価してもらえるほどのスキルと知識はないと思います
>>746 とりあえず誰かに見てもらわなきゃいけないわけですよね
普通はこんなん作ってみたよーってブログなんかでうp→評判よければcpanにって流れなんでしょうか
ふと思うんだけど、誰もつくってないものってどうやって 思いつくんだ?ある意味時代の最先端にいないと何が足りないのかって 気づかなくないか?たいていの作業は既存のモジュールでできるもんな
>>748 それが分かるようになったら思いつく思います
あと誰も作ってないってのは大抵作るまでも無いものでみんな自力で済ませちゃってるんじゃ? んで誰かがモジュール公開したら「自分でできるけどあるなら使ってやるか」→「それはあのモジュールが定番だよ」的な流れみたいな
>>748 最近のだと、電話番号の判定モジュールとか最先端でも何でもないよ。
技術も(実際はどうか知らんが)ほとんど必要ない。作った人に根気があっただけ。
そうか、実際今高校生なんだけど学校ではPerl使わんし、レポートとかもPODからLaTeXにしたり LaTeXを直打ちだったり、エクセルの授業中にVB使って変換した奴をPerlスクリプトに流し込んで 楽しまくりだったりするだけで実社会の問題に気づかないんだよな。 「これはなさそうとだなぁ、つくったら喜ばれるんじゃね」とおもって探すと あるんだよね...orz
LWPがあればWWW::Mixiがいらないかといえばそんなことはないわけで
既にあるものは使う 使い辛いものは作り直す 無いものは自分で作る これぞhacker
Pluggerみたいに単なる思い付きみたいなのが凄いことに なっちゃうこともあるしね。
お話の最中に大変恐縮ですが、考えあぐねて煮詰まってしまいましたのでなにとぞ助言を賜りたく お尋ねいたします。 やろうとしていることは、LWP::Simpleをuseして $BUFF =get($TargetURL) てな具合にて取得するという至って単純なものなんですが、この$TargetURLから送られてくるデータ というのがhttpによって配信されるストリーミングデータでして、EOFが返されない限りはブラウザの 画面は真っ白けっけのまんまという次第であります(よって、終了時間になったり中断すると、変数の 中に溜まったデータが初めてブラウザ上に表示されるという次第)。 なんでこんなことをするのかというと、サーバー側から送られてくるデータの内容を $BUFF =~ s/$Str01/$Str04/g; みたいな感じで置き換えたり消したりした上で画面に表示させたいなぁ…と思ったからなんですが、 もしかして自分は、Perlではできないことをしようとしてきたのではあるまいか?とか思い至るようになり、 こうして諸先輩方のお教えを乞いに参上いたしました。 というわけで、Perlではできないのであれば諦めますが、そうでないなら「これがイカン」とか「ここを もっとナニせなイカン」といったお話がありましたら、なにとぞよろしくお願いいたします。<(_ _)>
>>756 ストリームデータを加工して逐次表示したいならuse Socketして
シコシコ書くのが確実だと思う。$| = 1を忘れずに
>>756 > やろうとしていることは、LWP::Simpleをuseして
SimpleじゃないことはSimpleではできないというのが道理。
LWP::UserAgentを使って、callbackを設定すればおk
LWP::Simpleは機能削り過ぎなんだよな シンプルに書けるけど、突っ込んだことも出来る、というのが使えるパッケージ 一方、LWP::UserAgentは簡単なことをするにも行数が多くなる とりあえず、Simpleで書いて、限界が見えたらUserAgentに書き換える、 みたいなことをよくやる
LWP/Simple.pmを見てみると、メソッドgetprintがそれやってるやん。
>>760 わたしは基本的にURI::Fetchを使う。
LWP::Simple使わなきゃいけないほど、LWP::UserAgentって複雑じゃないよね
複雑じゃないけどダルイ
スクリプト(*.plなファイル)のデバッグというかテストってどうやるべき? 処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`) でもmainにベタ書きじゃテストが書きにくいし汚くなるからイヤなんですよね
とりあえずgetしてみて、エラーになってたら再チャレンジ、 みたいな制御構造って、どう書くのが普通? ループの中だとredoがしっくり来るんだけど、 単発のgetを強化したい時
while(1) hogehoge
>>766 テストの自動化ということなら、
ロジックを全て外部モジュールに追い出してそっちをテストするか、
それがダメならテストスクリプトからsystem関数とかで呼び出す、
ぐらいかなぁ
それだと無限ループを明示してるように読める 何事もなければ1回で済むけど、例外的に繰り返す、みたいな意味にしたい if (expr) {expr} と書くか expr if expr; と書くかみたいな話
until(expr)
sub get{ nanntara; &get() if(error); } >単発のgetを強化したい時 ってなんやねん
ラベル付きのブロックにすればいいのか ラベル名をユニークにするのがめんどい 大抵は意味なんか無いからなあ その時の行番号にしたろうか
再帰呼び出し!?
末尾再帰だから、ループに展開可能。 どうでもいいな。 普通に1..10でループまわして、成功したらlastかければいい。
ええー どんどん駄目になっていく
>>767 > とりあえずgetしてみて、エラーになってたら再チャレンジ、
> みたいな制御構造って、どう書くのが普通?
失敗したら再チャレンジじゃなく成功まで再チャレンジが普通じゃね
まぁ見た目の美学を求めるperlハッカーならこう書くだろうがね
↓
779 :
766 :2009/05/09(土) 01:41:25
>>769 外部に追い出すほどのロジックでないです(というか勝手にモジュール増やすと怒られそうです)
共用データベースから大量の変数を引っ張ってきているんでsystem関数で呼び出すと色々と不都合が起きそうな気はするんですが、
一番現実的ですかね
>>772 ありがとうございます
後付け条件で申し訳ないんですが、バイトでCPANに繋げられないような設定がされてるみたいなんです(’・ω・`)
せっかく探してもらったのに済みません・・・
もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか
unless(expr){until(expr){}}
>>779 > もしやこういうスクリプトでのスタンダードなテスト方法って確立されてないんでしょうか
お前はどういうスクリプトかまだ書いていない
do whileで書くと、まずdoから評価されるという性質を使う
>>779 -d じゃ駄目なんかよ
俺は使ったこと無いけど
>>766 > スクリプト(*.plなファイル)のデバッグというかテストってどうやるべき?
> 処理とテストをそれぞれファイル内にパッケージにして書いたら怒られた(´・ω・`)
どうすればいいのか。怒った人に聞け。
785 :
766 :2009/05/09(土) 03:18:08
>>781 あ、確かにそうでした
データベースのあるテーブルからすべての行について計算した結果をそれぞれ他のテーブルに書き込むスクリプトです
引数は取りません
問題は共用のテスト用データベースサーバーなのでテスト中に行が追加される可能性があることと、
勝手に都合のいいように変更しにくいということでしょうか
それがなければ
>>769 の通りsystem関数を使って行うのが一番ですかね…
と書いてて思い至ったんですが、使用するテーブルの中身をメモリやファイル上に退避→都合のいいようにデータベースをいじる→
別ファイルからsystem関数呼び出してテスト→テーブルを元通りに
で問題なさそうですね
質問したのに自己解決で申し訳ない
ありがとうございました
>>783 デバッグでは使ってもテストの労力は増えるので今回はその選択肢はないっす
すみません
>>784 確かにそれが一番ですね
ですが今日聞きそびれたのと、一般的にはどういうことをやっているのか知りたいというのもありまして…
786 :
772 :2009/05/09(土) 03:29:11
なめた質問だったな。 結局STDINもSTDOUTもSTDERRも関係無しと。 こんなものモジュール化してテストするだけ。
>>757-
>>765 いろいろお教えいただきありがとうございました。どうも、SimpleじゃないことをSimpleでやろうと
していたようですね。てなわけで皆様方のご指摘を参考に、また精進を重ねて参りまする。<(_ _)>
788 :
デフォルトの名無しさん :2009/05/09(土) 17:08:30
エラー処理について教えてください。 nfsでマウントしているディレクトリのファイルにアクセスした時に nfsサーバ側でトラブル起きていた場合はエラーメッセージを出力して 終了させたいのですがどのように書けばいいでしょうか? eval { local $SIG{ALRM} = sub { die "timeout" }; alarm 2; #タイムアウトは2秒 if (-e $file_name) { print 'found';} alarm 0; }; alarm 0; if ($@) { print 'error'; } exit(); といった感じでタイムアウトでエラー処理をしようと思いましたがSIGALRMを拾えませんでした。 何かいい方法は無いでしょうか?よろしくお願いします。
それは単にマウントしたファイルにアクセスできないってだけでないの?
790 :
788 :2009/05/09(土) 22:34:40
>>789 通常問題が無い事が前提のnfsサーバがダウンしている時のエラー処理が目的なのです。
なので普段はそのファイルへのアクセスは問題無く行えています。
nfsのマウントオプションがhard,intrなのでなんらかのシグナルが来るとは思うのですが
その前にタイムアウトで捕まえられれば・・・と思って書いたのですがうまくいってません。
別のシグナルを捕まえなければいけないのか、softでマウントしないといけないのか・・・
何か情報をいただけないでしょうか。
よろしくお願いします。
791 :
788 :2009/05/09(土) 22:39:05
どのようにうまくいってないかを書き忘れてました。 ・2秒のタイムアウトが動かない ・apacheのタイムアウトで強制終了される といった感じです。よろしくお願いします。
ファイルテスト演算子は使えんのかねー nfsよー知りませんが
あ、使ってんのか if( -e FILE ){ あった }else{ なかった } じゃいかんの
794 :
788 :2009/05/10(日) 00:29:33
>>793 レスありがとうございます。
elseについては試してませんが、あるか無いかの判断に2秒かかるとも思えないのと、
apacheでタイムアウトを起こす前に処理が帰ってきていないようなのです。
恐らくnfs側でタイムアウトして、なんらかのシグナルを送ってきてるのだが
私がそのシグナルをperlで受け取る方法を知らないのが問題なのだと思います。
>>794 でなくて、あれこれ想像するだけで、問題を切り分けてデバッグしていないのが問題。
やっぱりですか ですよね できました!ありがとう
SocketやI/O関係でブロッキングしてしまうときはselectか $ENV{PERL_SIGNALS} = 'unsafe';するといいよ
すいません、あるプログラムの一部なのですが、このコードはどのような構造なのでしょうか? my $でスカラー変数を宣言しているのですが、そのあとに{}や=>が入っていてよくわかりません ハッシュとは違うのでしょうか? my $test = { AAA => 'krnaa', BBB=> '454', };
無名ハッシュ リファレンス で調べて味噌
連想配列でいいじゃん。
無名配列へのリファレンスと、無名ハッシュへのリファレンスって、 いつごろのperlからあるの?
5
頭が4だからなあ 5の機能もそれとは知らずにばんばん使ってるけど、 無名まわりは知らなくても何となく読めるから整理されてない
5で追加になったmyとかorとかmapとか->とか最短マッチとか(?:とか、 そんなんもあったのかと個別に新発見してきたけど、 まとめて覚えた方が効率的だよな 5の新機能を使うと互換性が無くなると思って、 極力4の範囲内で書いてた筈がいつのまにかすっかり5
現在に通じる教訓を含まない昔話禁止
現在の話なんだが
日本語でok
809 :
788 :2009/05/10(日) 23:49:45
>>795 示したコードではファイルが見つからなかったら何も表示されずに正常終了しますよね?
でもapacheのエラーログにタイムアウトと表示されているのです。
それでもelseを書いてテストした方がいいですか?
>>797 レスありがとうございます。
使ったことが無いのですがこれから調べて試してみます。
どなたか、perlでnfsがらみのエラー処理のコードを書いた事がある方はいませんか?
nfsサーバのトラブルに対応した例をネットで探したのですが見つからないのです。
よろしくお願いします。
>>809 そもそもテストならApache経由じゃなくてコマンドラインから直でやってみればっ
すみません、Archive::Tarで、 「ファイルを粒でgzip圧縮して、それを最後にtarでまとめる」 のではなく、 「ファイル全部をtarでまとめて、それを最後にgzip圧縮する」 方法はどうすればいいでしょうか。 単にファイル群をadd_filesメソッドの引数に突っ込んで、 最後にwrite($file, COMPRESS_GZIP)すればいいだけの話ですか?
tarした後にzipするだけでしょ やってみれば
質問です。 perlで書かれたCGIファイルいじってHTMLページのリニューアルしてるんだけど firefoxでは表示されるのにIEじゃ500エラーになるんですが 何が原因ですか?? パーミッション、perlのパス、文法は問題無いんです。 EUCで書かれてるみたいなので、文字コードが原因なのかなと思うのですが どこをいじればいいのかわからないのですが。。
>>813 置いたディレクトリは、ApacheでOptions ExecCGIされてる?
とりあえず、hello world置いて実行できるか試してみては?
あと、apacheのログ確認。
とりあえずwebprog誘導じゃないのか
816 :
デフォルトの名無しさん :2009/05/12(火) 06:58:03
>>813 まずは、apacheのerror.logを貼れ。
話はそれからだ。
キャッシュされてたんだろう
ぺrlの話しようぜ!
開国してくださーい
たった四はいで夜も眠れず
822 :
デフォルトの名無しさん :2009/05/12(火) 20:57:01
初歩的な質問かと思いますが、どうかご回答いただければと思います。 TemplateとCGIを利用してプログラムの作成を行っております。 そこで、TemplateにCGIで受け取ったパラメータを渡したいのですがうまくいきません。 my %foo; $foo{$_} = $cgi->param( $_) for $cgi->param(); $param = { foo => \%foo; } という作業を行うと問題なく渡せるのですが、%fooを作成しない方法はありませんでしょうか?
$param = { foo => [map +($_, param($_)), $cgi->param] } こんなことかしら? tu-kaうまくいかなかったときのコードを晒さないでどうしろと♪
もしくはこういう事かもしれませんね [% USE CGI; CGI.param('name'); %]
というか、tt2にはリファレンスで渡さなきゃダメってだけのことだよ my $foo $foo->{$_} = $cgi->param( $_) for $cgi->param(); これで解決。
これもここに置いておきますね $param = { foo => { $cgi->Vars() }, }
テンプレート系に限らないけど、 他人にソースを渡して使ってもらう場合、モジュール依存の処理はどうしたらいいかなあ。 向こうでCPANから拾ってきてくれるなら何使ったっていいだろうけど…… 比較的インストールされてる可能性が高い(できれば標準の)モジュールだけに絞るべきか…。
俺は一応READMEに書くだけにしてるけど、 Perlに詳しくない人はCPANって言われてもさっぱりだろうからなぁ
PurePerlだったら同梱してしまう。 100ぐらいのモジュール試してarc依存だったのは2〜3割くらいだった
質問です。 &sub_routine &sub_routine->() 両者は同じ意味でしょうか? "->"の意味がよくわからず・・・。
&sub_routineはその名前のサブルーチンを呼び出すだけだが、 &sub_routine->()は&sub_routineの返す値をサブルーチンへの リファレンスだと思ってさらにそれを呼び出すから全然違うよ。
リファレンスでググれ 以上
デリファレンスの書き方が複数あるから混乱するんだよな 内部的にはデリファレンスだけど、意味としては関数オブジェクトだし 他のオブジェクト指向言語からの類推で何となく読めてしまうので、 厳密な意味の理解に至らない
メソッドもデリファレンスなの?
835 :
830 :2009/05/14(木) 00:48:30
>>831-833 アドバイスどうもです。
リファレンスについて調べました。
C言語ではポインタに当たるものらしいですね。
これを踏まえて書き直すと、下記のように。
&sub_routine
\&sub_routine->()
つまりポイントとしては
「アロー演算子は、
アドレスを指し示すリファレンスを
デリファレンスする働きをもつ 」
ということでしょうか。
アロー演算子が、デリファレンスとメソッドの両方について重複して定義されている と思っても、 perlではデリファレンスとメソッドは同じこと、と思っても困らない
>>835 > C言語ではポインタに当たるものらしいですね。
停留所でしか止まれないけどな。
あと &sub_routine と &sub_routine() は違うんで気をつけてね。 &NAME; # Makes current @_ visible to called subroutine.
% cat foo.pl g(1,2); sub f { print "@_\n"; } sub g { print "&f:"; &f; print "&f():"; &f(); } % perl foo.pl &f:1 2 &f():
>>840 なんて()が無いと、1,2が入るのか教えてください
>>841 http://perldoc.perl.org/perlsub.html > NAME(LIST); # & is optional with parentheses.
> NAME LIST; # Parentheses optional if predeclared/imported.
> &NAME(LIST); # Circumvent prototypes.
> &NAME; # Makes current @_ visible to called subroutine.
4行目に注目。
そんなバグの元になる使い方したくない
>>843 俺もそう思う。
しれっとかいてあるけど
&NAME(LIST); # Circumvent prototypes.
なんてのもあるしな。
結論としては&つける書き方はやめとけ。
circumvent 英辞郎レベル11
自分は &NAME(LIST); って書き方しかしない
>>844 青らくだ原著だと、「usually the & is optional」と書いてある。
訳本には「通常&はなくても良い」と、あたかもあっても良いかのように書いてあるが、
通常は使わないというのが5の流儀ということでいいと思う。
どうしても使わなきゃなのは以下のような場合とか。
$func = sub {return 1};
&$func;
$func(); だと動かない。
そういうときは俺は $func->(); 派。
そもそも4ではなんで要ったんだろう?
>>849 4の当初は裸のワードが当然のように許されていたので、
裸のワードと区別するために必要だった。
今はuse strictしとけば関数名タイプミスしても裸のワードと
間違われる心配はない。
変数の$とか関数の&とか 愚直なところがPerlのいいところだと思う
852 :
デフォルトの名無しさん :2009/05/16(土) 01:08:21
MySQLなどで名前のsortの為だけにカナをvarcharで格納しているのですが、 スピードupも兼ねてカナをintでなんとか表現出来ないかなと思ったのです が何か良い方法はないでしょうか? 最初、カナをunpackで分けて足してなんてどうかなと試してみましたが、 sortの基準が数字は右から、文字列は左からなので単純に足すわけにもい かず、私ではとても無理でした。 もしかしたらDBの所で聞いた方が良い内容かも知れませんが、perlで変更して 入れる方法がいいのかなと思ったのでこちらにしました。 宜しくお願い致します。
perlのコードについての質問じゃないんですが、 PerlRequireについての質問です。 # /etc/httpd/conf/httpd.conf PerlRequire /etc/httpd/conf/startup.pl #/etc/httpd/conf/startup.pl use strict; 1; たったこれだけなんですが、startup.plの中のuse strictが動いてくれません。 スクリプト内に書くとちゃんと読み込みできます。 なぜかわかる方いますか? スクリプトはCGIではなくmod_perlとして動いてます。
良く知らんけど、あてずっぽうでレスつけてみる。 #/etc/httpd/conf/startup.pl use strict; $unko = 1; # ←ここでエラーが出るなら、use strict; が生きてるんじゃないの? 1;
プラグマの有効範囲
>>855 >>856 ああ。なんとなくわかりました。
strict.pmはプレロードできないんすね。strictだけ反映しないんでなんでかと思いました。
use utf8ではまってます。 EncodeがCannot decode string with wide charactersエラー吐きまくり;; utf8フラグを毎回外さないといけないんですか?フラグ付けたり外したり自作モジュールがたくさんあるから整合性つけるのが大変><; 何か代替案ありませんか?
perlを捨ててPHPに移行する
>>859 PHPに全スクリプト移植なんて考えただけでも恐ろしい。却下
しっかし、文字コードの肝心要のEncodeモジュールがutf8フラグに対応してない(decodeね)なんて、なんてお粗末なんだ・・・
何を文句言ってるのかよくわからんのだけど、 あんたがどこかで大きな勘違いをしているんだと思う。 そんなことで困っているやつを見たことないし、おれもないもん。
入力がどの漢字コードで来るか不明な時に万全に対処する方法は?
そんな方法は論理的にあり得ない
>>862 EUC-JPとShift-JISが既に判別不可能。UTF-8なんか混じるともうだめぽ。
ASCIIのみで構成された非ASCII文字列なんかも判別不可能だな。
現状、その辺に転がってる判別ロジックは確率的にこっちだろjk、と判別をつけている。
しかしShift-JISの半角カナの奇数文字数文字列なんかはマジでEUC-JPと
区別がつかない時がある。半角カナが文字化けするからダメだと
言われる所以だ(その認識は間違ってる訳だが)
送信側受信側で環境なりプロトコルなり統一しろ コード組む以前の努力不足
>>865 HTTP1.0だとクライアントからどの文字コードが帰ってくるか不明なんだよねー。
クライアントは不定なの? 特定の文字埋め込んでおいて呼ばれたらその文字調べりゃわかる場合もある
>>867 HTTP1.0の時代のCGIはみんなそうやって対策してたよねー。
自分で両側作れるんなら苦労しないがな。
ブラウザベースなら、HTML4.0/XHTMLで送信文字コードを指定できる。 目的の文字コードと合わなかったら、はねればいい。 つか、webprogの話だな。
>>870 ぬぬっ!勝ち負けがあったのか。参戦したかったぜ。
>>873 非対応ブラウザは排除ですかそうですか。
仕事だとそうも行かないのが現実だと思いますが。
そもそもencodeされてるのとされてないのが混在するようなプログラムがおかしいと 思うが、手を抜きたければ sub mydecode { return is_utf8($_[1])? $_[1]: &decode; } とかすれば?
>>875 だから<STDIN>からの入力文字コードが不明な場合なんかだよ。
不明だからencodeもできないだろ。
非対応ブラウザって何があるんだ?
YahooApiを使うためにUTF-8エンコードをしたいのですが、一部の文字がうまくエンコードできません。 うまくいかない文字とは半角スペースやXのような文字です 例えば半角スペースなら+となって、Xなら%e2%85%a4となるのが正しくエンコードされた結果のようです(あるwebサイト上のプログラムでエンコードを試したところ、このような結果がでて、このエンコードされた文字列をYahooApiで普通に使えました)。 自分が使用しているサブルーチンだと半角スペースが%2bとなり、Xが%ef%bf%bdXとなってしまいます。 どうかご教授願います。 以下が使用しているサブルーチンです sub urlencode{ my $value="$_[0]"; $value=Jcode->new($value)->utf8; $value =~ s/\s/+/g; $value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg; $value =~ tr/\s/+/; return "$value"; }
> $value =~ s/\s/+/g; 半角スペースを2bにしたくないのならこれは不要。 Xは恐らく文字コード判別に失敗して正しくマッピング出来てないと思う。 入力文字コードが分かっているなら $value=Jcode->new($value、'sjis')->utf8; のようにして問題を切り分けてみると良いかも
お返事をありがとうございます。 Jcode::getcode(X)で調べたところsjisとなっておりました。 その後以下のコードにして半角スペースについては解決しましたが、やはりXとかVとかがうまくエンコードできません。 念のため$value=Jcode->new($value,'sjis')->utf8;のsjisのところをいろいろ変えて試してみましたがやはりダメです。 URLエンコードができるwebサイトを3つ見つけて、そのうち2つのサイトではXは%e2%85%a4と望みどおり変換されましたが、残りのサイトは下のプログラムの実行結果と同じで%ef%bf%bdと返されます。 このことから、おそらくよくある変換ミスだとは思うのですが・・・ ちなみにwindowXPでコマンドプロンプトからperlを動かしています。 my $title=''; $title='X '; $title=&urlencode($title); print "$title\n"; sub urlencode{ my $value="$_[0]"; $value=Jcode->new($value,'sjis')->utf8; $value =~ s/([^\w ])/'%'.unpack('H2',$1)/eg; $value =~ s/\s/+/g; return "$value"; }
$value=Jcode->new($value,'cp932')->utf8; XはMS拡張文字だからsjisではなくcp932だった。
おおおおおおおおおおお 機種依存文字ってとこまではわかったのですが、そこから進めなかったんです cp932にすればXみたいな文字や普通の日本語も望みどおり変換されて、漢字やひらがなも変換されますね ありがとうございました
ところでcpって何だろうね
while(1) { $ftp = Net::FTP->new($address, Debug => 0); $ftp->login($id, $pw); #処理本体 sleep(3600); } みたいなことをして、定期的にftpするスクリプトを走らせてるんだけど、 普通に使ってる分にはうまくいくけど、windowsを休止状態にして、復帰すると、 Can't call method "login" on an undefined value at なんたら で $ftp->login の行で落ちてる 何故エラーになるのかと、とりあえず終了しないようにするには、どうしたらいい?
>>887 基本的な原因は、その前のnew()で失敗しているからでそ
なぜ失敗するのかとかはゲイツOSの休止状態を知らないのでわからん。
休止状態なのにスクリプトが勝手に動くというのが訳判らないんだよな 今休止状態なのか起動してるのかを安全に調べて、 起動するまでsleepする、みたいな処理はどう書いたらいいんだろう
厳密には休止状態じゃなくて、復帰後のログオン前の画面の裏で、 スクリプトが既に動いている
俺なら sleep 3600 を入れた無限ループにせず 3600秒ごとにタスクスケジューラで叩く。
ネットへのアクセス全般がエラーになるみたいなので、 安全なgetあたりで様子を見る、というのを思いついた でも、タスクスケジューラの方がよっぽどスマートだ
ちょっとお尋ねします
MySQL5を使うのにPerlをインタフェースにしようとしていて
use DBI;
@dbs = DBI->data_sources("mysql");
で、localhostのデータベース名を取得しようとしたんですが、何も代入されません
なぜなんでしょう?
もしかしたら、ものすごく単純なとこで間違えてるかもしれませんが
MySQLは5.0.81、Perlは5.8.9、DBIは1.6.7、DBD::mysqlは4.005
参考にしたもの:
http://dev.mysql.com/doc/refman/4.1/ja/perl-dbi-class.html
どういう時に必要なんだ?それ
896 :
893 :2009/05/22(金) 20:30:53
>>894 うーむ、なんか適当なメソッドだなー
試行錯誤の結果、
DBI->data_sources("mysql",{user=>$user,password=>$pass})
としたら、とりあえずうまくいきました
localhostのときは"mysql"だけでいいみたいな書き方だったけど、実は
そうじゃなかったみたいです
ありがとうございました
>>895 MySQLからshow databasesする代わりに、Perlのコマンドラインツールで
見れないかと思って
あ、コマンドラインツールじゃなくてワンライナーっていうんでしたっけ? 用語が適当ですみません
DBなんてMS Accessでおk
↑ 自分の世界しな知らない人
↑ 自分の世界しか知らない人
いちいち反応すんなよ それはそうと、ちょっと利口な事務のおねーちゃんがAccessでちょっとしたもの作っちゃってて びっくらこいたぜ。Accessの功績は大きいな。
うちの会社のねえちゃんだって、Excelでちょっとしたもん作ってるよ。 Excelの功績も大きいな。
俺の実のおねーちゃんだってawkでちょっとしたもの作っちゃってて そりゃもう大騒ぎよ。
AccessとかExcel馬鹿にするやつって視野狭くて頭堅そう まぁプログラマーって事務仕事しないんだろうけど・・・ あいつらはマジ強力
自分の世界しか知らない人
906 :
デフォルトの名無しさん :2009/05/23(土) 23:37:09
質問です。 Win32::OLEを使ってAccessのデータベース(***.mdb)を操作したいのですが、読み込みのところで困ってます。 ・やりたいこと クエリーPriceから@BrandIdが55のもの一覧を取得したい ・問題がありそうな部分(WHEREの付け方がおかしい?) $rs=$objDB->Execute("SELECT * FROM Price WHERE @BrandId = 55;"); ・このようにWHERE以降をカットするとエラーが出ません $rs=$objDB->Execute("SELECT * FROM Price;"); ・エラーの種類 Can't call method "EOF" on an undefined value at testr.pl line 26. Active Perl 5.10.0を使ってます。 よろしくお願いします。
>>906 >Can't call method "EOF" on an undefined value at testr.pl line 26.
26行目見ろよ
@BrandIdが変数展開されてる
909 :
906 :2009/05/24(日) 00:40:29
>>908 ありがとうございます。
@BrandIdの前にバックスラッシュを入れたところ、動いたようです。
910 :
デフォルトの名無しさん :2009/05/24(日) 01:23:19
perlで 年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、 わかりません。 例:2009年第2週→1/5〜1/11(週は月曜始まり)
911 :
デフォルトの名無しさん :2009/05/24(日) 01:24:34
perlで 年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、 わかりません。 例:2009年第2週→1/5〜1/11(週は月曜始まり) どのたか教えていただけませんでしょうか?
なんかそんなようなモジュールがあったような気がするな。 すぐ作れるなら自分で作る派だからよく覚えてないけど。 適当な算出方 (2009 - 1970) * 60 * 60 * 24 * 365; 2 * 60 * 60 * 24 * 7; (2 - 1) * 60 * 60 * 24 * 7; なんか世の中には4年に一回うるう年とかあるし、4年に一回ってその内のどこ?って感じだし、 100年に一回はうるう年ないとか、うるう秒とか、わけのわからんルールがいっぱいあってこれ以上は知りません。 運がよければ誰か偉い人が答えてくれます
月の終わりの方が5週じゃなくて次の週1週に繰り込まれたりするのは、 どう表現するんだ?
use Time::Local; for my $n (1..53) { print join(',',hoge( 2000, $n ))."\n"; } sub hoge { my ($y,$n)=@_; my $s=timelocal(0,0,0,1,0,$y)+((24*60*60)*(($n-1)*7-(localtime(timelocal(0,0,0,1,0,$y)))[6]+1)); return map{sprintf("%d/%d",(localtime($s+($_*24*60*60)))[4]+1,(localtime($s+($_*24*60*60)))[3])}(0..6); } こんな感じかな?
<?php foreach (range('a', 'z') as $letter) { print $letter; print "<br>"; } ?> こういうことができるのが、PHPのすごいところ。 おなじことをperlでやったら、 「正規表現を駆使した渾身の一作」 で、何十行書かないといけないことやら。
>>915 perl -e 'print "$_<br>" foreach('a' .. 'z')';
で何か不都合があるの?
何か似たようなのを見たことあるなと思ったら
>>459 あからさまにレベルが低すぎるからPHPを貶めるためにわざとやってるんだと思いたい。
ただの釣りだろ 本人は全然おもしろくないことに気づいてないようだが
921 :
初心者 :2009/05/24(日) 22:45:39
すいません 教えてください my ( $hoge ); みたいに変数を()で囲むのはどういう意味があるんでしょうか?
my ( $hoge, $hogege, $hogegegege ); みたいにできる
923 :
初心者 :2009/05/24(日) 22:56:07
>>922 ありがとうございます
ググってもなかなか出なくて困ってたんですよ
925 :
名無し秀鵬 :2009/05/25(月) 00:39:27
$page = '1989/09/27'; my ($hoge) = $page =~ /^(\d+)/g; 見つかった中身が $hoge が入る my $hoge = $page =~ /^(\d+)/g; 見つかった個数が $hoge に入る まとめて宣言したいなら () 付き。 ただし、似た用途同士でまとめとかないとぐちゃぐちゃになって、 可読性が低下するので注意です 1つだけ宣言したいなら () 無し。 って感じでしょか By 中級になれない者より
926 :
デフォルトの名無しさん :2009/05/25(月) 01:05:04
おしえてください。 ディレクトリの所有者、パーミッションを調べるにはどうしたらよいでしょうか。 ファイル情報はいろいろ出てくるのですがディレクトリ情報はみつかりませんでした。 どうかよろしくお願いします。
928 :
デフォルトの名無しさん :2009/05/25(月) 02:02:09
>>927 さっそくありがとうございました。
ファイルもディレクトリも一緒なんですね。
ふぅ
use base qw(Package) のqwって何でつけるの? qwが配列化ってのまでは調べたんだが、 パッケージ名を生で書くとスペース区切りのリストが帰ってきたりするの?
>>929 四行目が何を言ってるかわからないけど、
継承元が複数あるってことが納得できないってこと?それともPerlの文法的な話?
例えば、
our @ISA = qw( Foo::Bar );
だったら納得いく?
>>931 ありがとうございます。
質問の仕方が悪かった。ごめんなさい。
そもそも
use base が具体的にどういう仕事をしてるのかよくわかってなくて、
そこら辺をあわせて知りたかったんだ。
ISAでググってみた感じだと、
つまりuse baseで指定したパッケージ内で宣言された関数を
自パッケージからも使えるようにするってこと?
ってことは、
use base qw(Foo);
は
use base (Foo::A, Foo::B);
みたいなものだと理解すればいいの?
use base ("Foo");
>>932 Foo::BarAとFoo::BarBは、まったく別のクラスなんだから、Fooだけでどちらも継承とかは出来ないよ
というより、Fooというのも、存在するならばクラスなわけだし。
あんまり難しく考えず、継承というのは複数のクラスから出来るものなのだから
一個でも複数でも指定できるようにしている
ってことで理解した方がいい。
コンテキストで配列かリファレンスか判断する、なんて処理を実装してるような言語なんだし。
あ、ここまで書いてて、
>>932 の勘違いした一つの理由がようやく分った。
(A, B, C, D) という書き方と、 qw(A B C D) という書き方はまったく同一だよ
qw|A B C D| でもいいよ。qw/A B C D/でもいい。
ようするにqwってのはスペース区切りでカッコ内を配列にするってだけ。
935 :
おしえてください。 :2009/05/25(月) 12:38:42
Catalyst、DBIx::Classを使用して全文検索を実装しようとしているのですが、
ttp://asakura.g.hatena.ne.jp/asakura-t/comment?date=20070405 ここに書いてあるようにやってもうまくいかない。
use SQL::Abstract::Fulltext::MySQL;
$rs = $rs->search({
-fulltext => {
-match => 'detail',
-against => $tag,
-boolean => 1,
},
});
とすると [SQL::Abstract::_where_op_in_hash] Fatal: unknown operator: -fulltext
と言われてしまう・・・
何が間違っているのでしょう?
>>934 qw(A B C)
と等価なのは
('A', 'B', 'C')
だろ?分かってると思うけど
Quote Whitespace か何なの略?
>>937 quote wordsだろ確か。
らくだ本くらい読んどけ。
またわざとマニュアルを見ずに当てっこするクイズゲームが行なわれていたのか。
誰がperlのマニュアル見るもんか。アフォくさ
教えて厨にはデタラメを教えてやれ
すいません。じぶんなりに調べてみたのですが、どうにもよく分からないので、 教えていただけるとありがたいのですが、 perlで日本語の複数の漢字(utf8)のデータが入ったファイルを読み込んで、 unicodeのコード番号をそれぞれ別ファイルに書き込むということは可能でしょうか?
944 :
デフォルトの名無しさん :2009/05/26(火) 09:25:34
Cygwinの上でPerlを動かしてるんだけどスレッドを使うとこんなエラーが出て必ず落ちます 2 [unknown (0x9A8)] perl 2328 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack) Segmentation fault (core dumped) CygwinとPerlのどっちに問題があるんでしょうか? そもそもPerlでスレッド使うのが間違ってるとか?
「問題の切り分け」 をしてみては? ネイティブのperlで短いコードを書いてテストしてみればわかるかも知れないやろ。
946 :
デフォルトの名無しさん :2009/05/26(火) 14:29:54
Perlのモジュールで、HTMLを再インデントするようなものってないですかね? CMSで吐き出されたコードをきれいに整形したいと思っています。 行いたいことは、 吐き出されたコードから、ホワイトスペースの削除 空行の削除 再インデント です。 どうかよろしくおねがいいたします。
正規表現を数行かけば出来る気がしなくもない
>>948 やってみれ。っつーかHTMLのタグ1個分の正規表現書いてみれ。
それだけで力尽きるからww
Cのマクロについて。 (1) 通常のassertマクロはリリース時には削除されるが、リリース時でも削除されないassertマクロの名前 (2) 与えられた文字列をエラーメッセージとして、強制終了するマクロの名前 お願いします。
952 :
950 :2009/05/26(火) 18:26:16
ごめん、誤爆した
数行の正規表現で何とかなるわけない。
まあ、ウェブブラウザはよくこんなにぶっ壊れたファイルをまともに表示できるもんだと思うね。
htmlが適当すぎるんだよな 書いても書かなくてもいい部分が多すぎ
ま、例によって、「詳しい人がちゃんとしたものを作ってくれるまで、 とりあえずこれで行こう」なものが永続化しちゃったものですから〜
とりあえずこれで行けばそれで良かったのに、 不満が生じて新たな機能を盛り込む方法が強引だから、どんどんおかしくなった どうせ人間が手が書いたりなんかしないし、という前提もある
>>957 それはない。昔はみんな手で書いてたし、その頃から
HTMLはおかしくなってた。
HTMLはマークアップ言語だという前提を完全に無視して
シェア獲得のために独自拡張を競ったNetscape社とMicrosoft社が主犯格。
SGMLからつまみ食いしたからだお
>>959 いや、HTMLをSGML準拠にしようとする試みはずっと続けられてきた。
ただNetscape社とMicrosoft社は完全にこれらを無視。今に至る。
まあ、標準化されたものが実用を無視したものだったから仕方なかったのだけれども。
XML+XSLで作ると、とっても美しい
ネスケとかIEの独自拡張は使うべきか使わざるべきか、迷ったよね tableタグとか便利なんだけど規格に無いし・・
別にMSだけの責任じゃない。CSSの普及が遅れたのはネットスケープの責任だし、ブラウザが有料のままだったら、インターネット自体の普及が大きく遅れただろう。
tableタグだけだと細い罫線が書けないのでそこだけcssに頼ったり、もう手の付けようがない
>>963 誰一人としてMSだけを責めていない罠。皆両方悪いと言うておる。
###################################### #!/usr/bin/perl open(IN,"test.txt"); while(<IN>){ @data = split(/[\s+]/, $_); print "$data[0],$data[1],$data[2]\n"; } close(IN); ####################################### #test.txtの中身 1 2 3 4 5 6 10 11 12 13 14 15 ###########
>>966 のスクリプトを用いてカンマ区切りで数字を出力したいのですが、
splitを使っての区切り方がわかりません。
test.txtは桁数をそろえてデータが格納されており、
(test.txtは1行目と2行目の先頭に1個の空白があり二個の空白で数字が区切られている。
3行目と4行目は1個の空白で区切られている。)
>>966 のスクリプトでは出力が以下のようになってしまいます。
,1,
,4,
10,11,12
13,14,15
この出力を
1,2,3
4,5,6
10,11,12
13,14,15
としたいです。
ちょっとあせってて日本語になっていないかもしれませんが
よろしくお願いします。。
while (<IN>) { $_ =~ s/^\s+//; my @data = split /\s+/, $_; print "$data[0],$data[1],$data[2]\n"; }
>>968 ああなるほど!!
ありがとうございます!!
#!の構文って、1行目にないと効かないのでは
>>967 別解
#!/usr/bin/perl -w
print join(',', split), "\n" while <DATA>;
__DATA__
1 2 3
4 5 6
10 11 12
13 14 15
省略された暗黙の変数は多用すべきではないかと
置換すりゃいいのに
この人、置換です
>>972 ワンライナーに多用も何もないだろ。このくらいは充分許容範囲だと思うが。
別に使ってもいいじゃん
ループ文で他に変数がなければむしろ積極的に使うがな。
むしろ、いかに変数を減らすかに努力する
perlからwindowsにポップアップでメッセージを出す、みたいなことをする外部ツールって無い? $ans = system("bin/popup.exe $mes"); みたいにして使う感じの
grepとかm/( )/とかで文字列を見つけると、それはリストで帰ってくる どうせ1つだと判っている時に、 ($tmp) = みたいに一旦リストで受けたり、 ( )[0] みたいに全体を括弧でくくるのがなんか嫌だという時、 先頭の要素のスカラーとして評価させる書き方って無いのかな shift?
>>979 そのpopup.exeがどういうのか知らんが、メッセージを表示するだけ(入力なし)なら
$ans = system("msg.exe * $mes");
おお、標準コマンド ぜひ入力付きで実装して欲しかった > ゲイツ
winAPIのモジュールなかったっけ?
win32::のを使うと、何でもできるけど、何をするにも長くなるからなあ プロンプトを表示して文字列一つ入力させて帰ってくるだけの簡単な外部ツールくらい、 delphiあたりでマウスだけで1分で作れそうなものなのに 意外と作ってる人がいない
じゃあ、オメエが作れよ。 あんま、言いたくない台詞だが、さすがに言いたくなった。
Tkでええんちゃうん
>>984 やったな!! ヒーローになるチャンスじゃん!!
そんなことより次スレ
素直にC#で.NET使った方がいい
正規表現について3つ質問があります。 (1) <td width="35%" align="right"><div style="font-size:12px">37台</DIV></td> <td width="35%" align="right"><div style="font-size:12px">400円</DIV></td> <td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td> <td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td> このHTMLタグから「37」「400」「1076」「27」という4つの値を取得するにはどのようにすればよろしいでしょうか? 単位(台、円、個、1/)は無視です。 (2) <img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td> <img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td> <img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td> 同じく、src=の後のURLを取得するにはどのようにすればよろしいでしょうか? (3) (2)の「129900905271010」の部分は、6〜11桁目が年月日で、12〜15桁目が時間になっています。 この年月日と時間を取得したいのですがどのようにすればよろしいでしょうか…? また、取得後に「年」はYYではなくYYYYの4桁に変換したいのですが… 桁数などは固定になっており、変動する部分は各数値です。 2日ほど前からPerlを使用し始めたばかりで、いまいち正規表現というものが理解できない状態です… 申し訳ありませんが、どうかよろしくお願い致します。
>>990 (1)
規則性が無いようだから、個別に抜くのがよいのでは
$dai=$1 if /(\d+)台/;
$yen=$1 if /(\d+)円/;
$kosu=$1 if /(\d+)個/;
$bunbo=$1 if /1\/(\d+)/;
>>990 my $str = <<'EOS';
<td width="35%" align="right"><div style="font-size:12px">37台</DIV></td>
<td width="35%" align="right"><div style="font-size:12px">400円</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1076個</DIV></td>
<td width="40%" align="right"><div style="font-size:12px">1/27</DIV></td>
EOS
while ($str =~ m|(?<=>)([^<]+)(?=</DIV>)|g) {
my $num = $1;
print $num =~ /^([0-9]+)[^0-9]*\z/ ? "$1 (単位)\n"
: $num =~ /([0-9]+)\z/ ? "(単位) $1\n"
: "無し\n"
;
}
print $str = join("\n", <<'EOS' =~ /\bsrc="([^"]+)"/g) . "\n";
<img src="imgview.cgi?p=129900905271010/IMG090527/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905280910/IMG090528/E/IAD0826M.PNG"></td>
<img src="imgview.cgi?p=129900905291900/IMG090529/E/IAD0826M.PNG"></td>
EOS
while ($str =~ m|\?p=[0-9]{5}([0-9]{10})/|g) {
my @date = $1 =~ /[0-9]{2}/g;
printf "%d年%d月%d日 %d時%d分\n", $date[0] + 2000, @date[1..4];
}
993 :
990 :2009/05/29(金) 22:34:06
>>991 >>992 レスありがとうございます。
共に動作確認致しました。
今回は、
>>992 の方法を取らせていただきます。
あと、もしよろしければ、今回のパターンの「m|(?<=>)([^<]+)(?=</DIV>)|g」のご説明をお願いできませんでしょうか?
「m|\?p=[0-9]{5}([0-9]{10})/|g」の方はなんとなくわかったのですが、上記のパターンがいまいち理解できません。
動作は正常動作するので問題ないのですが、お手数でなければご教授していただけませんでしょうか?
度々申し訳ありませんがよろしくお願い致します。
>>993 いくらなんでも自分で調べりゃ分かる事だぞ・・・
「Perl 正規表現」で検索くらいはしたんでしょうね?
995 :
992 :2009/05/30(土) 00:05:56
996 :
990 :2009/05/30(土) 01:11:50
>>992 ご説明ありがとうございます!
正規表現は難しい(ややこしい)ですね…慣れるまで時間がかかりそうです…
でも、分解していけばなんとなく分かってきたような気がします。
'>'は記号文字'>'が含まれ、
'([^<]+)' は記号文字'<'以外の文字にマッチし、
'</DIV>'はそのまま'</DIV>'にマッチする。
繋げると、
'>'にヒットし、'<'以外の1文字以上の文字にマッチして、'</DIV>'で終わる
という文字列にマッチするという感じですね。
結果、'>abcdef</DIV>'というような文字列にマッチする感じですね。
色々と調べてはいたのですが、複雑で理解にかなり時間がかかりました…
'|'は、'/'が本来では正規表現の書式(?)そのものに使用されるものですが、
'</DIV>'に、'/'が使用されているので'/'の代わりに'|'を使用するという情報にたどり着きました。
|を使用しない場合は m/>([^<]+)<\/DIV>/g という感じになると思います。
(間違っていれば指摘お願いします;)
この度は、とてもよい勉強になりました!
どうもありがとうございます。
997 :
デフォルトの名無しさん :2009/05/30(土) 06:16:42
1000 :
たまご ◆EGGMAN.HlI :2009/05/30(土) 11:08:53
1000ならぱにぽにだっしゅ!二期
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。