"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html ● 2006/12/21現在の最新版: 5.8.8
● 2006/12/21現在の開発版: 5.9.3
前スレ
Perlについての質問箱 28箱目
http://pc8.2ch.net/test/read.cgi/tech/1162273941/ リンク集は
>>2-3 過去スレは
>>4
6 :
◆TWARamEjuA :2006/12/21(木) 22:56:34 BE:4574276-BRZ(6677)
(´-`).。oO(「埋め」やっているやつは石器時代の人間か?)
ごめんね、おかあさんじょーくでquineかきこんだから、ごめんね
前スレ
>>985 一応答えておきましょう。2変数の値の交換。
($x, $y) = ($y, $x)
で$xに$yの値を代入して、$yに元の$xの値を代入
if ($x < $y) { ($x, $y) = ($y, $x) }
で、$xのほうが小さかったら$yと入れ替える。つまり$xのほうが大きくなるようにすると言う意味。
>>7 1000まで無駄なく使う、ってわざわざ言わなきゃわからないのか?
スレ隔てると中途半端になりそうな気もするがね。
C/C++も、Javaも、Rubyも、Pythonも宿題スレがあるんだな。 だから空気の読めない初心者が混ざるのか。
ちゃんと問題そのものを載せてくれるとまだ良いんだけどな
>>11 質問箱なんだから初心者が来るのは構わないんだけど結局
>>12 の言うとおりじゃない?
問題そのものを載せないのもそうだが コードが動かないときに自分の思いこみでコードの一部分だけ切り出して貼ったり 途中までやったけど分かりませんって書いて コードは一行もなかったり
@t=($x=1,$y=2,$z=3); $w=($l=@t)**2; {$j = 0;while(1){$i=0;while(1){@t[$i,$i+1]= ([$t[$i]=>$t[$i+1]]->[$t[$i]<=$t[$i+1]]=>[$t[$i+1]=>$t[$i]]->[$t[$i]<=$t[$i+1]]); last if$i++==$l;}last if$j++==$w;}} print "@t";
>>1 乙
my @in = qw( 4 2 6 ) ;
my @new ;
for( 0..$#in ){
my $min = $in[0] ;
my $ind = 0 ;
for (0 .. $#in ){
if ( $min > $in[$_] ){
$min = $in[$_] ;
$ind = $_ ;
}
}
push @new, $min ;
splice @in, $ind, 1 ;
}
print @new , "\n" ;
>>14 なんかエラーがでます。
そのエラーを貼れよ!!
○○ if △△ の形の条件分岐とかって使ってる? 俺は使ってないんだが。
next ifとreturn ifは使う
elseを伴わない場合で処理が1行ならほぼ間違いなく使う。
21 :
デフォルトの名無しさん :2006/12/23(土) 00:12:52
すいません、ちょっと質問です。 jcode.pm で、文字コードを自動判定させると なんか時々変な判断しませんか。 #別に半角カタカナは使ってはいません。 例: $szName = Jcode->new("ほげほげ")->euc; ・・・・・たっぷりと文字列処理 print Jcode->new($szName)->sjis; # あれ? なんか化けてる。 $szName = Jcode->new("ほげほげ".'sjis')->euc; ・・・・・たっぷりと文字列処理 print Jcode->new($szName,'euc')->sjis; # うん、これならOK. でも引数が多いのは嫌ですね。
そもそも、バイト列の並びから文字コードを確実に判定する方法なんてないですよ。
だよね 可能なら自動判定は避けるべき 漢字一文字だと一部の漢字は自動判定できないし cgiの場合なら入力時の漢字コードは決まっていると思うので、元の漢字コードを指定しましょう
24 :
18 :2006/12/23(土) 01:44:44
結構みんなバラバラなのね。うちの周りだと使ってる人がほぼゼロだった。 純粋なPGがいないからかもしれないが。
25 :
デフォルトの名無しさん :2006/12/23(土) 01:51:22
関係ないですが $sql = "select from T_hogehoge where (判定='A')"; てのを書いてて、「あ、右端に顔文字・・・・」と思ってしまいますた。 ・・・・余談でつ。
>>18 あまり複雑な条件では使わない
my $fh = new IO::File ">hoge";
return undef unless defined $fh;
とか
$str .= "hoge¥n";
$str .= "moge¥n" if $flag;
return $str;
とか
>>26 後者は同意だけど、前者は
my $fh = new IO::File ">hoge"
or return;
と書くおいら
perlstyleに言及があるとおり、場面に合わせて読みやすいであろう方を選択だよね。
ソースのインデント増やしたくないから積極的に 利用する(ある意味 next とかの積極利用なんだけど )
PBPに while ( <> ){ next if !/^(\S+)\s+(\S+)$/ ; #ここで$1, $2 の処理をする } みたく書いてあったときはある意味衝撃だったw ええ知らなかっただけですともorz...
\ を一々 \ に変えてる奴って頭おかしいの?
Vistaになればみんなそうなるのかな?
34 :
デフォルトの名無しさん :2006/12/23(土) 16:33:52
useしたモジュールで発生する"Use of uninitialized value"エラーを出力させたくないのですが、 どのようにしたらよろしいでしょうか? モジュールには手を加えたくないのですが。。
perl -w を使わずに use warnings すればいいんじゃね?
36 :
34 :2006/12/23(土) 17:21:35
>>35 質問文が分かりにくくてすみません;
#program start
use hogehoge 'hoge';
print hoge('unko');
#program end
例えば、上記のプログラムを実行して標準出力に出力される、
"Use of uninitialized value in %s at hogehoge.pm line 30."
というエラーの出力を止めたいのです。。
>>36 つまり何か。hogehogeモジュールがその中でwarningsプラグマを有効にしているにも拘らず、
正常な処理の範囲内でundefinedな値のチェックを怠っていて、しかも、
他の人が作ったモジュールだから触るわけには行かない。とそういう状況なわけか。
38 :
34 :2006/12/23(土) 18:01:53
レキシカルな特殊変数に干渉する方法がわからん… 一応、思いついたDirty Hack二通り 1. BEGIN { local *warnings::import; require hogehoge; import hogehoge 'hoge'; } 2. { use IO::Null; tie local *STDERR, 'IO::Null'; print hoge('unko'); }
いったんhogehogeにパッケージ切り替えてno warnings 'uninitialized';したら? use hogehoge qw/hoge/; package hogehoge; no warnings qw/uninitialized/; package main; print hoge('unko'); 試してないからわからん。
表示されなければいいのなら$SIG{__WARN__}を定義して横取りする手もある。 The routine indicated by $SIG{__WARN__} is called when a warn- ing message is about to be printed. The warning message is passed as the first argument. The presence of a __WARN__ hook causes the ordinary printing of warnings to STDERR to be sup- pressed.
42 :
34 :2006/12/23(土) 23:26:18
>>39-41 ありがとうございます _ _
>>39 さんの1の方法を使わせていただきました。
>>40 no useは地の文での解釈となってしまうようでした。
perl で PDFからテキストコンバータしたいんだけど、そんなモジュールってある?
CPANでそうやってけんさくするのか。 ありがとう。
WindowsのActivePerl-5.8.8.819-MSWin32-x86-267479.msiでインストールしたパッケージに Jcode.pmと新しいEncode.pmとEUCJPMSをインストールしようとしましたが、 Jcode.pm以外はインストールできませんでした。 Encode.pmの場合は NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80' Stop. NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\nmake.exe' : リターン コード '0x2' Stop. EUCJPMSの場合は NMAKE : fatal error U1077: 'C:\MSVSEE\VC\bin\cl.EXE' : リターン コード '0x80' Stop. このようになり、Makefileからmakeできませんでした。 ほかにインストールする方法はないものでしょうか。
「4の倍数」や「4で割り切れる」という条件は、どのように表したらよいのでしょうか?
50 :
46 :2006/12/24(日) 19:14:23
すいません自己解決しました。
vcのincludeやlibへのパスがうまく通っていなかったようです。
設定しなおしたらmakeできました。
>>49 ppmでやろうと思ったらそんなもんねーよとppmに怒られてしまいました。
51 :
47 :2006/12/24(日) 20:06:57
2で割り切れても50で割り切れない 上記のようなものはどう表示すればよいのでしょうか?
これはひどい
53 :
47 :2006/12/24(日) 20:25:26
事故解決しました
>>51 if(2で割り切れる? = はい){
if(50で割り切れる? = いいえ){
print "2で割り切れるけど、50で割り切れないよ。";
}
}
56 :
デフォルトの名無しさん :2006/12/24(日) 21:02:59
>>50 ppm では
search hoge* してからにすべし
Foo::bar というモジュール名は
経験上、ppm では install Foo-Bar の名称で指定することが多し。
<ちらしの裏>
追記すると、最新の ActivePerl (Win32) では
ppm だと GUIウインドウが開く。
ppm-shell だと、従来通りのコマンドライン版が起動する。
</ちらしの裏>
perlって何を造るための言語なんだ? 結局はWeb関連だったらツマランわ
聖夜釣ですか
Spreadsheet::WriteExcelでは既存のファイルを開けないことが判明orz VBAコードを仕込んでおきたかったんだけど、なんかうまい方法はないでしょうか。 Linuxサーバ上でやりたいため、WIn32::OLEという解は使えません…。
>>57 Perl is a programming language for getting your job done.
61 :
デフォルトの名無しさん :2006/12/25(月) 18:56:23
すみません。どなたか教えてくださいませ。 コード値を文字にしたいのですが、日本語はどのようにしたらよろしいのでしょうか? chrは2バイト文字はだめってのはわかったんですが。 ちなみにシフトJISのコードを変換したいです。 例 0x82A0 → あ
62 :
デフォルトの名無しさん :2006/12/25(月) 19:17:21
$str = pack("H*","82A0");
63 :
61 :2006/12/25(月) 19:22:37
>62 ありがとうございます! packの奥は深いっすね〜 もっと勉強します!
64 :
デフォルトの名無しさん :2006/12/25(月) 21:15:28
今日からオライリーのPerlの本で勉強始めます。 来月から仕事で使いそうなんで・・・
ここは俺の日記帳だからお前は日記を書くな
chomp
68 :
デフォルトの名無しさん :2006/12/26(火) 03:21:37
質問 文字化けする理由を教えてください。 スクリプト ------------------- $str="あー"; print $str; print "\n"; $tmp="−"; $str =~ s/$tmp//g; print $str; -------------------- 実行結果 -------------------- あー あ[ --------------------
69 :
68 :2006/12/26(火) 03:24:04
追記 環境Windowsで.plファイルのエンコードはShift-JISです。 実行結果はコマンドプロンプトでの実行結果です。
− = 81 7c | = 7c より、$str =~ s/$tmp//g;は $str =~ s/(文字コード81)|//g;とPerlに解釈されています。 つまり、$str内の文字コード81か、空文字にマッチングしそれが削除されます。 あー = 82 a0 81 5b内の81を削除すると82 a0 5bとなり これをShift_JISで表示すると[ = 5bよりあ[となります。
71 :
68 :2006/12/26(火) 04:50:18
>>70 丁寧な解説ありがとうございました。
$tmp="−";
$str =~ s/$tmp//g;
を
$str =~ s/\x81\x7c//g;
とすることによって解決できました。
72 :
デフォルトの名無しさん :2006/12/26(火) 10:26:52
そうくるかw
Perl4時代の息吹を感じました。
74 :
デフォルトの名無しさん :2006/12/26(火) 16:00:24
すみません、CPANにあるHTML::TableExtractについての質問です。
http://search.cpan.org/dist/HTML-TableExtract/lib/HTML/TableExtract.pm ↑のREGULAR METHODSにあるdepths()メソッドの文字を変数に代入したいんです。。
然るべき手順を踏んで、
print $te->depths();
するときちんとdepths()メソッドの文字が表示されるのですが、
my $test = $te->depths();
print $test;
すると"Use of uninitialized value in print"というエラーが出てしまいます。。
全く訳が分からず打ち間違えを確認したりして同じ事を何回も繰り返したりしたのですが、
訳が分からないです。。どなたがご助言お願いいたします _ _
>>66 r;ァ'N;:::::::::::::,ィ/ >::::::::::ヽ
. 〃 ヽル1'´ ∠:::::::::::::::::i
i′ ___, - ,. = -一  ̄l:::::::::::::::l
. ! , -==、´r' l::::::/,ニ.ヽ
l _,, -‐''二ゝ l::::l f゙ヽ |、
レー-- 、ヽヾニ-ァ,ニ;=、_ !:::l ) } ト
ヾ¨'7"ry、` ー゙='ニ,,,` }::ヽ(ノ 2ちゃんはみんなの日記帳だから
:ーゝヽ、 !´ " ̄ 'l,;;;;,,,.、 ,i:::::::ミ
::::::::::::::::ヽ.-‐ ト、 r'_{ __)`ニゝ、 ,,iリ::::::::ミ
::::::::::::::::::::Vi/l:::V'´;ッ`ニ´ー-ッ-,、:::::`"::::::::::::::;゙ , な!
:::::::::::::::::::::::::N. ゙、::::ヾ,.`二ニ´∠,,.i::::::::::::::::::::///
:::::::::::::::::::::::::::::l ヽ;:::::::::::::::::::::::::::::::::::::::::::/ /
::::::::::::::::::::::::::::::! :|.\;::::::::::::::::::::::::::::::/ /
76 :
74 :2006/12/26(火) 16:04:22
ごめんなさい。配列型で返ってきてました。。
>>73 use utf8を使えば文字を直接置換できるかな?
78 :
デフォルトの名無しさん :2006/12/26(火) 16:43:49
パール無図杉
すみません、質問があります。 WindowsのActive Perl v5.5.8です。 UTF16の日本語ファイルを開いて処理させようとすると 処理結果のテキストが文字化けしてしまいます。 Shift JISとUTF8形式だと問題なく処理できるのですが…。 UTF16でうまく処理できる方法はないでしょうか?
>>80 シフトJISのファイルを扱うとき、
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
binmode STDIN, ":encoding(cp932)";
use open IO => ":encoding(cp932)";
とか書かなかった?
cp932 を例えば、UTF-16LE に変えれば済むことと思われるが。
>>80 前スレがまだ残っているので、前スレ 694 からの流れを参照。
対策としては、前スレ 703 のリンク先にある方法が無難だと思う。
>>81 さん
シフトJISのときは何も指定せずにいけました。
>>82 さん
ありがとうございます。
明日頑張ってみます。
Activeperl でタイムアウトを指定してホスト名を逆引き(gethostbyaddr) するプログラムを書いています。タイムアウトした場合にはIPアドレスを 返そうと思います。そこで以下のようなサブルーチンを書いたのですが、 タイムアウトしません。古いActiveperlではalarmがないとの情報があった のですが、sleep行で確認した所、5.8.8では問題ないようです。 お知恵を拝借頂ければ幸いです。 sub resolv_host { my ($ip)=@_; my $timeout=2; my $host; $SIG{ALRM} = sub { die 'TIMED OUT' }; eval { alarm($timeout); # ホスト名を逆引きする。 #sleep 5; $host = gethostbyaddr(pack("C4", split(/\./, $ip)), 2); alarm(0); }; alarm(0); if ( $@ =~ /TIMED OUT/ ){ $host = $ip;} return ($host); } ※実行環境は以下の通りです。 Windows XP SP2 Activeperl 5.8.8
Net::DNS を利用するのはいかがかしら?
他所様のサーバの混雑具合を調べるプログラムを書こうとしています。 use IO::Socket; my $sock = IO::Socket::INET->new( PeerAddr => $ip, PeerPort => $port, Proto => 'tcp', Timeout => $TIMEOUT, ); if ($sock) { #接続成功 } else { #タイムアウト } 今現在のコードがこんな感じでして、繋がる繋がらないは分かるのですが、 接続に要する時間を調べたいもののその方法がわかりません。 SOCKETを触るのが今回初めてでして、 そもそもにおいて根本的な過ちを犯してる場合はそちらも併せて、 何かよい方法がありましたら、ご教授いただけると幸いです。
普通に前後で現在時間を求めて引き算すればいいのでは?
>>85 ありがとうございました。
sub resolv_host {
use Net::DNS;
my ($ip)=@_; my $timeout=2; my $host;
my $res = Net::DNS::Resolver->new(
tcp_timeout => $timeout, udp_timeout => $timeout
);
my $query = $res->query("$ip");
if ($query) {
foreach my $rr ($query->answer) {
next if $rr->type ne "PTR";
$host=$rr->ptrdname;
}
}
else { $host=$ip; }
return ($host);
}
@a = grep /^http/, split / /, $str;
@a = $str =~ /(?:^| )(http.*?)(?: |$)/g;
>>55 >>56 遅くなりましたが、ありがとうございました。
レポジトリを追加したらだいぶ便利になりました。
パッケージをダウンロードしてきてそのまま追加することもできるようになりました。
「後ろにtringが続かないs」を「z」に置換する方法は次の2つ以外にありますか? s/s$/z/; s/s([^t])/z$1/g; s/st([^r])/zt$1/g; s/str([^i])/ztr$1/g; ... s/string/(あり得なさそうな文字列)/g; s/s/z/g; s/(あり得なさそうな文字列)/string/g;
>>94 先読み否定。色々仲間があるので詳細はperlre参照。
s/s(?!tring)/z/g;
96 :
デフォルトの名無しさん :2006/12/28(木) 21:14:01
任意の精度の数値演算したいんですけど、 どうすればいいでしょうか?
あ、Math::BigFloat モジュールってのがありました すいません m(__)m
FTPプロトコルでリモートにファイル転送するスクリプトを作ってるのですが ローカルとリモートで同名だけどリモートの方がファイルサイズ小さい場合 差分のみ転送にしたいのですがレジュームはどうやればできますでしょうか? perldoc Net::FTP でresumeをキーに検索したのですが見当たりませんでした。 よろしくお願いします。
100 :
99 :2006/12/29(金) 08:20:07
どこまできちんと届いているかは、クライアントしか知らないから、 レジュームって普通クライアントから要求するようになってると思うよ。
>>100 Net::FTPだったらputじゃなくてappendにしないと上書きされちゃうよ
>>101 99は具体的なやり方聞いてるのにそんな回答しても意味ネェだろw
103 :
デフォルトの名無しさん :2006/12/29(金) 12:03:50
Perllこついての質問箱?
104 :
デフォルトの名無しさん :2006/12/29(金) 12:08:27
Jcode::CP932 Encode::EUCJPMS をインストールした後 use Jcode::CP932とするとエラーになってしまいます。 エラー内容 Jcode::CP932 is not an object at (eval 2) line 234 Jcode::AUTOLOAD('Jcode::CP932', 'sjis', 'cp932', 'euc', 'cp51932', 'jis', 'cp50221', 'iso_2022_jp', 'cp50220', ...) called at c:/usr/local/site/lib/Jcode/CP932.pm line 39 main::BEGIN() called at c:/usr/local/site/lib/Jcode/CP932.pm line 0 eval {...} called at c:/usr/local/site/lib/Jcode/CP932.pm line 0 Jcode.pmのAUTOLOADでconfessしてるっぽいんですが、何故動かないのでしょうか? ちなみにWinXP、ActivePerl 5.8.7.813です
105 :
SONY :2006/12/29(金) 15:18:48
GK涙目wwwwwwwwwwwww
108 :
デフォルトの名無しさん :2006/12/29(金) 17:17:46
なあ、次スレからテンプレートにこれを追加しない? 実は、オレもJperl から Active Perl に移行するとき、 これが解るまでかなり時間がかかった覚えがあるんだけど。 --------------------------------------------------------- # 【Perl 日本語処理の基礎の基礎】 # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま(シフトJIS形式の)ソースファイルに保存して下さい。 # 入出力ともシフトJIS形式のファイルまたはDOS窓を想定しています。 # 文字コードの条件が異なる場合には編集が必要です。 # 編集の仕方はご自分で勉強するか、このスレで質問して下さい。 # まず、以下の行を先頭に入れて下さい。 use encoding "cp932"; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # 次に、あなたが実行したい処理の内容を入れて下さい。 print "やあ!\n"; sleep(1);
use encodingは弊害がでかすぎるかと…。
>>110 >要するにhttp urlの正規表現が解ればいいわけね。
違うッスorz
(1)(2)だけなら $line =~ /(h?)(ttps?:\/\/[^ |^ ]+)/ で。。。
s{(h?(ttps?://[^\s ]+))}{<a href="h$2">$1</a>}g; ごめん、間違えた。
全角空白って文字クラスにそのまま放り込んで大丈夫なんかいな
115 :
108 :2006/12/29(金) 17:43:36
>>109 >>112 確かにね。
これから始める人なら、ソースはUTF-8に統一して
もらったほうがいいかもね。これでいいかな?
---------------------------------------------------------
# 【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)";
# 次に、あなたが実行したい処理の内容を入れて下さい。
print "やあ!\n";
sleep(1);
116 :
109 :2006/12/29(金) 18:24:42
>>108 =115
乙!
WindowsのActivePerl初心者による
似たようなQ&Aの再生産を回避するために
テンプレートを設置しようというのはとてもすばらしいッス!
でも、
・テキストモードとバイナリモード
・ASCIIとマルチバイトコード
・日本でのマルチバイトコードは複数の種類が存在すること
・UTF-8以外でのマルチバイトコードの扱い
を理解してないと結局はすぐにつまづくと思う。
でも、これを丁寧に説明してるとテンプレートで紙面が足りないから
結局「
http:// 〜を読んで」、「binmode, Encodeでググると吉」
ってなっちゃうんだよね。。。
次ぎスレに115のテンプレを追加して様子を見るのがいいのかな。
両方うぜーよwebprogでやれ
118 :
109 :2006/12/29(金) 21:07:36
>>117 うぜぇのは同意だけど、ウェブはかんけぇねだろバーカw
レベル的に物凄く関係ありまふ
くだすれPerlだな
117のスルー力たんないからスレが荒れたな。 スルー力身につくまでおまえがROMるかwebprog行ってろ
>>104 Jcode.pmにパッチあててなくね?
するーかって何だよ スルメイカかよ
ゾーキャスラー力を思い出す流れだが、まぁ通じないだろう。
126 :
107 :2006/12/30(土) 00:21:53
>>112 ,113
できました!ありがとうございましたm(_ _)m
Срука
kent-web の sunbbs.cgi を改造しまくって使っています。 記事番号が奇数番号のときと偶数番号のときとで、 交互に違う情報を入れたいと思っているのですが、 perl で偶数と奇数を判別するのってどうやればいいんでしょうか?
%2
?
>>129 2で割った余りが0なら偶数、1なら奇数と判定すればOK
1 と and とって1ビット目が 0 か 1 かで判断してもおk
>>134 この程度のこともわからないのに
>kent-web の sunbbs.cgi を改造しまくって使っています。
なのか
巨大な数字ってどういうビット構造なんかな? $a = 234; if ( $a & 1) { print "奇数" } else { print "偶数" }
138 :
デフォルトの名無しさん :2007/01/02(火) 00:43:33
詳解 正規表現 をかったんだよお年玉で
139 :
デフォルトの名無しさん :2007/01/03(水) 10:43:45
WINDOWSの鯖でファイルが書き込み可能かどうかを判断するにはどうしたらいいんですか? WINDOWS鯖の場合だと if (-w $write_file_path) { print "書き込み可能\n"; }というプログラムがが使えないんです
141 :
デフォルトの名無しさん :2007/01/03(水) 11:20:32
>>109 >use encodingは弊害がでかすぎるかと…。
kwsk.
今まで、Jcode->new($hogehoge)->sjis; でちまちま変換していた者としては
use encoding という技は新味ですyo.
うるう年かどうかを判別するプログラムが課題で出ているのですが $y=1900; if($y %4==0){ print "$y is a leap year.\n"; }elsif(($y %4==0) && ($y %100==0)){ print "$y is a common year.\n"; }elsif(($y %100==0) && ($y %400==0)){ print "$y is a leap year.\n"; }else{ print "$y is a common year.\n"; } これで1900を$yに入れても、うるう年になってしまいます。 1900をcommon year.にするには、どうすればよいのでしょうか?
>>142 そういうのは400,100,4の順番に判定するんだよ
なんてほのぼのする質問だろう
正直に課題って言ったのも好感w
>>142 最初の条件 $y %4==0 が、「4で割り切れたら」だから、4で割り切れる数字は、
全てここで引っかかっちゃうよ。
(´・ω・)ヤサシス
なんでうるう年は4年に一回なのに400と100も判定にいれるの?
愉快なスレだな
use DateTime; my $y = 1900; if (DateTime->new(year => $y)->is_leap_year) { print "$y is a leap year.\n"; } else { print "$y is a common year.\n"; } こうですか? よくわかりません><
アッー!
しかし
>>142 にはモジュールを使ってはいけないなんて一言も(ry
まあ冗談だろうけど、実際に閏年の判定を書くとしたら
>>151 なんだよなぁ・・・。
でもデフォルトで入ってたっけ?
最新のactiveperlには入ってた。
4000年で割り切れる年も入れないとね。
つ 「このように広く普及するのであれば、もっとちゃんとした設計を施すべきだった」
そんなに長いこと使われないだろうと思って作ったソフトが2000年問題とかの原因になったんだよな 1993年使われ続けることも考慮しとくべきだな
sub is_leap_year { $j = shift() + 660; unless ($j % 4) { unless (($j - 660) % 100) { return 0 unless ((($j - 660) / 100) % 4); } return 1; } return 0; } どぞ。
だが、心配のしすぎではないか。
もうまもなく4000年になろうとしているのに4000で割り切れる年を閏年にすべきか否かは未だ意見の分かれるところだね。 地球の自転が遅くなるからとか言うが。小賢しい。
そういってy2kが問題になってたんじゃないか。 だいたい時間を1970/01/01 00:00からの32bit整数であらわすのも心配だな。やっぱり64bitはほしいところだ。
符号付 64ビット整数で紀元からのピコ秒数で数えることにすると紀元の前後300年弱しか表せない。
perl -e "print scalar(localtime(0xffffffff/2));" だと「Tue Jan 19 12:14:07 2038」って出るが perl -e "print scalar(localtime(0xffffffff/2+1));" だと何も表示されないな perlは普通にでかい値扱えるから localtime関数も符号付32bitの上限超えても平気かと思ってたがだめなのか
じゃあ紀元から符号付で128bitあれば足りるかな。
コンパイル時に指定してあげれば、、、@64bits
ピコ秒って光が30cmしか飛べないんだぜ。 原子時計の精度が1ピコ秒なんだぜ。 どうやって計るんだぜ?
>>171 10E-16sオーダの時間の計測に成功したっていうニュースなら見た気がするが。
不確定性原理からいくと、最小の時間単位は何だっけ?
プランク時間か?
当方perl初心者です。 全角スペースを半角スペースに置き換えたく、 ~s/\xA1\xA1/\x20/g としています。スペースの置き換え動作自体はするんですが、「ァー」や「ぁ!」などの文字列が文字化けするようになりました。 文字コードはEUCです。 コードを調べてみると「ぁ!」は A4 A1 A1 AA となっており、全角スペースと誤認してしまうようでした。 どのように解決したら良いのでしょうか、教えてください。
require 5.8.1; use encoding 'euc-jp';
178 :
デフォルトの名無しさん :2007/01/04(木) 23:50:19
179 :
176 :2007/01/05(金) 00:12:36
解決しました。ありがとうございます。
180 :
デフォルトの名無しさん :2007/01/05(金) 13:30:32
さんざんキシュツかもしれませんが、見つからなかったので質問。
Windows XP ActivePerl の環境で、system コマンドで呼び出したプログラムをバック グラウンド で動かしたい。どうすればよい? 例えば、スクリプトはこんな感じ。
---
my $IE = "c:\\Program Files\\Internet Explorer\\IEXPLORE.EXE";
system ($IE, "
http://www.hotmail.com ");
---
例えば、上記を test.pl としてセーブし、これを DOS 窓から呼びだすと、こんな感じでとまり、別プロセスとして実行してない。
---
C:\Documents and Settings\takasaks>perl e:/work/0my/scripts/test.pl
_
---
別プロセスで動かしたい、どうれすればよいのでしょうか?
system(1, ...); ActivePerl限定だった希ガス
日本語が得意なフランス人みたいな日本語だな。
183 :
180 :2007/01/05(金) 14:54:17
すげー。うまくいった。ありがとう。m(_ _)m
>>182 確かに今読み直すと変だね。
184 :
デフォルトの名無しさん :2007/01/05(金) 21:25:20
以前、(スクリプトが)短い掲示板がどっかに貼ってあったのですが検索しても見つかりません。 突然もう1度見たいのですが、どなたか知っている方居ませんか? 1行に出来るんだから行数関係ないっていわれそうですが6行くらいで、掲示板として機能していたPerlのプログラムでした。 2chのどこで見たんだったかなぁ、、
188 :
デフォルトの名無しさん :2007/01/06(土) 02:56:25
ダイス用のモジュールってありませんか? $s に 3d20+10 のような文字が入ってたら、20面ダイスを3回振って結果に10を足す、ような。 $s に複数入っててもちゃんと計算してくれるのが良いです。更に言うと 1d6+5-4 のように加算減算も複数扱えると尚良いです。 自作しようかと思ったら結構フクザツで・・・。
置換 + evalで出来るよと言おうとしたけどCPANに真面目なのがあったか。 CPANスゲー
191 :
188 :2007/01/06(土) 04:23:08
おおー、CPANにあるんですね! 最近 Perl と離れてたんですが、やっぱり便利だ! ありがとうございました。
正規表現で()を後方参照としてではなく、ただの括弧としてマッチさせたい場合どう書けばいいんでしょうか
(?:re)
(?:pattern) つperlre
おおぅ、それグループ化のみだと思ってました ありがとうございます
\( ではないのか
括弧としてマッチさせるには \( が正しいみたいです
お騒がせしてすみません
>>196 ありがとうございます
198 :
デフォルトの名無しさん :2007/01/06(土) 22:19:53
>>198 GNUプロジェクトによれば、首尾一貫性と均一性のためにperlと同じライセンス
(GPLとArtistic Licenseのデュアルライセンス)を適用することを推奨されている。
<blockquote cite="
http://www.gnu.org/licenses/license-list.ja.html ">
Perl のライセンス
このライセンスでは、Artistic ライセンス とGNU GPLのどちらかを選択できるとしています。
言い換えれば、あなたはこれらの2ライセンスのどちらかから選べるということです。
フリーソフトウェアのライセンスに要求される条件は満たしますが、本物のコピーレフトとは言えないかも知れません。
選択肢の一つとして GNU GPLがありますので、GNU GPLとは矛盾しません。
Perl 4 や Perl 5 用のパッケージを書く場合には、Perl プログラミングの世界における首尾一貫性と均一性を促進するために、
このライセンスを適用されることをお勧めします。Perl 以外の分野では、単に GNU GPL を使う方が好ましいので、
このライセンスを使わないよう強くお勧めします。
</blockquote>
が、好きなライセンスにすりゃ良いんじゃない?
ついでにperlmodstyleには
<blockquote>
Licensing
Make sure that your module has a license, and that the full text of it is included in the distribution
(unless it's a common one and the terms of the license don't require you to include it).
If you don't know what license to use, dual licensing under the GPL and Artistic licenses
(the same as Perl itself) is a good idea. See perlgpl and perlartistic.
</blockquote>
とある
修正BSDとかMITとかもあるけど。やっぱりGPL/Artisticのデュアルライセンスにしとくのがいいかな。
[1-9.]のみで構成される文字列を表示したいのですが if ( $text =~ "[1-9.]" ) { print "$text \n"; } だとうまくいきません。 どのように修正すればいいですか?
203 :
デフォルトの名無しさん :2007/01/07(日) 05:25:42
(?: って変数に入れないようにするやつでしょ?
print "$&\n" if $text =~/[1-9.]/;
文字列だった。すまん 一つだけなら /[1-9.]+/ すべてなら print(join(',', /[1-9.]+/g));
#!c:\usr/bin/perl ←だとアクセスできますが、 #!usr/bin/perl ←だとアクセ500のエラーがでます。 3時間探しましたが答えが見つかりませんでした。 よろしくお願いします。 os:win2000 webserver:apache 2.059 active perl
スラッシュ一個たんなくね? ×#!usr/bin/perl ○#!/usr/bin/perl
>>207-208 いろいろやっていくうちに"/"が消えてました。
やっとゴールにたどり着きました。ありがとうございました。
>>205 説明不足ですみません。
$text = "12:24" なら $textの表示そのものをしない
$text = "3.142" なら表示する
というような不要な文字が1つでもあれば
無視するといった感じのものが作りたかったのです。
よろしくお願いします。
$text =~/^[1-9.]+$/ and print "$&\n";
printのとこ、$textじゃなくてわざわざ$&で出力する意味あるの?
短縮。
>>211 無事作成できました。ありがとうございました。
2chのdatファイルを、差分で取得したいのですが、どのようにしたらよいのでしょうか?
If-Modified-Since と Range をつけて叩いて 206|304|416 のどれかをもらうようにする
217 :
デフォルトの名無しさん :2007/01/07(日) 14:11:53
package の中で、 sub func(\[$@]) { my $class = shift; my $arg = shift; } として、$arg に配列もしくはスカラのリファレンスを受け取りたいのですが、 $arg にはスカラしか入ってくれません。 どう書くのが正解でしょうか?
>>218 自分でちょっと試せばいいだろ
print "Matchn" if 'ABC' =~ /[.]/;
>>217 prototypeに頼らないのが正解。
そのprototype、第一引数について書かれてないけど。
ppmをつかってモジュールを持ってくるときに、zipで圧縮されてると展開方法を知らんとエラーが出てしまうのですが、 どうすればこのエラーが出なくなるんでしょう。
Archive::Zip入ってる?
手元だとzipアーカイブでもインストールできるなぁ。どこのリポジトリの何で発現してる?
>>225 ためしに再インストールしようとしたArchive::Zipで出てます。。。
何処のレポジトリかはどうやってわかるんでしょうか。
csvの一行目を検索して、二行目をprintするだけなんですが 「ー」を含む言葉だと検索結果で出力されません 「。」「・(半角)」「・(全角)」とか色々やったんですが、どうやら「ー」だけのようです 解決方法をよろしくお願いします open(IN,"$file"); while(1) { $line = <IN>; @data = split(/,/ ,$line); if ( $line eq "" ) { last;} if ( $data[0] =~ /$in{'test'}/ ) { print "$data[1]\n"; } } close(IN);
228 :
デフォルトの名無しさん :2007/01/08(月) 11:44:40
>>227 CSVファイルを扱うならば、Text::CSV をお使いください。
(Text::CSV_XS かもしれない、手元にソースがない)
>>228 返信ありがとうございます
Text::CSVモジュールを使わないと対処できないということでしょうか?
フリーのwebスペースを利用したいので、モジュールはインストール出来ないです
Text::CSV自体は優れものみたいですね
>226 えっと、ppmシェルで、 search Archive-Zip って入力して。 Searching in Active Repositories 1. Archive-Zip [1.18] Archive-Zip こんな感じに出てくると思う。仮に1番なら desc 1 って入力したときなんて表示されてる?
>>227 つShift_JISの罠
/\Q$in{'test'}\E/
Text::CSVはマルチバイト文字通ったっけ?
Text::CSV_XSでbinaryオプションを与えない駄目だったような記憶が
Text::CSVは0x09(Tab)と0x20(Space)から0x7e(Tilde)の範囲しか使えないね。 Text::CSV_XSでbinaryオプションつけないとダメだ。
>>231 返信ありがとうございます。おかげで解決することができました
ただ、「\Q」が「\Eまでのメタ文字をリテラルとして判断する」のは別ったのですが
「/$in{'test'}/」←これのどこにメタ文字があるのかが分らないです
解決はしたけど理解出来てない…
>>233 「$in{'test'}」自体がメタ文字を含むってことじゃなくて、
実行時に変数$in{'test'}にメタ文字を含むShiftJIS文字が入る可能性があるってこと。
>>234-235 かなり見当違いな考えをしてたみたいですね
「ー」以外にも注意しなければいけない文字が結構ありますね
ご丁寧にありがとうございました
238 :
デフォルトの名無しさん :2007/01/08(月) 17:32:10
>>227 おもったが、他の文字コードに変換してsplitするのはどうよ。
いちばんお手軽。
open(IN,"$file");
while(1) {
$line = <IN>;
$line=Jcode->new($line)->euc;
@data = split(/,/ ,$line);
if ( $line eq "" ) { last;}
if ( $data[0] =~ /$in{'test'}/ ) {
print Jcode->new("$data[1]\n")->sjis;
}
}
close(IN);
たまに思うのだが、単なる文字列のスカラを "$file" とかって、ダブルクォートで括って書くの無駄だよね。 全く同じ内容の、新しい文字列を生成してる訳でしょ? だったら単に $file って書いた方が効率良いのに。 KENTとか、どっかのサンプルでわざわざ括るようになってるのかな。 こういう書き方してる人が、どこで習ってくるのか知りたい。
>>239 あ、それ昔やってた。
なんかprint = ダブルクォート括らないと不安、みたいな気がしてたような。
#俺にも print $a, $b; #とすればいいところを print $a . %b; #としていた時代や print "$a$b"; #としていた時代があったなあ
カンマは直接に文字連結の意味じゃないから余り好きじゃないなぁ。。 そっちの方が速いんだけどね。
強制的に文字列コンテキストに変えたいときとか。 オブジェクトじゃなくてその文字列表現だけ保持したい場合とかあるでしょ。
245 :
244 :2007/01/09(火) 01:46:32
ちゃんと読んでなかった。スマソ
>>243 散々既出だが、一応突っ込んどく。カンマの方が遲い
use Benchmark ;
my ( $hoge, $moge ) = ( 'hoge', 'moge' ) ;
sub dot { print STDERR $hoge . $moge . "\n" ; }
sub dq { print STDERR "$hoge$moge\n" ; }
sub comma{ print STDERR $hoge , $moge , "\n" ; }
timethese ( 1000000, { op1 => 'dot', op2 => 'dq', op3 => 'comma' } ) ;
$ perl Bench.pl 2> /dev/null
Benchmark: timing 1000000 iterations of op1, op2, op3...
op1: 15 wallclock secs ( 7.67 usr + 4.81 sys = 12.48 CPU) @ 80128.21/s (n=1000000)
op2: 12 wallclock secs ( 7.37 usr + 4.67 sys = 12.04 CPU) @ 83056.48/s (n=1000000)
op3: 22 wallclock secs ( 9.13 usr + 11.23 sys = 20.36 CPU) @ 49115.91/s (n=1000000)
247 :
243 :2007/01/09(火) 13:10:54
>>246 初心者でゴメン。Windowsだから、nulに出力して実行してみた。
(Windows XP SP2 ActivePerl5.8)
Benchmark: timing 10000000 iterations of op1, op2, op3...
op1: 12 wallclock secs (11.02 usr + -0.02 sys = 11.00 CPU) @ 909173.56/s
(n=10000000)
op2: 12 wallclock secs (10.87 usr + 0.00 sys = 10.87 CPU) @ 919540.23/s
(n=10000000)
op3: 8 wallclock secs ( 7.02 usr + 0.00 sys = 7.02 CPU) @ 1425516.75/s
(n=10000000)
あれ?最初自分の考えでは関数を二回使ってるカンマの方が遅いと思ってたんだけど、
ベンチしたらドットの方が速いんで
>>243 を書いた。
なんで結果違くなっちゃうのか誰か教えて〜。
248 :
243 :2007/01/09(火) 13:29:23
あー、わかった。Perlでの出力処理はcommaの方が速いけど、
systemのIOでのオーバーヘッドで結果的にdotの方が速いという寸法か。
>>246 Windowsで実際にファイルに出力して計測してみると大体同じ(わずかにcommaが速い)になった。
ここらへんはLinuxとWindowsで違うんだろうね。
>>246 うんにゃ。
8Bのメモリ確保なら大してコストかからんからサンプルとして不十分じゃないか?。
$hogeが十キロの単位になってくるとカンマが追い抜くんじゃないだろうか。
>>248 いや、
>>246 はSTDERRに出力してるからカンマ区切りが遅くなっているだけ。
STDERRはperl内部でも特別扱いされていて、カンマで区切られた要素毎に fflush される。
なので、STDERRへ出力する場合はカンマ区切りの方が(fflushの増える分だけ)遅くなる。
他のハンドルだと($|=1でも)、普通はカンマ区切りの方が速くなる。
えっちだから遅いんだね。
252 :
デフォルトの名無しさん :2007/01/10(水) 15:25:22
フリーウェアのソースを眺めてると、一つのファイルにやたらと機能を詰め込んでるのが 多いように感じるんだけど、これってどうなんだろう。 掲示板だったら、表示.cgi 書込み.cgi とか分けた方が保守しやすいのでは、と。 意見求みまする。
>>252 インスコするファイルがたくさんあるとお子様が混乱してしょうもない
質問で邪魔してくるので、ソースメンテする手間はかかるけどトータル
では得らしい。
コーディング外の質問です。 今、plファイルのwindows向けのアイコンを何となく作っていますが、 真珠っぽいのがファイルについたアイコンか、らくだの絵のアイコンかどちらがふさわしいと思いますか?
当然らくだ
PARのparl.exe
258 :
デフォルトの名無しさん :2007/01/10(水) 20:00:56
初めて書き込みさせて頂きました。 現在、perl(HPUX)とNet-Telnet-3.03を利用してtelnet接続しているのですが、 telnet中にESCキーを入力させる事は可能なのでしょうか? perl:v5.8.0 built for PA-RISC1.1-thread-multi telnet:Net-Telnet-3.03 対話式なプログラムを実行していき、途中で どうしてもESCキーが必要になりました。 $telnet->print("\x1B"); こんな感じで文字コード入力でもダメでした。。
259 :
韋駄天はふと考えた :2007/01/10(水) 23:02:23
あなた達も↓のような経験が一度や二度あるでしょう。私はわずか4年の間に 2回もパソコンをウイルスによって不調になり使えなくなりました。 私達はパソコン製造業者及び修理業者とパソコン関連で商売をしている業者を あまりにも野放にしすぎました。 その結果が自作自演ウイルスバラ撒きの悪徳商法です。 703 :韋駄天はふと考えた :2007/01/10(水) 22:11:17 ID:ZKnpXOph ノートンがウイルスを検出しました。 あなたのパソコンを60日間に渡り78250個ものウイルスから守ってきました。 もうすぐ無料期間が終わりますので、ウイルス対策有料ソフトを購入してください。 はぁ????なにいってんの?なんで、たった60日間で78250個ものウイルスが進入してくんだよ? 明らかに自作自演目的の業者の仕業じゃねえか? 犯人はおまえらだろが!この犯罪者かぶれの集団が!! あちこちのサイトを開く度にコンピューターウイルスがパソコンにバンバン進入してくる。 おまえらな!自分で作ったサイトにコンピューターウイルスを混ぜて、他人の 何十万台ものパソコンを不調にさせたり故障させて、ウイルス対策ソフトを 高額で売りつけてまで儲けたいのかよ? 自転車屋が地域の自転車をパンクさせて回ったり、消防士が管轄地域で放火して 回るのと同じ犯罪をおまえらがやっているんだよ! てめえらで新たなコンピューターウイルスを次々に作ってはバラ撒いては、ウイルス対策ソフトを 高値で売りつける自作自演商売しやがって! この腐れ外道共が! 恥知らずの犯罪者共めが!
>254 でっかく「PL」とか「Perl」の文字が入ってるアイコンとか……。(聞いてない)
>>255 公式のらくだの絵をちょっと使って作ってみました。
>>256 あれはそのままでも結構かっこいいのですが、ちょっと抵抗があったので。。
>>260 一応Perlの文字を入れました。
どうもでした。
ファイルを最終行から順にさかのぼって読む方法ないですか? seek , getc等で1文字単位で読むしかないかな?
>>262 つFile::ReadBackwards
課題で aを1文字の文字列、$bを数字とし、上の行から$aを$b回と表示していき、3角形を描くプログラム。 というのが出ています。 print "a? "; chomp($a=<stdin>); print "b? "; chomp($b=<stdin>); でaに+をいれ、bに5といれると + ++ +++ ++++ +++++ こんな感じで表示させたいです。 for文の入れ子でやると思うのですが、表記がわかりません。 ヒントだけでもいただけないでしょうか?
bに1を足してaをb個並べてプリントしたら改行を繰り返す
forの入れ子でやるとかいうと、もしかしたらこういう おぞましいコードを期待してるかもしれないんだけど for (my $line=1; $line <= $b; ++$line) { for (my $num=1; $num <= $line; ++$num) { print $a; } print "\n"; } こういう風に簡潔にかける。 for my $num (1..$b) { print $a x $num, "\n"; }
あと $a と $b は sort とかで使われるから使うなといっとけ
269 :
265 :2007/01/11(木) 17:33:51
>>267 できました。ありがとうございます。
入れ子でわけわからない長いプログラムを作っていた自分がアホらしくなりましたw
もし入れ子でやるとしたら
入れ子の方の後半部分の
print $a;
}
print "\n";
}
はどういうことでしょうか?
すぐ答え出す奴ってなんなの・・・
漁師さん
こういう場合は普通、for文を使わずにトリッキーなコードを書いてあげるのが お決まりなんだけどね。
print map { $a x $_ . "\n" } 1..$b;
チューニングした答え書いて分かるかよ。 いっそのことCPANで(笑
275 :
267 :2007/01/11(木) 19:02:50
$a='+';$b=5;$t=0; (${a}x(($b*$b+$b)/2))=~m{((??{++$t;".{$t}"}))(?{print"$^N\n"})}g; こうですか?わかりません><
$^Nなんて使ってるのはじめてみた(笑)
(笑)なんて使ってるのはじめてみた(笑)
確かにな(藁
まぁ、ありえない
print map "$_¥n", unpack +( join '', map "A${_}X${_}", 1..$b ), $a x $b ; 不毛だ…
$_が半角文字"@"(0x40)を含むときのみデータを取得したいのですが、 以下のコードだと、$_が"病院"(0x95,0x61,0x89,0x40)とかの場合でも データを取得してしまいます。 このような2バイト文字を取得しないようにするには どの様に修正すればいいですか? if ( $_ =~ "@" ) { $data[$i++] = $_; }
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=
http://www.xxx.com/index.php?%A5%AC%A5 と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「
http://www.xxx.com/index.php?%A5%AC%A5 」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
>1に全てが隠されているんじゃないだろうか。
>>283 orz
CGIはスレ違いだったんですね。本当にごめんなさい。
一日考え続けてて疲れてたのか、
>>1 を確認するのを失念してました。
向こうの初心者質問スレで質問してくる事にします。
スレ汚し失礼しました。
プログラム板から誘導されて来ました。
まず始めに。
当方、Perlは殆どいじった事がなく、
HSPやCを少々組んだ事がある程度の知識で質問しているため、
常識的な事や的外れな事を質問していたら申し訳ありません。
google等で調べても何やっても上手くいかなかったので、
どうか皆様の力をお貸し下さい。orz
CGIで生成したページから別サイトへのリンクをクリックした時に、
「このURLへアクセスします。よろしいですか?」
と言ったような確認ページを挟んでアクセスするようにしようとしています。
具体的書くと、元ページの別サイトへのリンクは、
xxx.cgi?url=
http://www.xxx.com/index.php?%A5%AC%A5 と言うように、リンク先のURLを<a>タグに埋め込んで自身のCGIに返すようになっています。
URL=の部分を取得し、そのまま確認ページの<a>タグに埋め込みたいのですが、
実際にやってみると?以降のURLエンコードされた部分が漢字や化けた文字として表示されてしまい、
綺麗なURLになってくれません。
渡されてきたURLを「
http://www.xxx.com/index.php?%A5%AC%A5 」のように、
そのまま表示するにはどうしたらいいでしょうか?
一応書いておくと、スクリプトはUTF-8Nで書いています。
ぎゃー!!! ありえない誤爆・・・。 ほんっとうにごめんなさい・・・。
>1に全てが隠されているんじゃないだろうか。
288 :
281 :2007/01/12(金) 04:29:08
自己解決しました。 おさわがせしました。
>>281 見てて、ふと、半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
うーんうーん悩んでいた時のことを思い出した。
そういや、半角英字を全角英字に置換することってできるの?
use utf8やるとか。
EncodeもあるしUnicode::Japaneseもあるし。
WebProg板に書いたけど、こっちの方がふさわしそうなので こちらでお聞きします。 キー入力を待って、キー入力があれば処理を次に進める、ということをやりたいのですが、 C言語でいうところの、getch() に相当する関数はないでしょうか?
293 :
デフォルトの名無しさん :2007/01/13(土) 22:10:05
4年前ぐらいまでPG兼SEをしていたのだが、 そのころと比べるとかなりPerlは寂れた?
こんな配列 @result=("E:15000", "S:20000", "W:15000", "N:50000")を作りまして ここから、1位=N、2位=S、3位=E、4位=W、という結果を出したいと思っています。 得点が同点の場合、E→S→W→Nの順で優先となります。 とりあえず、$rank{E}='15000',$rank{S}='20000',,,として、 if(($rank{E}>=$rank{S})&&($rank{E}>=$rank{W})&&($rank{E}>=$rank{N})){ #E=1位 #SとWとNで2位以下の判別 #何かと何かで3位と4位の判別 } elsif (($rank{S}>=$rank{W})&&....... #S=1位 #EとWとNで2位以下の判別 #何かと何かで3位と4位の判別 }elsif(.. と、やり始めましたが、とてつもない作業になりそうです。 何か、よい解決法がございましたらご示唆お願いします。
普通にソートすりゃいいやん @result= sort {(split/:/,$b)[1]<=>(split/:/,$a)[1]} @result;
とん・なん・しゃー・ぺー♪
use strict; # こんな配列 my @results = ("E:15000", "S:20000", "W:15000", "N:50000"); # 得点が同点の場合の順 my %prio_of = ( E => 0, S => 1, W => 2, N => 3, ); my @s_results = map { $_->[0] } sort { $b->[2] <=> $a->[2] || $prio_of{$a->[1]} <=> $prio_of{$b->[1]} } map { [ $_, (split/:/=>$_)] } @results;
数値として使う予定の変数を、文字列で宣言するのって確か非効率だよね。 随分長い間Perlから離れてるので間違ってるかも知れないけど $foo = '2000'; と文字列にしておいて、その後で $foo を数値として使った場合、 スカラ変数の構造体は、 文字列型のものから、数値も文字列も両方入る奴に切り替わる。 構造体切り替えの手間もあるし、構造体のサイズも大きくなるから非効率 …だったような気がする。
300 :
295 :2007/01/14(日) 01:43:35
すばやいご提示、ありがとうございます。
>>296 様
すみません、説明が不足していました(ということに気づくのに、いただいた式を
眺めながらかなり時間がかかりました・・・)。実は、EやSが変数の中に出てくる
順番は毎回変わる可能性がありました。申し訳ありません。
>>298 様
欲しい結果が出せました。ただ、内容の理解には私にはまだまだ時間がかかりそうです・・
なんとか少しずつ、吟味していきたいと思います。
>>297 様
わかりましたか。そのとおりです。
皆様、すばらしいご教授、どうもありがとうございました。
301 :
デフォルトの名無しさん :2007/01/14(日) 01:59:22
>>299 perl は型はなしでしょ。
$foo = '2000';
も
$foo = 2000;
は同じでしょ。
>>301 つ [perlguts]
つ [Devel::Peek]
>>302 もちっと教えてくれんかのう。
perldataには
「あるスカラー変数が、“文字列”型、“数値”型、“ファイルハンドル”型、
あるいはその他の型であるように宣言する方法はありません。」
とあるかんだけど、それとは違うレベルで何かあるのか?
提示されている情報ぐらい見なさい。 > Double-Typed SVs > スカラー変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。Perl は実際のデータに対して、 > 蓄積されている型から要求されている型へ、自動的に変換を行ないます。
305 :
265 :2007/01/14(日) 03:39:50
>>275 を提出したんですが、授業後
せんせから呼び出し受けました。
306 :
303 :2007/01/14(日) 03:57:55
>>304 どうもありがとう。
文脈によってperl内部で数値と評価されたり文字列として評価されたりすることは分かっています。
しかし、シンタックス上
$foo = '2000';
と
$foo = 2000;
に違いがあるとは読み取れませんでした。
#$foo = '2000' . '';
#と
#$foo = 2000 + 0;
#が違うのはわかりますよ。
307 :
303 :2007/01/14(日) 04:24:03
試してみれば良いんだね。 $foo = 2000; の場合数値コンテキストになるんだ。(そりゃそうか)
先生が読めなかったか 先生がこのスレを見ていたか どっちかな
>>289 >半角数字を全角数字に置換することはできても、半角英字を全角英字に置換することが難しいことに、
>うーんうーん悩んでいた時のことを思い出した。
>そういや、半角英字を全角英字に置換することってできるの?
次スレのテンプレ予定の
>>115 に忠実に従えば、
tr/a-zA-Z/a-zA-Z/
でできる。
print "@{[1+1]}", "${\(1+1)}"; こういうテクニック(?)を思い出したんですけど、どこに書かれていたものでしょうか。
>>306 use Devel::Peek;
$foo1 = '2000';
Dump $foo1;
$foo2 = 2000;
Dump $foo2;
↓
SV = PV(0x363bc) at 0x18aef9c
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x3dc2c "2000"\0
CUR = 4
LEN = 8
SV = IV(0x18a68b8) at 0x18af02c
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2000
313 :
299 :2007/01/14(日) 20:42:44
やっぱりPVIVになった。どうやら
>>299 に書いた記憶通りだったみたい。
use Devel::Peek;
$foo = '2000';
Dump $foo;
$foo += 1;
Dump $foo;
SV = PV(0x1801660) at 0x180b5a8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
SV = PVIV(0x1801a20) at 0x180b5a8
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 2001
PV = 0x300c70 "2000"¥0
CUR = 4
LEN = 5
この状態でFLAGSをC側からいじると、
文字列として表示した時と、数値として使った時で別の値を出すスカラ
とか作れちゃうんだよね。
315 :
314 :2007/01/14(日) 22:43:39
ああ、失敗。よく考えたら流石に代入は無理だな。…Tie使ったら或いは出来たりしそうな気もしないでもない。 313はスカラを作ると言うことで代入した別の値を保持まで出来たりするのかな
Scalar::Utils の dualvar は?
>実はoverloadがあればxsを使わずともそういうのが作れちゃったりするのですよ。 スルーしてた。xs を使って実現したのが Scalar::Util の dualvar ってことっすね。
dualvar でスカラ作ってみたけど、 作った後で代入し直したら、片方だけ(数値だけ or 文字列だけ)になっちゃった。 ということは、xsでフラグいじって IOK, POK 両方立てても 代入したら片方になっちゃうということか。 オブジェクトにして代入まで見張れば良いんだろうけど。
webサーバをan httpdからapacheに変更したところ文字化けする部分が出てきました。
method=getで受けとった部分が文字化けしてしまいます。method=postは大丈夫でした。
よろしくお願いします。
↓の一番下の部分も参考にしましたが直りませんでした。
http://tech.bayashi.net/pdmemo/chara2.html apache perlは↓のサイトを参考に構築してあります。
http://www.y-kit.jp/saba/ ------------------------------
環境
Apache/2.0.59 (Win32) PHP/5.1.4
------------------------------
コード例
require './jcode.pl';
#GET用
$myindata=$ENV{'QUERY_STRING'};
#POST用
#read( STDIN, $myindata, $ENV{ 'CONTENT_LENGTH' } );
#$myindata =~ tr/+/ /;
#$myindata =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
&jcode'convert( *value, 'sjis' );
print "Content-type: text/html\n\n";
print $myindata;
------------------------------
getデータ
http://localhost/bbsmt/write.cgi?name=a&mail=&message=あいうえお&a=11 表示データ
name=a&mail=&message=???¢???|?¨&ip=&a=11
>1に全てが隠されているんじゃないだろうか。
以前使っていたサーバでdbmファイルを使っていたのですが、 そのまま別のサーバに移動したら読み込めなくなりました。 dbmファイルは.dirと.pagの2つじゃない方(1つのファイル)です。 古いサーバはもう使えません。新しいサーバでdbmファイル を読む方法はないでしょうか…。
>>322 質問する時はまず環境を説明しろ!
(古い方と新しい方それぞれのOSの種類とバージョン,Perlのバージョン)
あと、読めなくなったってのはどんなエラーメッセージが来てるのかも報告汁
>>322 ヒントになるかわからんが
NDBM_File
DB_File
GDBM_File
SDBM_File
ODBM_File
325 :
320 :2007/01/15(月) 20:46:35
別のとこで質問してきます。
326 :
322 :2007/01/15(月) 20:58:26
読めなかったと思ったら読めました。お騒がせしました。 dbmファイルはテキストなどに書き出しておかないとバイナリでサーバを移しても 読めないのだと思っていました。dbmopen()で読み書きしていたので、どの 形式のDBMかわからなかったのです。
perlerのエロイ人教えて!ワッフルワッフル 指定されたディレクトリのディレクトリハンドルを開いて ディレクトリ内のファイル名を取得するスクリプトを書いたのですが 名前が長いファイルがあるとそのファイルと、それ以降のエントリが ディレクトリハンドルから取得できないんだけど なんで?これどうすれば回避できる? 環境: Windows XP + ActivePerl5.8.8 build819
esperのエロイ人が来て お前の書いたスクリプトを透視した上で回答してくれるのを待つことだ
329 :
327 :2007/01/16(火) 10:55:47
>>328 再現スクリプトを下記に示します。
DirHandle以外にopendirでディレクトリハンドル開いたり、
globを使ってみたけど結果はおんなじでした。
----
#!/usr/local/bin/perl
use strict;
use utf8;
use warnings;
use FindBin;
use DirHandle;
use Data::Dumper;
my $dh = DirHandle->new($FindBin::Bin) or die $!;
my @entries = $dh->read;
print Dumper(\@entries);
__END__
----
名前が長いファイルの例は何ですか?
質問します。 foreach( sort(glob("*")) ){ if(-d){ @local_dir = (@local_dir,$_) ; }elsif(-f){ @local_file = (@local_dir,$_) ; }else{ print "Not Support Format -> $_\n" ; } } ファイルとディレクトリに分けたいのですが、 ローカルだと上記のようにできますが、(他にスマートなやり方があるかもしれませんが。。) ftp上のファイルを区別する方法はありますでしょうか。 以下ではどちらも同じファイルを取得してしまいます。 use Net::FTP; my $ftp = Net::FTP->new($host); $ftp->login($user, $pass); foreach( $ftp->ls("./") ){ print "$_\n" ; } foreach( $ftp->dir("./") ){ print "$_\n" ; } $ftp->quit;
332 :
327 :2007/01/16(火) 11:19:46
>>330 全角数字0から9を繰り返すのを160文字 + .txt
のファイル名を用意したら再現しました。
全角数字100文字の場合はファイル名が取得できました。
パスは
D:\test
で実験しました。
95系は絶対パスで255byte以下、
NT系は絶対パスで255文字以下と認識してるのですが
このへんの絡みですかね?
333 :
327 :2007/01/16(火) 11:26:39
334 :
327 :2007/01/16(火) 12:18:54
バグではなく仕様。 WinAPIでも使っとけ。
336 :
331 :2007/01/16(火) 13:23:32
>>333 出来ましたー。
最初ソース見て作ろうと思いましたが
面倒臭くなって結局インスコしましたw
ありがとうございます。
337 :
327 :2007/01/16(火) 13:44:46
>>336 もめでとう! こっちはいまだにはまり中 orz
>>335 バグじゃなくて仕様なの?
ちなみにWin32::APIを使ってみたけどなぜか取得できない。。。
338 :
327 :2007/01/16(火) 13:51:26
Win32::APIを使った再現スクリプト ---- #!/usr/local/bin/perl use strict; use utf8; use warnings; use Data::Dumper; use Encode; use File::Spec; use FindBin; use Win32::API; Win32::API::Struct->typedef('FILETIME', qw( DWORD dwLowDateTime; DWORD dwHighDateTime;)) or die $!; Win32::API::Struct->typedef('WIN32_FIND_DATA', qw( DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[260]; TCHAR cAlternateFileName[14];)) or die $!; my $FindFirstFile = Win32::API->new('kernel32', 'FindFirstFile', 'PS', 'N') or die $!; my $FindNextFile = Win32::API->new('kernel32', 'FindNextFile', 'NS', 'I') or die $!; my $FindClose = Win32::API->new('kernel32', 'FindClose', 'N', 'I') or die $!; my $path = File::Spec->catdir($FindBin::Bin, '*'); my $FindData = Win32::API::Struct->new('WIN32_FIND_DATA') or die $!; my $hFind = $FindFirstFile->Call($path, $FindData); $hFind == -1 and die $!; my @list = ($FindData->{cFileName}); push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData; $FindClose->Call($hFind); print Dumper(\@list); __END__
339 :
327 :2007/01/16(火) 13:56:10
書込み時に改行多いって怒られたから改行を削ってたら
FindNextFileの閉じ括弧までまちがえて削っちゃった orz
>>338 のソースは
×push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData;
○push @list, $FindData->{cFileName} while $FindNextFile->Call($hFind, $FindData);
でお願いします。 m(_ _)m
この関数の ANSI 版では、名前は最大 MAX_PATH 文字に制限されています。 この制限をほぼ 32,000 ワイド文字へ拡張するには、この関数の Unicode 版を呼び出し、 パスの前に "\\?\" という接頭辞を追加してください。 詳細については、MSDN ライブラリの「File Name Conventions」(ファイル名の規則)を参照してください。
341 :
327 :2007/01/16(火) 14:45:03
作ってもらった __ | | | | ___ ___ | | . / | __ _____ / _ \ | | / /| | / / / ____/ / / > l | |. / / .| |. / / / /.. _ /  ̄ / | |/ / | |/ / /  ̄ ̄_/ / \ | /. | / / / ̄ ̄ __ / / ̄ ̄> | | / |___/ ./  ̄ ̄ ̄ / /  ̄ ̄ /  ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ _____ ___ ___ ___ ______ /__ __/ [][] _| |_| |__ _| |_ | ___ \ / / | _ | |_ レ'~ ̄| | | \ l | |_  ̄| | / / / /| | | |____/ / \__| | |  ̄ /_ /. | |_ | ____/ ___ __ __/ヽ |_|. |__|. \/ | | /`、_/_/ / _ ヽ / _ / | | ヽ / | l l l | l l l | | | l ヽ  ̄ / ,ヽ  ̄ /  ̄  ̄  ̄ ̄ / __ ヽ | l l l ヽ  ̄ ̄ / ~ ̄ ̄~
ちょっとでかいな
345 :
327 :2007/01/17(水) 01:05:42
346 :
327 :2007/01/17(水) 06:15:16
Perl 覚えたらこんなもの作れるようになりました。 █ █ █ █ █▀▀▀▅ ▀▅ ▅▀▅ ▅▀ ▅▅▅ █▅▅▅ █ █ ▅ ▅ ▅▅▅ ▅▅▅▅ █ █ █ █ █▅▅▅█ █ █ █▀▀▀ █▀ █ █ █▅▅█ ▀▅▀ ▀▅▀ █ ▅ █ █ █ █ █ █ █▅▅▅ ▀ ▀ ▀▀▀ ▀▀▀▀ ▀ ▀ ▀▀▀ ▀▅▅▅▀ ▅▅▅▅▅▅ ▅ ▅ █ ▀▀▀▀ ▅▀ ▅ █ ▅▅▅█▅▅ ▀▀█▀▅▀▀▀▅ █ █ ▀ ▀▀▀█ █ ▅█▀ █ █ █ ▅▅▅▀ ▅▀█ █ ▀▅ █ ▀ █ █ ▅ ▀▀▀ ▀ ▀ ▀
sub owata { # local $_; $_ = "\(^o^)/"; } $_ = "/(^o^)\"; owata; print; local $_; の行をコメントアウト/インして実行してみよう!
ありがとうございます。でも余計にわからなくなったorz 実はこんなコード書いて試してみたんですがlocal $_;あっても無くても同じように動くんですよね # lstはファイル名のリスト open (FH, '< lst') or die; while (<FH>) { print; &localtest } close FH; sub localtest { local *FH; open (FH, $_) or die; #local $_; while (<FH>) { print } } 何が違うのかも教えていただけたらうれしいです。
$_はグローバルだから他で使われてるかもしれない。特に 左辺値でないもののaliasだったりすると値を書き換えることも できないしな。 foreachのときは暗黙にlocalにしてくれるけど。
>>350 localtest 呼び出しの後 $_ は書き換わってるけど、
すぐに次のループに入るので問題がないだけ。
while (<FH>) { print "begin: $_"; &localtest; print "end: $_" }
とかやってみると、違いがわかると思うよ。
353 :
350 :2007/01/17(水) 23:02:32
ありがとうございます。ようやく理解できました しかし350のコードはアホですね…何をやっているんだか この分じゃ他にもいろいろ勘違いしていることありそうで怖いです。 とりあえずほとんど理解せず使ってる型グロブをもうちょっと調べてみよう…
間接的なファイルハンドル使おうよ open my $fh, '<', 'filename' or die;
FileHandleやIO::Fileって使わないの?
356 :
331 :2007/01/18(木) 09:36:42
331で質問したモノです。
また壁にぶち当たりました。
ftpしたあとのファイル、ディレクトリの日付、サイズを取得したいので調べてましたが
use Net::
FTP::File;のNet::FTP::fstatは作りかけのようで使用出来ませんでした 。
$ftp->dir(./)で拾って日付を抜こうと思いましたが、日本語環境と英語環境で
表示が異なるので断念しました。
何か取得方法はないでしょうか。
use Net::FTP;
my $ftp = Net::FTP->new($host);
$ftp->login($user, $pass);
>>356 > 何か取得方法はないでしょうか。
マニュアルを見ると分かるんじゃないでしょうか
358 :
デフォルトの名無しさん :2007/01/18(木) 12:07:32
Perlで文字列にunicodeが含まれているかどうかを判断するにはどうすればいいですか?
「文字列にunicodeが含まれている」という言い方があいまい杉。 あるバイト列の文字コードがunicode由来のものであることを知りたいのか (エンコーディングの仕方が何通りもあるので) → Encode::Guess。ただし完全な判定は無理。 UTF-8フラグが立った文字列であることを知りたいのか →Encode::is_utf8(あるいはutf8::is_utf8) それともぜんぜん別のことなのか
360 :
デフォルトの名無しさん :2007/01/18(木) 12:45:35
>>359 unicode由来のもであるかどうかです
それと環境はPerl5.0でJcode.plです
361 :
356 :2007/01/18(木) 13:54:08
調べていたらNet::FTPのmdtmが使えそうだったので 書いてみましたがエラーが出ました。 使い方が間違えているのでしょうか。 $host = "***" ; $user = "***" ; $pass = "***" ; use Net::FTP; my $ftp = Net::FTP->new($host); $ftp->login($user, $pass); foreach($ftp->ls()){ $aaa = $ftp->mdtm($_) ; print "$aaa\n" ; }
>>361 Net::FTPの使い方としては間違ってないよ。
エラーってnot a plain fileのことか?
とりあえずエラーの理由知りたけりゃDebug=>1設定しなさい。
>>360 jcode.pl は Unicodeには対応していないはず。
Perl 5.0 なんて時代遅れなもの使うのやめたら?
時代は6だな
365 :
361 :2007/01/18(木) 16:36:17
--------------------------------------------------------------------------- #!/usr/local/bin/perl -w -- # -*-Perl-*- use strict; use warnings; use Net::FTP; my $host = "txfs02" ; my $user = "g-fan" ; my $pass = "fan" ; my $aaa ; my $ftp = Net::FTP->new($host); $ftp->login($user, $pass); foreach($ftp->ls()){ $aaa = $ftp->mdtm($_) ; print "$aaa\n" ; } --------------------------------------------------------------------------- ↑これを実行すると一つのファイルにつき↓このメッセージが出ます。 色々試してはいますが詰まっていますorz Use of uninitialized value in concatenation (.) or string at bbb.pl line 15.
>>365 >Use of uninitialized value in concatenation ...
何も無いものをprintしようとしたからwarningsが出たわけ
print "$aaa\n";
を
print "$aaa\n" if $aaa;
で
367 :
361 :2007/01/18(木) 16:52:50
>>366 そうなんです。
全てのファイルのmdtmがundefになってるんですよね。
だいたい”foreach($ftp->ls()){”でファイルを拾っているので
ファイル名を間違えているとかそういうのは無いはずなんですが。
Debug=>1にすると俺の環境では ディレクトリはエラーでnot a plain fileを返してる(undef) ファイルはtimeを返してる
>>367 > ファイル名を間違えているとかそういうのは無いはずなんですが。
「はず」じゃなく確認しる。
とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
成功したりする。なんじゃらほい。
>>369 > とはいえ、手元で動かしてみたところ、同じエラーが出て失敗したり
> 成功したりする。なんじゃらほい。
急いで捕捉すると、テストに使った対象ftpサーバが、複数個をラウンドロビン
していたようた。要するに、ftpサーバソフトウェアによって成功したり
失敗したりしていたようだ。
371 :
361 :2007/01/18(木) 17:17:49
>>368 すみません。
Debug=>1の意味が理解できていませんでした。
今調べてDebug=>1で流したらこんなメッセージになっています。
Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.
MDTMというコマンドがないみたいですが↓このファイル見たら_MDTMならあるけど
MDTMはありませんでした。
/usr/local/lib/perl5/5.8.6/Net/FTP.pm
>>369 調べましたがちゃんと見れていました。
>>371 > Net::FTP=GLOB(0x15ecd4)>>> MDTM xxx.log
> Net::FTP=GLOB(0x15ecd4)<<< 500 'MDTM xxx.log': command not understood.
> Use of uninitialized value in concatenation (.) or string at bbb.pl line 16.
これはひどい(笑) MDTMコマンドが実装されていないのだろうか。
手元でやった例だと
失敗例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 550 Could not get file modification time.
成功例
Net::FTP=GLOB(0x8212d38)>>> MDTM pub
Net::FTP=GLOB(0x8212d38)<<< 212 20060419172149
となります。
今ぐぐってみたら MDTMはFTPの拡張仕様だから対応してない鯖が多いみたいだ MDTM対応してない鯖は気合でLISTの結果を解析するしかなさそうな感じ
LISTのフォーマットもまちまちだから、本当に「気合」が必要だなw
普通のftpクライアントはどうやってリスト作成しているんだろうね・・・ #暇なときにffftpのソース眺めてみよう
>>379 @KINTAMA_STRとかあってワロス
381 :
361 :2007/01/19(金) 09:54:34
>>373 拡張なんですね。。
>>372-
>>380 $ftp->dir("./")で取得するとサーバによってこんな風になるんですよね。
表示が英語か日本語だけならまだ対応出来るんですが
日本語で去年のファイルになると時間が年表記になって
時間が取り出せないorz
drwxrwxr-x 2 user group 1024 Dec 5 00:03 dir_name
drwxr-xr-x 5 user group 512 3月 29日 2006年 dir_name
何か他に日付とサイズ取得できるのないかな。
>>381 > 日本語で去年のファイルになると時間が年表記になって
> 時間が取り出せないorz
いや、UNIXのlsコマンドの詳細表示は、半年以上過ぎるとそういう表示になる
仕様だというだけ。それを反映しているのでしょう。英語でもそうなるはず。
っていうか、そうなるのがある、か。
>>379 これぐらいの物ならPerlで作らなかった方が良かったのにね。。
コメントとテストコードが残っている事以外に関して言えば
別に酷いコードじゃないと思うけど、フォレンジック技術について言えば;;
文字連結が好きだって事は分かった。
> 別に酷いコードじゃないと思うけど、 マジで?
112 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:23:40 ID:p3fP2iOG0 sub pf_check_p2p{ if ($_[0]=~/winny\.exe/i){add_ctime($_[0],$WINNY,"WINNY");} if ($_[0]=~/winnyp\.exe/i){add_ctime($_[0],$WINNYP,"WINNYP");} if ($_[0]=~/Share\.exe/i){add_ctime($_[0],$SHARE,"SHARE");} if ($_[0]=~/PERFECT DARK\.EXE/i){add_ctime($_[0],$PD,"PD");} if ($_[0]=~/cabos\.exe/i){add_ctime($_[0],$CABOS,"CABOS");} if ($_[0]=~/limewire\.exe/i){add_ctime($_[0],$LIMEWIRE,"LIMEWIRE");} if ($_[0]=~/BITTORRENT\.EXE/i){add_ctime($_[0],$BIT,"BIT");} if ($_[0]=~/BITCOMET\.EXE/i){add_ctime($_[0],$BIT,"BIT");} } (;^ω^) 139 :番組の途中ですが名無しです [sage] :2007/01/17(水) 15:35:19 ID:p3fP2iOG0 なんか製品版も同じな気がする… だってp2ptest.plの30行辺り見ると… my $kin="\x5b\x90\x6d\x8b\x60\x82\xc8\x82\xab\x83\x4c\x83\x93\x83\x5e\x83\x7d\x5d"; ついでにこれってShift_JISで見ると [仁義なきキンタマ] なんだよね
386 :
383 :2007/01/19(金) 14:20:43
>>384 苦なく読めるという点で。改良点を挙げようとすればそりゃ出てくるがな。
Prefetchに気づいてる香具師が一人しかいないそのスレも大分痛い
>>379 調査員が、PC操作してる俺の隣に座って
監視するわけじゃないのか。 じゃイラネ。
人件費が馬鹿にならんだろそれじゃ
マwジwレwwスwww
391に突っ込むって どんだけ2ch初心者なんだよ
2chw初w心ww者www
はいはい vipに帰りな
はwいwwはwwwいwwwww いい加減自演疲れただろうパトラッシュ
ばばばばばばっ w w _ _ w w w ヽ(・ω・)ノ w w w .(( ノ( )ヽ )) w wwwwwwwww..............┛┗...........wwwwwwwww
言い負けてからが長い
2chViewer ●にログインして、過去ログをひたすら(ウェイトは挟みつつ)取得するスクリプトを書いたのですが、
●ログインは出来るものの、肝心の過去ログが取得できません。gzip圧縮された「-ERR もう つかえません」と言うメッセージが取得されるだけです。
●アカウントそのものは既成の専用ブラウザ(OpenJane 0.1.12.6b)で生きていることを確認しています。
コーディングの問題なのか、2chの●過去ログ取得の仕様にあっていないための不都合なのか、自分では切り分けが出来ませんでした。
ソースはこれです。
http://sub.jetabbs.org/upload2/upload/upz043.zip (コメント・メッセージがキモくてごめんなさい)
スレ違いでしたら誘導をお願いします。
専用ブラウザでのやりとりをキャプチャして同じリクエスト投げるようにすればいいんじゃね? 暗号化されてたらシラネ
403 :
401 :2007/01/20(土) 15:51:23
>>400 あと、Snifferというソフトを使って、専用ブラウザが出しているIPパケットと、
自作のスクリプトが出しているIPパケットとを比べれば解決するかもしれないよ。
use threads; use threads::shared; # 終了の合図 my $kill:shared = 0; # スレッド作成 my $thread = threads->new(\&loop); 処理... $kill = 1; $thread->join; sub loop { while (!$kill) { 処理... sleep(60); } } 少し長くてすみません…。 マルチスレッドでwaitを挟みつつ処理を行い 任意のタイミングで終了させるプログラムを組んでいるのですが、 このコードだと終了用の変数をセットしてから処理が戻るまで60秒もかかってしまいます。 何かいい方法はないでしょうか よろしくお願いします。
>>400 UAをMonazilla/1.00にするとか
>>404 threads::sharedにcond_ナントカというのがいくつかあるので
よく説明読め。たぶんお前が求めているものはそれだ。
そんな本が出るこそさえ知らなかったわさ
>>406 cond_timedwait
cond_signal
を併用する事でできました
昨日からずっと悩んでいたので助かりました
ありがとうございました
第1章の1項ってテクニック?
1章2章はツールの話だろ
「firefoxから簡単にCPAN検索できるようにする」だからテクニックといえばテクニックだろ。 俺はsleipnirもfirefoxもCPAN検索できるようにしてある。 あとはローカルにppmリポジトリを立てればすごく便利。
>>408 買った買った。ペラペラとめくってからほぼ衝動買い。
お前も買え。
416 :
デフォルトの名無しさん :2007/01/21(日) 12:10:31
すみません @week = ("Sun","Mon","Tue","Wed","Thr","Fri","Sat"); $i = 0; for($i=0; $i <= 7; $i++){ print $week[${i}]; } このソースで-wオプション付けて実行すると Use of uninitialized value in print at ./hairetu.pl line 7. と警告が出るのですが何故でしょうか? 見たところ変数はきちんと初期化していると思うのです。
417 :
デフォルトの名無しさん :2007/01/21(日) 12:12:55
わかりました 7じゃなくて6ですた… 自己解決染ました
>>417 > 7じゃなくて6ですた…
植木算のミスといいます。そして Perl では「必要がなければ添え字を扱わない」ことで、このリスクを回避できます。
foreach my $wday (@week) {
print $wday;
}
あるいは、
print for @week;
すごい省略できるんですね…
Perlの省略記法は、芸術ですから。 いろいろ言われるところもあるけど、ラリー・ウォール先生もPGは傲慢であれとおっしゃっていることだし。 うん。大丈夫。半年前に書いたスクリプトがさっぱり分からなくても大丈夫。泣くことなんて無いよ。
> foreach my $wday (@week) { > print $wday; > } "my" なんて入れる必要ないだろ
PBP6.9に入れた方がいいと書いてあるだろ
自分のフォルダのtextファイル(1000行〜1500行)を ひとつの変数に入れる方法を教えてください open(IN,"< foo.txt"); foreach(IN){ ・・・ } のように一行づつ処理ではなく、全部の行をまとめて処理したいのです。 (正規表現で複数の行に渡って処理したいため) 何かいい方法はないでしょうか? よろしくお願いします
read関数
my $txt = join('', (<IN>)[999 .. 1499]);
426 :
423 :2007/01/21(日) 18:49:16
いいのかおい
正規表現の量指定子{}に変数は使えますか?
すいません、自己解決しました てか自分で試せばよかった・・・
すみません。 教えてください。 my @aaa = () ; my @bbb = () ; for(my $i=0;$i<5;$i++) { @aaa = ($i,$i+1) ; @bbb = (@bbb,\@aaa) ; } foreach(@bbb){ print "$_\n" ; } foreach(@bbb){ foreach(@$_){ print "$_\n" ; } } 上を実行すると下の結果になります。 ARRAY(0x13c93c) ARRAY(0x13c93c) ARRAY(0x13c93c) ARRAY(0x13c93c) ARRAY(0x13c93c) 4 5 4 5 4 5 4 5 4 5 >>↓に続く
431 :
430 :2007/01/23(火) 17:28:11
>>↑の続き 出力させたい結果は以下なのですがどうも リファレンスの中がARRAY(0x13c93c)で全て同じになってしまっているようです。 (同じ@aaaという配列名をリファレンスしているせい?) ループさせてリファレンスを増やしていきたいのですが どのようにしたら下記のような出力結果に出来ますでしょうか。 0 1 1 2 2 3 3 4 4 5
レキシカルスコープ
>>430-431 ループのなかでmyするようにする。
my @aaa = ($i,$i+1) ;
若しくは無名配列のコンストラクタを使う。
@bbb = (@bbb,[@aaa]) ;
ループの外では@aaaを使っていないのだから、
スコープをループ内に縛る前者をお勧めする。
質問です。 テキストファイルから顔文字を除去しようと考えていますが、いい方法がみつかりません。 正規表現でうまく除去する方法というのはないでしょうか? 現在考えていますのが、括弧の中に記号あると顔文字であると判断するとしています(例=(゜Д゜) (ノ∀`*) など。 この正規表現を書く場合全ての記号を書かないといけないでしょうか? 質問が2つとなりましたが、よろしくお願いします
>>434 まず正規表現を勉強しろ。
顔文字のリスト作ってそれと比較するのが単純で速いと思うが。
(゜o゜)これはおk? (TへT)これもおkだね
437 :
434 :2007/01/23(火) 17:57:28
>>435 リスト作ったほうが早いですか。
その場合、リストにない顔文字は一致しませんけど、しょうがないか…
全部の顔文字をうまく除去するなんて、難しいですよね
上手く作ったとしても テンプレート・ツールキット(TT) なんて文脈じゃ誤判定は避けられないな
>>437 "ヽ(`Д´)ノ"
とかが、"ヽノ"になってもいいのかってこったわな。
結局は、顔文字の辞書ファイルを保守するしかないだろ。
440 :
434 :2007/01/23(火) 18:18:05
"ヽ(`Д´)ノ"の場合は前後が記号ならそれも弾くとか考えてたんですよね まぁ、ノのほうが記号じゃないんで、残りますが。 顔文字の辞書作ってるけど。結構メンドクセ
441 :
430 :2007/01/23(火) 18:21:54
>>433 解決しました。
ありがとうございました。
>>432 こういうのをレキシカルスコープって言うんですね。
ありがとうございます。
文字の置換の際に、「マッチした文字列になんらかの処理をする」ということは可能でしょうか? $str = "ABCDEF"; $str =~ s/(B)/&conv($1)/; のように、マッチした文字列を、関数を使って、返り値で置換したいのですが・・・ (ちなみの、このコードだと、 A&conv(B)CDEF という文字列になってしまいました。。。)
e
v
>>442 Windowsならコマンドプロンプト開いて
perldoc perlre
でperlの正規表現のドキュメント読めるよ。
ドキュメントにざっと目を通してれば人に質問するような内容じゃないぞ。
>443 >445 ありがとうございます。 /e で、できました。 ドキュメントを確認せずに質問してしまって 済みませんでした。 プログラミングPerlにも、 /e が載ってました・・・
CGI作るつもりでperl始めたんだけど、テンプレにあるようなCGIとは無関係な使い方ってどんな使い方するの? 例えばどんな仕事でどう使うとか教えてほしい
>>447 スクリプトとして使えるじゃん。 バッチ処理とかさ。
>>447 CGIと関係なく、データベースとのやりとりとか。
こんな質問するやつに教えても理解できないと思うよ
エロ画像エロ動画収集に決まってるだろ
分類したエロ画像ファイルをリネームする
CUIだから単純で且つ面倒くさい処理やらせてる。すぐ書けるしね
>>452 漏れ以外にPerlをエロ収集に使おうと考える奴がいるとは・・・
>452-454 あれ、俺が何人もいる…
たしかにエロ収集に便利、というよりエロ収集してる時が一番はかどるな。
組みたくなってきた・・・ エロパワーは絶大だな
▀▄ ▀▄ ▄█ ▄█ ▀▀▀▀█ ▀▄ ▀▄ ▄▀█ ▄▀█ ▄▀ ▄▀ ▄▀ ▄▀ █ ▄▀ █ █ ▄▀ ▄▀ ▀▀▀█▀ ▀▀▀█▀ █ ▀ ▀ ▀ ▀ ▀ █ ▄▄▄ █ ▀▀▀▀ ▄ ▄█ █ █ █▄▄ █ █ ▄▄▄▄▄▄▄ █ ▄▄▄▄█▄▄ ▀█ ▄█ █ █ █ ▄▀ █ █ █ ▀ █▀ █ █ ▄▀▀▄ █ ▄▄▄█ █ ▄▀ █ ▄▀ █ █ █ █▀▄ ▀ ▀ ▀▀ ▀ ▀▀▀ ▀ ▀▀▀ こんなスレアラシに使える。
正規表現が使いやすいからPerlで組んだ でもCUIなのがなぁ
Perlでは、ワンライナーか数行程度のスクリプトでテキストをいじったりとか しかしてないが Unicode対応がボミョウなので、たまに困ったことになる use encoding('cp932')とかって、-n/-pスイッチとかと一緒に使うと うまく動かなくね?つか、これって基本的に非推奨なんだべ? Unicode文字列のリテラルや正規表現を直接記述できないので、 use encoding()しないとなると途端にウザい事態になるわPerlは
スクリプトをutf8で書けばuse encodingいらないし特に問題ないけどね。
462 :
460 :2007/01/24(水) 18:43:07
>>461 それはスクリプトも入力もUTF-8を仮定できるときだけだべ?
少なくともWindows環境でそれは仮定できないなぁ
UTF-8なファイル名でファイル開いたりできないし
465 :
460 :2007/01/24(水) 23:34:35
>>463 -pスイッチや-nスイッチを使わない場合はそれで上手く行くようです。
そもそも毎度毎度こんなに長いのではワンライナーは書けませんし、
簡単な仕事を簡単にやっつけられないのなら、Perlとしての魅力は
激減ですが。
やっつけ仕事によく使う-pスイッチや-nスイッチと
use utf8を共存させる方法はありますか。
#!/usr/bin/perl -pi.bak
なスクリプトで
>>115 の方法を試すと全くおかしなことになります。
>>464 なるほど、便利なモジュールがあるのですね。
間違いなく合ってない。 煽りとかではなく。 別の言語にしたほうが幸せになれるとおもうよ。
Perl/Tk で GUI でエロ画像を集めてるよ。
エロのエネルギーはおよそ12kW/hです。
質問 use strict; warn $c; だとstrictが効くのに use strict; warn $a; だとstrictが効かないのはなぜ? $bも効かない
sort() で使われるから例外扱い perlvar嫁
質問します。 for(my $i=0;$i<=$#aaa;$i++){ $out = $aaa[$i] ; if( $aaa[$i+1] ){ while($aaa[$i+1] =~ /^\+/){ $i++ ; $out = "$out $aaa[$i]" ; } } print "$out\n" ; } これのforをforeachで書いたらどんな記述でかけますでしょうか。 やりたいことは、ある要素のアタマに"+"があれば その要素は一つ前の要素とつなげようとしています。 foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。
from
>>469 to
>>470 perldoc perlvar
$a
$b Special package variables when using sort(), see "sort" in perlfunc. Because of this specialness $a and $b don’t need to
be declared (using use vars, or our()) even when using the "strict ’vars’" pragma. Don’t lexicalize them with "my $a" or
"my $b" if you want to be able to use them in the sort() comparison block or function.
thx!
>>foreachで回している最中に強制的に次の要素にアクセスすることは出来るのでしょうか。 foreachでは今アクセスしている要素が何番目かを知ることはできない。 もちろん、中で別に変数を$i++とかすりゃ別。 俺ならこんな感じに書く。 foreach (@aaa) { if (/^\+/) { $out[-1] .= " $_"; } else { push @out, $_; } }
すまん、なぜかソラ目でprintがpushに見えていた。 printだとこうかな。printが2つあるのがいまいち気に入らないが... my $buf = undef; foreach (@aaa) { if (/^\+/) { $buf .= " $_"; } else { print $buf, "\n" if defined $buf; $buf = $_; } } print $buf, "\n" if defined $buf;
>>473 の後
print map { "$_\n" } @out; でもすりゃいいんだから別にいいんじゃ
print "$_\n" for @out; このほうが短い。
print join "\n", @out; の方がわかり安い
どれが速いんですかね^^
>>477 ダウト。それだと最後の要素の後に改行が出ない。
480 :
471 :2007/01/25(木) 16:31:27
>>473 できました!!
すっきりしてわかりやすくなりました。
ありがとうございます。
>>479 そういう細かい部分ってすっごい大事だよね
後で泣き見たりする
しかし「ダウト」って使う人はあんまり見たことが無い
482 :
デフォルトの名無しさん :2007/01/25(木) 18:24:14
クイズのゲームを作っているのですが、問題を回答したら次ってどんどん進んでいき 正解したら各問ごとに正解数をカウントしていってりうのですちゃんとカウントされません。 perlはテキストでも作ってそれに書き込んでそのあと読み込んでしないと記憶した 変数が消えるのですか・・・? 変な質問ですみません。HSPからperlに乗り換えてみたんですが混乱してしまって
>>482 日本語でおk
HSPで作ったほうがいいんじゃね?
>>483 perlの勉強をしてみたいと思いましたので・・・
myで定義をしてるんですけど、なんかいろいろと定義の仕方があるみたいですねperlは
さっさとソースを見せろ
if($tugi eq "Q1"){ if($toi eq "t"){ $sum=$seikai+1; } &mon0; } if($tugi eq "Q2"){ if($toi eq "t"){ $sum=$seikai+1; } &mon1; } if($tugi eq "Q3"){ if($toi eq "t"){ $sum=$seikai+1; } &goukei; } sub goukei{ print "正解は"+$sum+"個"; }
次の問題へ進むたびに正解数を my してるんだろうな
sub mon0{ print "<P>"; print "<SELECT name='answer' size='3'>"; print "<OPTION value='true'>みかん</OPTION>"; print "<OPTION value='false'>アップル</OPTION>"; print "<OPTION value='false'>ばなな</OPTION>"; print "</SELECT>"; print "</P>"; print "<INPUT type=hidden name=tugi value=Q2>"; print "<P><INPUT type='submit' value='次の問いへ'></P>"; } sub mon0{ print "<P>"; print "<SELECT name='answer' size='3'>"; print "<OPTION value='false'>インコ</OPTION>"; print "<OPTION value='true'>ふくろう</OPTION>"; print "<OPTION value='false'>鳩</OPTION>"; print "</SELECT>"; print "</P>"; print "<INPUT type=hidden name=tugi value=Q3>"; print "<P><INPUT type='submit' value='次の問いへ'></P>"; } こんな感じです
webprogでやれ
490 :
487 :2007/01/25(木) 18:49:27
はずした。 > $sum=$seikai+1;
$sum=$sum+1 じゃないの?
>>491 そこは修正しました。
上のほうで
my $sum;
と定義してるのが問題なんでしょうか?
上のほうで、とか言われてもわからないから全部見せろ
そもそもCUIなのかCGIなのか
htmlなんだろw
板違いっぽいですね(−−
>>477 は最後の改行もそうだが、メモリ内で一旦展開するから、
効率よくないんでない?
さらに、文字列を連結するためにメモリの再割り当てが何度も起きる悪寒
UTF8 で並んでいる名前の一覧があるのですが、それをあいうえお別に分類したいのですが どういう方法が良いでしょうか。 青木 -> @AGyou へ 斉藤 -> @SaGyou へ という感じにしたいとおもいます。
読み仮名付けなきゃ無理だね
>>502 お返事ありがとうございます。やっぱり難しいですね orz
別の手段を考えて見ます。
>>503 > 別の手段を考えて見ます。
なんで? 読みがなつければいいじゃん。
>>504 表現が悪くてすいません。別の手段 → 読み仮名をつけることです。
読みがなをつけるモジュールって、あっても良さそうなもんだけどね。 mecabにぶっ込めば一発か?
不確実すぎるだろ・・・
すべて登録されているとは限らないし ――特に名前の方、 読みがアンビなのもあるから、必要なのは、読みがなふり支援ツール じゃなかんべか。
漢字にふり仮名を自動でつけるのは ある程度は自動化できるが 同じ字で読みが違う場合もあるので(ex.徳沢 => とくさわ,とくざわ etc.) 完全な精度では無理。
読みを当てはめるのも結局確率だから ↑のデータ使ってもやっぱ無理っしょ
そこでAIの出番なわけだ
そこでエスパーの出番なわけだ
515 :
デフォルトの名無しさん :2007/01/26(金) 20:57:04
WindowsXP上でActivePerlを使ってるんですが、USBデバイスをコントロールする方法はありますか? 学習リモコンのクロッサム2+USBとデータをやりとりしたいんですが。
>>511 のリンク先より引用
----
名字 ふりがな 人数 順位 累積人数 累積比率
鈴木 スズキ 139,627 1 139,627 2.04029%
鈴木 ススギ 25 13,107 6,517,718 95.2398%
鈴木 ススキ 7 27,840 6,723,557 98.2476%
鈴木 スズノキ 3 41,426 6,795,040 99.2922%
鈴木 スズ 2 47,333 6,812,494 99.5472%
鈴木 スズシ 2 47,333 6,812,506 99.5474%
鈴木 スヅキ 2 47,333 6,812,518 99.5476%
鈴木 スス 1 56,150 6,832,142 99.8343%
鈴木 ススヘキ 1 56,150 6,832,147 99.8344%
鈴木 ススリキ 1 56,150 6,832,148 99.8344%
鈴木 スズギ 1 56,150 6,832,151 99.8344%
鈴木 ズスキ 1 56,150 6,832,308 99.8367%
鈴木 ズズキ 1 56,150 6,832,309 99.8367%
鈴木 ヌズキ 1 56,150 6,836,957 99.9047%
----
姓しかわからない状況で確実に読み仮名をつける方法は
>>513 のAIじゃなく
>>514 のエスパーだな。
AIについて無知な
>>513 はAIと書けばかっこいいと思ってるのか?
ヌズキはねーよw どう考えても書き間違いだろwww あ、ヌズキさん見てたらごめんなさい><
518 :
ヌズキ :2007/01/26(金) 21:24:52
呼んだ?
名前の仮名振りは、人間がやってもかなり難しい。 自動化なんてとても無理。 入力補助が限界でしょうね。
あと「ズスギ」さんと「ズズギ」さんが入れば 濁点のあるなしの組み合わせがそろうのにな
読みが存在しない漢字が存在する
たとえば、「東」と書いて「あずま」「ひがし」「とう」と、読み方がいろいろある。 漢字だけからは読み方は判別できない。 そのため、正しい読み方は、本人にしかわからない。
同じクラスに五島(ごとう)と五島(ごしま)が居たことあるよ。
>>523 おまえ、ひょっとして1年2組の時の近藤(こんどう)か?
おれ隣のクラスの権藤(ごんどう)だよ。おぼえてるか?
住基ネットワークに問い合わせれば総て解決♪
>>515 キミの質問は、2つに切り分けないといけない。
1.クロッサム2のDLLのインターフェースが公開されているかどうか。
2.ActivePerl から DLLを呼び出せるかどうか。
両方とも「YES」だからできるのだが、質問の切り分けができず、
「1」の当否を回答者に調べさせるキミには無理だ。
>>525 スーパーハッカーキタ━━━━━━(゚∀゚)━━━━━━ !!
あふぉか
姓しかわからないデータと住基ネットのデータをどうリンクするんだよ。
>>525 =
>>527 か?
くだらないネタにみんなスルーしてるわけだが、
自作自演するほど反応してほしかったのか?
ネタだと思っているなら何故あふぉとか言ってマジ突っ込みするんだろう。分裂気味? まぁ大方、真相がネタでもマジでも恥かかないよう工夫したら前後で矛盾が出たってとこか。
まぁ未承諾さんだし。
>>526 もちろんDLLとかWindowsの約束とかよく分かっておりません。
そのあと、mrccom.dllを見つけてWin32::APIでimportを試すところまで来ましたが、
unknown errorでimport出来ず\(^o^)/。どなたか気が向いたら教えてください。
>>527 ,
>>529 ,
>>532 ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
>>528 =533 別に君以外誰も文句も言ってないし、しきりも頼んでないけど。
頓珍漢レスを
>>529 に指摘されて逆ギレしてる張本人乙にしかみえないよ?w
粘着だが逆ギレだか知らんが、 PerlのスレでPerlの話をしないやつはすべて平等に価値がない
ここは批判されると30分以内に逆切れコメントする527を観察スレですか?
>>531 >どなたか気が向いたら教えてください。
まず、C++を勉強しろ。C++でDLLを扱えるようになること。
PerlでDLLを扱う話はそれからだ。
>>533 ここはvipでも口論・議論ではなくperlの質問箱スレだ。
前日の終わったネタをいつまでも引きずったり、
指摘されて逆切れして粘着するぐらいならほかのスレ行けよ
__ | | | | ___ ___ | | . / | __ _____ / _ \ | | / /| | / / / ____/ / / > l | |. / / .| |. / / / /.. _ /  ̄ / | |/ / | |/ / /  ̄ ̄_/ / \ | /. | / / / ̄ ̄ __ / / ̄ ̄> | | / |___/ ./  ̄ ̄ ̄ / /  ̄ ̄ /  ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ _____ ___ ___ ___ ______ /__ __/ [][] _| |_| |__ _| |_ | ___ \ / / | _ | |_ レ'~ ̄| | | \ l | |_  ̄| | / / / /| | | |____/ / \__| | |  ̄ /_ /. | |_ | ____/ ___ __ __/ヽ |_|. |__|. \/ | | /`、_/_/ / _ ヽ / _ / | | ヽ / | l l l | l l l | | | l ヽ  ̄ / ,ヽ  ̄ /  ̄  ̄  ̄ ̄ / __ ヽ | l l l ヽ  ̄ ̄ / ~ ̄ ̄~
それ、もう少し小さくならんか。
Web でやれ Prog
vv3bpr0gマ”ゃれ
Image::Magickで32bit(RGBA)のpngを読み込んで、24bit(RGB)のpngに書き出したいんだけど、 どうやればいいか教えてください。
545 :
543 :2007/01/29(月) 00:12:46
もう少し調べてみたら、 $im->Set(matte => 0); で解決できました。スレ汚しごめんなさい。
threads::shared なんですが、 例) $var : shared; と言うのは、文法的にどういう意味なのでしょうか? threadsだけに許された特殊な文法なのでしょうか?
attributes
>>547 ありがとうございます
CPANで見ても英語がさっぱりで…
分かり易く解説されているページ等はないでしょうか
はてなのは見ましたがさっぱりです
質問です UNIX系OSやWindowsで .soや.dllを利用したいのですが、 どうするのが一般的でしょうか? 出来れば日本語の解説ページをお願いします
質問です コマンドラインでカウントダウンってできますか? C:\>perl hoge.pl 次の処理まで待ち時間: 5秒... のところ “5”の部分のみが 4 3 2 1... と更新されていくようにしたいのです いちおー system "cls (もしくは) clear "でスクリーンごと更新とかは なしで Activeperlですが cpanで解決するなら cpanでも結構です よろしく〜
>551 うおっ! ありがとうございます!! さっそくそのキーワードで調べてみます!!
553 :
デフォルトの名無しさん :2007/02/02(金) 13:47:58
perlでISHテキスト←→バイナリ変換するモジュールってある? 一通りCPANしたりぐぐったりしてみたが見つからなかったんだけど。
質問です。 項目数(列数)が多いCSVのデータを読み込んで処理するとき、皆さんはどうしてますか? 私は10項目くらいでしたら my($id, $name, $age, ..) = split /,/; と、それぞれ変数を用意するのですが、 100項目を超えるような場合、項目名を要素とする配列を用意しておき @col_name = qw(id name age ..); 連想配列に格納して my @array = split /,/; my %hash = (); for(0..$#col_name) { my $key = $col_name[$_]; my $val = $array[$_]; $hash{ $key } = $val; } $tel = $hash{tel}; 今扱ってるCSVはデータの件数(行数)が500件あって、上記の連想配列の格納をその件数分繰り返し行なっています。
555 :
554 :2007/02/02(金) 15:03:04
「項目名 => 項目番号」の連想配列を用意しておくのがいいのかなとも思うのですが、 %col_no = ( id => 0, name => 1, ..., ); $tel = $array[ $col_no{tel} ]; ↑ちょっと読みづらいかなとも思います。 項目数・項目名が変わる可能性は低いです。 効率よりも読みやすさ重視です。 よろしければ、ご意見お聞かせください。
$tel = $array->[$i]->{'col_no'}->{'tel'};
$tel = $array->[$i]->{'tel'}; これでいいのか 入れ方は任せる
@col_name = qw(id name age); # member $_ = "1,hiroyuki,30"; # csv @$record{@col_name} = split /,/; # print $$record{id},"\n"; print $$record{name},"\n"; print $$record{age},"\n";
利便性の為にハッシュを使わざるを得ないのが気になってるんじゃないの? 配列でやりたいなら、こんなことしちゃったり: my $r = MyRecord->new(split /,/); print("$r->name\n"); package MyRecord; BEGIN { my $i = 0; my @col_name = qw(id name age); # カラム名を設定。 for my $n (@col_name) { eval qq{ sub $n :lvalue { \$_[0][$i] }}; $i++; }} sub new { bless [@_[1..$#_]], $_[0]; }
ミス。 print("$r->name\n") 修正 → print($r->name, "\n")
561 :
デフォルトの名無しさん :2007/02/02(金) 22:02:33
>>559 evalで作るのと、*{...} = sub{}で作るのどっちがスマートなんだろ。
evalはパーサが動く分遅くはなりそうだけど 通常の定義と見た目が一貫してるから読みやすいかも。 シンボルテーブル+クロージャだと、クロージャ作る側のレキシカルな環境?も意識しないとならないし、ちょっと嫌。
563 :
554 :2007/02/03(土) 10:09:16
>>556-562 ご回答ありがとうございます。
いろいろ方法があるのですね。
まだご回答の内容が理解できていないので、勉強してきます。
他人が作った、FTPで複数のファイルを受信する為の処理に手を入れなくては いけないのですが、元のソースにエラー時の処理が全く入っていません。 $ftpcmd = ○○○ #<-ftpコマンドが記述されたテキストファイル system("ftp -n < $ftpcmd); 対象ファイルは複数あって mget logfile*.* で取って来ています。 ファイルが取って来れなかったり、相手に接続できなかったりといったような エラーが起きた事を判定するにはどのようにすればいいのでしょうか? PerlもLynuxも初めてなので、出来るだけ簡単な方法を教えていただけると ありがたいです。 よろしくお願いします。
Net::FTP で書き直したらいいんじゃないかな。
Lynuxはおらも初めてだ
>>565-566 教えていただいた方法で組んでみたのですが、複数のファイルをワイルドカードで
指定して取って来るにはどうしたらよいのでしょう?
対象のファイル名には出力された日付と時刻が含まれていて、個数も名前も不定
なのです(○○○YYYYMMDDHHMM.logのようなファイル名で、日付部分が
当日のものだけ取って来たいのです)。
何度もすみませんがよろしくお願いします。
sub mget { my($ftp,$pattern) = @_; foreach my $file ($ftp->ls($pattern)) { $ftp->get($file) or warn $ftp->message; } }
>>570 どうもありがとうございます。
上手く持ってこれました。
572 :
デフォルトの名無しさん :2007/02/07(水) 11:31:08
希望結果を得たいのですが、実行結果の通りになります 以下のソースで実行結果になることは納得できるのですが、 希望結果を得るためにはどうすれば良いのでしょうか? ●ソース @$data=( {'name'=>'test1','pay'=>'1000','cancel_flg'=>'0','create_date'=>'20070131','cancel?date'=>''}, {'name'=>'test2','pay'=>'2000','cancel_flg'=>'1','create_date'=>'20070110','cancel_date'=>'20070120'}, {'name'=>'test3','pay'=>'100','cancel_flg'=>'0','create_date'=>'20070201','cancel_date'=>''}, ); foreach(@$data){ push(@lst,$_); if($_->{cancel_flg}){ $_->{create_date}=$_->{cancel_date}; $_->{pay}="-".$_->{pay}; push(@lst,$_); } } print "$_->{name}\t$_->{pay}\t$_->{create_date}\n" foreach(@lst); ●実結果 test1 1000 20070131 test2 -2000 20070120 test2 -2000 20070120 test3 100 20070201 ●希望結果 test1 1000 20070131 test2 2000 20070110 test2 -2000 20070120 test3 100 20070201
foreach(@$data){ push(@lst, {%$_});
574 :
デフォルトの名無しさん :2007/02/07(水) 11:55:08
>>573 ありがとうございます
希望どおりの結果を得られました
ハッシュ内のデータを1つずつ別のハッシュに移し替えることで回避していましたが
これからはソースがスマートになりそうですw
私が無知なだけだと言う話かも知れませんが、勉強になりました
こういうことだな。 $X = ['A']; $Y = $X; #リファレンスデータのポインタ(?)だけをコピーして、データそのものはコピーしてない。 $X->[0] = 'B'; print $Y->[0]; 結果「B」
ちょっとCPANで調べるとStorableのdcloneとか、 Clone(::More/Fast/PP/Any...)とかなんかたくさんあるんだけど どれを使うのがいいんだよ
俺は年寄りなのでcancelないときもコピーすんのもったいないと思ってしまう
辞書みたいなものを作っているのですが、見出し語にダブりが多数あります。 こんな感じで。 <midashi>kuki</midashi> 茎とはクキである。・・・・・ <midashi>kuki</midashi> 茎とはクキである。・・・・・ 見出し部分タグ内が同じ場合のみ、一つ残してダブりのぶんは見出しも本文も消す、 という作業を行いたいのですが、perlで出来ますか? 何を勉強すればよいのか、示唆頂ければありがたいです。
xmlなら、専用のエディタ使う方がよっぽど早くて安全だと思うのだが。
ファイルのパースさえ出来れば楽勝だろうけどたぶんそこが一番の問題だと思う 機械読み取りを考慮した仕様になってればいいんだが
配列を初期化したいのですが、どのようにすればいいのでしょうか? 引き渡したパスにあるファイル名を配列に入れて、そのファイル1つ1つを順繰りに 処理していきたいのですが、1度処理をした後でもう1度処理を行うと、最初に配列 にセットしたファイル名が配列に残ってしまっています。 下のソースだと、「1回目」と「2回目」のところでは同じ内容のファイル名が表示 されます(2回目では何も表示されないで欲しいです)。 どこがおかしいのでしょうか?ご指導を宜しくお願いします。 sub aa{ ($path) = @_; @localfl; @dir; opendir(DIR,$path) || return(-1); @dir = readdir(DIR); foreach $f (@dir){ if($f =~ /^\.\.?/){ next;}#親&カレントフォルダ(.と..)を除外 $localfl{$f} = $f; } foreach $f (sort(keys(%localfl))){ print("1回目 $f\n"); } undef @localfl;#これでクリア? @localfl = ();#これでクリア? foreach $f (sort(keys(%localfl))){ print("2回目 $f\n"); } }
@localfl と %localfl は別物ですよ
なぜに Perl4 … 変数全部グローバルだし
>>582 @localflには最初から何も入ってなくて、%localflをクリアしてないから
前の中身が残ってるということでしょうか?
%localflの中身をクリアすればOKですか(%localfl=""; とか・・?)
>>583 すみません、まだPerl触り出して1週間のド素人なもので・・。
%localfl = ();
586 :
582 :2007/02/07(水) 23:36:52
とりあえず
>>585 の %localfl = (); または undef %localfh; で意図する結果が得られます
バグの温床になるのを防ぐために use strict; と use warnings; をお薦めします
変数を宣言するときは my を使ってください
適当に書き直したらこんな感じでしょうか
use strict;
use warnings;
sub aa {
my ($path) = @_;
opendir(my $dh, $path) or return -1;
my @localfl = sort grep { ! /^\.\.?/ } readdir($dh);
foreach my $f (@localfl) {
print("1回目 $f\n");
}
}
Encodeモジュール使い方を勉強中です。 なんとか試行錯誤しながらやってるんですが、 Data::Dumper がやたら文字化けします。 Dumper無しで出力すると化けないので エンコードの部分は間違ってないと思うのですが。
use strict; use utf8; use Data::Dumper; binmode STDOUT,":encoding(cp932)"; my $str="あああ"; print Dumper $str; print $str; 以上をutf8で書いて実行すると $VAR1 = "\x{3042}\x{3042}\x{3042}"; あああ となります どうにかして日本語をDumperする方法はないでしょうか?
590 :
578 :2007/02/08(木) 20:17:25
ありがとうございました。 XML エディタ で検索してみましたが、どうもよく分かりませんでした。 ちなみに見出しは全部でaからzまで数十万あります。 ダブり語は多分、数千種類が各2〜7個くらいダブっています。 差し支えなければ、使えそうな専用エディタを教えて頂けないでしょうか? ファイルのパースさえ出来れば楽勝だろうとおっしゃるのは素晴らしいです。 ちなみに楽勝というのはperl で、ですか? 機械で読むというのがよく分からないのですが(すみません)、多分txt形式で 50MBくらいのファイルになりそうで、そこまでは出来ます。
ちなみに環境は WindowsXP sp2 上で、ActivePerl Build 819 使用しています。
592 :
デフォルトの名無しさん :2007/02/09(金) 02:39:44
なんとなくWebProgからきました。取り留めもない質問なんですがお願いします。 WEBの掲示板などでよく、特定のタグだけ書き込み許可してますよね。それを実現するのに 下記のようなコードを書きました。最近、WEBに限らず、テキスト系の処理は何するにも こんな感じでsplitして再帰する書き方に固執してしまってます。 字ヅラ的には短くて気に入ってるんですが、処理的には効率悪い気がしてならないのです。 もっとうまい方法があるでしょうか。 sub escape_limited { my %args = (str => '', @_); $exception = q!</?(?:a|img|blockquote|pre|code|span)(?:\s[^>]*)?>!; my @scraps = split(/($exception)/im, $args{'str'}, 2); if ((scalar @scraps) == 3) { return &escape(%args, str => $scraps[0]). $scraps[1]. &escape_limited(%args, str => $scraps[2]); } else { return &escape($args{'str'}); } }
sub escape_limited { my %args = ( str => '', allowed => qr{a|img|blockquote|pre|code|span}, @_ ); my $text = $args{str}; $text =~ s{( < (?! /? (?:$args{allowed}) \b ) [^>]* > )}{ escape($1) }iegx; return $text; } とかでどう?
$LT = quotemeta escape("<"); $GT = quotemeta escape(">"); ($str = escape($str)) =~s/$LT\/?(a|img|b|blockquote|pre|code|span)\b.*?$GT//ig; とかねー。多分軽いよ。 タグ内に'<' '>' が無いことを前提にしてるみたいだけど、大丈夫? 属性も調べないと、スタイルシートとかスクリプトとか埋め込まれる可能性もあるし。
うおっ、間違えた。正規表現のリテラルのトコ…。 s/$LT(\/?(?:a|img|b|blockquote|pre|code|span))\b(.*?)$GT/<$1$2>/ig だわな。スマソ
試しました。 592(私):スプリット型 593:一発置換型 594:例外事後処理型 マッチングがひとつもない場合 592:速い 593:圧倒的に遅い 594:速い マッチングがある場合 592:圧倒的に遅い(しかも多重再帰の警告でまくり) 593:少し速い 594:速い 一旦、なりふり構わず置換してから例外を元に戻すってのは、 分かりやすいだけで処理的に気持ち悪いと思ってましたが、 意外と効率いいんですね。
お礼を忘れました。みなさんありがとうございます。 ひとつ、事後処理型の場合、対象文字列に最初からエスケープ文字が 含まれてるケースを考慮する必要がありますね。これが一番やっかいかなあ。
いや、一旦、二重エスケープになって元に戻るからいいのか。 混乱してきたので仕事に戻ります。
>>590 テキスト読み込んで処理はPerlの得意とする分野なので楽勝
タグは<midasi></midasi>だけなのか?その他のタグがあったとして処理する必要はないのか?
複数の同じ見出しに対し残す本文はどれでもいいのか?
本文中にタグや特殊文字があったりした場合は?一意に判別できるエスケープの仕様はある?
あたりの仕様さえ確定できればファイル読み込みのやりかた、正規表現、ハッシュあたり覚えればできるっしょ
ちゃんとしたXML形式になってるなら専用のパーサ使えば楽が出来るが、正規表現でも十分なように思える
ちゃんとしたXMLになってなくても、XML::Liberal使えばわりといける。
wxperlを使ってGUIのメモ帳を作っています。ファイルを新規に保存するとき ファイルと同名のフォルダをつくりたいのですがなぜかうまくいきません。 my $filename = $saveasdialog->GetPath; $this->{text_ctrl_1}->SaveFile($filename); mkdir($filename); このスクリプトで、一行目でwxperl filedialogオブジェクトにより ファイル名が取得され$filenameに入ります。2行目でsavefileメソッドで テキストが$filenameの通りに名前がつけられ保存されます。これは正常にいきます。 しかし、3行目のコードではフォルダが作成されません。 wxperl固有というよりもperlのコードの書き方に問題があるような気がするのですが、 アドバイスがあったらお願いします。
> ファイルを新規に保存するときファイルと同名のフォルダをつくりたい なんじゃそりゃ??
どの OS でテストしてるんだか知らないけど、ファイルシステム側の問題だろう。 例えば Windows では同名のファイルとフォルダは作れない。
604 :
601 :2007/02/10(土) 04:31:21
>>603 すみませんでした。windows xp, active perl環境です。
>例えば Windows では同名のファイルとフォルダは作れない。
これは知りませんでした。というか大昔に聞いたことがあるような気がしますが
盲点でした。
mkdir($filename."Folder");
のようにしたら("作成したファイル名"Folder)という名前でフォルダが出来ました。
自分の考えている機能としてはこれで十分先に進めそうです。
ありがとうございました。
て言うか、同名のファイルとフォルダを作れるファイルシステムってあったっけ?
同名のファイルとフォルダがあるとApacheがまいっちんぐしちゃうよ
>>605 むかし、「同名のファイルとディレクトリ作れるんじゃねえ!!」と怒った記憶がある。
これも拡張子を非表示にするゆとり教育の弊害か…
これもファイル名とディレクトリ名を同じ名前空間に置くという異常なことを やったUNIXの弊害か……
610 :
デフォルトの名無しさん :2007/02/10(土) 18:44:58
初学ながらリファ本片手にCGIスクリプトを書いています。 下記のような問題にぶつかるもどうにも解決方法がわかりません。 どうすればよいか教えてください。よろしくお願いします。 【やりたいこと】 投票CGIの改造で、イエスノーの2択の選択肢の投票に応じて、表示されて いる数字も増減されるようにしたい。 数字の増減はカウンタスクリプトを流用し ています。 【現在書いているスクリプト(抜粋)】 open(FILE, "+<./count.dat") or die("エラー:カウントファイルが開けません"); eval { flock(FILE, 2); }; $counta = <FILE>; seek(FILE, 0, 0); if($item == 1 ){ print FILE $counta+1 } else { print FILE $counta-1 } close(FILE); 【問題点】 例えば現在の$countaの値が100で、値が-1される場合、結果は99となって欲しいのに、990と なって返ってきます。1000から999の場合なども同じです(どうも桁数が減る場合にうまく動作し てくれない模様)。 【解決したいこと】 100が99になって欲しい場合、その動作が990とならず希望どおり表示されるようにしたいです。 【その他】 同じ桁数が変わる場合でも、99→100など、桁数が増える場合は問題が発生しないです。
ファイル名とディレクトリ名の名前空間が異なるなんて想像したら そちらの方が異常だと思うが。 そもそもそいった実装のOSはあるんかえ?
>>609 最近それで頭に来てる。百万個を越えるファイルを持つ非常に巨大なファイルツリーを
トラバースするのにリソース食いまくり。
やっぱり分けてあるシステムってあるんだ。
>610 use Fcntl qw/:flock/; open my $fh, '+<', './count.dat' or die $!; eval { flock $fh, LOCK_EX }; $count = <$fh>; seek $fh, 0, 0; print $fh $item == 1 ? $count + 1 : $count -1; truncate $fh or die $!; close $fh;
614 :
610 :2007/02/10(土) 19:27:24
>>613 正直、書かれている内容がさっぱり分からないので、リファ本で読み進めながら
テストしたいと思います。ありがとうございます。
615 :
610 :2007/02/10(土) 21:14:23
>>613 早速アドバイスを実装したところ、思った通りに動いてくれました。
どうもtruncateがポイントだったようですね。ありがとうございました。
616 :
デフォルトの名無しさん :2007/02/11(日) 04:18:34
正規表現でマッチしたものを任意の変数に入れて(もしくは任意のエイリアスに結びつけて)、 後で取り出すことって出来るのでしょうか? マッチした順に$1や$2ではなく、(.*?>$name)とかした時、 (.*?)のマッチを$nameで受け取れると非常に嬉しいのですが。。 どなたかアドバイスいただけると嬉しいです。。
>>616 マッチした後に代入しておくんじゃなんで駄目なんだ?
if (/(.*?)/) {
$name = $1;
}
>>616 マッチしたもののリストが返ってくるのでそれを受け取る
($a, $b) = /^(.)(.)/;
619 :
616 :2007/02/11(日) 09:49:39
>>617-618 返信ありがとうございます _ _
なぜエイアリアスに結びつけたいかというと
βのウェブサービスのラッパーを作っていて、
正規表現がころころ変わる可能性がある(欲しい文字列が前後する可能性がある)からです。
欲しい文字列が前後してしまうと正規表現だけでなく、
その後の正規表現を受け取るコードも変更しなければならなくなってしまうので。。
# 正規表現を正規表現で自動生成するスクリプトを作っていたら、
# 文字列が前後した場合その部分は自動化できなくなってしまうことに気づき、
# 質問させて頂きました。
>>588 ,599
それは文字化けでなく、エスケープされてるだけ。
Data::Dumper の仕様
詳説正規表現第2版 7.8.8 名前つきキャプチャを模倣する (.*?)(?{ $name = $^N })
622 :
592 :2007/02/11(日) 15:22:43
タグそのものだけでなく、例えば<pre>の内側はエスケープしない、など、 ちょっと込み入っている場合、例外事後処理だと信じられないほど遅くなりました。 コーディングに問題があったかも知れませんが。 という訳でスプリット型に戻しました・・。もっとうまい方法があるでしょうか。 sub escape_limited { my %args = (str => '', exception => [], exception_block => [], @_); my @regexp_array; (scalar @{$args{'exception_block'}}) and push(@regexp_array, sprintf(q!<(%s)\b.*?>.+?</\2>!, join('|', @{$args{'exception_block'}}))); (scalar @{$args{'exception'}}) and push(@regexp_array, sprintf(q!</?(?:%s)\b.*?>!, join('|', @{$args{'exception'}}))); return &loop($args{'str'}, join('|', @regexp_array)); sub loop { if ($_[1]) { my @scraps = split(/($_[1])/is, $_[0], 2) ; return &escape($scraps[0]). $scraps[1]. &loop(pop(@scraps), $_[1]) if ((scalar @scraps) >= 3); } return &escape($_[0]); } }
>>619 たぶんアプローチが根本的に間違ってる。
624 :
616 :2007/02/11(日) 19:05:54
前から疑問に思ってたんですが、 $input = 'hoge'; $output = $input; $output =~ s/ho/ha/g; return $output; これを$outputを使わずにreturn &func($input, /ho/, 'ha'); みたいに表現することはできないんでしょうか。
こんなん? join('ha', split(/ho/, $input))
return str_replace('ho', 'ha', $input);
関数的な操作が充実してる割に標準でついてる関数がほとんど破壊的なんだよな
630 :
592 :2007/02/12(月) 00:10:16
すみません、うそを言いました。594さんのがやっぱり一番速いです。 遅くなったのはバグでした。スレ汚しすみません。
パッケージが提供してる関数の一覧って簡単に取得できますか?
632 :
631 :2007/02/12(月) 03:15:00
633 :
デフォルトの名無しさん :2007/02/12(月) 07:44:44
動的に生成された複数のPNG画像データをzip圧縮したいと考えています。 GDモジュールとArchive::Zipモジュールが活用できそう、 と調べたのですが不明点があります。 Archive::ZipモジュールのaddFileメソッドは引数としてファイル名が必要ですが、 GDモジュールのpngメソッドで動的に生成されたPNG画像データをzip圧縮するにはどうしたら良いでしょうか。 生成されたPNGデータをbinmodeを使用して画面表示するサンプルは見かけたのですが・・・ Perlを勉強し始めたばかりで基本事項も良く分からず五里霧中です。 アドバイスのほど、よろしくお願いいたします。
addString
635 :
デフォルトの名無しさん :2007/02/12(月) 13:43:39
system() で所定の場所からwgetでファイルを持ってくる処理を作っています。 必ずしもその場所にファイルがあるとは限らないので、ファイルが無かった時と 接続出来ないなどで取ってこれなかった時を判定したいのですが、どうすれば よいのでしょうか?
system関数の戻り値でチェックできないの?
637 :
デフォルトの名無しさん :2007/02/12(月) 14:20:49
>>636 ありがとうございます。
やってみましたが、ファイルが無かった時も接続できなかった時も、戻り値は
256となるので区別がつかないです・・。
wgetの複雑な機能をバリバリ使ってるなら別だが、ただファイルとってくる だけならLWP使う方がその辺のエラー処理は書きやすいと思うけどな。
639 :
デフォルトの名無しさん :2007/02/12(月) 14:39:33
>>638 すみません、wgetを使わないといけないので別の方法で取ってくるというのは
出来ないのです。
美しくないがstderr読むしかないだろう
接続とファイル存在チェックだけ別ルーチンで作っといて、 それがOKならwgetで取ってくるってのはどうだ?
642 :
デフォルトの名無しさん :2007/02/12(月) 15:59:14
>>640 ,641
ありがとうございます。
>>640 さんの方法の方が簡単そうなのでこちらで
いこうと思うのですが、
open(STDERR, ">> errmsg.txt");
$ret = system("wget 〜");
close(STDERR);
とやって、$ret が256 だったらerrmsg.txtを1行づつ読み込んで
[ 404 Notfound ]という文字列が見つかったらファイルなし、無い
ならその他のエラー、という感じでいいのでしょうか?
あーごめん、404と接続できなかった時とを区別したいのか。早とちりスマソ。
気にしてへんからええよ。 書いてくれてありがとな。
647 :
デフォルトの名無しさん :2007/02/14(水) 00:10:02
数字と文字が混在した要素からなる配列があるんですけど、これをsortすると 1〜〜,11〜〜,2〜〜,23〜〜・・・ という風になってしまいます。 これを数字順 1〜〜,2〜〜,11〜〜,23〜〜・・・ にするにはどうすればいいのでしょうか??
648 :
デフォルトの名無しさん :2007/02/14(水) 00:17:12
>>647 @dst = sort { $a <=> $b } @src; # 数値ソート
@dst = sort { $a cmp $b } @src; # 文字列ソート(こっちは略せる)
649 :
デフォルトの名無しさん :2007/02/14(水) 00:39:50
>>648 それ試したんですけど、数字順にならないんです・・orz
@dst = sort { sprintf qq|%02d|,$a cmp sprintf qq|%02d|,$b } @src; とかとか♪
651 :
デフォルトの名無しさん :2007/02/14(水) 00:53:47
>>650 Sort subroutine didn't return a numeric value
ってエラーがががorz
652 :
脱帽 :2007/02/14(水) 00:59:09
ちょうてけとう @dst = sort { ($a =~ /(\d+)/)[0] <=> ($b =~ /(\d+)/)[0] } @src;
print join qq/, /, sort { $a <=> $b } qw/21d 1aa 11b 2cc 13e 5b/; 1aa, 2cc, 5b, 11b, 13e, 21d ちゃんとなってるけどなあ
>>653 いろいろ試したらできました。
splitを何回か使って要素の中の数列にまで要素を分割して比較したらうまくいきました。
俺なんかに付き合ってくれてありがとうございましたm(_ _m)
ひ〜(悲鳴)
(悲鳴)
シュー 三(悲鳴)
質問〜perlから直接web上のファイルを開く事はできますか?
ソースをテキストで保存したくて
open(IN,"
http://**** ・・・") or die "無理";
ってやってみたら無理でした。
startup.plに print int rand 10; のようなコードを入れたtest.plをrequireして実行すると ↓↓httpdプロセス番号(実行結果)↓↓ 1(3), 2(3), 3(3), 1(5), 2(5), 3,(5), 1(2), 2(2), 3(2) のように完全でない乱数がある規則で発生してしまいます。 srandを加える、もしくはtest.plを意図的に更新し共有メモリから外すと期待通り全て違う表示がされます。 なぜこのような動作になるのか教えていただけませんでしょうか。 環境はFedora core5、Perl v5.8.8、mod_perl-2.0.2-5.1、httpd-2.2.2-1.2(prefork)です。
あ、ありがとうございます! お陰で心置きなく寝れます。いや、仕事でした。いってきます;;
% cat > test.pl #!/usr/bin/perl $ID = "id"; $PASS = "pass"; __END__ perlと余り関係ない質問かもしれませんが.. 上の様なスクリプトを作った場合ファイルを開くと$PASSの「pass」が丸見えに なるのですがこの部分を暗号化してわからないようにしてスクリプト実行時に 何らかの処理をして$PASSをpassに戻すような事は可能でしょうか?
なんらかの処理をしてpassに戻ったら意味がないだろうが SHA-1とかでハッシュにしてそれを持ってるとよろし
>>663 ありがとうございます
ぐぐってきます..(´・ω・)
>>665 なんか失敗ばっかりしているように見えるね。
SMTPを使わず/usr/lib/sendmail等から送る場合sendmailをパイプでopenする 手法がよく使われていますがこれらを実現出来るCPANに登録されているスタンダードな モジュール名を教えていただけませんでしょうか。
途中で手入力してるしw 開発部署のあちこちのデスクから、こんなん聞こえてきたらコエー。
>>669 search.cpan.orgでsendmailをキーワードに検索すればいくつか出てくるので
適当に好きなのを使えばいいんじゃないか。
>>665 この後に、オフィスPCに切れて投げ壊してる外人おっさんの動画を
>>665 That was eazy.txt
ワロス
Thank you って言ったらそれまで入ってもうて、必死で消してるw
Undoできないのかな
5分もかかってまだ open ( INFO しか入力できてねぇしw
いや、INFO は結局入力できず手で入れてたし。
検索結果を表示させるだけのものなんですが、大文字小文字の区別がつきません 297 if ( $line =~ /\Q$in{$form1}\E/ ) { を if ( $line =~ i/\Q$in{$form1}\E/ ) { にするとエラーが出てしまいます syntax error at test.cgi line 297, near "$in{" syntax error at test.cgi line 297, near "/ )" syntax error at test.cgi line 300, near "}" Execution of test.cgi aborted due to compilation errors. 292 sub umu1 { 293 open(IN,"$file"); #csv読み込み 294 while(1) { 294 $line = <IN>; #csvの行を&lineに代入 295 @data = split( /,/ ,$line ); #@data[0~]にcsv行を個別に代入 296 if ( $line eq "" ) { last; } #無限ループ終了条件 297 if ( $line =~ /\Q$in{$form1}\E/ ) { 298 print "$data[0]$data[1]"."<br>"."\n"; 299 } 300 } 301 close(IN); 302 }
679 :
678 :2007/02/14(水) 23:04:54
自己解決しました。なんともお粗末なミスで・・・
sub foo { 処理 return(@A,@B,@C) } としている関数で、 (@A,@B,@C) = &foo() ↑のような感じで返り値を配列個別に受け取りたいんですが、 Perlでは可能なんでしょうか?
sub foo { hoge; return \(@A, @B, @C); } ($refA, $refB, $refC) = foo; こういう感じにリファレンス渡しにしないといけない。
>>680 Win32OLE
JavaScriptみたいなタグの分解も一緒にやってくれる
Win32::GUIのListviewで行ごとに色を変えるにはどうしたらよいでしょうか?
>>684 カスタムドローかオーナードロー
ってかWinAPI使うならCとかC++のが断然楽だぞ?
>>685 カスタムロードがいいみたいですね。
Perlのサンプルコードはぜんぜんないようで。。。
困った
ドロー
>>686 Win32::GUIって自分でウィンドウメッセージ取れないのか?
取れるならC,C++のサンプルコードと同じようにできるが
できないなら知らん
>>689 substr( $lParam, 48, 8, $clrText);
を
substr(unpack("P56", pack("L",$lParam)), 48, 8, $clrText);
にするとエラーは無くなるが、文字色は変わらない。
要するに、$lParamはNMLVCUSTOMDRAW構造体へのポインタ
cf.
http://www.kumei.ne.jp/c_lang/sdk3/sdk_261.htm であって、この構造体の中身を書き換えればいいように思えるのだが、
Perl でどうすればいいのかわからない。
CUIサーバープログラムで裏で1秒ごとにデータファイルを読み込みながら クライアントにその時々の最新データを返すにはどのようにすればいいのでしょうか? &readdata sub readdata{ after(1000,&readdata); }
Tkで使うafterのようなものがあるのでしょうか? ということの説明のためにコードを書いていたのですが、途中で投稿してしまいましたorz
693 :
デフォルトの名無しさん :2007/02/18(日) 19:55:10
sleep(1)
694 :
デフォルトの名無しさん :2007/02/18(日) 20:26:34
ある数値が何行にもわたって書いてあるいくつかのテキストを読み込んで 指定した列の数値の平均を割り出すプログラムをperlで作りたいんですが どのように作ればいいんでしょうか? 入門サイトなどをいくつか見てきましたが これといったお手本が無く、行き詰まってしまいました。 お願いします。
>>694 もちっとデータに具体性を出してほしい
例を上げて
696 :
デフォルトの名無しさん :2007/02/18(日) 20:56:22
>>695 レスありがとうございます。
例というか、実際に使うテキストファイルの最初の5行をそのままコピペしますが
0; 133.44; 3180
1; 134.76; 3180
2; 168.35; 3180
3; 141.58; 3180
4; 157.86; 3180
5; 176.92; 3180
こうなってます。
一番左は列数、二列目が平均値を出したいデータ、三列目は無視してください。
二列目の数値の平均値が出したいのです。
ひとつのテキストファイルに44640行、
こんな感じの数値がずらずらと並んでいるので
二列目の数値を全部足して44640で割る、ということがしたいんです。
とりあえず ・ファイルをperlに読み込んで各行をループさせる ・一行の中で、2列目の数値を取り出す といった操作が必要だけど、 ファイルの読み書きや、正規表現とか、まったく何も分からないの?
699 :
デフォルトの名無しさん :2007/02/18(日) 22:02:02
>>697 一応、基礎的なことはサイトを見て勉強してきたんで
正規表現のことや
ファイルを読み込んでコマンドプロンプトに内容を表示させたり
ファイルの作成、書き込みなどは理解しているつもりです。
ただそれらのことを組み合わせてプログラムを作るとなると
まだよくわからないんです。
もう明日中には完成させなきゃならないんで
できればヒントだけでもお願いしたいです…
こんな感じじゃね?試してないけど。 my $sum = 0; my $i = 0; for my $file (qw(unko1.txt unko2.txt)) { open my $fh, $file or die "開けん"; while(<$fh>) { $sum += (/;\s*(-?\d\.\d);/)[0]; $i++; } } print "阿部怜治:", $sum / $i, $/;
701 :
694 :2007/02/18(日) 23:30:17
>>698 .700
ありがとうございます。
もう少し頑張って明日試してみます。
じゃ模範的なperlで perl -pae "$l++;$s+=$F[1]}{$_=$s/$l" input.txt
perl -F";" -lane '$t+=$F[1]; END{print $t/$.}' input.txt
>>702 $F[1]}{
の
}{
って何してるの?
>>704 $ perl -h
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
-p は while (<>) { ... print; } で囲まれる。
706 :
デフォルトの名無しさん :2007/02/19(月) 05:26:43
挙動的に同じって意味だと思ってたら、 本当にプリプロセッサのように囲まれるのね
707 :
デフォルトの名無しさん :2007/02/19(月) 18:41:27
if ($a) { print $a; } この書き方と print $a if $a; この書き方では何か違いはあるのでしょうか
見た目
709 :
デフォルトの名無しさん :2007/02/19(月) 20:24:07
すいません、質問です。 大体5万行くらいの大きさのテキストファイルから、 重複している行 (連続して重複してるわけでは無く、内容が同じ行が とびとびに存在してる)を一つのこして、残りは省く というスクリプトを書く場合、 1)1行目はそのまま書き出す 2)2行目は1行目と比較して、同じだったら書き出さない、違ったら書き出す 3)3行目は1行目と比較して、同じだったら書き出さない、違ったら2行目と比較して、、、 4)以下繰り替えし このようなスクリプトしか無いのでしょうか? 処理に非常に時間がかかるので、何か良い方法があったら、御教示下さい。
>>709 「perl 重複」でぐぐればいろいろテクニックが見つかる
>>709 5万行くらいなら全部ハッシュテーブルに詰め込んでも大丈夫そうだが
順序崩していいならソートしてから重複を除くのがいいだろう
1. 1行目の内容をハシュのキーに詰め込む。 while (<$fh>) { $hash{$_} = 1; 2. 読み込みが終わったら、keyを書き出す。 print for keys %hash; 1-1. 読み込んだ順に書き出したい時。 my $line; while (<$fh>) { $hash{$_} = [$_, ++$line]; 1-2. 先に読み込んだ方を有効にしたい時。 $hash{$_} = [$_, ++$line] unless $hash{$_} ; 2-1. 読み込みが終わったら、sortしながらkeyを書き出す。 print for sort $hash{$a}->[1] <=> $hash{$b}->[1], keys %hash; 脳内妄想なので、補完よろしこ(照)
ん、、、リファレンスにしなくても良かったか(呆)
714 :
709 :2007/02/19(月) 20:42:52
>>710-712 ありがとうございます。ハッシュテーブルを使う方法は、
全く考えてませんでした(というか今迄使ったことが無かったので)
とりあえず、ハッシュテーブルの使い方を勉強してきます。
perl -ne 'print if not $seen{$_}++;' でいいだろ。 メモリ足りないようならtie()使ってDBMファイルをワークに使えばよし。
Perl やっててハッシュを使ったことが無いとな
今までperlやってなかったんだろ
無名(?)のBLOCKで、 {} ←中身が空だとエラーになるんだけど、素のBLOCKは使ってもいいのか、 使えるが推奨されてないのか、perl的でないのか、どんな感じなんでしょう?
WindowsでNMAKEが必要なモジュールのインストールについて質問。 Windows2000では問題がなかったのに、vistaになってDBIとかがインストールに失敗する。 どうすれば回避できる?
>>719 そのエラーメッセージで言われてるところを直せばインストールできるんじゃないか
>>718 $hoge = {};
何か見えてこないかい?
それからperlrefのMaking Referencesの3番辺りに目を通すといいと良いかと。
…スクリプティング言語資料室さんの訳、そこの所間違ってるかな
> 一方、ハッシュではなくBLOCKへのリファレンスを返すのであれば、
722 :
718 :2007/02/19(月) 23:08:43
>>721 おー、ありがとう。丁度良い書き方が見つかりました。
{}だけ書いて中身は後で書きたいときに、エラーになるのが気持ち悪かったのですが、
{;}という方法があったか!
最近対策済みのスパムに漏れて書き込みが散見されるので if ($comment !~ /(\x82[\x9F-\xF2])|(\x83[\x40-\x96])/) {&er_("cannot write!","1");} ここを変えたいと思います。 ここをひらがなの「あ」〜「ん」が含まれていなければ、という意味にしたいのですが、 「あ」は 82A0 「ん」は 82F1 です。 (\x82[\x9F-\xF2])|(\x83[\x40-\x96]) これをどう治せばいいのでしょうか? ↑正規表現とマッチングを理解していないので、 これのはっきりとした意味がわかっていません。 たぶんカタカナまで含まれていると思うのですが・・。
>>723 sjisか。
| の左側がひらがなで、右側がカタカナでしょ。
ひらがなだけよけたいなら、
$comment !~ /\x82[\x9F-\xF1]/
でいいんじゃね?
725 :
723 :2007/02/20(火) 17:04:41
>>724 ありがとうございます。
ひらがなのみのフィルタで無事動きました。
726 :
中の人 :2007/02/21(水) 00:01:39
>>721 すまん確認した。
どこをどうすればこういう勘違いをするんだかわれながら不思議だ。
つーことで今週末までをめどに修正しておきます。
なるほどねぇ
728 :
688 :2007/02/21(水) 22:09:52
>>690 自己解決しました。
my $CopyMemory=new Win32::API("kernel32", "RtlMoveMemory", "NPI", "V");
defined $CopyMemory or die "Cant find CopyMemory";
$CopyMemory->Call($lParam+48, $clrText, 8);
>>728 substr( $lParam, 48, 8, $clrText);
を
$object->TextColor( (unpack('II',$clrText))[1] );
$object->TextBkColor( (unpack('II',$clrText))[0] );
にする方が楽だと思うけど、自己解決おめでと。
731 :
686 :2007/02/22(木) 00:45:28
>>730 それじゃ、Selectすると全部色変わっちまうぜよ。
732 :
690 :2007/02/22(木) 01:35:07
>>728 自己解決おめでとう。
>>689 の
substr( $lParam, 48, 8, $clrText);
の意味について考え直したのだが、以前のバージョンのActivePerl では
「裏仕様」として、「$lParam がポインタと考えられる場合は、間接指定
されたアドレスの文字列(バイト列)を操作し、そうでなければ$lParam
そのものを操作する」というのがあったのではないだろうか。
>>689 のソースを読む限り、そうとしか思えない。
ところが、この「裏仕様」は危険であるし、安全確実な間接アドレス指定方法
が手当てされたから、いつかのバージョンで廃止されたんだろうね。
if( $ENV{REMOTE_ADDR} eq ’’ ) ってありえるのでしょうか?
>>733 CGIとかで動かしてるなら鯖の仕様次第だし
普通にコマンドラインから実行すれば空になる
$comment に http の文字が5つ以上あるとエラーを出したいのですが、 正規表現でのチェックはどうすればいいのでしょうか? if( $comment /~ (.*http.*http.*http,*http,*http) ) { error(); } こんな感じでしょうか?orz
if ($comment =~ /(.*http){5}/s) { error(); }
print "error" if $comment =~ /http/g > 4; だめだった。。。 print "error" if scalar @{[$comment =~ /http/g]} > 4; 桶だった。。。 詳しい人の解説キボンヌ(照)
738 :
脱帽 :2007/02/22(木) 21:26:24
スカラーだと真か偽しか返さないから
739 :
脱帽 :2007/02/22(木) 21:27:58
スカラーの場合は真か偽しか返さないからじゃ
スカラーコンテキストでマッチした数が返ってくるのは置換の s///g の場合。 なので、もしそういう風に書きたいのなら print "error" if $comment =~ s/http/http/g > 4; とか書くといいかも。
なるほどねぇ
742 :
735 :2007/02/22(木) 22:24:08
if($comment =~ s/http/http/g > 4){ &er_('cannot write!');} これでいけました。 s/hogehoge/fugafuga/gの s と g の意味がわからなかったのですが、 調べて理解できました、ありがとうございます。
WindowsXP + ActivePerl 5.8.8 build 820 です こちらは初めてです、29箱目ということで既出質問だったらすみません 上記環境で モジュール Encode が threads と同時に上手く働きません perl素人の自分なりに調べた結果、Encode モジュールはスレッドセーフでは ないのではないかと思い始めたのですが、それで間違いないでしょうか? それとも私が何か大事なお約束や呪文を忘れているのでしょうか また、スレッドセーフで無かった場合、各スレッド内で文字コード変換を 行いたい場合、皆さんはどのようにしているでしょうか
745 :
743 :2007/02/23(金) 14:22:08
>>744 返信ありがとうございます
確実に再現性のある最小コードを続いて投稿…と思ったのですが上手くいかずorz
自分の考え違いだったかもと思っていたところでした
URL 先のコードを試した結果、私の環境でもおかしな結果を不規則に起こしました
再入しないようにとりあえず自衛していく方向でいってみます
ありがとうございました
746 :
743 :2007/02/23(金) 16:42:34
他のモジュール内でもEncode使っているのが多くありそうですね
PerlIO layer での :encoding(〜) とか
HTTP::Message の decoded_content とか便利だなーとガシガシ使っていたので
どんどん泥沼のソースになっていきましたorz
よく使われる奴はthread safeにして欲しいね
小飼氏(メーリングリスト)に投げてみたらいいんじゃないかな。 つーか投げてほしい。
blogの感じからするとすごく暇そうなので「直せやおら」とか言うといいんじゃね?>Encode メーリングリストはJcodeメーリングリストでok
あのヒゲモジャのことだからギブミーpatchでかえされるに200ペソ
それはひどい>ギブミーpatch
なんの解決にもならないw>ギブミーpatch
>>751-752 なにが「ひどく」て「解決にならない」なの?
ライセンスがArtisticとGNU GPLのデュアルライセンスで、
どっちもソースが公開されているものなんだから不具合あったらソースを追って自分で改変するくらい当たり前じゃん。
おまえらはフリーライダーなの?それともそれをやるだけの能力がない低脳なの?
これは酷い混じれ酢だ
少なくとも小飼氏よりは低能間違い無しです><
patchが作れるなら人に頼らないしメールも送らないってば。
「ギブミーpatch」といわれたら、「無理!」って返事すればいいだけ。 キラクニヤレヤ〜♪
(´・ω・)
759 :
デフォルトの名無しさん :2007/02/24(土) 23:26:36
質問です。 浮動小数点計算をループでしていてその結果を出力したら、 あるタイミングから#INDというのが出力されました。 これは一体なんでしょうか、、、
不定値(正負の無限大 or NaN) 0除算してるんじゃね?
761 :
デフォルトの名無しさん :2007/02/24(土) 23:48:49
>>760 レスありがとうございます。
数値扱いされてないのでしょうか?
具体的なコードはこんなかんじなんですが、、
my $a = -0.1382 ** 0.000212494687632809;
my $temp = -0.1382;
my $b = $temp ** 0.000212494687632809;
これだと$aはちゃんと出力されるんですが、$bは-1.#INDと出力されます。。
>>761 "**"は"-"より強いので
-0.1382 ** 0.000212494687632809
は
-(0.1382 ** 0.000212494687632809)に等しい。
765 :
デフォルトの名無しさん :2007/02/25(日) 02:10:48
(´・ω・)12時
(´・ω・)時報スクリプトを作ってみました.. #!/usr/bin/perl use WWW::Mechanize; $mech = WWW::Mechanize->new(agent => 'Mozilla/4.0 (MSIE 6.0;)'); while(1){ my(@t) = localtime(time); unless( $t[1] == 59 && $t[0] > 20){sleep(30);next;} $mech->get($ARGV[0]); $mech->field("MESSAGE" => "時報"); $mech->click(); (@t) = localtime(time); sleep(60-$t[0]); $mech->click(); }
768 :
デフォルトの名無しさん :2007/02/27(火) 20:41:51
日本語PDF作るモジュールのお薦めってありますか? PDFJ?
PDFJ
$input=<STDIN>; $input=~s/\n//; print "$input"; コマンドラインから「\n\n」と入力した場合に 「\n\n」と出力されるのではなく、改行2個が出力されるようにしたいんですが どうすればいいですか?
771 :
デフォルトの名無しさん :2007/02/28(水) 00:17:23
自力でs/\\n/\n/g;とするかevalするか
>>771 ,772
evalは安易に使うとコマンド実行も出来ちゃうので正規表現にしとけ。
どうしてもeval使う場合は入力チェックしないと危険よ
774 :
770 :2007/02/28(水) 01:14:01
>>773 アドバイスありがとうございます。
自分でちょっとしたテキスト処理をやりたいだけなので大丈夫です。
\< や \/ や \. などの入力が入った場合、その都度
s/\\\</\</;
s/\\\./\./;
を書かなければいけないのでevalにします。ありがとうございました。
775 :
768 :2007/02/28(水) 13:05:37
>769 サンクス。 自由度がありすぎて面倒な部分もあるんだけど、 やっぱPDFJでいってみます。
776 :
デフォルトの名無しさん :2007/02/28(水) 16:35:41
質問です 頓珍漢だった笑ってください perlはCの #include に相当する機能はあるのでしょうか? 今、Perlで統計解析の処理をしています。解析手法ごとに異なったスクリプト を作っています。 入出力部分が複雑なんでここの部分と全体で使える共通サブルーチンだけ切り出して 別ソースにして、実行時に組み込んで使いたいのですが、どうも旨くゆきません。 ぐぐったりしてみましたが、Use、Requireの話しか検索できません。何か単純に Includeする方法は無いのでしょうか?
>>776 そう難しくないからモジュールにしてuse使うべきだな。
ァ ∧_∧ ァ,、 ,、'` ( ´∀`) ,、'` '` ( ⊃ ⊂) '`
ははは ∧_∧ もうダメ ( ´∀`) ∧_∧ モウ カンベン . ( つ ⊂ ) ヒヒヒヒ (´∀` ,,)、 あははは シテクダサイ .) ) ) ○ ∧_∧ , , へ,, へ⊂), ∧_∧ ○, (__)_)⊂ ´⌒つ´∀` )つ (_(__)_丿 ⊂(´∀`⊂ ⌒ヽつ
requireで問題なくできそうだけど駄目なんかな
目線を高くしてオブジェクト指向にしたらどうだ?
776はrequireやuseの説明を読んでないのではないのでは? includeとスペルが違うからって脊髄反射したのか? そうでないのなら、ますはrequireでは駄目だった点を質問文につけないと回答者は答えようがないぞ
すまん ×776はrequireやuseの説明を読んでないのではないのでは? ○776はrequireやuseの説明を読んでないのでは?
名前空間の問題とかあるし、普通にモジュール作るのがいいと 思うけどな。よほどこったことやるんじゃなけりゃ、Exporter 使えば一発だし。
すみません確かにRequireに関して真面目に読んでいないです Cの#includeのつもりだったので、 ------------ 今まで ------------ 初期の宣言など・・・ open(FP, $filename) or die($filename); while(<FP>) { $hash{$key} = hoge; } ------------ 変更 ------------ 初期の宣言など・・・ require 'other.pl'; &sub($filename, \%hash); と変更しただけなんですが・・・・実行時に
ワッフルワッフル!!
単純に定数の扱いがやっかいかな。perlは。
use constant FOO => 'bar'; use Readonly; Readonly my $HOGE => 'fuga'; こういうのでいいじゃん。
790 :
デフォルトの名無しさん :2007/03/01(木) 08:05:44
PerlでCPANによるモジュールのインストールが失敗します。 install LWP::Simple .... BEGIN failed--compilation aborted at /System/Library/Perl/Extras/5.8.6/darwin-thread-multi-2level/HTML/TokeParser.pm line 12. Compilation failed in require at ../blib/lib/HTML/Form.pm line 116. html/form-param.......dubious Test returned status 2 (wstat 512, 0x200) DIED. FAILED tests 1-24 Failed 24/24 tests, 0.00% okay .... どなたかお助けを。 環境:MacOS X 10.4 Tiger, perl 5.8.6
791 :
デフォルトの名無しさん :2007/03/01(木) 16:35:18
正規表現?に関する質問です。 条件文 $Fm{"data"} !~ /^[0-9]/ の意味は ”0〜9以外の文字を含まない場合”ですが これを”0〜9と半角カンマ「,」以外の文字を含まない場合”という条件文にしたいです。 どう書けばいいんでしょうか(´・ω・`)??
>>791 ”0〜9と半角カンマ「,」以外の文字を含まない場合”
→”0〜9と半角カンマ「,」のみを含む場合”
$Fm{"data"} =~ /^[0-9,]*$/ # NULLもマッチ
あるいは $Fm{"data"} =~ /^[0-9,]+$/ # NULLはマッチしない
>>792 レスありがとう。なるほど(´・ω・`)
>>790 cpan> install LWP::Simple
LWP::Simple is up to date.
(゚∀゚)アヒャ
MacOS X 10.4.8
$ perl -v
This is perl, v5.8.6 built for darwin-thread-multi-2level
(with 3 registered patches, see perl -V for more detail)
ほいほい・・・
Locally applied patches:
23953 - fix for File::Path::rmtree CAN-2004-0452 security issue
33990 - fix for setuid perl security issues
SPRINTF0 - fixes for sprintf formatting issues - CVE-2005-3962
795 :
791 :2007/03/02(金) 01:52:03
>>792 すいません、おそらくマッチングはしてるっぽいんですが、その後
$Fm{'data'}の中身の半角カンマが全角カンマに変わってました。
これは何故なんでしょう?
そんな莫迦なことがあるか
797 :
791 :2007/03/02(金) 02:09:50
ちなみに$Fm{'data'}というのはテキストボックス &input('text','data',"$up",' size=50',"\n"); の入力値です。
798 :
791 :2007/03/02(金) 02:23:03
あ、 &inputは sub input { $label++; print qq|<LABEL for="$label$_[1]">\n|; print qq|<INPUT type="$_[0]" name="$_[1]" id="$label$_[1]" value="$_[2]"$_[3]>$_[4]\n|; print qq|</LABEL>\n|; } となっております。
「してるっぽい」ってなんだよ。プログラムなんだからしてるかしてないか どっちかしかないので、きちんと確認してから質問しろ。 問題の切り分けができてなくて的外れな質問を垂れ流している予感。
そして質問内容がWeborogの範疇に…
どっかで置換してんだろ
802 :
デフォルトの名無しさん :2007/03/02(金) 12:13:48
LWP::UserAgent を使って、https のコンテンツを「Proxy経由」で取得する場合は、
================================================
use LWP::UserAgent;
$ENV{HTTPS_PROXY} = "
http:// 〜proxy〜:〜port〜/";
my $proxy_url = "
http:// 〜proxy〜:〜port〜/";
my $url = "
https:// 〜URL〜";
my $ua = LWP::UserAgent->new();
$ua->proxy(qw( http https ), $proxy_url);
# $ua->proxy(['http', 'https'], $proxy_url); --> これでも同様
my $response = $ua->get($url);
print $response->content;
================================================
で問題が無く取得できるのですが、
URLが"
http:// 〜"の場合には、Proxyサーバから
「サポートされていないリクエスト/プロトコルです」
というエラーが出てしまいます。
「perldoc Crypt::SSLeay」に記載されている
$ua->proxy([qw( https http )], "$proxy_ip:$proxy_port");
では、Proxyサーバから上と同様のエラーが。しかしこの場合、URLが"
http:// 〜"ならOK。
また、http と https を入替えてみると
($ua->proxy(qw( https http ), $proxy_url);)
今度は http がOKで https がエラー。
"http" "https" のどちらかしか認識してくれてないようなのですが、
どうすれば http, https とも取得できるようになりますでしょうか?
803 :
802 :2007/03/02(金) 12:15:02
ちなみに環境は以下です。 OS Red Hat Enterprise Linux ES4 Squidバージョン 2.4.STABLE7 perlバージョン 5.8.5 その他モジュール Crypt-SSLeay-0.53 , openssl-0.9.7a-43.10
squidはhttpsをproxyするときにCONNECTメソッドを使うやり方を期待している
ので、LWP::UserAgentのproxyの仕組みではだめでCrypt::SSLeayの方のを
使う必要がある。したがって、$ua->proxyでhttpsのproxyを設定せずに、
環境変数HTTPS_PROXYを設定するのが正解。また、HTTPS_PROXYの設定は
末尾に'/'があるとエラーになる。
たぶん以下の2行を修正すれば動くと思う。(俺の手元では動いた)
$ENV{HTTPS_PROXY} = "
http:// 〜proxy〜:〜port〜"; # 末尾の/をとる
$ua->proxy(qw( http ), $proxy_url); # httpsは指定しない
805 :
802 :2007/03/02(金) 16:10:21
> 804 バッチリいけました。ありがとう!
PATH_INFOをHTMLに出力する場合、以下のエスケープ方法で大丈夫でしょうか。 $path = $ENV{'PATH_INFO'}; $path =~ tr/+/ /; $path =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; $print_path = $path; $print_path =~ s/&/&/g; $print_path =~ s/>/>/g; $print_path =~ s/</</g; $print_path =~ s/"/"/g; $print_path =~ s/'/'/g; print $print_path;
808 :
806 :2007/03/02(金) 22:26:19
orz 失礼しました。向こうに移動します。
809 :
デフォルトの名無しさん :2007/03/02(金) 22:53:42
「$textにいくつかの文字列候補、例えばApp,Bbq,Ntk,Sunが2個以上含まれる時」 っていう条件はどう書けばいいの? 1つだと $text =~ /(App|Bbq|Ntk|Sun)/だけど・・・
>>809 これでどうかな?
$text =~/(?:.*?(?!\1)(UnKO|CHiNKO|MaNKO)){2}/
性器表現の質問なら、専スレのがレベル高い回答を得られるかも。
(scalar @{[$text =~ /App|Bbq|Ntk|Sun/g]} >= 2)
あ、重複があってもいいのか。なら /(?:.*?(UNKO|CHINKO|MANKO)){2}/ で十分。
括弧に量指定子を使うのって何か気持ち悪い
つ ?:
>>809 my @str = qw( FooAppBarBbqBaz NtkQuuxSun Foo App BarBbqBaz);
for (@str) {
print 1 if @{[ /App|Bbq|Ntk|Sun/g ]} >= 2; #
>>811 print 2 if s/(App|Bbq|Ntk|Sun)/$1/g >= 2;
print 3 if @{[ split /App|Bbq|Ntk|Sun/, $_, 3 ]} >= 3;
print 4 if /App|Bbq|Ntk|Sun/g && //g;
print '/';
}
816 :
デフォルトの名無しさん :2007/03/04(日) 01:01:58
WWW::Mechanizeのインストールをしたいのですが、 make test で以下のように失敗してしまいます。 何か原因はわかりますでしょうか? (OS:fedora core 5 / perl:v5.8.8) ----------------------------------- # Failed test '404 check' # at t/local/back.t line 149. # got: '500' # expected: '404' t/local/back............ok 29/38# Looks like you failed 1 test of 38. t/local/back............dubious Test returned status 1 (wstat 256, 0x100) DIED. FAILED test 28 Failed 1/38 tests, 97.37% okay (less 2 skipped tests: 35 okay, 92.11%) -----------------------------------
817 :
816 :2007/03/04(日) 01:05:47
もともと開発環境が無かったので、yumでgcc make bison flex gcc-c++ gnupg をインストールしました。 他に足りないものがあったりしますか?
足りないものは、エラーログを探して見てみようとする知恵。
819 :
816 :2007/03/04(日) 01:29:41
for $i (0..100){ $n = ($i)?1:0; ... } このコードの、1以上を全て1とする処理部分を if文を無くして$n=bool($i)の様な感じでシンプルに 書く方法はあるでしょうか?
$n = 0; for $i (0..100) { ・・・ $n = 1; }
822 :
820 :2007/03/04(日) 05:18:01
>>821 ありがとうございます。
すみません、例が悪かったですね。。出直してきます λ...
“シンプル”にという意味では関数以外ないはず
824 :
デフォルトの名無しさん :2007/03/04(日) 10:17:41
まだ誰も指摘していないが「ゲーム脳」(これはガセらしいが)と同じような
障害で、「検索脳」というものが存在するようだ。
>>819 を見て確信した。
「ヒト」として機能していない。
それだと偽の場合に 0 じゃなくて空文字列になるような。
$n=int!!$i;
828 :
820 :2007/03/05(月) 00:57:42
結局?0:1の方が短い件について
それは言っちゃダメ
条件分岐が無くなって算術演算だけになってるのがミソじゃまいか?
reach!!
内部では条件分岐起きまくりだろ・・・。常識的に考えて・・・。 三項演算子の方が間違いなく低コスト。
int!!ってrubyかなんかかよ…気持ちわるい
PerlがRubyに気持ち悪いとな?
目糞鼻糞
それはないだろ・・・常識的に考えて・・・。
>>833 論よりベンチ。
use Benchmark;
timethese(undef, {
820 => sub {
for my $i (0..100) {
my $n = $i? 1: 0;
}
},
821 => sub {
my $n = 0;
for my $i (0..100) {
$n = 1;
}
},
827 => sub {
for my $i (0..100) {
my $n = int !! $i;
}
},
});
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 3 wallclock secs ( 3.07 usr + 0.01 sys = 3.08 CPU) @ 30756.17/s (n=94729)
821: 3 wallclock secs ( 3.16 usr + 0.00 sys = 3.16 CPU) @ 48809.49/s (n=154238)
827: 3 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 28888.54/s (n=90710)
意外と差が無いな。
820だけ$nがループの外でmyされてるので影響あるんじゃないか という疑問があったのでとりなおしてみた。やっぱり影響あった らしく820,827はやや速くなったまでは予想通りだが、820と827が 逆転したのはかなり不思議だ。誰か理由説明できる? use Benchmark; timethese(undef, { 820 => sub { my $n; for my $i (0..100) { $n = $i? 1: 0; } }, 821 => sub { my $n = 0; for my $i (0..100) { $n = 1; } }, 827 => sub { my $n; for my $i (0..100) { $n = int !! $i; } }, }); Benchmark: running 820, 821, 827 for at least 3 CPU seconds... 820: 2 wallclock secs ( 3.14 usr + 0.00 sys = 3.14 CPU) @ 36769.75/s (n=115457) 821: 3 wallclock secs ( 3.05 usr + 0.00 sys = 3.05 CPU) @ 48989.51/s (n=149418) 827: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 42848.40/s (n=133687)
int!!のが速いな・・・。マジかよ・・・、信じられない。
俺のPCでも
>>840 でやってみた。
Benchmark: running 820, 821, 827 for at least 3 CPU seconds...
820: 4 wallclock secs ( 3.10 usr + 0.04 sys = 3.14 CPU) @ 2998.73/s (n=9428)
821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 4186.78/s (n=12665)
827: 4 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 3838.45/s (n=11761)
なるほど。俺のPCの性能は
>>840 のPCの1/10もないのか。
ここにまた新しいトリビアが生まれた
どうでもいいな。
/usr/bin/perl -v This is perl, v5.8.5 built for x86_64-linux-thread-multi Benchmark: running 820, 821, 827 for at least 3 CPU seconds... 820: 3 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 51378.64/s (n=158760) 821: 3 wallclock secs ( 3.03 usr + 0.00 sys = 3.03 CPU) @ 62582.84/s (n=189626) 827: 4 wallclock secs ( 3.11 usr + 0.00 sys = 3.11 CPU) @ 55434.73/s (n=172402) /usr/local/bin/perl -v This is perl, version 5.005_03 built for i686-linux Benchmark: running 820, 821, 827, each for at least 3 CPU seconds... 820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 43505.98/s (n=130953) 821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 51370.00/s (n=154110) 827: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 30147.18/s (n=90743) 同一マシンで実行 int!!が2倍近く違う。
シングルコアと、マルチコア。 条件分岐の影響が出てるということ?
ここはソース解析するしかないな。な?↓
それをCで書いて、そのコンパイル結果で比較するとかは無意味?
毎回ベンチだと盛り上がるなw
850 :
845 :2007/03/05(月) 11:59:10
XEON(32bit)で実行 /usr/local/bin/perlは845と同じもの /usr/bin/perl -v This is perl, v5.8.0 built for i386-linux-thread-multi Benchmark: running 820, 821, 827 for at least 3 CPU seconds... 820: 3 wallclock secs ( 3.07 usr + 0.00 sys = 3.07 CPU) @ 37608.14/s (n=115457) 821: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 45086.26/s (n=141120) 827: 4 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 41884.98/s (n=131100) /usr/local/bin/perl -v This is perl, version 5.005_03 built for i686-linux Benchmark: running 820, 821, 827, each for at least 3 CPU seconds... 820: 3 wallclock secs ( 3.01 usr + 0.00 sys = 3.01 CPU) @ 44429.57/s (n=133733) 821: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 53565.33/s (n=160696) 827: 3 wallclock secs ( 3.01 usr + 0.02 sys = 3.03 CPU) @ 28967.00/s (n=87770) 5.0が遅いのか、i686が遅いのか、多分前者だろう。
>>844 どうでもよくなかったらトリビアじゃないだろアホw
数十倍も変わるならあれだがね n<2倍なんて誤差の範囲だろ…馬鹿馬鹿しい
測定してみなきゃわからない。
実際にやってみた。 Benchmark: running 820, 821, 827, each for at least 3 CPU seconds... 820: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 363.00/s (n=1089) 821: 4 wallclock secs ( 3.27 usr + 0.00 sys = 3.27 CPU) @ 395.64/s (n=1292) 827: 3 wallclock secs ( 3.00 usr + 0.00 sys = 3.00 CPU) @ 249.67/s (n=749)
855 :
デフォルトの名無しさん :2007/03/05(月) 16:17:10
Perl で、XMLファイルのパース可否(well-formed)をチェックするツールを作りたいのですが、 環境条件があって関連モジュール(XML::Simple、XML::Parser)を使用できません。 データの抽出とかは不要で、$!={0|1} だけがわかればいいのですが、 正規表現だけで作る方法がありましたら、教えてください。
俺の公言身長は、実測値の1.2倍。もちろん誤差の範囲だよな?
>>856 ちょ、EBNFと正規表現じゃ受理できる言語のクラスが違いますがな。
もっとも何とかする方法はなくもない。
(1) ネストの段数を適当に有限に制限してがんばって展開する
(2) perl拡張の(??{ code })を使う
ああ、再帰を使うのは当然だと思ったから書き忘れた
モジュールがインストールされていなくても、 pmファイルをどっかから持ってきて一緒に置いとけば使えたりしないの? ちゃんとインストールコマンド使って、CPANから入れなきゃダメ?
ぐぐれ
>>860 PurePerlモジュールならそれでいい。
つーか「モジュールを取ってきて適切なディレクトリにコピーする」という作業をインストールという。
XML::TinyならPPだから使えると思う。
864 :
デフォルトの名無しさん :2007/03/09(金) 10:24:45
単純な質問ですみまそん。 windowsのactive perl を使っているのですが、 ファイルの行数を数えるのは↓が最速でしょうか?もっといい方法はありますか? open(FILE, "< filename"); $i++ while <FILE>; close(FILE);
ファイルが巨大なら `wc -l filename` とかした方が速いかもよ?
wcってのはじめて見ました。ありがとん。 max1000行程度なんですが、ちと調べてみます。
sysreadで丸呑みしてtrでカウントするのが早いかな。 1000行ほどじゃwc遅いけどもっとでかくなるとwcが爆速で笑える
1000行ぐらいならどうやっても大差ないんじゃないかな。 それを10000回やるなら別だけどさ。
869 :
866 :2007/03/09(金) 11:16:11
なるほど、いろいろあるんですね。sysreadもためしてみます。
>>868 ファイルはせいぜい10こ前後です。結局最初の方法でいいのかな・・
`≡ 人
≡(_)
`≡ (__)
≡( ・∀・) ありがとですたー!
≡⊂⌒ ⊃⊃
≡ ̄◎ ̄◎
>>865 wcは質問者の環境であるWindowsでは駄目だろ。
>>864 open(FILE, "filename");
while(<FILE>){};
print "$.\n";
close(FILE);
872 :
866 :2007/03/10(土) 07:38:15
>>870 そうですね^^;
>>871 なるほど、毎回カウントアップするよりこちらの方がいいかもしれませんね。
ありがトンございます(・∀・)
perl -n 'if (eof) { print "$. $ARGV\n"; $. = 0; }'
874 :
質問 :2007/03/10(土) 13:11:58
netstat -sで出力される Received Packets Delivered = 6558 Output Requests = 5420 を%dataにキーをReceived Packets Delivered、値を6558、 キーをOutput Requests、値を5420として格納したいのですが、下記のプログラムでは どうしてもoutput requestsのほうだけが%dataに格納されてReceived〜のほうが 格納されません。どうしてでしょうか? foreachを2回行えばいいとは思うのですが、もし読み込む行数が何万行になると かなり負荷になるのでできればforeachを1回でうまく取り込める方法が知りたいのですが・・ #!C:\Perl\bin\ @naiyou=`netstat -s`; foreach (@naiyou){ last if($_=~/Routing Discards/); chomp; if($_=~/(Received Packets Delivered)(\s+)=(\s)(\d+)/){ %data=("Received Packets Delivered"=>$4) } if($_=~/(Output Requests)(\s+)=(\s)(\d+)/){ %data=("Output Requests"=>$4) } } @key=keys %data; print"@key\n"; @val=values %data; print"@val\n";
>>874 %data上書きしてるやんか
$data{"key"} = val;
876 :
874 :2007/03/10(土) 13:23:56
キーがちがうから上書きにはならないと思っていましたが・・
>>876 ハッシュの使い方が根本的に間違っている。
パンツを頭にかぶるくらい間違っている。
どうでもいいけど、 netstat -s が 何万行になる可能性ってあるの?
880 :
874 :2007/03/10(土) 14:08:39
いま$data{"key"} = val; にかえてみましたら、きちんと格納されていました。 配列なら本に書いていましたが、ハッシュも上書きになるとは思いませんでした。 ありがとうございました。
マージを意図して書くならこう %data = (%data, "foo" => "val");
perlのオプティマイザはそれをなんとかできるほど賢くはなかった気がする。毎回ハッシュのつくり直しになりそう。
883 :
881 :2007/03/10(土) 19:57:05
言葉足らずだった。 実際こんなコーディングはしないけど、 874がどう間違えたのかの理解の助けになるかと思ってね。
1回の実行で、その際使用された関数名を一覧することはできるでしょうか?
885 :
デフォルトの名無しさん :2007/03/11(日) 01:39:32
日本語でおk
っ Devel::Profile
887 :
デフォルトの名無しさん :2007/03/11(日) 06:15:50
rubyのMailParserのようなモジュールってないですか? MIME::Parserはちょっとちがうかなと思っています。
>>887 まずはrubyのMailParserの仕様を説明しる
あるいはMIME::Parserの何が違うのか説明
分からないのなら 無理に答えなくてもいいのに
>>889 そこは素直に「実はRubyなんて知らずに質問しました、すみません」って
言っておけばいいところだと思うよ。
? 私は質問者じゃありませんけど 「分からないなら無理に答えるな」 これ、どこかおかしいですか?
あーあ、怒っちゃたよ
いいんじゃない、答えなくてもいいって言ってるんだから、
>>889 みたいな失礼な奴はスルーで。
894 :
デフォルトの名無しさん :2007/03/11(日) 16:27:45
はじめまして。何をやってもわからないので質問させてください。 print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$id\" target=\"_blank\">スレタイ</a>" みたいな感じでスレタイをクリックするとそのスレッドの内容の別ページが 開くようにしたいのですが、$ENV{'SCRIPT_NAME'}?page=1 になってるところを クリックされた場合は$ENV{'QUERY_STRING'}にpage=1として返ってくると思うのですが、 それを分解して$form{'page'}=1 となるようにして、条件で if($form{'page'}){ printPage() ; } としてもひっかかってくれません。。なぜかわからないでしょうか・・
反論出来ないのなら、私の勝ちですね。 簡単に論破出来ました。 頭の悪い人間の相手は簡単ですね。
板違い
>>894 板違い。WebProg板。
後、$ENV{"QUERY_STRING"}を
分解する部分のコードが怪しそうなのでそちらも添えて。
898 :
デフォルトの名無しさん :2007/03/11(日) 16:53:16
>>896 ,897
失礼しました。。
WebProg板で質問してみます!
Ruby のほうがモジュールもコミュニティも質が良いということですね。 VM 性能も、もうすく Ruby には YARV が搭載されちゃうからもう勝ってる ところがなくなりますね。Perl6 がはやくできるといいですね。
そうですね。 どうぞその優れているRubyとやらを使っていてください。 そしてこのスレにはもう来ないでください。
そうそう、自分の劣等感を刺激するまともな人間は追い出すに限る。
>>899 今も昔もPerlスレは僕たち無能の馴れ合いスレです。まともな人は来ないでください!><
902 :
デフォルトの名無しさん :2007/03/11(日) 23:30:12
あるパッケージが use もしくは require されているかを知る方法はありますか?
>902 %INCを見たら幸せになれそう。
CPANPLUSってどんなところが優れてるんですか。
>>902 %INC
厳密に言うとわかるのはuseまたはrequireされたファイルだけどな。
すみません、ワイルドカードが入った文字列を 評価するモジュール等はありますでしょうか? 諸事情で正規表現は使えません。 検索の仕方が悪いのか、ありませんでした。 宜しくお願いします。
「ワイルドカードが入った文字列を評価する」じゃ何のことやらわからんよ。 もうすこしちゃんと説明したほうがいい。 お望みのものかどうかはわからんがとりあえず File::FnMatch をあげておこう。
>>906 正規表現ではなくてワイルドカード? あのファイルのパターンマッチのやつ?
* を .* に変換して正規表現としてマッチさせればいいんじゃない?
あるいは、ファイル名検索したいだけなら glob() を使う。
>>906 シェルのワイルドカードのことか? あれはGlobって言うんだぞ。
とりあえずText::Globってのがあるな。
今、ソートの勉強しているのですが、 htmlのテキストボックス から数字を配列に入れてソートして1行1つの数値を出そうとしているのですが、 require cgi-lib.pl; for($i = 1; $i <= 5; $i++) { $number[$i] = $in{"form$i"}; } @number = sort {$a <=> $b} @number; for($i = 1; $i <= 5; $i++) { $TEMP .= print "$number[$i]\n"; } print $TEMP; で、 1 2 3 4 5 とでてほしいのですが、 11111 に、なってしまいます。どこがおかしいか検討もつきません。
$TEMP .= sprintf("%s\n", $number[$i]);
912 :
910 :2007/03/12(月) 20:34:40
>>911 ありがとうございます。
なぜか、$tempに蓄積されませんでしたが、
なんとか思い通りにできました。
(´-`).。oO(なんで11111になったのか理解したんだろうか。。。)
つーか、そのprint文の出力はどこにいったのかと(r
915 :
906 :2007/03/13(火) 14:20:37
>>907 説明が分かりにくかったのなら申し訳ありませんが、
そのままです。ワイルドカードを含めた文字列を文字列Aとして、
文字列Bと比較しマッチするかどうかを求めるだけです。
>>908 >>909 正規表現は使わないと言ったはずです。
globは知っていますが、今回はファイル名を
抽出する事が目的ではありません。
Text::Globも内部的に正規表現を使っているのでお断りします。
ツン・・・
>>915 だったらまさしくfnmatchをしたいわけだから、File::FnMatchでいいんでない?
あれはCライブラリのfnmatchを呼ぶモジュールだから正規表現使ってないよ。
918 :
906 :2007/03/13(火) 14:59:43
すみません、書き忘れていました。 PurePerlなモジュールでお願いします。
じゃあもう無理でいいよ
正規表現使えばいいところを、わざわざ使わないで作られた公開モジュールなんてあるのかな? 自作するんならともかく。
んなもんある訳なかろう。 釣りとしか思えん。
>>918 出来合いのモジュールはまずないから、そこらからfnmatch.c拾ってきて
perlで書き直すぐらいしかないと思われる。
正規表現を禁じられるとsplitするのも一苦労だな sub stupid_split($$) { my($sep, $src) = @_; my $seplen = length $sep; my @splited; my $cur = 0; while ((my $next = index($src, $sep, $cur)) != -1) { push @splited, substr($src, $cur, $next - $cur); } continue { $cur = $next + $seplen } push @splited, substr($src, $cur); return @splited; }
釣りじゃないなら、なぜ正規表現を(モジュールの内部的にも)使っては ならないのか、理由を言ったほうがいいね。多分、その理由を回避することの ほうが楽だと思うが。
何だこれw
>>906 課題とか上司にそういうのを作れって言われたのか?
perlから正規表現なくしたら何にも残らんわな
どうせ宿題だろ。
>>918 とか、ソース流用したいのミエミエ
コアに用意されている機能をわざわざ使用しない意味がわからんな。 宿題を手っ取り早く片付けるのが目的なのであればスレ違いだ、去れ。
しかし、「宿題」とすれば結構いいテーマだね。 そんなモジュール、絶対に無いはずだから、本人の掛け値なしの実力が試される。
930 :
906 :2007/03/13(火) 20:11:22
宿題じゃないよ。 理由は(?{〜〜})でコードを実行されたくない、 正規表現のコンパイルエラーで止まる、等。 回避術はいくらでもあるけど、 どれも美しくないので使いたくない。 というか、善良な質問者に対してその態度は何なの? 分からないのなら、無理に答えなくても良いんですよ?
>善良 ここが笑うポイントですか
934 :
906 :2007/03/13(火) 20:22:45
いや、モジュールが存在しないのなら諦めますよ。 幸い時間だけはいくらでもあるので、 自分でガリガリとルーチンを書くのは可能なのですが… なるべく車輪の再発明はしたくなかったので このスレで質問させて貰った訳で、、、
阿呆は放っておけよ
任意のコードは実行できんがな
馬鹿の言うことはレベルがちがうな
任意のコードが実行できるような脆弱性やエラーで止まる事なんて、当然モジュールなら対策済みだろうに それを使わずに「車輪の再発明はしたくない」とな?
(´-`).。oO(トリップ付けて欲しいよなぁ)
940 :
906 :2007/03/13(火) 21:02:49 BE:716364599-2BP(3000)
トリップは付けないけど クソコテなら名乗ったことがあるよ。
>>930 正規表現でコードの実行なんて出来たっけ?
943 :
941 :2007/03/13(火) 21:41:37
>>942 どもっス。
perlre読みなおしてきますた。
これってpatternのほうを変数にしてもランタイムエラーになって実行はされないっすよね?
汚染された質問は実行しない方がよいようですな( ̄ー ̄)ニヤリッ
みんなお触り好きだよねえ
>>915 >Text::Globも内部的に正規表現を使っているのでお断りします。
>>930 >理由は(?{〜〜})でコードを実行されたくない、
>正規表現のコンパイルエラーで止まる、等。
なんかおかしいよな。
Text::Globがコードを実行させる正規表現なんか使うのか?
Text::Globがコンパイルエラーを起す正規表現なんか使うのか?
どうみても釣り
948 :
906 :2007/03/14(水) 10:25:23
正規表現は使わないと、最初の条件に書いたはずですが。 正規表現使ったら1分で書けますよ、そんなもの。
まだいたのか。 とりあえず、その1分で書ける正規表現の例を見せてよ。 それを見れば、具体的になにをしたいのか皆にわかるから。
950 :
906 :2007/03/14(水) 10:55:56
具体的に言うと、.htaccessってありますよね。 あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。 1分で書けるってのは、 * を .* に変えるやつです。 KENTがこの手法を使ってた覚えがあります。
いや普通は*→.*にして他の記号はメタキャラクタとして解釈されないように quotemeta相当のエスケープするように書くから正規表現使っても全く問題 ないわけですが... KENTとか引き合いに出すあたりどうみても釣りだし しょうがないか。
>>906 おめぇコテハン「正規表現は使わない」にしてこいよ。
そしたらちょっとは相手してやるよ。
>>950 つーか、正規表現使わない理由がおかしいし。宿題厨はカエレ。
正規表現を使わない理由=モジュールを使わない理由 になっていないわけだが。 > 理由は(?{〜〜})でコードを実行されたくない、 > 正規表現のコンパイルエラーで止まる、等。 これらは、モジュールを使えば解決する事。 希望通り、任意のコードが実行されるような脆弱性もなくて、エラーでもとまらなければ 実装に正規表現が使われていようがいまいが関係ないじゃん。 車輪の再発明を避けようとして、車輪を使うのをためらってどうする。
> * を .* に変える え?、変換後もワイルドカード文字が残ってるの?
* -> .* じゃなくて * -> [^/]* かな。
カレーにヌルーしようぜ
958 :
906 :2007/03/14(水) 14:52:02
>>953 宿題?学校も行ってないのに、
誰が宿題出すんですか?逆に聞きたいよw
>>951 >>954 正規表現は使わないって
何回言えば理解出来るの?メクラですか?
906 を NGName 指定で万事解決
960 :
906 :2007/03/14(水) 15:48:10
もう正規表現なんて使わないなんて、言わないよぜったいぃー
961 :
906 :2007/03/14(水) 16:00:23
俺が正規表現使うと日本が滅びるんだよ。 つまり俺は日本のために必死に頑張っているのであり お前等の運命は俺に委ねられているんだよ。 わかったらとっとと俺を導け。
>>961 正規表現が難しくて分からない って正直に言っちゃえよ。
964 :
906 :2007/03/14(水) 16:25:49
2ちゃんねるが無能の塊だということはよく分かりましたよ。 こんなところで訊いた私が莫迦でした。 二度と来ません。
今日、2chで一番気分の良くなる書き込みを見たな(´ー`)y━~
この後、散歩途中の
>>962 が、
コンビニで立ち読みしてる906を目撃しようとは
>>962 本人も今はまだ気付いていなかったのである。
流れを無視して書いてみたけど動かねえ '*' の処理は再帰でいいよね?
perl で質問です TreePPというライブラリを使ってます。 連想配列 $tree というのがあってこれにXMLを展開したものを入れてあります。 <top> <elem>1</elem> <elem>2</elem> </top> こんな感じで $value = $tree->{top}-{elem}[0]; とアクセスしますよね elemの個数は不確定です。 1個の時に添え字を使うとperlがエラー起こします。 何個あるかどうかを調べるにはどうしたらいいのですか?
想像だが常識的に考えると scalar $tree->{top}->{elem}; あたりじゃないか?
やってみたら HASH(0x1ad51b4) ってのが帰ってきます
>>906 Perlで正規表現が使えないのは特殊なケースだと思いますので,
お探しのようなモジュールは絶対とは言い切れませんが,おそらくないと思います。
私は作れませんが,とても興味がありますので,
作られたら是非見せてください。
Socket使ってWebページからソース取得したんだけどprintで出力すると ヒ、ョ、・/b> こんな感じに化けちゃっててシフトJISにまともにエンコできない どうやって対処すればいいんだい?
>>972 主にsjis以外で使われる文字コードはUTF8の場合が多い
jcode.pl pmはたぶんこのコード変換が出来ない
取得するページが固定ならperlソースのコードをUTF8に合わせてそのまま出力するのが一番簡単
どうしてもsjisに統一したければutf8用のライブラリがあるよ
974 :
967 :2007/03/14(水) 17:46:38
# 誰か添削plz sub simple_fnmatch { my ($pattern, $string) = @_; my $p = 0; my $s = 0; while ($p < length($pattern)) { my $char = substr($pattern, $p++, 1); if ($char eq '?') { } elsif ($char eq '*') { $p++ while (substr($pattern, $p, 1) eq '*'); for my $pos ($s..length($string)) { return 1 if fnmatch(substr($pattern, $p), substr($string, $pos)); } return 0; } else { return 0 if $char ne substr($string, $s, 1); } $s++; } return $s == length($string) ? 1 : 0; }
>>968 使ったことないんだが
単数のとき、 $value = $tree->{top}->{elem};
複数のとき、 $value = $tree->{top}->{elem}->[0];
だよな?とすれば、
単数のとき、 ref($tree->{top}->{elem}) eq "HASH"
複数のとき、ref($tree->{top}->{elem}) eq "ARRAY" / $count = @{$tree->{top}->{elem}}
となるはず。
>>975 一部できたけど
また問題がでました、elemが0の時はどうしたら?
$havechild=0; foreach $key(keys %{$tree->{top}}){ if($key eq "elem"){$havechild=1;last;} } これで出来たけどなんか長い
978 :
906 :2007/03/14(水) 18:40:19 BE:88440252-2BP(3000)
答えられなくなると、名前を偽って
マイナス要素になる書き込みをするんですね。
ここのレベルも落ちましたね。残念です。
>>962 そこまで頭は悪くありません。
普段は普通に使っていますので。
典型的すぎてワロタ
あと何回捨て台詞吐くのかな
>>978 入力が何で出力が何したいのか書けば、
天才の俺が教えてやっても良い。
>>974 マンドクセーからちゃんと読んでないが、fnmatch()の真似をしたいのなら
パスのセパレータ('/')は意識しないとだめだろう。
983 :
906 :2007/03/14(水) 20:20:25
>>981 自称天才の意味不明な要求なんか
聞く耳持てません。
俺はまともな人に向けて話しているんです。
>>982 とりあえずめんどくさいので ? (任意の一文字) と * (任意の文字列) だけ実装してみました。
関数名が良くなかったですね。
906が > あれと同じで、ホスト名やらにワイルドカードを使い、評価したい訳です。 なんていうからこんな仕様になったんですけどね。
次スレはー?
988 :
デフォルトの名無しさん :2007/03/14(水) 21:10:43
RFTM
>>976 refが空文字を返してるんじゃないか?
そこまでは実装がどうなってるのか見てみないことには分からんが。
991 :
デフォルトの名無しさん :2007/03/15(木) 00:48:00
>>968 もう解決したかもしれんが、XML::TreePPならnewの時に
$obj = XML::TreePP->new( force_array => [ "elem" ] );
…とすれば、1個の時でも添え字を使える。
梅?
竹
松
酒 清 の び こ ろ よ
ume
うめ
1000!
┌┐ ●●● 人 ││ ●\ ●\ ノ二\ ナ ゝゝ V ●●● ●\ ●\ / / 乙 つ O ●\ ●\ ●\ ●\ ●●● ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●\ ●●● \ ●\ ●\ ●\ ●\ ●\ \\\ ●\ ●\ ●\ ●●● \ ●\ ●\ ●\ \\\ ●\ ●●● \ ┌┐ ┌┐ ●\ \\\ ┣━┳┃┃ ┃ ││ ││ ●●●\ ┃ ┃┃┃ ┣┓ ━╋ ━╋ V V \\\\ ┛ ━┛ ┃ ┏┫ ┏┫ O O (´´
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。