1 :
デフォルトの名無しさん :
2006/09/10(日) 16:50:14 "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/09/10現在の最新版: 5.8.8
● 2006/09/10現在の開発版: 5.9.3
前スレ
Perlについての質問箱 26箱目
http://pc8.2ch.net/test/read.cgi/tech/1153412251/ リンク集は
>>2-3 過去スレは
>>4
なんという良スレ・・・ スレタイを見ただけでほすほすしてしまった このスレは間違いなく伸びる ( ´∀`) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
I think of Perl, therefore I exist.
I eat Perl, therefore I erupt of poopoo.
$time = 06:59 ; となっていて、1足すと 07:00になってくれたら時刻の計算が便利なんだけど perlではこういうのモジュールとかありますか?
> $time = 06:59 ; これの意味がわかりません 実行可能なのですか?
$time = Data->parse("6:59"); $time += 1; print $time; ==> 7:00 みたいな感じ?確かに便利そうだなぁ。ちゃんと演算子のオーバーロードもやってもらわんとね。
13 :
デフォルトの名無しさん :2006/09/11(月) 03:33:50
何でもあるなwCPANはww
汎用性もクソもない一発ネタのマイナーモジュール使いまくって コードを Readonly 化しようぜ
> 汎用性もクソもない一発ネタのマイナーモジュール まさかTime::Pieceのことじゃないよね?
時間は12進法か24進法、分と杪は60進法っていうのを考えれば 初心者向けの練習問題になるんじゃないの?
XSモジュールはコンパイルしたgccのバージョンが違うと 動かなかったりしますが具体的にはどういった内容で動かないのでしょうか?
19 :
デフォルトの名無しさん :2006/09/11(月) 15:25:49
改行コードで区切られた外部のデータを配列に入れるいい方法はありませんか? 外部データの例(gaibu.dat) aaa bbbb cc …(続く) openで開いて入れると,配列としては入りませんよね?
<>
open(IN, 'gaibu.dat'); while(<IN>){ chomp; push(@arr, $_); } close(IN);
open my $in, "unko.txt"; my @a = map {$_ =~/(.*)$/} <$in>
open(IN, 'gaibu.dat'); @gaibu = <IN>; close(IN);
>>19 use File::Slurp;
my @lines = read_file('gaibu.dat');
25 :
19 :2006/09/11(月) 16:47:37
>>21 ありがとうございました。
その方法で無事解決しました。
色々調べて,関数はないだろうという結論でしたが,
最後の判定をどうするかでいい方法が思い浮かびませんでした。
while(<IN>){
こういう判定の仕方がどうにも慣れないというか思いつかないというか・・・。
ちなみに,23の方法は最初自分が試した方法なんですが,
これだとデータファイルがそのまま放り込まれてしまって,
配列1つずつに入れるということにならなくて困っていました。
アドバイスくれた方々,ありがとうございました。
でおくれた。 open(IN, 'gaibu.dat'); @array = map{ chomp; $_} <IN>;
chomp @array 一回で配列の中身全部処理してくれるよ
うちでも\\\\は\\になるな....なんでだろ 995 :デフォルトの名無しさん :2006/09/10(日) 15:47:32 独習perlで勉強してる。 ----------------------------------------------- $ cat print.pl print '\\\\'; ----------------------------------------------- 上記のたった一行のスクリプトを実行すると、 $ perl print.pl \\ となってしまう。 独習perlには「シングルクォート間にある文字列はエスケープシーケンスを無視する」 と書いてあるのに、なんでこんな結果になるんだろう。 FreeBSD6.1、Cygwin環境下両方で試したけど同じ。 996 :デフォルトの名無しさん :2006/09/10(日) 15:55:24 「初めてのperl」を見たら、2.3.1節に、 シングルクォートの間に置かれたすべての文字(ただしシングルクォートと逆スラッシュは除く)が、 そのまま文字列の内容になります。 って書いてあるよ。
バックスラッシュに¥記号を割り当てたやつ氏ね!まぎらわしいだろ、ボケ! と、言いたかったのだろう。
OSの力を借りれば。
>通常一般のパソコンでの利用よりもサーバー上や >データ処理用のパソコン等で使用される事が多い「Perl(プログラム >言語)」プログラムが、 個人のPerl使い=希少種
そんなわきゃーない。大学でも教えてるし。
個人用ツールをCで書いてるやつがいたらお目にかかりたい。
ノ
ひょっとするとPOPFileとかSpamAssasinとか入れてると起動しなくなるのかな? Perlが駄目ならRubyとかで作るとかpugsで動かしちゃうとかいろいろ出来るようなきもするけど。
>>39 /.参照。dllを監視しているらしい。まぁ、ROやらない俺には全く関係ないがなー。
こないだperlスクリプトをexeファイル化してくれって奴居たろ。メールアドレス晒して。 あれがそう。
>>32 よくわからんけど、ここで質問に答えてるような連中には、
良い小遣い稼ぎのネタがあるってことか。
でもゲーム嫌いだからなあ。
>>42 そういう汚いお金を稼ごうと思う人はレベルの高い人にはあまりいないと思われ。
いてもスクリプトキディレベルの人かな。
>>43 運営会社は「不正」だと言ってるが、倫理的に何が悪いのかおれにはわからない。
あー、でもくだらない質問でスレが埋まるのはいやだから、
「他人がいやがる用途に関する質問はお断り」とでもしといたほうがいいのかな?
>>42 > よくわからんけど、ここで質問に答えてるような連中には、
> 良い小遣い稼ぎのネタがあるってことか。
莫大な財産を築けるネタじゃねえの?
46 :
43 :2006/09/13(水) 09:33:30
>>44 たしかに、悪いとは言い切れないね。賛否両論あるだろうが。
「汚いお金」とは言いすぎだった。
スパムメールで稼ぐことなどの迷惑行為を連想してしまっていたようだ。
スレ違いの内容失礼。
増子をスクリプトキディ呼ばわりできるハカーって日本に何人いるんだろうな
Teratermっていうwindowsのターミナルソフトあるでしょう。 あれに「バイナリファイルの送信」っていう機能があって、 目的の装置にtelnetしてから、よく任意のバイナリファイル(バイナリエディタで作ったファイル) を送信している。 これをperlでやるにはどうしたらいいのだろう。っていうかshellの機能の話しになるんだろうかこれ。
>>49 「これ」って具体的になによ? ファイル送信の方法なら山ほどあるぜ。
52 :
デフォルトの名無しさん :2006/09/15(金) 00:45:15
$b = sprintf("%04d",$a); 上記のようにすると、 $a = 1 なら $b = 0001 となりますが、 $a = -1 だと $b = -001となってしまいます。 $b = -0001とするには、どのようにすれば、 よろしいでしょうか? 条件分岐で、マイナスなら、%05dとかでしょうか、 もっとスマートな方法はありませんでしょうか? ご教授下さい。 お願いします。
もともとフィールド長の調節のための機能だからなぁ。条件分岐しかないとオモ。
スマートとは言いがたいけど。 $a =~ s/^(-)//; # +記号も対応するなら ([-+]) $b = $1 . sprintf("%04d",$a);
かっこわるいけど $b = sprintf(($a > 0 ? "%04d" : "%05d"), $a);
56 :
52 :2006/09/15(金) 01:59:09
いろいろとレス ありがとうございます。 条件分岐でいきます。
58 :
デフォルトの名無しさん :2006/09/15(金) 02:57:57
質問はともかく回答者のレベルが低すぎてお話にならないよ 初心者は回答しないでくれるかな?
>>52 perldoc -f sprintf
質問者やここの住人の大半はドキュメント読んだり
CPANでモジュール無いか調べたり出来んのか?
ほら、コンパクトを筆頭にWebProg板に隔離されるべき人間が紛れ込むようになったからだよ。
ドキュメント読んだら負けかなって思ってる
馬鹿なのに何かに勝てると思ってるのが そもそもの間違いだろうな。
と、リアル負け組が申しております。
明らかなネタにいちいちふっかけてくる理由が分からん…。 リアルでストレス溜まってるんだろうな。
fooというフォルダ配下に abc_DATA def_DATA GHI_DATA zyx_DATA というフォルダがあります、これらのフォルダ名を abc_Win2k def_Win2k GHI_Win2k zyx_Win2k とリネームしたいのですが、どうしたら良いでしょう? $foo = *. '_DATA'; $bar = *. '_Win2k'; print "[$foo]を[$bar]に変換します。\n"; rename $foo, $bar; これじゃぁできないのですが・・・・
system("rename *_DATA *_Win2k");
馬鹿な僕にはこんなコードしか思いつきませんでした map { $x = $_; $x =~ s/DATA$/Win2k/; rename($_, $x); } glob("*_DATA");
えーと、 1: CGIで自サイト内のHTMLを検索するプログラムを作りますた。 2: ところが、ディレクトリとかファイルとか全部調べるととっても時間がかかって問題となりますた。 3: と言うことで、1回調べたディレクトリやファイルのパスは、txtファイルに保存して次回からそれを読み込むことにしました。 4: ところが、新規でファイルやディレクトリを増やすと、プログラムがそれに気付かない罠に陥りました。 (僕のプログラムは頭が弱いのでtxtに書いてあるパスが全てだと信じきっている。) 5: しょうがないので、毎回ディレクトリやファイルの構造をチェックしてみました。 6: そうすると、振り出しに戻った上、txtファイルが何の意味もない事件に陥りました。 7: どうすればいいですか?(サクサク大量のディレクトリやファイルを検索できれば問題解決です)。
定期的にディレクトリ構造をtxtにするプログラムをcronで走らせるとか そもそもHTMLを直にアップロードするのをやめてCMSを使うとか いっそのことGoogle先生に頼ってみるとか
時間がかかるって、ひょっとしてファイル内の文字列も検索してるのか?
>>72 検索CGIの紹介文ですね。
せっかくなんで、全部ベンチ取ってみよう。
>>73 えーー。
なんかもっとこのスレっぽい回答ほしいです。
>>74 ファイル内の文字も検索してるけど、これもこれでとっても時間かかるます。
と言うか、自分のマシンじゃないからアレなんだけど、きっとCPUが低いんだよ。たしか800MHzって言ってた気がする。
CGIってあれじゃん、検索ボタン押して3秒以上経過するとアレじゃん。ヤじゃん。
--------------------------
と言うかファイルのアップなんてそんな頻繁にやってないのに、毎回ディレクトリ構造チェックするのヤなんだよ。
だからと言って、ファイルやディレクトリを増やした時に即座に反映されないのもヤなんだよ。
そして、この仕様(希望)を満たすプログラムを作りたいんだよ。
書いてて思ったけどなんか無理っぽい要求ですね。コレ。
しょうがないので、たぶんどっかで妥協したりします。
超妥協したらGoogle先生呼び出します。
てか今思ったけどGoogle先生早くね??なにアレ。
350個のファイル(全部で5M程度)をperlで全文検索してみたら5秒とかかかったけど grepでやったら1秒とかからずに終わった件 マルチスレッドでも使ってるのかこれ?
つーか、ディレクトリ構造保存したってそんなに高速化にはならないでしょ。 「構造テキスト読み込み+解析+記録されてるパスをそれぞれ検索」と 「ディレクトリ列挙+ファイル列挙しつつ検索」では、あんまかわらないような。試してはないけど。 検索部分(ファイルの読み込み+検索)のアルゴリズムを見直したほうが良いと思うよ。 検索の助けになるようなインデックスファイルを作るとかね。
>>75 ファイルアップロード時にインデックスをキャッシュするアップローダーを書いてみてはいかが。
msearchやらnamazuやらEstraierやらの出来合いの全文検索エンジン使った方が早いよ
>つーか、ディレクトリ構造保存したってそんなに高速化にはならないでしょ。 構造っていうか、HTML一つにつきPathを一つ作りますた。上から順番に開いていくだけです。 >検索の助けになるようなインデックスファイルを作るとかね。 インデックスファイルってなんですか。どのような装置ですか。 >ファイルアップロード時にインデックスをキャッシュするアップローダーを書いてみてはいかが。 よくわからんけど、ようするに、FTPくそくらえ!検索プログラムに暗黙でファイルをいじるな!ってコトですね!
>検索部分(ファイルの読み込み+検索)のアルゴリズムを見直したほうが良いと思うよ。 プログラム部は書き間違えがなければこんな感じです。数年この状態のまま使ってます。 再帰してるけど、再帰のほうがあとでなんかあったとき、いじりやすそうだったからです。 個別に処理をしてるのも同じ理由です。あとは、見た目が綺麗とかそんな理由。 BEGIN { #▼なんかディレクトリからファイルを返す関数 sub file_list (&$;$) { my ($code, $dir_name, $mode) = ($_[0], $_[1], $_[2]); my $path; { $path = $dir_name . q[./], last if(qq[\l$mode] eq q[p] or !$mode); $path = "", last if(qq[\l$mode] eq q[f]); return(); #モードが変なのは処理しない。 } opendir DIR, $dir_name or return (); my @file_list = grep{ $_ = $path . $_; &$code; } (readdir DIR); closedir DIR; foreach my $file (@file_list){ 1 while($file =~ s[/\./][/]g) } return(@file_list); } }
INIT { #▼対象ディレクトリ全取得みたいな。 $::routine{'ディレクトリ取得'} = sub { my @read_dir = @_ or return( undef, '読み込むべきDirPath が入力されていません。' ); my @return_dir; #返す値 &{ my $sub; $sub = sub{ foreach my $dir ( @{ shift; } ){ my @list = map {$_ . '/'} file_list { -d and !(m/[\/\.]+$/) } $dir; push @return_dir, @list; $sub->( [@list] ) if(@list); #ディレクトリがまだあったら再帰 } }}( [@read_dir] ); return(@return_dir); }; } #▼Path取得 { my @all_dir; #▽Dir @all_dir = $::routine{'ディレクトリ取得'}->($::info{'path'}); defined($all_dir[0]) or error($all_dir[1]); #エラー処理しと #▽html foreach my $dir_path (@all_dir){ $::all_path{"$dir_path"} = [ file_list {-f and (m/\.html$/ or m/\.htm$/) } $dir_path ]; } }
検索の部分はごちゃごちゃしてるので書きませぬ。 と言うか直す余地が満載なので直します。
ディレクトリの更新日時を覚えておけば未更新のディレクトリ以下は触らずにすむよな
>>80 とりあえず「全文検索」で検索すればインデックスの件を含め色々出てくる。
ていうかそのキモいコーディング直すだけで保守性も速度も上がりそう。
昔どっかのスレで紹介されてた、UNIXなんとかっていう雑誌に載ってたらしい方法。 確かこんな感じだった。 普通、インデックスを使った検索ってのは辞書が必要になる。 でも辞書とか形態素解析とかは面倒くさい!>< そこで、辞書に登録された単語毎にファイルを引けるようにするのではなく、 nバイト毎のハッシュを単語代わりに使う。検索するときも、検索ワードのハッシュを取って、インデックスから引けば 実際に開いてマッチングする必要のあるファイルや部分は大幅に減る。 これならPerlなら簡単に書けそうだし、イイと思うよ。
ああウゼェ レスすんなカス
89 :
63 :2006/09/16(土) 04:54:43
>>64 あぁ だめだなぁ。それでいくなら「いや 勝ってないから」のたった一文で、
ぱすーんと決まるのに。おしいなぁ。
>>86 の内容は忘れるが、俺は君の事をわるれれない。
で、何がデタラメだと? 元ネタと多少違ってたとしても、この方法でいけるじゃん。 まさかハッシュをPerlの連想配列とでも勘違い(ry
作ればわかる。
こんなの自分で書きたがるなんてバカだと思うが、 もしそうしたいならざっとこんな感じか。 ・File::Findでサブディレクトリを含むエントリをスキャンする ・ファイルが見つかったらstatで更新日時を調べる ・キャッシュに対象ファイルのエントリがあるか調べる。キャッシュした時刻がファイルより古ければ無視する。 ・キャッシュを利用できる場合はそうする。 ・利用できない場合、よくわからんが好きなようにファイルから検索する。 ・検索結果をキャッシュに記録する。最終検索日時も記録しておく。 キャッシュの構造や 具体的にどんな検索をしたいのかとかは知らんが 何らかのデータベースシステムを使った方が明らかに速いだろうな。
>>92 中身の無い批判してんなよ。何が目的なんだ?
>>89 そういう亀レスが一番「効いてます」って証だけどね。
と、リアル負け組が申しております。
と、泣きながら申しております。
100 :
デフォルトの名無しさん :2006/09/17(日) 10:44:36
strict厨、warnings厨、my厨、死ね
my変数の方が速度面でも保守面でも有利。 ourやlocalを使うのはそうする必要がある場合だけ。
>>104 >>106 釣れた釣れたw
俺の完全勝利wwwwっwww
このレスに反応したらさらに俺に加点なwwwwww
でもお前らは悔しすぎて自分を抑えられずこのレスに反応するww
もう勝ちすぎてこわいwwっwwwwwwwwwっwww
IO::Allのせいで頭が腐ってきた
使い捨てのスクリプトまでstrict/warnings/myやる奴の気が知れん
そういう人は別に知る必要ないっしょ
>>109 それを先に言ってほしかった。
「使い捨てのスクリプトまでstrict/warnings/myやる奴の気が知れん」
↓
「いや、use strictはどんなスクリプトでも使うべき。付けないやつはアフォ」
↓
「うっせぇ!!strict厨、warnings厨、my厨、死ね」
これなら納得。
102のコードが 「いや、use strictはどんなスクリプトでも使うべき。付けないやつはアフォ」 と言ってるのに相当するわけだが
Perl6では常時 use strict になるわけだが。
じゃあわざわざつける必要ないね
use strict初めて見ました
サンプルコードに対する添削にまで付け足すのは既に偏執的というレベルを超えていて もはや原理主義と言ってもいい 危険だから下手に触らない方がいいよ
正直strictとwarningsは空気。#!perlとセット。
118 :
100 :2006/09/17(日) 20:30:48
回答ありがとうございます!!!
use strictしなくても宣言する時にmyは書いちゃうよ。なんていうか、もう癖。 てか、書き捨ての時と普通に書くときで、書き方変えられる人は器用だと思う。素直に感心。
僕の場合、strict と warnings を書かないのはワンライナーくらいです。 ファイルに起こす程の分量になると僕には複雑すぎるので、それらなしでは混乱して発作を起こしてしまうから。
もれもワンライナー以外のときはstrictとwarningsはつけてるな。
共同作業とか職場が一緒でなければつけてない人を見かけても無視だけど
>>112 ,
>>116 みたいなのは真性のアフォを見ちまったと思って胸糞悪くなる。
どっちでも書けるんだから好きにしていいのよ。 自分の考えを押し付けるヤツがアホってだけで。
同感。 使い捨てなんだから自分の書きやすいように書けばいい話。
馬鹿は何が自分に優しいスタイルなのかさえ見つけられないから、 「ほっとけ、それがそいつにとって良い書き方なんだろう」っていう捨て置き方が 常に問題なく成り立つとは限らないんだよね。 でも、そういう馬鹿に限って「より良い何かに変わろうとする力と意志」がないもんだから、 ちょっと意見をぶつけられただけですぐ「押し付けられたヨ〜」っていう電波被害届出すし。
126 :
デフォルトの名無しさん :2006/09/17(日) 23:52:28
俺真性のアフォだから
strictとwarningを付け足すことが
>>100 の質問内容とどんな関係があるのかさっぱりわかんないんだよね
誰か偉い人教えてくれ
真性のアフォに教えようって奴はいないと思うよ。 アフォに物を教えるのってものすごーく面倒だから。 だからまともな頭の持ち主は「アフォな俺に教えて」という言い方はしない。 それがどれだけ傲慢で無駄なオネガイががわかるからね。 これを言ってしまうのは、それすらわからない本当にアフォな奴だけ。 そしてそれがバレちゃったらもう、誰もまともには答えてくれない。 残念だったね。まずは自力でアフォじゃない人間になりなさい。
真性のアフォ相手ではどんなに説明しても無駄だけど 普段書いているコーディングスタイルでサンプルを提示しただけのを 何か特別な意味があると勘違いしているのが真性のアフォのゆえんなんだろうな
やっぱstrict厨が涌くと荒れるなw
アフォとstrictな構文書けなくて挫折し劣等感にまみれた アンチな奴らには何言っても無駄よ。 サンプルを提示されただけでこう書けと押し付けられたわけでもないのに アレルギー反応を示してるだけよ。 うざいけど、可哀想な奴らなので生あたたかく見守ってあげて下さい。
131 :
デフォルトの名無しさん :2006/09/18(月) 00:20:40
こういう場で示すサンプルは、実質的な部分だけにしぼって 自分のスタイルとか必要ない部分は極力減らすべきじゃないのか?
↑何言っても無駄で無限ループに入るだけなので無視の方向で
だから原理主義者に何言っても無駄だってのw
wではごまかせない根源的なわかってなさが痛い。
なんで素直に、質問の趣旨とは無関係だしコードとしての作用もない無用なゴミだけど 宗教的な理由でどんな状況でも書かずにはいられませんごめんなさい って言えないんだろ
なんで煽らずにはいられないんだろ
”作用もない無用なゴミ” 処置なしだな。。。
>>136 文字通り「アフォ」だからだと思うよ。
まぁ、他人に歯軋りさせてナンボなはずの煽りで
他ならぬ自分の歯軋りを聞かせちゃってるザマじゃ、まるでダメだけどね。
ぶっちゃけstrictやwarningsをつねに使うなら他の言語のほうがいいじゃん。 Perlなんだから可変変数やグロブ使いまくって変態コード書くのが楽しいんじゃん。 もちろん俺はそんなことしないよ☆
なんか一気にスレが進んでるなと思ってみてみたら,ただ荒れているだけなのね orz 流れを見ると100の質問に101と102が回答して 102のコードにstrictが入ってることにアンチstrictな人が反応して strictいらねぇだろと102の書き方にケチをつけたのが事の発端ですよね。 とりあえずアンチstrict厨な方々はもちつかれてはいかがでしょうか。 コードの書き方は人それぞれなのですから気に入らなければ流せばいいではないですか。 それができないからアフォ呼ばわりされるのでは?
おまいら他所でやれ。 回答は本質部分を分かりやすく書くのが基本。 必ずしも実装時の理想的な記述がよいわけではない。 (例はラクダ本等を参照) 本質でないところでごちゃごちゃ騒ぐな。
最新の版のラクダ本をちゃんと読んでないんだな…。
>>143 本質でないところでごちゃごちゃ騒ぐな。
俺はテストコードでもstrictとwarnings付けてmod_perl上でイッパイ走らせる。
ここはインターネットですね。
>>144 有名どころの本の名前を出して自分の主張を押し通そうとしたのに
通らないと逆切れですか。
さすがはアフォだ。
黙れ初心者ども
149 :
デフォルトの名無しさん :2006/09/18(月) 03:19:35
cygwin perl v5.8.7でPARをインストールしようとしたんですが、test時に 30-current_exec.t の43行目の生成したexeファイル実行時で cygwin1.dllがみつからないと怒られてtest失敗しちゃいます。 ぐぐりまくったけど、よくわからんです。どうすりゃいいですか? ちなみにshell scriptに組み込んでperl使いたいのでactive perlは抜きで おながいします。
strict厨必死杉w
>>150 もしかして、わざわざ名前入力してるの? それなんて初心者?
普通にstrictを使ってるだけで使えと強要されたと被害妄想に駆られて 人のコードにケチをつけ原理主義呼ばわりしてスレを荒らす アンチの馬鹿っぷりがおもしれぇ
このスレはいつからこんなにうんkくさくなったんですか。 もしかして、最近プロではない人がどんどん流れ込んできてるんですか。 web板のCGI始めちゃったー♪ってノリと同じですか。
頭がうんこじゃない限りは2秒でわかることだから 誰もちゃんと答えてくれないと思うよ。 既出だけど、アフォは相手にされない。
>>149 > ぐぐりまくったけど、よくわからんです。どうすりゃいいですか?
目的、環境、制限条件、行った事、実行したコマンド、それらの結果、そして特にエラーメッセージを正確に述べる能力を身に付けることから始めよう。
157 :
デフォルトの名無しさん :2006/09/18(月) 20:05:37
下記のコーディングで、キーボードから、tを入力すると t t master.txt と表示されるのですが、どこが不味いのでしょうか? <コーディング> print "ファイルのタイプは m/t ?"; $type=<>; print $type; if ($type=="m" ) { print $type; $price_file="pricem.txt"; $mt_file="master.txt"; } else{ $price_file="pricet.txt"; $mt_file="tran.txt"; } print $mt_file;
158 :
157 :2006/09/18(月) 20:09:01
蛇足: キーボードから入力したtの表示は、別にあります。 画面上では、tは3つあります(入力分1つ+出力分2つ)
>>157 chomp($type=<>);
if ($type eq "m") { ... } # 文字列比較はeq
無い頭で無理して言い返さなくても・・・ (ryから先が「まだこの世に無い」のが丸わかりで痛い・・・
あー、俺はそもそも質問者じゃないし。意味ないレスが増えたって言っただけだよ。 まぁ通じてないからどうでもいいわ。
/\___/ヽ /''''''strict'''''':::::::\ . |(●), 、(●)、.:| ふたりともやめて | ,,ノ(、_, )ヽ、,, .::::| . | `-=ニ=- ' .:::::::| これ以上わたしのために争わないで \ `ニニ´ .:::::/ /`ー‐--‐‐―´\
>>156 なんか、てめーのちんこねじ切りたくなるような、お返事サンクス。
自力でがんばってみるんでいいっす。
KENT WebでCGIの勉強をしました。 あと橋本和明の本でPerlを身につけました。
橋本和明って誰?って思ったら、 巷では結構有名な人みたいね。 マイナス方向に。
167 :
157 :2006/09/19(火) 08:42:56
>>159 どうも、ありがとうございました。
もう一つ教えて下さい。
$a = "山田(株)";
$a =~ s/(株)//;
の結果($a)が、山田() になります。
()も削除するには、どうすれば、良いのでしょうか。
\( \)
test.pl という、ある実行ファイルがある。 test.pl "TEST 2CH VIP" という引数を付けて実行する。 "TEST 2CH VIP"は12文字だ。すなわち12bytes。 12を16進数で表記すると0Cになるだろ。 引数の文字列のバイト数をカウントし、かつそれを16進数に変換して取り出すことは可能だろうか。
可能
171 :
デフォルトの名無しさん :2006/09/19(火) 12:22:52
>>169 もちろん可能。
printf "%02X\n", length (shift @ARGV);
教えて君にマジレスすんな
教えて君は教える側よりも偉いんだよ
174 :
171 :2006/09/19(火) 13:50:44
もう子ねえから。
Template::Plugin::TruncateJp で ああああああああああああ 見たいな連続するもじれつでもじばけするんだけど、どうしたらいい?
こんな感じでやってもうちじゃ化けないのできちんと再現できる条件を出せ。 ]% cat foo.tt [% USE TruncateJp %] [% FILTER truncate_jp('10') -%] あああああああああああああああ [%- END %] % tpage foo.tt あああ...
化けないよ use Template; Template->new->process(\*DATA); __END__ [% USE TruncateJp %] [% 'あああああああああああ' | truncate_jp('8') %]
あう被った
179 :
175 :2006/09/19(火) 17:22:00
自己解決したです jfoldがEUCで返してくるんですね、、 UTF8なテンプレートで使ってたのが原因でした。
180 :
175 :2006/09/19(火) 17:24:54
とか思ってたら、だめでした。出直してきます。 やはり原因はUTF8あたりらしい。
Jcodeの問題かもしれない、、、 [% USE Jcode; USE Dumper; aaa = 'あああああああ'; # 本来は200文字ぐらい bbb = aaa.jcode.jfold(100); Dumper.dump(aaa); Dumper.dump(bbb); %] こんな感じ。 テンプレートはUTF-8、データも当然UTF-8。困った…。 $VAR1 = 'あああああああ (略) ああ'; $VAR1 = [ '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??????????????????????????????????????????????????', '??' ];
Jcodeのjfoldはそのままだとなんとなくeucを返すが、 正式な使い方はさらに希望の文字コードで ->eucとか ->utf8とかしないとだめなんじゃ。そうじゃないと どのコードで返していいかわかんないだろ。
確認してるのがコンソールだかブラウザだかわかんないけど そっちのロケールとか文字コードは確認したの?
184 :
175 :2006/09/19(火) 17:58:24
HTTPレスポンスヘッダー情報 - Date: Tue, 19 Sep 2006 08:54:45 GMT Server: Apache/1.3.34 (Unix) (Gentoo) mod_perl/1.29 Content-Encoding: gzip Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked 200 OK 確認はブラウザにて。 truncate_jp使わないで、truncate使うと正常に表示(当然、全角文字は文字数によって切れる)なので、Template::Plugin::TruncateJpとかTemplate::Plugin::TruncateJpの中身のJcode.pmとかが怪しいという感じで調べてみたんだけど、手詰まりというか。 まぁ、全角文字がぶった切れない指定文字数で切れれば、他の方法でも構わないんだけど、ちょっと不可解な感じです。
>>184 Template::Plugin::TruncateJpはeuc決め打ちっぽいので全部EUCに直すか
自分でなんとかしろ。
utf8決め打ちでよければ
my ($line) = jcode($str)->jfold($len-length($suf));
を
my ($line) = jcode($str)->jfold($len-length($suf))->utf8;
に改造する程度でいけるかもしれないが試してないので自己責任で。
$sufがascii範囲に収まってないとさらにlengthまわりもいじらないとだめそう。
186 :
175 :2006/09/19(火) 18:44:03
>>185 アリガトン
結局、Template::Plugin::TruncateJpをいじくってみたけど、
特定の場合(同じ文字列が大量に続くときだけ化ける)は治らなかったです。
他に原因があるのかもしれません。
今はテストデータぐらいしか化けないので、他の方法で対応を考えます。
お騒がせしました。
utf8の「あ」×偶数個をJcodeに食わせると誤判定されるので、 utf8と決まっているのなら自動判定に頼らずにcode($str)を jcode($str,'utf8')にしてみるといいと思われる。
188 :
デフォルトの名無しさん :2006/09/19(火) 20:36:57
$buff = "ほげほげ<フヒヒ>ふがふが"; という文字列の < から > までを削除して ほげほげふがふが という文字列にするにはどうすればいいでしょうか。
$buff = "ほげほげ<フヒヒ>ふがふが"; $buff =~ s/<[^>]+>//;
190 :
デフォルトの名無しさん :2006/09/19(火) 21:42:43
191 :
156 :2006/09/19(火) 22:51:43
192 :
デフォルトの名無しさん :2006/09/20(水) 01:18:59
あいうえおあいうえおあいうえおあいうえお の中に何回あが含まれているか調べるにはどうすればいいですか?
193 :
192 :2006/09/20(水) 01:36:38
あ は実際は文字列です。 $str= "僕の名前はホゲです。昨日はホゲしました。明日もホゲでホゲ。"; 〜ほげな処理〜 print $str;で4が表示されるようにしたいです。
194 :
デフォルトの名無しさん :2006/09/20(水) 02:29:39
性器表現で出来そうです。 自己解決しました。
性器表現ってなんですか? 気になって夜も眠れません
大人のプログラムだよ。
性器を写実的に描写することだろ
s/ほげ/ほげ/g
5 :デフォルトの名無しさん :2006/09/20(水) 09:52:54 制御系の貴殿らにperlスクリプト検定試験をプレゼントだ。 【ether⇔com1変換装置がある。この変換装置にtelnetしてconnect com1を 実行すれば、あたかもモデムなどのシリアル接続機器が自分のPCに ローカルで接続しているかのような状態になる。ぜひとも"ATZ"などの コマンドをモデムに送り込みたい。 以下のスクリプトをどう修正すればいいだろうか答えなさい。】 変換機のIPを192.168.1.1 変換機にログイン後、モデムに接続するコマンドをconnect com1とする use strict; use warnings; use Net::Telnet (); my($t,$pass,$host,$user); $host = '192.168.1.1'; $user = 'admin'; $pass = 'admin'; $t = new Net::Telnet (-host => "$host"); $t->open("$host"); $t->waitfor('/login:/'); $t->print("$user"); $t->waitfor('/Password:/'); $t->print("$pass"); $t->waitfor('/#/'); $t->print("connect com1"); $t->waitfor('/com1 connected!/'); $t->print("ATZ");
答は「これはPerlスクリプトの試験になっていない」だな。
変換装置へのログイン手順、リクエスト、レスポンスが 設問に含まれてないんだから問題に問題がある。
つーかExpect使えって感じだな
つーかそもそもバイナリの送信なんてprintでできんのか
perlを使って画像ファイルのアップロードを実現したいんですけど、 でもcgi-lib.plやcgi.pmを使わないで自前で処理したいのです。 色々検索してはみたのですが、基本的にモジュールありきなので、 どこかに自前処理を紹介しているサイトなどありませんでしょうか? #リクエストされたバイナリを文字列処理してbinmodeで吐き出せばできるかなと思って試してもアウトでした。 #根本的に理解できていないかもです。 板違いだったらごめんなさい。
205です。 お!ちょっと待って!出来た! そもそもSTDINをbinmodeにしなければいけなかったのですね! 自己解決しました!久々にヒットした!
CPANに沢山教科書があるじゃないか
ビックリした 自前でPerlスクリプトから画像をアップロードしようとしてるのかと思った。
>>207-208 説明ベタですんませんでした。(ちょっとビール呑んでperlだったもので)
CPANって英語なんすね。
でもレスありがとうございました。良い人達で良かったす。
今回は一応cgi-lib.pl見てて、あっ!と思ったという結論でした。
未熟ですんませんした。精進します。
久々にテンション上がったんでビール買ってきます。
210 :
167 :2006/09/21(木) 18:38:51
>>168 どうもありがとうございました。
これからは、良く調べてから質問します。反省してます。
ライブドア元CTOの小飼弾っているよね。 TVによく出てるひげ面の人。 あのひと、何の実績があって何が凄いの? jcode.pl書きました、とか、 オレの知っている範囲ではショボい実績しかないけど。 くわしいひと、おしえて!。
Encodeの中の人だろ
本人のブログに聞きにいけば? あんた一体なにしたの?って。
214 :
デフォルトの名無しさん :2006/09/21(木) 20:30:52
jcode.plを開発したのは、歌代和正。 小飼弾は、jcode.plを元にJcode.pmを作っただけ。 その後、Encode.pmを開発。 最終学歴はカリフォルニア大学バークレー校中退。
215 :
デフォルトの名無しさん :2006/09/21(木) 20:54:00
>>211 英語がぺらぺらでYAPCとか大きなイベントでリアルタイム通訳とか
もできる人。
ラリーウォールとか海外のPerlコミュニティーとの
橋渡しとかそういう業績が大きいんじゃないかな
しいて言えば、海外から見た日本のPerl界の顔役みたいな人ではないかと
モジュールの実装については・・
EncodeをPerlの標準にするんだったら
文字コード自動判別機能を盛り込みやがれぐらいはいいたいな・・
Guess何とかってやつがあったような。
218 :
215 :2006/09/21(木) 21:32:07
>>216 あまり信用しないほうがいいよ。
guess、つかった時に判定失敗を食らった経験があって
経験上あまりあてにならない。
趣味ならともかく仕事で「たまに間違えるかも♪」
とかいう判定なら怖くて使えない。
けど「事前にエンコード文字列はPGがしっててしかるべき」
ちうスタンスらしいからあまり期待は・・・
いい加減文字コードの変換なんつー石器時代みたいな発想はやめて UTF-8でもUTF-16でも何でもいいから統一すりゃいいのにな。ばかばかしい。
自分のファイルがあるパスを得るにはどうすればよいですか? /home/user/testprogram/bin/pg1 を実行したときに、このプログラムがある場所 /home/user/testprogram/binを取得するにはどうすれば良いでしょうか? /home/user/testprogram/bin/pg1から /home/user/testprogram/conf/test.conf というファイルをOpenしたいのです。 pg1を #/usr/bin/perl open(FP,"../conf/test.conf"); @data=<FP>; close(FP); print @data[0]; とした場合、 $ cd /home/user/testprogram/bin $ ./pg1 PARM=DATA1 の様にtest.confの1行目を表示することができるのですが、 $ cd /home/user/testprogram $ bin/pg1 では何も表示されません。 多分、 open(FP,"../conf/test.conf"); が「コマンドを実行した際のカレントディレクトリの相対パス」になっているのだと思います。 そこで、(1)「pg1があるディレクトリからの相対パス」を指定するか、(2)絶対パスで指定するようにしたいと考えています。 (1)はどうもむりっぽい。 諦めモード。 (2)は絶対パスをハードコーティングするのは不味いので、プログラムの中で取得する方法を探しています。
もう全部うにこでいいよ、と思うも、 なんか、日本の役場のファイルとかシフトJIS指定指定なんよね。しかもスペースすらも全部全角。 死ねばいいと思うよ。
>>220 use FindBin qw($Bin);
print $Bin;
>>222 すげー 一発回答。
しかも、すぐできた。
ありがとう!!
>>214 Encode.pm のオリジネイターは Nick たんなの。忘れちゃイヤン。
>>218 それはちゃんと使ってないだけじゃないかな?
100%正確に識別することはできないし。
ちゃんと使えば他の自動判別と同程度には識別できるよ。
2つのパッケージに同じファイルをrequireすることはできますか? その1 sample =============================================== #!/usr/bin/perl ../lib/sampleclass.lib my $obj1 = new CLS1; my $obj2 = new CLS2; ← $obj1,$obj2というオブジェクトを作る。 ../lib/sampleclass.lib =============================== { package CLS1; sub new { my $class=shift; my $ref={}; $obj=bless $ref,$class; return $obj; } sub testprint{print "TEST";} } { package CLS2; sub new { my $class=shift; my $ref={}; $obj=bless $ref,$class; return $obj; } sub testprint{print "TEST";} } とまあ、こんなかんじで、CLS1とCLS2という、名前が違うだけで中身は全く同じというクラスを作り、それぞれ$obj1,$obj2というオブジェクトを作っています。 よく見ると、CLS1にもCLS2にもtestprintという同じ関数があります。 このような同じ関数は今後も増える予定なので、testprint.libというファイルにしてしまおうと思います。
2つのパッケージに同じファイルをrequireすることはできますか? その2 testprint.lib ====================================== sub testprint{print "TEST \n";} ../lib/sampleclass.lib =============================== { package CLS1; sub new { my $class=shift; my $ref={}; $obj=bless $ref,$class; $opj->testprint(); ← 試しに実行してみます。 return $obj; } require "../lib/testprint.lib" ← testprint()を外に出した。 } { package CLS2; sub new { my $class=shift; my $ref={}; $obj=bless $ref,$class; $opj->testprint(); ← 試しに実行してみます。 return $obj; } require "../lib/testprint.lib" ← testprint()を外に出した。 } この状態でsampleを実行してみると $ ./sample Undefined subroutine &CLS2::testprint called at /home/Administrator/DGSCRIPT/bin/../lib/sampleclass.lib line 18. TEST ← CLS1のtestprintは成功 となり、CLS1のtestprintは成功し、CLS2のtestprintは失敗します。 requireの仕方がおかしいのでしょうか?
>>215 ちゃんと判定機能ついてるよ。
おまえがドキュメント読んでないだけだろ。
>>218 文字コード判定を絶対に間違えないライブラリなんてものが存在するなら
お目にかかりたいんですが、是非教えていただけませんでしょうか?
まぁ言うは易しだよ。
他の言語で似たような機構のメンテナンスしてるけど大変…。
あと、絶対に間違えない文字コード判定なんて不可能。
>>215 は知ったかぶり。
>>211 JcodeやEncodeがしょぼいと思ってるなら
これだけ多くの人に使われるモジュールを自分で作ってみ。
そして長期にわたってメンテナンスを継続してみ。
そうすればおまえが以下にあさはかな人間かが分かるよ。
客から「なんでこんな簡単なことができないの?」と言われるのが仕事のうちみたいなもんだしね。 文句を言うのは壁の向こう側の「お客さん」。 ・・と書いてて、文字コード判定処理の改善方法を思いついたよ。
>>227 ・CLS1 と CLS2 の中身が同一で、それぞれ異なる状態を保持したい。
→同一クラスとして実装し、必要に応じてインスタンスを生成してください。
・CLS1 と CLS2 が良く似ているが、それぞれに異なる機能を持たせたい。
→共通の機能をベースクラスに持たせ、CLS1、CLS2 をその派生クラスとし、機能などを継承してください。
・面倒くさい事はいいからとっとと動く方法教えろやボケ。
→require を do に書き換えてかわいそうな子扱いされてください。
これは require が %INC を参照し、自動で同一ファイルのロードを避けるため生じる現象です。
235 :
227 :2006/09/22(金) 10:01:47
>233 >234 ほんと なんも知らなくてすんません >・CLS1 と CLS2 が良く似ているが、それぞれに異なる機能を持たせたい。 やりたいのはこれです。 なので、 >共通の機能をベースクラスに持たせ、CLS1、CLS2 をその派生クラスとし、機能などを継承してください。 これをやろうと思います。 ありがとうございました。
236 :
227 :2006/09/22(金) 10:42:38
ナイス!
>>236 そのとおり。
@INCで示されたパス以外の場所にモジュールをおく場合は
use lib qw(/path/to);
って感じで自作モジュールを置く場所を利用する側のスクリプトで指定する。
239 :
227 :2006/09/22(金) 12:47:29
>238 でけた!! ありがとう!!
227じゃないけど勉強になりますた。
241 :
デフォルトの名無しさん :2006/09/22(金) 14:40:33
環境:Windows XP MeCabのバージョン:mecab-0.93.exe MeCabの辞書:mecab-ipadic-0.91-utf8 Perlのバージョン:v5.8.8 built for MSWin32-x86-multi-thread MeCabを使って形態素解析を行おうとしたのですが、付属のtest.plを実行した ときに次のようなエラーが出ます。 Can't call method "parse" without a package or object reference at test.pl line 3. このエラーを出なくするためにはどうしたらよいのでしょう。 ちなみに use MeCab; としても別段エラーは発生しません。 test.plの中身↓ use MeCab; $m = new MeCab::Tagger ("-Ochasen"); print $m->parse ("今日もしないとね");
めかぶ単体で動くの?
MeCabのperlバインディングを使いたいってことだよね? READMEは読んだ?
perlでオブジェクト指向をはじめて勉強しようと思っています。 これはC++などの他のオブジェクト指向言語の理解にも役立ちますか?
246 :
241 :2006/09/22(金) 15:17:23
>>244 READMEの通りにMakefile.plを実行すると
'mecab-config' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
とのエラーがでるので、以下のサイトの手順を踏んでバインディングを行いました。
http://namazu.asablo.jp/blog/2006/03/12/286404 MeCabのモジュールはどうやら正常に呼び出せているようなのですがメソッドの実行が
上手くいきません。MeCab.pmを見てみると、以下の部分が呼び出すメソッドのようです。
package MeCab::Tagger;
use vars qw(@ISA %OWNER %ITERATORS %BLESSEDMEMBERS);
@ISA = qw( MeCab );
%OWNER = ();
%ITERATORS = ();
*parse = *MeCabc::Tagger_parse;
*parseToNode = *MeCabc::Tagger_parseToNode;
*parseNBest = *MeCabc::Tagger_parseNBest;
*parseNBestInit = *MeCabc::Tagger_parseNBestInit;
*nextNode = *MeCabc::Tagger_nextNode;
*next = *MeCabc::Tagger_next;
*formatNode = *MeCabc::Tagger_formatNode;
*what = *MeCabc::Tagger_what;
XSのロードでこけてるんでしょ。 newの返り値がundefineじゃない?
make && make testでこけなかった? test.plがこけるならmake testでエラーでてるはずだと思うんだけど
>>245 自転車の乗り方を覚えるために、曲乗りから始めるようなもんです。
250 :
241 :2006/09/22(金) 15:50:57
>>247 以下で実行してみると、okと出力されます。何らかの定義はされていると思うのですが……。
しかしprintしても何も表示されない。
use MeCab;
$m = new MeCab::Tagger ("-Ochasen");
print "ok" if (defined($m));
>>248 make testはどのディレクトリで行えばよいのでしょうか?
252 :
24 :2006/09/22(金) 16:02:54
>>245 普通に役立ちますよ。
「アルゴリズム」がそうであるように、
「オブジェクト指向」の基本的な概念は言語を問いませんから。
@a = split (/!!|\?|。/, $hoge); の|\?|はどういう意味ですか?
255 :
241 :2006/09/22(金) 16:27:37
>>254 ?という文字自身のことです。
Perlの正規表現では?は「直前の文字が0個または1個」というように扱われます。
たとえば/test?/は"test"または"tes"にマッチします。
しかし/test\?/という場合は"test"にも"tes"にもマッチせず、"test?"にマッチします。
以上より/!!|\?|。/というのは"!!","?","。"のいずれかにマッチします。
>>241 が未だにできません……
256 :
245 :2006/09/22(金) 16:32:03
>249 >251 >253 ありがとう。 いいほうに受け取って役立つと思っていきます。 「役立つ」という言葉が曖昧でした。 ここでいう役立つは、 オブジェクト指向とはどういうものかが、 実際にコードで表現でき、そして他のオブジェクト指向 言語を使う人と、理解を共有することができるという意味です。
>>255 なるほど
"|\?|"で何か意味を持つものかと思っていました。
"|"は区切り文字というか又はの意味だったんですね。
分かりやすい説明ありがとうございました。
258 :
253 :2006/09/22(金) 17:29:26
>>256 ちょっと補足です。たしかにPerlでは
>>249 が抽象的に指摘しているように、
1. 「オブジェクト指向」を使う前にリファレンスやパッケージ
というPerlの機能を理解する必要がある。
2. また、クラス名を引数で受け取るなどちょっと特殊な
ところがある。
3. ネット上で個人が公開しているようなCGIスクリプト等では
「オブジェクト指向」はそれほど使われていない。
と、「オブジェクト指向」に到達するまでに少々ステップが必要なので、
解説書なりを読んでPerlでのオブジェクト指向が
理解しにくいと感じたら、ためらわずに他の言語も試されるのがよいかと。
rubyへゴー
>>256 正直、Perlで勉強するのはおすすめしない。
Perlから入って、他のOOPの人と理解を共有するのは困難。
まだPHP5の方がマシ。
できればRubyかPythonでどうぞ。
RubyかPythonにいったらPerlに戻ってくることは無いだろうがな。
本当に純粋に概念だけを捉えられればいいんだけど、 Perlでやる場合、言語仕様に惑わされる可能性大だぬぁ。
OOP的にはこんな風に作るんだけど、 Perlだとできないから、なんちゃってな方法で回避、 というのが多過ぎ。 既にOOPについて理解してる人が書くなら、どうにでもなるけど。 うまくPerl用にデフォルメするだろうし。
264 :
256 :2006/09/22(金) 18:27:29
>258 >260 >261 >262 ありがとう御座います。 うーん、そうなんですか〜。 私の周りは、VBとかVC++ などのMS系言語(?)を使う人が多くて、 オブジェクト指向(クラス等)を使いこなしています。 わたしは、独自路線でperlをまあ、趣味でやっていますが オブジェクト指向も知っておきたいなあと思っています。 (解らないとくやしいし) オブジェクト指向を純粋に学ぶには 遠回りかもしれませんが、perl自体気に入ってるので 続けていこうと思います。
265 :
ニュース速報+ :2006/09/22(金) 19:05:11
何でこんなところに貼ってんだよ。
267 :
デフォルトの名無しさん :2006/09/22(金) 19:58:39
269 :
267 :2006/09/22(金) 20:38:26
>>268 さん
できました。有り難うございました。
270 :
デフォルトの名無しさん :2006/09/22(金) 21:52:01
csvファイルをリファレンスで2次元配列にしてるんだけど excelみたいに 行、列ごとの計算、操作をしようとすると その都度、行列転置しなければならないのか??? ほかにらくにできる方法はないの?
なんか気に障る口調だが。 # 列ごとに操作 sub rows(&\@$) { my($p, $mtx, $i) = @_; for my $E (@$mtx) { local $_ = $E->[$i]; $E->[$i] = &$p; } } こんな感じの操作用のプロシージャを作っておいて、利用する。 my @a=( ["A","B","C"], ["a","b","c"], ["1","2","3"]); rows {"($_)"} @a, 1; 結果 ==> ( ["A","(B)","C"], ["a","(b)","c"], ["1","(2)","3"])
>>260 そうか?
俺はPerlでOOPを覚えたけど、他の言語で書くときも問題なかったよ。
PHPは言語仕様が腐ってるので(PHP5も含む)できれば触りたくないなぁ。
とはいえ、OOPを覚えるならRubyのほうがいいと思うよん。
PerlのOOPって妥協案だから Perlだけで覚えても、OOPの考え方や組み方は身に付かないよ。 他の言語触った時に、public, protected, privateやinterfaceを どう使っていいか分からない、なんてことになりかねない。
SQLを自前で書ける場合に、Class::DBIを使う意味ってありますか? set_sqlの山になるくらいなら、自分でSQLを発行した方が効率が良いような気がするんですが。
O/Rマッパーのいいところは SQLをかけない奴でもRDBMSにアクセスできることじゃないぞ。 それが理解できないのであれば どんなに説明しても話は平行線のままなので お好みのままにスクリプトファイルに直接SQLをガシガシ書くがよかと。
>>275 レスどうもです。
平行線になるかどうかわかりませんが、
O/Rマッピングするクラスを(SQLを書いて)自前で用意するのと、
Class::DBIを継承して作るのとだと、どっちが効率がいいのかわかんなくなったので。
Class::DBIだとどうも無駄にメモリを消費するような気がするんですが、
これは使い方が悪いだけなんでしょうか。
277 :
275 :2006/09/23(土) 17:52:43
>>276 あぁ、そういう意味っすね。
すんません、勝手に話を平行線にしようとしてたのは私でした m(_ _)m
そういう話になると好き好きでいいと思います。
むしろClass::DBI, DBIx::Class, Rose::DBなんかよりいい
O/Rマッパーモジュールを作ってください。
自分はO/Rマッパーを自作しないのはめんどくさいのと
共同作業者に使い方を覚えさせる強制が発生するのが良くないと思うので
大体の人が使い方分かってるClass::DBIを使い続けています
>>277 こちらこそ言葉足らずで失礼しました。
ケースバイケースということでしょうか。
集団での作業だと、やっぱりClass::DBIの方が良いのかな・・・
引き続き精進したいと思います。
ありがとうございました。
279 :
デフォルトの名無しさん :2006/09/23(土) 18:52:30
入力されたデータが数値かどうか調べる方法と 配列を数値順にソートしたいのですけど、 どのようにすればよいのでしょうか?
>>279 前者は /^\d+$/;
後者は sort
>>279 横から蛇足な説明かもしれないけど
sort関数はデフォルトはcmpで文字列整列だから
数値整列の場合は<=>を明示するの忘れると痛い目にあうよ。
4〜5年前にunix timestampが桁上がりして時間で整列という処理にて
sortを間違って使い方したシステムをまかされててえらい目にあった。
$hoge = <STDIN>; だと、何か文字列を入力してEnterを押すと続行となるようですが、 キーボードの入力(例えば Kが押された など)を判定するにはどうすればいいのでしょうか? 押されたキーによって処理を変える、といったことがしたいのです。
OS依存
>>280 sortは
sort {$a <=> $b} @array
とかしないとまずくね?>数値順
PBPのChepter17、Version Numbersで use version; our $VERSION = qv('1.0.3'); って例があるんだけど、これどうして1行で書いてあるの? なにか2行で書いちゃダメな理由ってある?
>>285 パッケージプログラム(ExtUtils::*の類)がモジュールのバージョンを調べる際に、$VERSIONが含まれる行をeval()するのだが、
qv()はversion.pmの中で定義されているため、use version;しないとバージョン値を取得できないのだ。
287 :
285 :2006/09/23(土) 22:11:28
>>283 OS依存というのは、OSによって方法が異なるということでしょうか?
WindowsXP と ActivePerlを使っています。
>>282 >キーボードの入力(例えば Kが押された など)を判定するにはどうすればいいのでしょうか?
つまり、ターミナルからエンタキー無しの、1文字入力したいって
事ですか?
Term::ReadKey を使ってくみてださい。
>>290 ActivePerlでは使えなかったはず。
292 :
290 :2006/09/24(日) 00:38:19
>>291 いまWinXP+ActivePerlで試したけど、使えやよ?
脳内補完機能の欠如乙。来世ではパッチあててもらえよ。
>>293 おや、いつの間にか使えるようになってたんか。以前は使えなかったと思うんだが。
で、代わりにTerm::Getchなんてものもあったんだが。(しかも微妙に使い勝手が悪い。)
Term::ReadPasswordが使えなかったのは確かなんだが。
Term周りはActivePerlはほかとはかなり違うから正直うんざり。
>>290 期待していた動作をしました。
ありがとうございました。
299 :
デフォルトの名無しさん :2006/09/24(日) 13:16:07
WindowsXP + ActivePerl の環境で、 例えば print "hoge"; などでコマンドプロンプトに表示された文字群を 一旦全て消す、といったことがしたいのですが、 どうすれば良いでしょうか?(そもそも可能でしょうか?)
system('cls'); とかじゃなくて?
> print "hoge"; つまり「ESCシーケンス」のことを言いたいんじゃない? ActivePerl の環境は弄ったことないけれど、おそらく print "¥x1B[2J"; 他は「エスケープ・シーケンス」でググって。
>>282 >キーボードの入力(例えば Kが押された など)を判定するにはどうすればいいのでしょうか?
>押されたキーによって処理を変える、といったことがしたいのです。
getc を使うんじゃないの?
オレは使ったことないからよく知らんけど。
303 :
302 :2006/09/24(日) 14:26:51
解決済みだったか。スレ汚しすまそ
>>301 残念ながら、WinNT系では32bitプログラムはエスケープシーケンスが使えない。
Win9xまでなら使えたんだが。
どうしてもやるのなら、Win32::Consoleあたりを使うことになる。
>>299 半分冗談だが
print "\n"x50;
最近のディスプレイは解像度がでかくなってるからもっとでかくなきゃダメw
$=
>>299 改行していないなら、
print "\r" . " "x80 . "\r"
とか。
改行ありならかなり面倒になると思う。
>>304 の言うとおり、NT系のコマンドプロンプトではエスケープシーケンスが使えない。
以前文字の色を変えようとした時に、うまくいかなくて気が付いた。
Win32::Console::ANSI 使えば? どの程度キチンと動くか知らんが。
XPだけどそれ動いたよ、昔。 Themeサービス切ってたからかも知れないけど。
>>309 Win32::Console を使えばいいのかもしれないけど、
自分で使うスクリプトだったし、面倒だったので逃げた w
単にずらずらと出力するスクリプトだし、出力に色をつけたら見やすいかな、程度だったし。
とりあえず、"\a" のベルが使えるのは助かった。
>>310 XPで動いたっていうのは、Win32::Console を使った方?
それとも、ANSIエスケープ・シーケンスの方?
もし後者なら興味深いけど。
自分で使うスクリプトで面倒だからこそCPANを使う。 それが生粋のPerl Mongers。 逆に配布用スクリプトの時の方が、依存モジュールに気を使うなぁ。
>>300 とりあえずコレ使いました
ありがとうございます
print for @INC; と for (@INC) { print;} は、同じ結果が表示されます。 後者は意味が理解できるのですが 前者はなぜそうなるのかわかりません printしているのは一体何(どの変数?)なんでしょうか 文法的に解説してもらえるとありがたいです
>>314 こんな流れで @INCの中身が表示されてる感じ。
print ← for ← @INC;
forが@INCの中身を引っ張る
それが$_に入る
print に$_が渡る
>>315 早速回答ありがとうございます
$_ に入った値を print しているということは
print は $_ に値が入る度に(つまり@INCの中身の個数分)
毎回呼び出されてるということでしょうか?
それはちょっと文法的におかしいようにも思えるのですが
そういうものなんでしょうか?
>>316 毎回 print は呼び出されてる。
試しに
print $_, "¥n" for @INC;
を実行すると分かる。
そういうものです。
文の後ろに for や if などを書くのは文修飾という、れっきとした Perl の文法だよ。 print "ABC" if (/abc/); print for (@INC); sleep 1 while (!terminated);
>>317 >>318 なるほど、ifやwhileが後ろにつくのと同じように
forも後ろにつくと考えればいいんですね
(ifやwhileは違和感なく受け入れていたのですが)
モヤモヤとしてたので、聞いてよかったです
ありがとうございました
へぇ〜、いいこと知った。
LWP::Simpleのgetってキャッシュ機能発動してますか? していないはずなのに動作がおかしい。
use LWP::Simple; my $content; while(1) { sleep(30); $content = get('xxx'); #正規表現でいろいろ処理して更新差分だけを表示 } みたいにやっているのだけど$contentの内容をチェックしてみたけど更新が反映されていない。 自前でやるしかないのかな。
……(;゚Д゚)
参考になる情報が上のソースだけでは憶測でしかものが言えないぞ。 アクセス数が多いサイトはリバースプロキシかまして 間にキャッシュサーバが入ってたりしてるばあいもあるけど 自前でWEBサーバ立ち上げてネットワーク上に キャッシュが入らないようにテストして確認済み? 正規表現が間違っているとかの他の間違えの要素は排除済み? 古いほうのデータと新しいほうのデータをeqで比較しても同じなの? ソース見る限り$contentには常に新しいのしか残ってないけど どうやって古いのと比較してるの?
325 :
322 :2006/09/26(火) 01:08:11
すみません。コードです。 use strict; use LWP::Simple; my ($old,$content,$output,$fh); while (1) { sleep(30); open $fh, '<', 'out.txt' or die "$!"; $old = <$fh>; $content = get(''); ($output) = $content =~ /<dl class="bookmarklist" id="(.*?)">/; if ($output eq $old) { next; } open $fh, '>', 'out.txt' or die "$!"; print $fh $content;print "$output\n"; } はてなブックマークの自サイトの新着ブックマークを報告するためのスクリプトなんですが、 ブラウザで更新したらすでに新しいものが追加されているのに、 そのスクリプトを実行していても、それが検出されないのです。で、一回スクリプトを終了して 再度実行するとうまく検出されます。どうもループ中でキャッシュが働いているとしか思えないのですが。
>>325 >$old = <$fh>;
古い方は先頭の1行しか取って来てないけど、いいの?
というか if ($output eq $old) { next; } で比較してるのは、現在のソースの中の ($output) 部分と 30秒前のソースの 1行目だよね。 なんで等しくなることがあるのか俺には理解できないんだが・・・。
328 :
322 :2006/09/26(火) 01:27:17
>>326 ありがとうございます。ええ、それでいいのです。そこに書き込まれているのは必ず
正規表現/<dl class="bookmarklist" id="(.*?)">/で抜き出されたカッコの中の部分なので
329 :
322 :2006/09/26(火) 01:28:33
>>328 すみません。それでいいのです。スクリプトはa.plで、out.txtとは別です。
>>328 でも古い方は改行コード入ってるよ。
新しい方には無いけど。
質問者じゃないけど 現行で不便に感じるorz ローカルでブラウズする際に単にLWP::Simpleでmirrorsだとキャッ シュだけしてくれても見辛い。 wgetでmirrorしてる感じ(´・ω・`) 低レベルですまそ。高レベル?上級者?perlmongerなら 更新分に対し強調をしたり、目印を付けたり つまり採ってきて見やすく加工する処理をして、吐きなおし。新し い部分がすぐ判るようにする そんな便利なのを見た。そんでそんな処理したいけど出来ないorz 前回と今回の比較で今回の部分を黄色で塗りつぶすみたいな 出来たら便利だと思うんだけど...凄腕のperlmongerにhackして便 利にして欲しいです...
>>331 何言ってるかわからん
根本的に何を不便に感じてるんだ?
333 :
331 :2006/09/26(火) 02:23:02
やりたいことがわかってるならそのまま書けばいいだけじゃないか
引っぱってきて差分チェックするぐらいで高レベルとか言われても。 これぐらい自分でやれよ…。
しかも差分チェックはdiffコマンド任せじゃないか
my $a = 1; my $b = $a + ($a++) + ($a++) + ($a++); がperlで$b=8になるんだけど(;´Д`)なんでよ?
最初の$aが2になってるっぽいが、そんな計算をさせることがあるのかとか、 答えがどうなるのが正しいのか気になる。
GD::Graphを使って折線グラフを作成しており、通常はY軸とX軸が 左下でくっつく形のグラフになると思うのですが、これを左上で くっつく形のグラフにする事は可能なのでしょうか? 左上でくっつく場合は、Y軸の目盛を逆転させて、上から下に向かって 数値が増えていくグラフにしたいと考えております。 色々と探してみたのですが、どうしても見付からなくて・・・。
あ、ごめん。 http%3A%2F%2Fb.hatena.ne.jp%2Fentry%2F が余分だった。
>>337 先頭から評価していって、()付きの場合は先に評価するからじゃないの?
$a + ($a++)で、()付きの方を先に処理して $a + 1。そして、$aに1加算されて$a = 2。
この時点で()無しの方が確定して、2 + 1 = 3。次に3 + ($a++)で、$a = 2なので、
3 + 2。$aに1加算されて$a = 3。最終的には 2 + 1 + 2 + 3 = 8。
でも、こういう評価順序って、OSやVersionによって不定なんじゃなかったっけ?
わかりにくいねー。 式だけじゃ 8 になるなんて考えなきゃわからんし、合ってるかどうかも不安だw
ちょっと込み入った行の場合 ++ は、単独行にしちゃうけどねぇ。 可読性も含め、バグの原因にもなるし。
単独行の場合って $i++ と ++$i のどっちがいいんだっけ?
(+ +);
$i += 1
>>345 void contextの場合は最適化されるからどっちも同じ。
値を使う場合は、++$iの方がちょびっとだけ効率がいいが、ほとんど変わらん。
Linux使ってます。 open関数で(ファイル名が)マルチバイトのファイルを開けますか? 文字コードとかは全てutf8で統一しています。 open ( IN , "cat (日本語ファイル名) |" ); の様な方法でもなんでもokです。 というか、中身が読み込めればどんな方法でも良いのですが。
>>350 マルチバイトのファイル名だと、cat : (ファイル名) : そのようなファイルやディレクトリはありません
となります。英数字及び空白文字のファイル名なら問題ないのですが、、
352 :
349 :2006/09/27(水) 12:30:41
自己解決です。 Perlは正常に機能していました。 自分のミスです。申し訳ないっす... ...o.rz..
以下のような、UNIXのシェル(cat,grep)に依存するような形をやめにしたい。 perl単体で可能だろうか。 "マッチ演算子"というのがどうやら関係していそうなんだが、 具体的な書き方がわからない・・・・ ---- $srcip = <STDIN>; chomp($srcip); exec "cat nsfw.log | grep 'src=$srcip'";
chomp(my $srcip = <STDIN>); my $log = "nsfw.log"; open(FH, $log) or die "$log : $!¥n"; while (<FH>) { print if /src=$srcip/; } close(FH);
>285 > use version; our $VERSION = qv('1.0.3'); > って例があるんだけど、これどうして1行で書いてあるの? 便乗質問です。 CPAN.pmとかにある ---------- package CPAN; $VERSION = '1.87'; $VERSION = eval $VERSION; ---------- の、$VERSION = eval $VERSION;は一体何をやってるの?
Nick Ing-Simmonsさんが心臓発作で亡くなられたそうです ナムナム(-人-)
これは言葉を失いますな
誰だよw んな奴べつに死んだっていい
↑オマエのほうが死んだってどうでもいい奴なんだよボケ。 Nick Ing-Simmonsさん ご冥福をお祈りします。
誰なの?
誰? まじで分からない。
誰なのかくらい書いておけよ。
366 :
デフォルトの名無しさん :2006/09/27(水) 17:54:54
システムパッケージの*.pmをgrepしてみると、いくつかのファイルに名前が 出てくるね。 まあ、オープンソースなんだから、だれか死んでも支障なく車輪は回り続ける んでしょう? 特に気にすることないんでは?
俺たちはみんな、誰かの作った車輪の上で生きてるんだ その誰かが亡くなったことを悲しむのが、そんなに不思議か? 合掌
>>354 ありがとう。うまくいった。
精進する。
ひ、非情な世界や……
>>367 先人の業績を利用してあぐらかいてるくせに
敬うことを知らない恥知らずはどっかいけ
どなたかは存じませんがご冥福をお祈りします。
優れた功績を残した人を素直に敬うことができない奴なんてほっとけ。 そんな奴らは死に際、死した後に 家族・友達・知人だーれもが集まらない寂しい奴なんだよ。 妬んで死者に暴言はいてるわけだから、相手にするだけ無駄。
>>371 業績を残した先人の死を利用して人を罵倒している人がいますね。
375 :
デフォルトの名無しさん :2006/09/27(水) 19:01:02
ぼくは誹謗と中傷の嵐の中でNick Ing-Simmonsという名前を知った。 人の死の知らせのただ中で、他人に「死ね」と叫ぶ者がいる。そして、 他人の死後について、呪いの言葉を吐く者がいる。 今後この名を見るたびに、Perlに巣食ったこの変質者たちのことを 思い出して不快な思いをすることになるだろう。
まじで誰よwwwwwww
なるほどね。
>>374-375 のような友達いない奴は屈折した曲解して
屁理屈こねて素直に過ちを認めることが出来ず
人との摩擦がおきたときに我を押し通して友人を失ってくのか。
変人の心理の一端を見れてとても参考になりました。
> Nick Ing-Simmonsさん ご冥福をお祈りします。 の一行前に > ↑オマエのほうが死んだってどうでもいい奴なんだよボケ。 と書ける心って……
ナムナム
Perl厨って最悪の存在やwww
Perl厨って人の死を冒涜する最悪な存在なんですね
Perl/Tk の人?
Encode とか作った人で合ってる? 心臓発作とは・・・。まだ若いのだろうにもったいないねぇ。 ご冥福を・・・ (´-ω-)っ† Amen
385 :
デフォルトの名無しさん :2006/09/27(水) 19:53:16
訃報をここに書くなよ こうなることくらい予測しる
perl/lib の中で検索しただけでいかなるひとか垣間見えるw 彼の作った車輪とその精神は、彼の死後も脈々と受け継がれていくんだろうなあ。
ちょ、Encodeはdan kogai(子飼 弾)よw ライブドアねたの番組にゲストで呼ばれて 髭面の濃い顔と相反して甲高い声ですげーギャップのある人ね。 番組の進行役に意見もとめられたとき 予想として求められている言葉とぜんぜん違うことを 独特の世界観で語りだすからまわりと全く噛み合ってなくて 視聴者層には「何言ってんだこいつ?」として見られている。
死んだとか生まれたとかは、Perlのコミュニティでやればいいだろ。
そうだね。質問箱がパンクしちゃう
>>387 えー、Encode.pm の中に
This project was originated by Nick Ing-Simmons and later maintained by Dan Kogai E
って書いてあるお?( ・з・)
面白そうな人だったんですね。(笑
Nick Ing-Simmonsが作ってdan kogaiがメンテナンスしてるんだな
つうか最初にここで伝えた、またはその近辺の奴。 正確に伝えんかい。 ○○でご尽力なさった○○氏が〜 ってよ。 それが誰しもが知ってる丹波哲朗だっても同じだ。 なに片手間で適当に報じとんねん。一番失礼だっつうの。
その人が偉業を残してようが残してまいが、お悔やみを申し上げます。 今日亡くなった他の人たちも含め、ご冥福をお祈りします。
いや、そのレスはおかしい。
>>379 「善人ぶるために人の死を利用している」としか思えないよね。
「今この理由に乗っかる限り、正義の側に立ったまま堂々と他人を罵倒できる!
どんなに口汚く罵ってもすべては悪を懲らしめる行為になる! すげー! さっそく参加だ!」
という感じなんだろうね。
自分が正義の側にいることはいまさら確かめるまでもないことだが
399 :
392 :2006/09/28(木) 09:37:37
>>394 どうおかしいのか説明してくれるかな。パソオタくん。
死人に口なし。
>394 死んだの?!
>>394 じゃないが、
「○○でご尽力なさった、って書け」ってことが引っかかるんかなぁ。
尽力した実績が無いとご冥福を祈れないのかよ?みたいなことを言いたいんじゃないのかな。
>>402 冥福を祈れない ってどこに書いてるの?
Perlについての質問箱というスレの趣旨と異なる口論・議論は 口論・議論板でやってくれ。
「だれそれさんが死去されました」 っていうだけでそのひとに一番失礼ってのがわけわからん。
Perlについての質問箱というスレの趣旨と異なる口論・議論は 口論・議論板でやってくれ。
日本語読めない人、理解できない人はこのスレに来る前にやることがあるだろ
James Hendrickさんが心臓発作で亡くなられたそうです ナムナム(-人-)
>>406 それ以前におまえの抜粋の仕方がわけわからんが。
細田平八郎さんが心臓発作で亡くなられたそうです。 ナムナム(-人-)
誰やねん
盛りあがるスレを見て、Nick Ing-Simmons氏も お喜びになっている事でしょう。
三田うめさんが心臓発作で亡くなられたそうです ナムナム(-人-)
415 :
デフォルトの名無しさん :2006/09/28(木) 19:52:02
もう飽きた
キラ様の裁きが再開された模様です
Perlで『○○さん以外にも今日死んだ人かわいそう!! 』なんてセリフを言ってくれる スクリプトあったらカッコイイのになあ
誰かが亡くなって可哀想なのは残された者たちだ。
Perlもこの世から消滅して可哀想
>>355 以下は調べた上での僕の理解です。参考になれば。
> $VERSION = '1.87';
# ExtUtils::MakeMaker に食わせるバージョン文字列
> $VERSION = eval $VERSION;
# $VERSION を数値化 (警告回避のため)
our を使っていないのは、これらのモジュールが後方互換性を必要としているからだと思います
422 :
デフォルトの名無しさん :2006/09/28(木) 23:29:22
すいません、テキストファイルに aaabbbccc aaabbbccc aaabbbccc ...... と適当なデータが入っているファイルから 3行ごとに(絶対に3の倍数にはなっています) ahoaho0.txt ahoaho1.txt ahoaho2.txt ..... というような連続したファイルを出力したいのですが どのように書けばできますでしょうか・・・ 今現在ファイル名が連続で作成できず参っています・・・
>>422 my $base = 'ahoaho';
my $num = 0;
として、
$filename = "$base$num.txt"
したりとか$num++したりとか。
>>422 「3行ごと」の意味を読み違えてるかも知れんけど
#!/usr/bin/perl -w
use strict;
my $in_file = './in.txt';
my $format = './ahoaho%d.txt';
my $lines = 3;
open my $in_fh, '<', $in_file or die $!;
my $out_file = '';
my $out_fh;
{
local $_;
while (<$in_fh>) {
my $current = sprintf $format, ($. - 1) / $lines;
$current eq $out_file
or open $out_fh, '>', $out_file = $current or die $!;
print $out_fh $_;
}
}
__END__
print 1つで、複数のデバイス(FILE, STDOUT等)へ同時出力することは可能でしょうか?
>>425 そういうタイファイルハンドルを作ればできそうだな。やったことはないが。
またstrict厨か ゴテゴテした完成品スクリプトで無駄に行数使うのはリクに答えるスレの方でやってくれよ
また自治厨か。
>>424 $_をlocalizeするときはlocal *_にしないと危険だそうだ(perlsub参照)
431 :
デフォルトの名無しさん :2006/09/29(金) 17:00:32
Plaggerを使いたいんですが、perlが分からないせいで
どうにもならなくて困っています。perlの実力は、
Perlプログラミング講座
http://www.site-cooler.com/kwl/perl/ の内容なら大体知っている程度で、CPANだとかモジュールだとかは
よく分かっていない感じです。
Plaggerのソースを読んで自分でいろいろできるレベルに
なりたいのですが、どんな本(OR サイト)を読めば
いいでしょうか。やっぱりオライリー?
>>431 Plaggerは別にperlが分からなくても使えるだろ。
>>431 > Plaggerのソースを読んで自分でいろいろできるレベルに
> なりたいのですが、どんな本(OR サイト)を読めば
> いいでしょうか。やっぱりオライリー?
添付ドキュメント
一応podを読み読み頑張ってはいるんですが、個別のプラグインの使い方は 分かってもPlaggerで何ができるのかよく分からなくて、ウェブ上の情報も perl使える人向けに書かれているのが多かったんでやっぱりソース嫁って ことなのかなとか思ったりしたんですが… もうちょっとあさってみます。
ん? Perlの添付ドキュメントって言ってるんだろ。
そっちの方ですか。了解です、読んでみます。
今日感動したこと。 DBIは楽だなー。 PostgreSQL にサクッと接続できてあっさり select できて感動した。
>>437 すみません、今までどうやって接続してたんですか?
他言語?
Pgとかじゃね?
>>438 今まで Perl 使わずにCとかで Oracle とか昔の Informix とか使ってましたが、
ブランクが何年もあります。
どこか、perlで書かれたソースを大量に読めるところないでしょうか。 最近勉強を始めて、お手本となるソースを探してます。
>>441 /usr/lib/perl5 ディレクトリ以下。
443 :
デフォルトの名無しさん :2006/09/30(土) 05:57:39
>>390 そっか、Encode.pmってNick Ing-Simmonsが作ったのか。勉強になった。
koders.com
>>441 > どこか、perlで書かれたソースを大量に読めるところないでしょうか。
> 最近勉強を始めて、お手本となるソースを探してます。
Perlの配布パッケージ
Catalystとか。最近のCPANモジュール事情がわかっていいかも。
448 :
425 :2006/09/30(土) 20:59:46
>>448 > スゴス! IO::Teeでできました! 誠にありがとうございました。
礼はIO::Teeの作者に。
450 :
425 :2006/10/01(日) 01:31:49
IO::Teeの作者さんありがとうございました。
>>440 そらCで叩くのに比べればめちゃくちゃ楽だわな。
気が向いたらDBIx::Classとかに手を出すのもいいかもね。
452 :
デフォルトの名無しさん :2006/10/01(日) 18:44:29
perlでCGIの勉強をしているのですが、 やっと一つ目のCGIができたのでローカル鯖立ててCGI試そうとおもったんですが 何回インストールしなおしてもエラーが出て困ってます。 どなたかCGI試すのに最適な方法知らないでしょうか スレ違いだと思いますが、ここで聞いたほうがいいかと思ったので。
他のスレ行ったとしも > 何回インストールしなおしてもエラーが出て困ってます とだけ書いてるようじゃ相手にされないだろうから出直してこい
>perlでCGIの勉強をしているのですが おしい。 「CGIでPerlの勉強をしているのですが」 って書けばせめて二行目あたりまでは読んでもらえたのに。
>>452 1) perlやCGIがどうこうよりまずは、
>>1 の書き込みをよく読み、理解しろ。
2) おまえは「車が壊れました」だけでどこが壊れたのか分かるのか?
エスパーじゃない限り他人はおまえが伝えなければ
何を使って、どういう手順で行い、結果がどうなり、どんなエラーメッセージが出た
かなんてわからないんだぞ
あれ、この板にはエスパーレスのスレないの?
| | ∩___∩ | | ノ _, ,_ ヽ (( | プラプラ / ● ● | (=) | ( _●_) ミ _ (⌒) J )) 彡、 |∪| ノ ⊂⌒ヽ / ヽノ ヽ /⌒つ \ ヽ / ヽ / \_,,ノ |、_ノ
460 :
デフォルトの名無しさん :2006/10/01(日) 20:25:22
すいませんエラーの原因を聞いてるんじゃなくて 他の方法はないかと聞いたんですが・・・
サーバの問題なのかperlコードの問題なのかわからんね。 動くかどうかわからんコードなら、winならコマンドプロンプトから 「perl hogehoge.cgi」 とかで試してみれば?
>スレ違いだと思いますが、ここで聞いたほうがいいかと思ったので。 せめて「ここで聞いたほうがいいかと思った」理由を書けば良いのに…
>>460 >他の方法はないかと聞いたんですが・・・
ってことは、「ローカルで鯖立てる以外にCGIを試す方法」を聞いてるわけ?
>>1 >CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
>CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
>(WEBプログラミング板
http://pc8.2ch.net/php/ )
1 を読めばここで質問するのが全く妥当ではないことだけは判るはず。
C:\> perl hogehoge.cgi > hogehoge.html ってして、hogehoge.html をブラウザで開くとか。
>>460 他の方法でCGIを試す方法はないかという話であれば
ますますperlスレと関係ないよね
まともに日本語を解釈出来ない馬鹿が露わになってワロタ
まともに漢字を使えないのが顕になっててワラタ
異常な質問者は放置しろよ。
回答者が異常なんだからしょうがないだろ
正規表現に入れる文字列中の / などを演算子とされないよう 適切にクォートしてくれる関数はありますか?
メタ文字は演算子だったのかー
>>471 quotemeta
もしくは/\Q$unko\E/
474 :
471 :2006/10/02(月) 19:55:31
>>473 ありがとうございます。うまくいきました!
>>421 >
>>355 > 以下は調べた上での僕の理解です。参考になれば。
> > $VERSION = '1.87';
> # ExtUtils::MakeMaker に食わせるバージョン文字列
> > $VERSION = eval $VERSION;
> # $VERSION を数値化 (警告回避のため)
> our を使っていないのは、これらのモジュールが後方互換性を必要としているからだと思います
回答ありがとうございます。
・警告なんて出ます?
とか、
・最初から$VERSION = 1.87;じゃだめなの?
とか疑問が湧いてきますです。。。
476 :
421 :2006/10/02(月) 22:20:29
>>475 perldoc perlmodstyle にちょろちょろと関連情報が。
> ・最初から$VERSION = 1.87;じゃだめなの?
$VERSION = 5.8.8; # bareword になる。なので、
$VERSION = '5.9.3'; # とする必要がある。従ってどちらに転んでも、
> ・警告なんて出ます?
出ちゃうんです。
>>476 1.87は浮動小数点数(つまり"1.87"の近似値)だから、じゃないのか。
しかし eval しちゃ同じじゃね
>>475 なんで疑問に思ったなら自分で確認しないの?
他人に何でもかんでもやってもらわないとダメなの?
最初の行は、バージョンを返す式を書くところ。今回はもろにばっちりな 数字で書いてあるけど、cvsが埋め込むバージョン文字列から適当に 拾い出すプログラムが書いてあるのとかある。 で次の行のevalでそれが実行される。こうしておけばなんかうまくいかな かったときもバージョンが設定されないぐらいで一応動くので便利。 よく見かけるのでそういうテンプレなんじゃないか?
perlで文字列の処理などしてみたいのですが サイトでのコピペなど適等につくってttest.plを名前を付けて保存しました。 ttest.plをクリックすると一瞬だけDOSウィンドウが出て消えてしまいます。 何が出力されたのかよくわからないのですが、もっとじっくり出力内容を プレビューするにはどうしたらよいのでしょうか? ActivePerlとhtttpは入れてローカルで掲示板などは動かしています。 ttest.pl実行時はhtttpは起動してませんでした。 個人的にはperlで実行したいのですが cgiにしてローカルサーバーから見たほうがいいのでしょうか よろしくおねがいします。 これはttest.plのソースです。 #!/usr/bin/perl $name = "1"; print "$name test\n"; print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>htmlのタグあああああ</P>\n"; print "</HTML>\n"; exit(0);
`pause`; exit(0);
sleep 100;
表示された瞬間にprintscreen
ザ・ワールド
処理結果を適当なテキストファイルにでも出力したら?
コンソールから実行しろ、でいいじゃん。嫌がらせするくらいなら何も書かないほうがマシ。
unixから実行しろ
C:\>perl ttest.pl
ttest.bat を作る。 中身は↓ perl ttest.pl pause
私はこんなのを使ってエディタから直接呼べるようにしてる。 ---perl.bat--- @echo off "C:\Perl\bin\perl" %1 echo; & echo ---perl end--- pause>nul
おはようございます
>>482 ウィンドウがすぐ消えず表示できました
>>483 こっちは482みたいにenter押しても消えないしばつボタンを押すと警告が出ました。
これら482や483の機能を望んでいました。
>>484 何回か試しましたが難しかったです上2つで良かったです
>>485 Exactly(そのとおりでございます)
>>486 いずれやってみたいことですがよくわからないので当分は`pause`;とsleep 100;を併用してみようと思います。
>>487 コンソールとかわからないです。とりあえず動いてるところがみたかったです
>>488 Windows上からやりたいです。
>>489 DOSプロンプトでC:\>WINDOWSからC:\>perlにするやり方がよくわからなくて質問してしまいました
>>490 やってみました。同名で作り続けるなら便利で、複数起動したい時batファイルつかえそう。知識的に役に立ちました。
>>491 batファイルでしょうか。perlエディタから同じ要領でデバックが見れたらとっても助かりますね。
初心者すぎて相手されないと思ってたらたくさんレスがついて質問回答以外にもいろいろ勉強になりました。
レスくれた方々、ありがとうございました
Perlの最強IDE教えて
** コマンドプロンプトを起動する スタートメニューのプログラム-アクセサリ-コマンドプロンプト。 よく使うならアイコンをDnDしてクイック起動ツールバーにでもコピーしとく。 ** カレントワーキングディレクトリを変更する 「cd /d 」と打って、次にスクリプトのあるフォルダをコマンドプロンプトの窓にDnDする。 フォルダのパスが行の続きに書かれるから、そこでEnterを押す。 ** スクリプトを起動する 「perl なんとか.pl」と打って、スクリプトを起動する。 出力が多すぎて読めないときはパイプやリダイレクトを活用する。 詳しくは「コマンドプロンプト」でぐぐれ。
モジュールの命名規則を教えてください。 HTML::Selector::XPathとか、 ありえないくらい頭悪い名前なんですが、 Perlではこういうのが普通なんですか?
>>498 あれってやっぱり変なの?
なんでこの機能にこの名前? と困惑してたんだが。
ほかに、WWWとWebServiceとかもごっちゃだね。
モジュールの命名って作者が自由にするみたいだから、規則なんてあるのかな? Acme にジョークモジュールとか、そういう慣習はあるみたいだけど。
規則有るよ。 Perl Best Practice参照。
命名規則は確かに無茶苦茶だと思う。
>>499 > ほかに、WWWとWebServiceとかもごっちゃだね。
WebServiceはAPI(WebService)が用意されているのを利用している感じ。
WWWはHTMLをゴリゴリparseしている感じ。
>>499 は無知ゆえの無理解だな。文句言う前に勉強しろ。
>>476 > perldoc perlmodstyle にちょろちょろと関連情報が。
お〜、ありがとうございます!
> > ・警告なんて出ます?
> 出ちゃうんです。
それが出ないんです。
% cat test.pl
use strict;
use warnings;
our $VERSION = 5.8.8;
print $VERSION;
% perl -cw test.pl
test.pl syntax OK
ただし、$VERSIONはNVではなくてPVMG(v-string)になりました。
% perl test.pl | dump
00000000 0508 08 ...
------------------------------
our $VERSION = 5.8.8;
としたときと、
our $VERSION = '5.8.8';
$VERSION = eval $VERSION;
としたときの$VERSIONの内部構造を比較すると、”全く同じ”でした。
------------------------------
やっぱり
> ・最初から$VERSION = 1.87;じゃだめなの?
という疑問は消えません。。。
>>477 ,
>>480 そうかもしれない。
などとと思っていたのですが、perldoc perlmodstyleを読んでいて本当の理由がわかりました。
NVとPVの両方を設定させるのがミソだったようです。続く↓
「VERSION XX 以上」などという指定をする時
本当の理由は、警告抑止でもなく、浮動小数点を避けるためでもなく、プログラムがどうこうでもありませんでした。 αバージョンの扱いに問題があるからのようです。 Perlでは元々言語仕様として、数値に_(アンダースコア)を入れることが出来ます。 要するに、Numeric Versionsでαバージョンを示す場合、 1.12_01 のように書きますが、数値として書いてしまうと 1.1201 と”全く同じ意味”になります。 ですので、1.012.001のつもりで1.12_01と書いても、1.120と解釈されてしまい、 αバージョンの情報が欠けてしまいます。末尾にその様子を記載しておきます。 すっきりしました。ありがとうございました。 our $VERSION = 1.12_01; print Dump($VERSION); # SV = NV(0x68b3a0) at 0x67ee50 # REFCNT = 1 # FLAGS = (NOK,pNOK) # NV = 1.1201 our $VERSION = '1.12_01'; $VERSION = eval $VERSION; print Dump($VERSION); # SV = PVNV(0x664910) at 0x67ee50 # REFCNT = 1 # FLAGS = (NOK,pNOK) # IV = 0 # NV = 1.1201 # PV = 0x675b00 "1.12_01"\0 # CUR = 7 # LEN = 8
>>502 > 命名規則は確かに無茶苦茶だと思う。
歴史的理由ってやつでむちゃくちゃな部分と、
規則とか知ったこっちゃないってんで自分勝手にやっててむちゃくちゃな部分と、
規則を作って、それに沿ってやろうとしている一部の人たち、
って感じ。
509 :
421 :2006/10/04(水) 22:54:19
>>505 > お〜、ありがとうございます!
どういたしまして。
> ただし、$VERSIONはNVではなくてPVMG(v-string)になりました。
v-string なら数値扱いすると警告出るじゃないですか。w
>>507 それは CPAN.pm にそのモジュールなりを最新版として扱わせないようにする記法ざんすね。
>>509 > > ただし、$VERSIONはNVではなくてPVMG(v-string)になりました。
> v-string なら数値扱いすると警告出るじゃないですか。w
アッー!↓こういうことですね!
% perl -Mwarnings -e '$VERSION=5.8.8; 5.8 < $VERSION'
Useless use of numeric lt (<) in void context at -e line 1.
Argument "^E^H^H" isn't numeric in numeric lt (<) at -e line 1.
すみません。うっかり比較のことを忘れてました(_ _(--;(_ _(--; ペコペコ
$VERSIONはもう全部version.pmのqv()でいいよ
同じネットワークの他のPCのMACアドレスを IPアドレスから調べるのにはどうしたら良いでしょうか。 nbnameだと取得出来る確率が低く今は対象IPにpingして arpテーブルにキャッシュされた値を取得するという力業でやってます。 外部コマンドを使わずに実現できればと思います。
>>512 目的は知らないけど、そのやり方でまずい理由も見当たらない。
どうして外部コマンドを使いたくないのかもわからない。
しかしその用途なら Net::ARP とかその辺でどうにかならんか?
>>512 レスありがとうございます。
forkのコストとあまり美しくないと感じたからです。
で、仰るとおりNet::ARPで解決しました。
Net::ARP::arp_lookup(br0 => $ip, $mac_address);
書き込む前にもNet::ARPは試していたのですがpodに書いてある例
Net::ARP::arp_lookup($dev,"192.168.1.1",$mac);
の$devって何だよ・・・ってナチュラルスルーしていましたーー)
あるフォルダ配下のファイル名を大文字→小文字にしたくてこうしたのですが エラーは出ないのですが、期待する動作をしません(変化なし)(^^; 教えてください、オナガイシマス map { $x = $_ ; $x = lc $x ; rename($_, $x);} glob;
>>515 Windowsではファイルの大文字小文字は区別されない。
敢えてやりたいならテンポラリファイルを使うしかないとオモ。
一旦tempとかかぶらなくて適当な名前にリネームしてから、小文字でリネームしなおすとかどう?
>>515 windowsはよく知らないがrenameの戻り値みてないんだからエラーになりようがないんじゃないか。
map {$x = lc $_; rename($_, $x);} glob("*"); これでうまく行ったぞ? これでうまく行かないならファイルの指定の仕方が間違ってる可能性も あと俺が使ってるファイラだと更新ボタンがうまく働いてなくてちょっとはまったorz リネームされたかどうかの確認はdirコマンドとか使うのをお勧めする
521 :
デフォルトの名無しさん :2006/10/08(日) 15:12:49
初心者です 参考書とか参考サイトを見ると 「サブルーチンは指定した返り値を返す」 「指定を省略した場合は最後に定義した値が返り値」とのことです。 では、途中で代入した変数は無かったことになるんでしょうか? 以下のスクリプトの場合、$dy[($dyg+3)] = $dicenumber;だけが 返り値になって、$dfaceや$shuは無視されるんでしょうか? sub dicego { $dquan = $dn[($dng+1)]; $dface = $dn[($dng+2)]; $syu = $dn[($dng+3)]; &dice; $dy[($dyg+3)] = $dicenumber; }
>>521 君はまずサブルーチンの値と変数の違いを理解するところからはじめたほうがいい。
>>520 サンクス
っていうか、漏れもそれ試してたんだけど
ファイル名が変わっていないかと思ってた、出来てたんだアハハ
サブルーチンの値って何だ??
perlは省略したがるからな
特定の単語が一行の中に含まれているか否か判定する方法があれば 教えて頂けないでしょうか。 @target_name = {"A HREF", "a href", "IMAGE", "image"}; 行中に単語の有無を判別したいのですが・・・・ 宜しくオナガイシマス。
>>528 > @target_name = {"A HREF", "a href", "IMAGE", "image"};
@target_name = ("A HREF", "a href", "IMAGE", "image"); # 上の行はこうだと仮定して
foreach my $word (@target_name) {
$line =~ /\Q$word\E/;
}
531 :
529 :2006/10/08(日) 19:04:26
532 :
デフォルトの名無しさん :2006/10/08(日) 19:13:49
Jpegファイルの破損を検出できるモジュールって何かありますか?
どうも
>>152 です
>>529 さんサンクスです
お蔭様でやりたい事が少し進みました
参考に↓の様に書いたのですが問題があります
やりたいことは、ファイルを開いて@target_nameの単語が出たら同じファイルの
その行を全て小文字に変換したいのですが、書込み処理が巧くいきません
なにとぞ書込み方法を教えてください。
それからもう一つ、↓のファイルはfoo.htmを開いていますが
これを、あるフォルダ配下の全てのファイルに同じ処理をしたいのですが
どうしたら出来ますでしょうか?
欲を言えばそのフォルダ、配下のフォルダ配下のファイルにも再帰的に全て
同じ処理が出来れば最高なのですが。
@target_name = ("A HREF", "a href", "IMAGE", "image");
open ( FH , " +< foo.htm" );
while(<FH>)
{
foreach my $word (@target_name)
{
$find = index ($_, $word);
if($find > -1)
{
print FH lc $_; #ここが巧くいかない(^^;
}
}
}
close (FH) ;
536 :
528 :2006/10/08(日) 21:08:25
>>535 さん
探したんだけどね
分かんないお(^^;
opendir D, $dir and closedir D or mkdir $dir or croak "can't makedir $dir: $!"; 昔自分で書いたコード。いくらなんでもこれはあんまりだと思った。
>>534 >その行を全て小文字に変換したいのですが
それだと、アルト属性やアドレスとかファイル名が含まれていた場合ムチャクチャになっちゃわない?
取りあえず、"A HREF" と "IMAGE" が含まれていたら、それだけを小文字に変換してみるテスト。
後は、引数から個別にファイルに書き出す部分を追加してくれ。
foreach (<>) {
s/A¥ HREF/a¥ hrer/ig;
s/IMAGE/image/ig;
print;
}
そしてこの論争は、最終的にカタカナで正確な発音を表記するのは無理だというオチに
542 :
538 :2006/10/09(月) 02:43:46
どれでもいいよ!不毛な論争はしたくないしw でも、間違いを指摘してるって事は アルトでも意味が通じてるって事で よかですね?
altと書けよ
このスレには低俗な釣り師が常駐してるってことだけ理解した。
>>538 アルト属性がなんたらかんたらは置いといてw
その仕様だったら、もうワンライナーでいいんじゃね?
perl -p -i.bak -e "s/A¥ HREF/a¥ href/ig; s/IMAGE/image/ig" *.html
>>534 の希望に叶うかどうか知らんが。
( ゚д゚) (つд⊂)ゴシゴシ (;゚д゚) (つд⊂)ゴシゴシ _, ._ (;゚ Д゚) アルト…?!
おっ、なんだか安い釣り師が来てたようだな。
たしかにアルト属性プッ だがな。
どう見ても
>>542 は、擬似餌(
>>538 の騙り)だろ。
藻前ら、堪え性ないな。
>>547 それで十分だと思われ。
デレクトリィを再帰的に処理する必要があるか
疑問だ。場合によれば別のコマンドかませてもいいし。
よく判らんのが、アルト君の指摘した
>その行を全て小文字に変換したいのですが
だけだな。ほんとに全部小文字にしていいの?
550 :
528 :2006/10/09(月) 07:41:22
>>538 >>547 サンクスです
>>それだと、アルト属性やアドレスとかファイル名が含まれていた場合ムチャクチャになっちゃわない?
。゜゜(´□`。)°゜。ワーン!! 説明不足でした勘違いされてしまったお
むしろ属性やアドレス、ファイル名を小文字に変換することが目的なのです。
例
<p><img border="0" src="image/AM_A01-1.GIF"></p>
↓
<p><img border="0" src="image/am_a01-1.gif"></p>
<a href="15F_A_E1.HTM#01">問題へ</A>
↓
<a href="15f_a_e1.htm#01">問題へ</A>
こんな風に変換したいのですが・・・・・・
実はとある出版社から販売されている受験参考書の付録のCDに
年度毎の過去問題集及び解答がhtm形式で納められています、そのファイルの内容
ファイル名が出版社の意図することかどうかは分からないのですが?
htmファイルの中では、属性やアドレス、ファイル名を大文字小文字混在で記載して
実際のファイル名は大文字で記述していますPCからそのCDを開くことは全然問題ないのですが、
何処にいても携帯で見えるように、自鯖に転送したのですが上記の問題で
リンクが巧く取れて見えません、
そこでファイル名は全て小文字に変換して
ファイル内でA HREF", "a href", "IMAGE", "image"が含まれる行があったら
その行を全て小文字に変換してしまい、するとおのずと
オルト属性やアドレス、ファイル名も小文字に変換できます、それが目的なのです、
しかもそのファイル数が数百個もあります・・・・・・
>>550 目的がそれなら、HTML書き換えるよりmod_rewriteでto_lower使った方が楽かも。
自鯖だし。
552 :
528 :2006/10/09(月) 08:04:13
>>551 さん
サンクスです
>>mod_rewriteでto_lower使った方が楽かも。
そうなりますとapacheのことになりスレ違いになので控えさせていただきたく思います
perlの威力で解決できないものでしょうか?
宜しくお願いいたします。
じゃあ、 foreach (<>) { $hoge = $_; if ( grep( /A¥ HREF|IMAGE/i, $hoge ) ) { $hoge =~ s/([A-Z])/¥l$1/ig; } print $hoge; } これを、てけとーなスクリプトファイルして find でれくとりぃ -iname *.html -print | てけとーなスクリプトファイル すりゃいいじゃね? 試してないから保証無し。
てけとーなスクリプトファイルの先頭に #!/usr/bin/perl -i.bak としていて。
しかしファイルはSJISだったので大変なことに... とかならなければいいがな
HTMLをParseして分解して必要なエレメントを書き換えてHTMLに再構成したら?
HTML::Filterってのが
558 :
528 :2006/10/09(月) 09:28:18
>>553 サンクスです
とりあえず
perl hoge.pl -iname *.html -print |
これだとコマンドの構文が誤っていますとなったので
perl hoge.pl -iname foo.html -print
としたら
コンソール画面に出力されますが(巧く変換できてるっぽい?)、ファイルに書込みできてないのですが・・・・・
というかfoo.htmlの中身は空にナリマスタ
ごめん動作確認してないから(^^; #!/usr/bin/perl -pi.bak if ( grep( /A¥ HREF|IMAGE/i, $_ ) ) { $_ =~ s/([A-Z])/¥l$1/ig; } これを適当なスクリプト名で保存 find ~/html -iname *.html -print | xargs 適当なスクリプト名 ~/html <ーこれは、処理したいフォルダ名を指定 この場合ユーザーホーム直下のhtmlデレクトリィってことね。 適当なスクリプト名は、実行権限を与える事。
find ~/html -iname *.html -print | xargs 適当なスクリプト名 上記の *.html -> "*.html" クォートした方がよさげだね
>>555 >しかしファイルはSJISだったので大変なことに... とかならなければいいがな
あるあるー
答えるレベルにない奴が答えてる様だな。 仕様後出しでやる気なくなった。
>>550 >年度毎の過去問題集及び解答が
sjisの確率高いね。wktk
iconvもnkfもあるでしょうて。
iconvの使い方がわかりません
教えてください。
>>567 市ね
print -nep '$_ = lc $_ if /a href|image/i; $_' HTMLFILES... もしくは use strict; use warnings; use HTML::Parser; sub start_h { my ($tagname, $attr) = @_; $_ = lc $_ for values(%$attr); print "<$tagname"; while (my ($k, $v) = each(%$attr)) { print " $k=\"$v\"" } print ">"; } my $p = HTML::Parser->new(handlers => {default => [sub {print $_[0]}, 'text'], start => [\&start_h, 'tagname, attr']}); $p->parse_file($_) for @HTMLFILES;
570 :
528 :2006/10/09(月) 12:25:24
>>569 二つも書いてくれてありがd
'image'は、内部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません
Global symbol "@HTMLFILES" requires explicit package name at foo.pl line 20
Excution of foo.pl aborted due to complation erroes.
両方だめデスタ
ファイルハンドルを読書き両方出来るように設定して↓の様にしてみたが
元ファイル×2倍になってしまう(^^;
後半のファイルは大文字小文字の変換は巧く行っているのだが、
ファイルが2倍っていうのはいかがなものか・・・・・・・・
open (FH, '+<foo.html')or die $!;
foreach (<FH>)
{
if ( grep( /A\ HREF|IMAGE/i, $_ ) )
{
$_ =~ s/([A-Z])/\l$1/ig;
}
print FH $_;
}
close FH;
573 :
528 :2006/10/09(月) 13:44:07
皆さん色々ありがd 遂に変換、書込みまでデキマスタ ちょっと照れくさいけどコードを書きます ところで、これを再帰的(再帰的でなくても同じ階層のフォルダ内)だけでも まとめて変換するにはどうしたらよいでしょうか? open (FH, '<aa.htm')or die $!; @foo = (); #my @hoge = <FH>; while(<FH>) { if ( grep( /A\ HREF|IMAGE/i, $_ ) ) { $_ =~ s/([A-Z])/\l$1/ig; } push @foo, "$_"; } close FH; open (OUT, '>aa.htm')or die $!; print OUT @foo; close OUT;
#! /bin/sh for i in `find . -name '*'`;do hoge.pl $i fone
perlでやろうぜ・・・ map{`perl hoge.pl "$_"` if(-f $_);} glob("*"); あれ?別ファイルにする意味なくね?って思ったけどどうでもいいや
>>573 のスクリプトの中で find すればいいですやん。
なんか問題あるの?
シェルスクリプトとも連携できるポータビリティの高いスクリプトにした方が便利だと思っただけ。
578 :
528 :2006/10/09(月) 14:12:00
>>574 さん
サンクスですそれってシェルスクリプトってやつですか、外していたらごめんなさい
使い方がよく分からないっす(^^;
>>575 さん
どうもです、mapで同じファイルの中で書こうとしてたら、おぞましい
コードになりかけてました(^^;
頭がよくないので二つに分けたほうが、分かりやすいです
ところで
map{`perl hoge.pl "$_"` if(-f $_);} glob("*");
この場合変換したいファイル名は*で渡しているんですよね?
だとしたら
>>573 のコードの
open (FH, '<aa.htm')or die $!;
open (OUT, '>aa.htm')or die $!;
の部分を書直さないといけないですよね?
>>576 さん
どうもです、findの使い方余りよく分からないんです、すみません。
#!/usr/bin/perl $mydir = $ARGV[0];#適当に open(FIND ,"find $mydir -iname ¥"*.html¥" -print|");# || 氏ね; @html = <FIND>; chop(@html); close FIND; foreach (@html) { $infile = $_; open (FH, "<$infile")or die $!; @foo = (); while(<FH>) { if ( grep( /A¥ HREF|IMAGE/i, $_ ) ) { $_ =~ s/([A-Z])/¥l$1/ig; } push @foo, "$_"; } close FH; open (OUT, ">$infile")or die $!;#書出すのにinfile print OUT @foo; close OUT; } exit; #hoge.pl ~/myhtml
File::Find
581 :
528 :2006/10/09(月) 15:26:19
>>579 さん
サンクスです
$mydir = $ARGV[0];#適当に
$mydirはデレクトリの階層の深さを設定する変数なのでしょうか?
#!/usr/bin/perl
use File::Find;
$mydir = $ARGV[0];
以下同様として実行したら
ファイル名が見つかりません - -INAME
ファイル名が見つかりません - -PRINT
こうなってしまうのですが・・・・・・・・・・
お前なにも自分で考えてないだろ。File::Findのマニュアルぐらい読め。
583 :
528 :2006/10/09(月) 15:51:57
皆様どうも色々頭の悪い漏れに教えてくれて、本当にありがd つ・・ついに完成シマスタ U\(●~▽~●)Уイェーイ! しかしperlって変数の扱いとか実にいい加減なようでも文字処理とかは やはり強烈なパワーを持ってる事を再確認シマスタ はじめCで同じことやろうとしたけど、ファイル名の取得の部分であきらめて perlにしがみついてましたアハハ 最後に一応コード載せときますね(^^;恥ずかしい @htm = glob("./*.htm"); foreach (@htm) { $infile = $_; open (FH, "<$infile")or die $!; @foo = (); while(<FH>) { if ( grep( /A\ HREF|IMAGE/i, $_ ) ) { $_ =~ s/([A-Z])/\l$1/ig; } push @foo, "$_"; } close FH; open (OUT, ">$infile")or die $!; print OUT @foo; close OUT; } exit;
>>583 変な見栄を張るのはやめたほうがいいよ。
小汚いコードもやめたほうがいいな。
↑ なんか知らんが偉い遅れて出てきて必死だな。
別に必死には見えないけどなぁ。むしろ君のほうが・・・。
面倒臭そうな奴だったから答えまで書いたのに、 回答を理解できない上に、後付けで再帰的にしたい、 とまで言い出すとは思わなかった。
「ところで」って言ってるから、いちおう名目上は別の質問なんだろう。 回答する側の心情的にはクるけどなw
1行目に #!/usr/bin/perl -w といれて、terminalから /aaa/bbb/ccc/test.pl のように実行するスクリプトの名前を フルパスで取得する方法はございますか? print "$ARG[1]¥n"とやってみましたが、 うまくいきませんでした。 使用環境は、OSX10.4.8 + 付属の標準perlです。
>>590 自分自身を知りたいのかどうか判別つかんが
ご希望は $0 か __FILE__ の事?
ああ、フルパスだからちゃうか…。
$0でいいんじゃん?
FindBinモジュール使え。
皆様、素早く適切なご助言を感謝します。 $0でうまくいきました。 perl歴20年なのですが、Googleで検索しても 正解の$0まで独力ではたどり着きませんでした。 今まで一度も$0を使ったことななかったわけです。
>>595 変な見栄を張るのはやめたほうがいいよ。
perlって20年も続いてたのか。
>>595 >Larry Wall began work on Perl in 1987, while working as a programmer at Unisys,[4]
>and released version 1.0 to the comp.sources.misc newsgroup on December 18, 1987.
未来人乙。
>>595 釣りでないのなら今すぐ perldoc perlhist と打鍵した上でご自分の Perl 歴を確認してください。
その上で 20 年と判断されたなら僕に Perl を教えてください。>Larry
>>598 , 599
重ね重ね、正確なご指摘をありがとうございます。
記憶違いでした。私がperlを始めたのは1990年頃で、
秋葉原のコンピュータ店の洋書売り場でO'Reillyの本を
買ったのが始まりでした。16年後もperlで仕事が
続けられるとうれしいです。
perl歴16年で$0を知らないのもどうかと思うが、さらに調べられもしないとは お前はいったい何をやっていたのだ...
ある種の精神異常なんでしょ。放置放置。
>>600 自身の$0には何が収められているんだろうか。
>>604 「1990年頃」の「洋書売り場」ということなので辛うじて true かな。w
こいつは16年間何をしてたんだ…
日本でインターネット接続サービスが始まったのって1990年だったね確か。 別にPerlにインターネットは必須じゃないけどさ。
Internet黎明期にPerlの存在を知りソースを入手。 当時のPerlにWindows版バイナリなんてなく、 BSDとかでソースからのコンパイルも一苦労。 当時のPerlの完成度とハードウェアスペックではPerlは重くて そうそう使われる代物ではなかった。 上記のハードルを乗り越えて当時から使っていたのであれば かなりの情報収集力/運用力があるはず、 なのに$0を知らない。 ありえねぇ。。。
精神と時の部屋みたいな色のMac使ってるみたいだからあり得そう。
古い人が来ましたよ
>>608 当時のPerl文化圏は、インターネット/NetNews/JUNETとUNIX Magazineあたりに
存在した。
その時期に大学に進んだ年代で、理工系の上のレベルの大学に入った人なら、
比較的普通に触れられた環境だっただろう。
ちなみに、オライリーの本が出る前に、非常に上質な日本語マニュアルが存在
していた。
当時、コンパイル過程は延々質問に答えていくというものだった。
面倒だというだけ。
もっとも、大学等のワークステーションが主戦場だったので、ほとんどの利用者に
とっては、ソフトウェアというものは、しばしば得体の知れない技巧を持った、
畏怖すべき「管理者」氏が勝手に入れておいてくれるものであっただろう。
当時Perlの完成度については不満を持った記憶はない。現在とは異なる作法が
要求されたけどね。CPU速度もメモリサイズも現在の100分の1程度とかいう、
そういうオーダーだったころかな?
ちなみに、かの人の言動を怪しむ向きには反対しない。以前、 インターネット歴36年を自称するキテガイが暴れたのを見たことがある。 「70年代にはメインフレームが主流で、ディスクはギガバイト単位だったのに」 とワークステーションの性能の低さを嘆く某二流大学工学部教授なんてのもいたし。 虚言と記憶改竄恐るべしである。 しかし、一方で、目の前にずっとニンジンがぶら下がっているのに、 10年もそのことに気づかないような人間も散見してきたのだよ。 だからとりあえず、質問箱は質問箱に戻りましょう。
今日感動したこと。 QRCode が GD::Barcode::QRcode でいとも簡単に作れてしまったこと。 素晴らしい。
>>612 検証もしないで素朴な疑問だけどSwetake氏のとどっちがいいんだろね。
そんなもんまであるのか
教師をしております。マークシートのテストをperlスクリプトで 採点しています。正解を次のような形で@ans1の中に入れています。 (1) my @ans1 = (4,4,2,1,4,3,1,4,6,1,3,3,3,6,5,3,8,4,2,4,1,3,5,5,4); 毎回、25問の正解をテンキーから入力していますが、数字の間に入れる"," の入力が面倒で ","を省略した(2)のような入力形式を考えています。 (2) 4421431461333653842413554 (2)の数字を分解して、@ans1に入れる方法はございますでしょうか?
my $ten = 222333 ; split //, $ten @ans1 = qw( 2 2 3 4 5 ) ;
>>615 無理せずExcelでも使ったほうが良いのでは…。
>>616 分かりやすい実例をありがとうございます。ご指摘いただいた
実例を参考にして、明日、職場で次のようなスクリプトを試し
てみます。
my $ten = "4421431461333653842413554";
my @ans1 = split //, $ten
>>617 >無理せずExcelでも使ったほうが良いのでは…。
Excelはインストールはしていますが、Visual Basic(?)の使い方が
分からないので、採点作業はできない状況です。
Perlの便利なところは、CSV形式の生徒200人分の解答データを
読み込み、全体の平均点、得点分布、クラス別平均点を出力し、
生徒の個別の採点結果もファイルに出力する作業が一気にでき
る点です。Excel+Visual Basicでも同じことができるのでしょ
うが、Visual Basicの勉強が大変そうなので、躊躇しています。
>Visual Basic(?) VBSな
>>607 >別にPerlにインターネットは必須じゃないけどさ。
て言うかかなり関係ない。
>>618 Excel VBAとPerlありゃいいや。
crypt で生成した暗号化文字列に含まれる文字種を教えてくれませんか。
a-zA-Z0-9./
>>613 どうなんだろう? CPANの検索で qrcode で川合氏の GD::Barcode::QRcode
が出てきたからそっちしか試してない。
626 :
デフォルトの名無しさん :2006/10/11(水) 14:50:38
とつぜんですが、ぜひ教えて下さい。 PERL(CGI)でコーディングしたプログラムをバイナリー化して中身のコードを読まれない方法 はありますか? ショッピングカートを作成したのですが、そのプログラムをお客に渡すと中身が読まれて しまうので、読まれない形で渡したいのです。 どなたか良い方法を教えていただけないでしょうか? 宜しくお願いいたします。 色々調べたのですが、中々有効な情報が無くて・・・。
perlcc?
おれも perlcc しか無いような気がする。 他にやり方有ったら知りたい。 別式だとASP方式取るとか。
>>626 完璧な方法はない。
手軽なのは難読化。
バイトコードにしてから渡すというのも、もしかしたら有効かも。
630 :
デフォルトの名無しさん :2006/10/11(水) 15:06:27
早速のレスありがとうございます。 PERLCCでバイナリ化するには、どのようにコマンド入力すればよいのでしょうか? なかなか上手くいかないので、例をあげていただけると助かります。
$ cat test.pl print "hello\n"; exit; $ perlcc -o test test.pl $ ./test hello
ソフトウェアの自由はどこにいった
最初からCあたりで書けばいいものを・・・
自分のテクニックは客に知られたくないが自分の為のテクニックは只でくれ、って 何さまのつもりだよ
汚すぎて見せられないんじゃ...
というか中身のコードを読めなければ実行できないんじゃね? まさかバイナリなコードなら人間が理解できないとか思ってるのか?
問題があるコードなのがばれると困るんじゃねーの? セキュリティがやばいとか どっかのパクリとか...
客相手にプログラムを作ってしまってから、隠す必要に気づくってのがすごいな プログラム自体にもとんでもないエラーがありそうだ
PHPだと暗号化ツールとかあったりするから、その手のヤバいレベルの請負が のさばってたりするんだろうなぁ。
640 :
622 :2006/10/11(水) 19:54:39
>>623 ありがとうございました。Seedに使える文字種と一緒なんですね。
>>626 大きなお世話なんでしょうが…、
あなたはその商売に向いていないので展望を再検討されることをお勧めします。
そのまま続けても、搾取されて捨てられてから、潰しが利かなくなってしまった自分に気が付く事になるでしょう。
よほどぼろい客でもつかんだなら、しばらくはその客頼みで食えるかもしれませんが、それだけのことです。
がんばってください。
>>626 自分の技術力を金で売ってるのに難読化して非公開し
他人には無料で技術を公開し手取り足取りで教えろとは
とても厚顔無恥ですね。
> どっかのパクリ これだと思うが。
>>642 知らないならややこしいから取りあえず黙ってくれや
perlccというキーワードを教えてもらいながら googleやperldocでperlccの使い方を調べられない奴が いっちょまえに文句言うな
Artistic Licenseはソースを公開することを強いてないんだから ソースを隠蔽することは当然の権利だよ。 現状じゃチープな難読化ツールとバイトコードにするぐらいしか手段がないけど Perl6のFAQでここら辺のことに言及していた気がする。
Perlインタプリタのライセンスと Perlインタプリタの上で動くスクリプトの話を ごっちゃにされてもねぇ (´゚c_,゚` )
隠したいってのに対してなんでキレてる人が多いんかわからん
書き始めの頃ってなんか恥ずかしいじゃん、見られるの。
でも見られて困るようなものを売るべきではないよな
>>645 には同意
恥ずかしくて見せられないほどヘボいコードは 難読化しようがバイナリ化しようがやはりヘボいコードであって そんなものは誰の役にも立たないんだから どうせ隠すならソースだけではなく存在自体をなかったことにするほうが合理的
>>650 隠したいってだけでキレてる人はいないと思う。
ギブ&テイクの精神のなさや、ただでテイクしたもので商売しようとする態度でキレてるんだろう
>>650 この人の書き込みを見てあなたはどう思う?
俺はこの人が商用のショッピングカートを開発できる人とは思えないわけよ。
そんな人がソースを隠したい理由って何だろうね。
perlccでコンパイルしたHello World と素のCで書いたHello Worldだと びっくりするほどバイナリサイズが違う罠(前者>>後者)
>>655 yep. その代わり、大作か!? と思わせる効果がある。
>>654 最初はそうなんじゃないの?ってこと
経験不足なのがクライアントにバレるのが嫌だとか
それでも食っていかなくちゃいけないとか色々あるでしょ
いやあるいはすごい技術がつまってて(ry
>>657 > 最初はそうなんじゃないの?ってこと
普通、最初は人に見せまくりですが。
初期段階で人に見てもらわないと言うのは、異常な育ち方です。
まぁたしかにそうだ
で、それに対して何故キレ気味なんだw
>経験不足なのがクライアントにバレるのが嫌だとか そういうヤバい人こそソースを見られている意識を持ってほしい。 今ならいくらでも良い書籍があるんだし、達人のソースも読めるんだし。 別にそういう人が商売するのは勝手だけど、2chスレで教えてくんすりゃ批判 されるだろうな。
>>658 孤立した状態にいる独学の人だと、最初は人に見せないんじゃないかな。
まあ、だからといって、ほかの人たちが一般的に最初はそうなん
じゃないかと想定するのは変だけど。
オープンソースであるPerlを利用しているだけの一般人が それを利用するプログラムを作ってソースを公開したくないという人に向かって 「公開しない精神は腐ってる」という方がよっぽど不愉快だ。
自分と反対の考え方を許容すればそれで済むんじゃないかと。
べつに公開しないことを批難してんじゃなくて、すぐに素直にperlccと教えて もらったのに、それを調べようともしない態度を批難してんじゃねーの。
>>664 > 自分と反対の考え方を許容すればそれで済むんじゃないかと。
キモオタに交際求められて断った女の子が、キモオタにそれを言われて
わがままだと批判されたと言ってた。
いや、俺は逆に人に見せながらスルのが好きだ
以前に投稿者の記録をまったく関係のないサーバに送信していた掲示板スクリプトがあったような。 あとはやっぱりパクリものかな(著作表示を消しているとかとか)
「ひらがな以外が一文字でも含まれる」 ↓ 「ひらがなが連続していない」 と解釈して良いかと。
>>670 そういう場合は、「本当にやりたいこと」を書いたほうがいいよ。
なんとなく「ひらがな以外が一文字でも含まれる場合」は直接は関係ない感がひしひしと。
$str !~ /^(?:\xA4[\xA1-\xF3])+$/
# ひらがなのみが1文字以上含まれる、の否定
# =ひらがな以外が含まれる、または空文字
とかでいいんじゃね?
674 :
670 :2006/10/12(木) 22:17:48
>>672 >>673 レスありがとうございます。
コマンドラインからIMEの辞書ファイルを作成するスクリプトを作ろうとしていたのですが、
読みにはひらがな、全角英数、一部の全角記号しか使えないので、それ以外が入力されたときは弾くようにしたいのです。
そこで、ひらがなの場合はどうすれば良いかを聞いて、他の文字の場合に応用するつもりでした。
>>657 色々あるが、盗作を隠すためなら問題だろう。
>>660 子供じゃないなら一部を全部と捉えるのはやめたほうがいい。
>>670 ひらがなしかない = 最初から最後までひらがなだけがぎっしり詰まっている
続・はじめてのperlが改訂されましたね。 皆さんは、この本(改訂前)を読みましたか? リャマ->ラクダに行こうとしたのですが、 ちょっと無理でした。断念しました。 続をやってからにしようと思っています。
>>675 一部とか全部とか妄想に浸りすぎですよ・・・
ラクダ本ってそんなに難しいかなぁ・・・ これで入門したんだけど・・・
ラクダ本買うくらいならperldocで十分だろ。。。
perldoc は、さっとひくリファレンスとしては便利だけど じっくり読みたい時とか流し読みしたい時は本(ていうか紙)が便利。 perldoc だけで済んでるんなら、いいと思うけどね。
683 :
681 :2006/10/13(金) 13:54:30
ディスプレイで見るか紙で見るかの 媒体の違いでラクダ推奨なら好みの問題ですね。 納得。
英語なのが最大の問題。
英語漬けとかNHKの語学番組とか利用して英語力うっぷしといたほうがいいぞ。 perlに限らず英語の技術系ドキュメント読めたほうがなにかと得。
o my god
得というか読めないと話にならんな
i hate english
>>675 「一部」がそんな電波妄想で返しても無意味。
どうがんばっても一人の意見は一人の意見でしかないのですから、 それを皆の意見、その集団全てがそうだとだとみなすのは傲慢なのですよ。
で、パクリコードを隠蔽したい奴は無事難読化できたのか?
>>690 同意ですね。
ただ問題は、そんなことをしている人間がこの会話の参加者にいないことです。
いわゆる韓流ってやつだろう。前提からして既に捏造な切り口を持ち込むのは。
ActivePerlの5.8.7.813以降のバージョンで、 PARでexe化出来なくなったという問題はまだ直らんのか。
>>670 if ($str =~ /^(?:\xA4[\xA1-\xF3])+$/)
でいいと思うが、文字コード依存というのは感心しないね。utf8に変換して、
if (/^[\p{InHiragana}\x{30fc}]+$/) # [ぁ-ん゛゜ゝゞー]+
の方がずっと読みやすいだろう。
697 :
デフォルトの名無しさん :2006/10/14(土) 19:00:19
Perl/tkの質問はここで良かったでしょうか? フォルダ選択用のウィジェットって無いでしょうか? getOpenFile()のフォルダ版のような感じの。 データの保存用フォルダを指定する用の入力とかに使いたいんですが、 getOpenFileだと絶対ファイル名を指定しないといけないので、 空のディレクトリを指定することが出来なくて困っています。 仕方なく手動で入力してますが、フルパスなのでバリめんどいです。 誰かご存じの方がいらっしゃいましたら、よろしくお願いします。
>>697 Tk::chooseDirectory() # if $Tk::VERSION >= 804;
699 :
697 :2006/10/14(土) 22:02:41
>>698 おおお!ありがとうございます!まさにこれです!!
Tk勉強し始めたばかりなんですが、
こういうウィジェットの一覧が画像でのってるサイトってどっかに無いでしょうか?
本でもいいんですが。
700 :
698 :2006/10/14(土) 22:29:38
>>699 > こういうウィジェットの一覧が画像でのってるサイトってどっかに無いでしょうか?
作って公開してここで晒して♪
ActivePerl 5.6の@INCにはめられたよぅorz
よく分かっている>703が居るスレ
Perl/Tk使ったことないけど面白そうだな。 でも、どうせならPythonでも学んだほうが・・・・ってのは禁句か。
Pythonはインデントで構造あらwすのが嫌い。インデントつけるのは嫌いではなくて当たり前なんだが、 インデントのみで構造を表しているのでちょっとプログラムの構造をいじるのに{と}を追加してインデント ぐちゃぐちゃになったのをperltidyで整形みたいなことが本質的にできないのが不便なのです。
>>705 > でも、どうせならPythonでも学んだほうが・・・・ってのは禁句か。
っていうか、ここで言ってもしょうがない
>>706 > Pythonはインデントで構造あらwすのが嫌い。インデントつけるのは嫌いではなくて当たり前なんだが、
文章だと思うんだ!!
ぐちゃぐちゃに書いてから整形する=Perl 最初からきれいに書く=Python って事ですよね^^
いや、 ぐちゃぐちゃに書いてから整形する予定だったが面倒くさいから後回しでいいやと思い結局そのまま=Perl
perltidy通せばいいから整形なんてしなくていいよ。
整形は遺伝子詐欺!!
perlccすればいいからインデントなんていらないよ
/ ̄ ̄ ̄ ̄\ ( 人____) |ミ/ ー◎-◎-) (6 (_ _) ) | ∴ ノ 3 ノ \_____ノ マル・パク・リー [Mal Pak Lee] (1989〜2006没 韓国)
パクって著作権表記書き換えればいいからコードなんて書かなくていいよ
パクり元のコード探すのもめんどいから、人間やめるよ!
717 :
デフォルトの名無しさん :2006/10/16(月) 12:59:40
すいません くだスレでは返答がいただけないのでこちらに書き込ませていただきます。 CGI_Liteを使用したいためcpanを入れて cpan> install CGI_Lite とやってみたところ -------------------------------- Welcome to the installation of CGI_Lite 1.8... WARNING: MAN3PODS takes a hash reference not a string/number. Please inform the author. Checking if your kit is complete... Looks good Can't use string (" ") as a HASH ref while "strict refs" in use at /usr/lib/perl5/5.8.6/ExtUtils/MM_Unix.pm line 510. Running make test Make had some problems, maybe interrupted? Won't test Running make install Make had some problems, maybe interrupted? Won't install -------------------------------- と出てうまくインストール出来ません。 どのようにしたらCGI_Liteがインストール出来るのでしょうか? ご助力をいただけますと幸いです。 ちなみにcpan> install CGI::Liteでは cp Lite.pm blib/lib/CGI/Lite.pm Manifying blib/man3/CGI::Lite.3pm とうまくインストールできた模様なので サーバーの設定がまずいというわけではないと思っております。
>>717 CGI_Lite 1.8はCGI::Liteのものすごく古いバージョン(2.0になった
ときに名前がかわった)。1997年のものだからさすがに古すぎる
んじゃないか。
どうしてもインスコしたければPerlを古いのにするか、自分で問題
がある部分を書き直すかだろうね。
719 :
デフォルトの名無しさん :2006/10/16(月) 16:04:21
今まで価値観の違いから、いろいろなことで喧嘩が絶えず、 そのたびに私は「離婚したい」などと言っていました。 でも主人はいつもそれには応じず、聞き流していたのですが、 先日の喧嘩でついに主人の方から「離婚したほうがいい」と 言われてしまいました。 自業自得なのかもしれませんが、離婚したくありません。 私は本当に離婚する気などなく、ただ主人の気持ちを 確かめるためだけに離婚という言葉を使って来たように思います。 でも話し合いの中で、他に好きな人がいるわけではないけど 彼の私に対する愛情はもうないこと、自分はマイペースだから そのリズムを壊されるのが我慢できないこと、 今後私がどんなに変わる努力をしても今の気持ちは変わらないだろう というようなことを言われました。 私は主人のことはまだ好きで、どうしても離婚したくありません。 元に戻れるならどんなことでもしたいです。 でもここまで離れてしまった主人の気持ちはもう元にはもどらないでしょうか。
>>719 「なんでここで聞くんだよw」などの反応を期待されての書き込みだとは思いますが、
残念ながらまったく面白くありません。
簡単な質問でスイマセン。 aaa ccc というまとまりと bbb ccc というまとまりが10000行ほどファイルとして存在するとします。 このとき、cccの部分だけ抽出したいのですが、 aaaの場合のcccとbbbの場合のcccを分けたいので、 if(/aaa\n(ccc)/){ print $1; } とやったのですが、out of memoryと表示されました。 他にいいやり方を教えてください。
ファイルから1行ずつ読み込むループ内で、現在位置が偶数行目なのか 奇数行目なのかを判断して、2通りの処理をすればいいかと。
メモリを増やせばいいかと。
my $flag = 0; while(<>){ if($flag){ $flag = 0; if(/^(ccc)/){ print $1; } } $flag = 1 if(/aaa$/); } こんなんでどうよ?
$flg; while(<>){ if ($_ =~ /aaa/){$flg=1; next;} if ($_ =~ /bbb/){$flg=2; next;} if ($_ =~ /ccc/){ print "a $_" if $flg==1; print "b $_" if $flg==2; } $flg=0; } こんなのしか思いつかない・・・orz
while ( <> ){ if ( /^aaa/ .. /^(ccc)/ ){ print $1 if $1 ; } }
こういうときにスイッチ使うのね(´・ω・)
Perlはかなり長いこと使ってるけど、スイッチは使ったことないなぁ
誰か哀れな初心者に
>>726 氏の内容を解説してください…
検索したけどよく分からんです。
フリップフロップ演算子でぐぐれ
False..Trueのつもりで print scalar(0..1) for 1..5 とやったら、 偽が返るかと思ったのに真が返ってくるので嵌った嵌った。 定数表現になってるもんだから行番号との比較になった上に、 一行も読み込んでないから$. == 0のために真が返ってるのね。
perldoc.jp には「いったん左が真になると、右が真であるあいだ真を返す」とあるんだが for (qw{a b c a c c}) { print $_ if (/a/ .. /c/); } このコードの出力が "aacc" ではなく "abcac" になるのが謎だった が、いま原文読んでわかった > Once the left operand is true, the range operator stays true until the right operand is true 「右が真になるまで真を返す」じゃねーかクソが
英語もPerlも理解してないとこうなります、という典型だな。
英語やPerl以前にアホが作ったawkでさえ理解していないじゃねーの?
>>734 ワロスwww
perler が until 間違えちゃいかんよなあw
まずはこのスレ読み直そうか。
>>732 から学んだ事
for の後置文使ってるから if 文をコピペミスしたのではないと思うのだが、
まあ、そこはおいとくとして。
1. scalar したからといってリスト全体が scalar コンテキストで判断されるわけではない。
perl -le 'print scalar ( 0 , 3)'
単に最後の要素をプリントしてるだけ。
perldoc -f scalar に注意書きがなされている現象。scalar は単項演算子だから〜のくだり。
2. 拡大解釈してやりたいことが以下の様な事だったとして、
perl -le 'for ( 1 .. 5) { print "hoge" if 0..1 }'
これの 0 .. 1 は、732 の解説通りたまたま左辺が $. == 0 で成立し(#) print
perl -le ' $. = 1 ; for ( 1 .. 5) { print "hoge" if 0..1 }'
は、print されないと。
# 実際には undef == 0 というのが成立する。ちょっと違和感。
スカラーコンテキストで範囲演算子に指定された数字が $. を見に行くっての忘れそうだな、、、
>>740 scalar LIST は、リスト全体をスカラーコンテキストで評価するよ。
例えば、$a=(0,3); と $a= scalar(0,3); は同じ値になる。
スカラーコンテキストで配列は要素数を返し、リストは最後の要素を返す違い。
それと、732のコードに手を入れて
perl -e "$.=$_,print $.,':',scalar(0..1),qq/\n/ for (1..5)"
とした場合や、範囲を変えて
perl -e "$.=$_,print $.,':',scalar(0..1),qq/\n/ for (0,0,1,1,1,0,0,0,1,1)"
とした場合も見てみるといいよ。
732は 0..1 を false..true のつもりで使ったと書いているから、実際の $_ は
false か true が入るループだったという考えでね。
>>741 スマソ、「必ずしも」が抜けてました。
perldoc -f scalar してください。きちんと注意がきは載ってます。
後半はまあ、どうでもいいです。
>>741 実行できない例をだすなよw
>perl -e "$.=$_,print $.,':', scalar(0..1),qq/\n/ for (1..5)"
>Can't modify constant item in predecrement (--) at -e line 1, near "color="
>syntax error at -e line 1, near "qq/\n/ for "
>Execution of -e aborted due to compilation errors.
リスト中でプリントするなよw
下を実行してみ?
$ perl -le 'print 0, print 0, $a = 'b' , 1'
同一リスト内で代入と print なんて狂気の沙汰だw
すまん。自分で実行できない例(つーか実行出来てしまったんだが)を書いた b をシングルでくくってなんでエラーになんないんだよ orz...
>>743 B::Deparseしたくて色々試したら実行出来たよ意味不明だけど
おそらくbash/zshだけ
$ perl -e 'print "$.¥n" '
$ perl -MO=Deparse -e "$.=$_,print $.,':',scalar(0..1),qq/¥n/ for (1..5)"
foreach $_ (1 .. 5) {
$. = print($., print($., ':', scalar(0 .. 1), "¥n"));
}
-e syntax OK
746 :
741 :2006/10/17(火) 22:29:14
>>742 リストに含まれる全要素数が欲しい場合は単にリストにscalarを適用するのではなく、
一時配列を作れって部分だよね。
これとリスト全体が…がどうにも繋がらなくて悩んだのだけど、もしかして
リスト全体をスカラー評価=リストに含まれる全要素数を取得って事でしたか。
失礼しました。
>>743 >>745 それは申し訳無い。
駄目な理由は $ をシェルが展開するからなので、適当にクォート($→\$)して下さい。
シングルクォートで
perl -e '$.=$_,print $.,q/:/,scalar(0..1),qq/\n/ for(1..5);'
と書けば良いんだけど、そうすると今度はwin系で通らなくなる気がする。
リスト中のプリントって、 printの左にあるコンマ演算子の事だよね。
そのコンマ演算子ならリストとは無関係です。
747 :
743 :2006/10/17(火) 23:10:31
>>746 > 駄目な理由は $ をシェルが展開するからなので、適当にクォート($→¥$)して下さい。
うわあ、、、大恥(汗)
>そのコンマ演算子ならリストとは無関係です。
745 の Deparse 結果を読んで理解してて、それがお前が意図したものなら何もいわんが…
まあいいや、元気でやってくれ。
>>747 745の結果もなんかおかしいよ?""の影響じゃね?
perl -e '$.=$_,print $.,":",scalar(0..1),qq/¥n/ for (0,0,1,1,1,0,0,0,1,1)' 0:1 0:2 1:3E0 1: 1: 0:1 0:2 0:3 1:4E0 1: この結果を誰か解説してくれ、俺には理解できん。
>>749 > この演算子は、偽なら空文字列を返し、真なら(1から始まる)通し番号を返す。
> この通し番号は、新たな範囲がスタートするごとにリセットされる。
> 範囲の終了点では、通し番号の後ろに文字列“E0”を付けたものを返す。
> この“E0”は値を数値として解釈する際には何の影響も与えないが、
> 範囲の終了点を除外するための目印とすることができる。
「プログラミング Perl VOLUME1」第三版 p121 より引用
>>750 thx. 範囲演算子の方の機能なのね>E0
えっと、Net::FTP でサーバー間転送させているときに Ctrl-Cとかで終了したときに abort を呼ばないといけないんだけど %SIG{'INT'} = abortFTP; ftp_dest->pasv_wait(ftp_src); ってやっても、タイムアウトするまで abortFTP が呼ばれないんです。 ちゃんと abortFTP が呼ばれるようになるにはどうすれば いいのか教えてください。
% ?
ごめん、$SIG{'INT'}でした。
Net::FTPのソース読んでないので適当な回答だけど タイムアウト処理のためにNet::FTP側で$SIG{ALARM}を仕掛けているだろうから アラームの時間を1secとかに書き換えればすぐにタイムアウトするのでは?
>755 タイムアウト処理は pasv_wait の中の responce の中の getline の中の select でやってるみたいです。 あと、「転送開始→すぐに中断」が目的じゃなくて、 あくまで Ctrl-C を押したときに abort することが目的なので alarm(1); ftp_dest->pasv_wait(ftp_src); は目的とは違うと考えて試していません。 abortFTPのなかで alarm(1) すればいいんじゃないの?ということならば、 そもそもタイムアウトまで print すら呼ばれない状態なので 意味がないかなとか思います。 そもそも、$SIG{'INT'} を設定しないときはデフォルトの ハンドラが即座に走るのに、 設定するとなんでタイムアウトまでブロックされるのが疑問です。 >756 いえ、解決していません。投稿時に間違えただけです。
selectやシグナルはけっこうOS依存で微妙に違うことがあるので、 その辺の条件も出すと何かわかる人がいるかもしれない。 とりあえずシステムコールトレースでもしてみてはどうか。
最近は $SIG{'INT'} = \&abortFTP; と書かなくていいのか、へえ。
>>755 $SIG{'INT'} = sub {
print "abortFTP\n";
abortFTP();
};
としたら、^C で "abortFTP\n" は表示される?
というか、環境書けや。まさかwin32ってオチじゃねーだろな。
761 :
デフォルトの名無しさん :2006/10/18(水) 22:08:32
ごめ。安価まちがい。
>>760 =~ s/755/752/;
>>760 window環境で作ってる奴なんか、ふつーにいるんじゃねぇの?
何がまさかなんだ?
PerlはUNIX/UNIXクローン上で動くこと前提で WinではOSの設計の差異からいろいろと問題がある。 質問をする奴らは環境ぐらい書け。
764 :
デフォルトの名無しさん :2006/10/19(木) 00:15:25
ニュースサイトから、リンクや記事を抜き出すスクリプトを作ってんだけど、 正規表現で抜き出すのに限界を感じたんで、HTML::Parser使おうと思ってるんですが、 ドキュメントだけだとイマイチ使いかたが判らんのです。 HTML::Parserの使いかたが判り易く載ってるサイトってないですかね? HTML::TreeやHTML::TokeParserも似たようなもんなのかな?
>>762 DOSとunixだと^Cの効くタイミングがぜんぜん違うじゃん
>759 その書き方は知りませんでした。正確には $SIG{'INT'} = 'abortFTP'; とやってました。 >760 >としたら、^C で "abortFTP\n" は表示される? タイムアウトまで表示されません。 >環境書けや。 環境はWindowsXP で ActiveState の Perl 5.8.8です。
ActivePerlでSIGINTはやろうとして悩んでるのはたまに 見かけるが解決したのを見たことがない。(ぐぐってみれば わかる) 別の方法を考えることをお勧めする。
769 :
752 :2006/10/19(木) 12:43:56
cygwin の perl で試してみるとうまくいきました。 うまい回避策も見つからなかったので ActivePerl を使わない方向で進めることにします。 ありがとうです。
770 :
デフォルトの名無しさん :2006/10/20(金) 01:26:27
my $j = new Jcode($_, $self->{in_char}); $_ = $j->$self->{out_char}; こんなコードなんですが、Jcodeのメソッドがないと怒られます。 $self->{out_char}に'euc'が入っているんですがうまく変数展開できない。 $self->{in_char}は問題なし(あたりまえか)。 ${self}->{out_char}とか${self->{out_char}}とかやっても駄目でした。 一旦、$out_char = $self->{out_char}と代入すれば上手くいくので、 お茶を濁してるんだけどスマートな書き方ありませんか? 後、$mode = 'out'; $self->{${mode}_char}みたいなのも駄目ですよね? こういう考え方が間違ってるのかな…
771 :
デフォルトの名無しさん :2006/10/20(金) 01:28:27
質問させて下さい $aaa=&sub1(); print $$aaa; sub sub1 { my $bbb; $bbb="ABCD"; return \$bbb; } my宣言されたレキシカル変数の値に対して、リファレンスでスコープ外から 参照出来ますが、この場合のsub1における$bbbの値がいつまで保持されるのかが 分かりません メモリ空間的に$bbbの値はプログラムが終わるまで保持され、安全だと思っても 良いのでしょうか?
>>770 その syntax は、一度変数に代入して $j->$out_char とするしかない。
一次変数を用意するのが面倒な時は can() を使うとか。
$_ = $j->$self->{out_char};
↓
$_ = $j->can($self->{out_char})->();
うーん、イマイチ。
蛇足だが、$j を使い回さないなら、あえて convert() とか。
Jcode::convert(\$_, $self->{out_char}, $self->{in_char});
>>771 Perl の変数は参照カウンタを持っているので、参照されている限り保持される。
プログラムが終わるまで使われていれば終わるまで保持されているだろうし、
使われなくなった場合は GC が走ったタイミングでメモリから消える可能性が
あるが、使われてないんだからそもそも関係ない。
要は、変数がメモリ空間にあるか考えてコードを書く必要はないってこった。
>>770 いったん別の変数に代入するのが一番明示的でいいと思うんだけど
あなたの言う「スマート」とは例えばどんなコード?
後半部分については、そもそもハッシュのキーは文字列なので
$self->{"${mode}_char"} と引用符で囲うか、 $self->{$mode . "_char"} とすればできます。
$_ = $j->${ \$self->{out_char} }; 無名変数つかってるだけで実質明示的に別変数に入れるのと変らん罠
775 :
764 :2006/10/20(金) 07:40:13
>HTML::Parserを使っているモジュールのソース読めば理解できるっしょ。 こう言われると「ぐう」の音も出ませんw TokeParserの方が直感的で判り易いのと希望の動作が出来たんでTokeParser使います。
776 :
771 :2006/10/20(金) 12:32:52
use strict; while (my ($key,$value) = each %ENV) { print "$key=$value\n"; } は大丈夫で、 use strict; print "$key=$value\n" while (my ($key,$value) = each %ENV) はどうしてダメなのでしょうか? Global symbol "$key" requires explicit package name at -e line 1. Global symbol "$value" requires explicit package name at -e line 1. Execution of -e aborted due to compilation errors. と言われてしまいます。
print がブロックの外にあるからでは?
ソース冒頭でサブルーチン プロトタイプを宣言した場合、 呼び出し時の引数過不足はチェックされますが、 プロトタイプを別ファイルにしてインクルード(require)すると エラーチェックされません(perl, v5.6.1) これをエラーチェックさせるような方法はないのでしょうか。 use strict 'vars' / use vars... などもインクルードすると 無効になり、非常に使い勝手悪いです。。。
むしろ他のソースで use strict して require すると、strict モードが有効になったらやだなぁ・・・
>>779 BEGINブロックの中でrequire
requireはそのままだと実行時に評価されてしまうので、
プロトタイプのチェックが行われる解釈段階には効果を及ぼせない
>>779 requireじゃなくモジュール化してuseにする。
やったあああああ! ありがとう>781
質問です。 AAA BBB CCC というファイルがあります。 一行目がAAAであるときのAAAとCCCを AAA CCCというならびで抽出したい場合 foreach(<STDIN>){ if(/(AAA)/){ print "$1"; foreach(<STDIN>){ if(/(CCC)/){ print " $1\n"; last; } } } } で上手くいきません。 ご教授お願いします。
785 :
770 :2006/10/20(金) 23:21:34
>>772 ありがとう。代入するしかないんですね。
convert()使用でも無問題なんで、こっちの方がすっきりしますね。
convert()にします。
>>773 「スマート」なんて人それぞれなんで変ないいかたしました。
個人的には、可読性がおちなければ、より少ない変数、少ない行数って事ですね。
今回は、$self->{out_char}で意味は通じてるので、わざわざ同じ意味の$out_charに
代入するのが??と思ったからです。
それと、$out_charをやってしまうと、統一感で意味で$in_charも作らないと駄目ですよね。
ものぐさな者なんで、引用符とかで逃げれないかなと思ったもんで。
後半部はあっさり出来ました、ありがとうございます。
>>777 myで宣言した変数はその宣言が含まれた文が終わるまでは
見えない。
>>784 $count = 0;
$str_a = "";
$str_c = "";
foreach (<STDIN>) {
if (!$count++ && /(AAA)/) {
$str_a = $1;
next;
}
if ($str_a && /(CCC)/) {
$str_c = $1;
last;
}
if ($count && !$str_a) {
last;
}
}
print $a, $c, "\n";
でどうかな。
>>787 ありがとうございます。
AAA
BBB
CCC
の塊がが複数行続くんですが、どう処理させたらいいんでしょうか?
Tkについてです。 1: マウスアクションって不可能なんでしょうか。 例えば、ノートブックのタブをダブルクリックしたらそれを閉じたり、 タブを掴んで画面の外まで持っていくと新しい画面にするとか、 そうゆう風に動かしたいんですけど無理でしょうか。 2: あと、エクスプローラーのフォルダの画面で「詳細表示」にしたみたいな画面は作れないんでしょうか。 (上にファイル名とかファイルサイズとかの項目があって、好きに並び替えたり、左右の広さを調節できたりする)。 3: ちなみに、2のような画面形態のことをなんていいますか?w
791 :
デフォルトの名無しさん :2006/10/21(土) 05:09:02
>>791 その話題がこのスレと何の関係があるの?
いわゆる単なるコピペあらし
質問です
http://203.111.199.131:8080/test.m3u ←を拾ったとき、test.m3uまで含めたいのですが 8080の後ろで切れてしまい
それを$outputの中に入れてしまいます。
test.m3uまで含めた状態で$outputに入れたいです。
どうすればいいでしょうか?
↓ここの表記に問題がありますか?
while ($data=~ m/(((?:$site_m)[\:\d\w\-\.\/\=\?\!\-\%\&\_\#]+\:[\d]+)|h?
ttp:\/\/ (?:[\w\/\.\?\-\%\&\=]*$site\/[\w\/\.\?\-\%\&\=]*|[\w\/\.\?\-\%\&\=]*\.$ext[\w\/\.\%\&\-\?\=]*))/g) {
$output = $1;
}
マルチは死んでください
回答が付かなかったからってマルチしていい理由にはならないんだよね。
800 :
デフォルトの名無しさん :2006/10/22(日) 04:44:40
しねよ
801 :
794 :2006/10/22(日) 05:26:37
すみません。しねませんでした
>>801 お前の頭の悪さじゃ一生わかんねぇだろうなwwwwww
もっかい死んでこい
>>794 > どうすればいいでしょうか?
同じようなことをやっているプログラムを探して、
どうやっているのか調べると良いです。
マジレスするとurlを書いて「xxでも質問したのですが、答えが無かったので」と書けば。 >794
マルチしてもいいじゃん 逆にマルチしちゃいけない理由を言えよwwwwwwwwwwwwwwwwwwwwwwwwwwwww
すみません、質問です。 ppmでモジュールをインストールしたいです。 モジュールはSOAP::Liteです。 >search SOAP::Lite から調べていくと、以下まで達しました。 ppm> search ResourcePool-Resource-SOAP-L Using cached search result set 7. 1. ResourcePool-Resource-SOAP-~ [1.0101] SOAP::Lite bindings for ResourcePool 2. ResourcePool-Resource-SOAP-~ [1.0101] ResourcePool-Resource-SOAP-Lite ここで、正式名称が分からないので、インストール/確認ができない状態です。 チルダで省略されている部分を参照するにはどうすれば良いでしょうか? 宜しくお願いします。
if ( @list1[2] eq @list2[3] ){ とやってて、@list1[2]と@list2[3]にはそれぞれ"00001"が入っているのですが、 条件に一致しません。 if ( @list1[2] == @list2[3] ){ とすると一致します。 この例では値が"00001"ですが、実際は文字の場合もあるので、eq をつかいたいのですが、 どうしたらよいでしょうか? Perlは文字とか数値とかあんまり意識せずに使えると思ってましたが、こういう場合は 別なんでしょうか?
つっこみどころが満載でもう何ていったらいいか…
>>811 とりあえず配列じゃないので試してみたらどうかね?
815 :
619 :2006/10/22(日) 19:08:02
>813 有難う御座います。 自己レスになってしまうのですが、 ppm> search SOAP::lite Searching in Active Repositories 1. ResourcePool-Resour~ [1.0101] SOAP::Lite bindings for ResourcePool 2. SOAP-Lite-InstanceE~ [0.02] 3. SOAP-Lite-SmartProxy [0.11] URI Redirection and Forwarding for SOAP-Lit~ 4. SOAP-Lite-Utility [0.01] Utilities for SOAP::Lite client programs ppm> describe 3 <----------------コレ ==================== Package 3: Name: SOAP-Lite-SmartProxy Version: 0.11 <略> ==================== 上記のように、正式名が分かりました。
816 :
619 :2006/10/22(日) 19:08:37
817 :
619 :2006/10/22(日) 21:17:42
続き >816 自己解決しました。 リポジトリに追加するわけですね。 納得しました。 すみませんが、再度追加質問です。 Time::JuliasDay のモジュールはどこで手に入ります でしょうか? active stateやこのwininpeg には無いようでした。 すみませんが、宜しくお願いします。
Time::JulianDayじゃないの? ppmにあるのかしらんけど
819 :
816 :2006/10/22(日) 22:06:25
pure perlだからmake必要なす
821 :
816 :2006/10/22(日) 22:28:17
>820 そうなんですか。 Cpanからダウンロードして、解凍すると libの下にtime と t というフォルダがあります。 libはいいとして、tは何か必要なのですか? 宜しくお願いします。
Windows でも make はできる。nmake とか cygwin とか。 てっとりばやいのは nmake なので、検索してダウンロードしてパスが通ったとこにおいて コマンドプロンプト開いて、ソースのフォルダに cd して、nmake して nmake test して nmake install。
823 :
816 :2006/10/23(月) 01:45:47
>822 有難う御座います。 nmake test で、エラーが発生しました。 ですが、 構わず、nmake install をしました。 一応インストールはできたと思うので、 確認してみます。
cryptの戻り値がどんな文字から構成されるかって どこみれば書いてありますかね? 体験的には英数字 . / のようなんですけど , とか=なんかデリミッターで使いそうな文字返されると やばいんで。。
perldoc -f crytpの方が適切だな
830 :
826 :2006/10/23(月) 22:49:46
ありゃ外出でしたかorz でも、827-828どっちみても今ひとつ確信がもてない。。。 827には、「13 の印字可能な ASCII 文字からなる」なんて書いてあるし 828での具体的な説明はsaltだし、 うちのCライブラリには、cryptもどきしかいないし
>>830 他人が信用できないならソース読むとか。
サーブルさんのとこにpure perlなのがあったと思う。
>>830 うちでは5.8.8を入れているが、perldoc -f perlfunc のこの部分にしっかり
書いてあるだろ。
Traditionally the result is a string of 13 bytes: two first
bytes of the salt, followed by 11 bytes from the set
"[./0-9A-Za-z]", and only the first eight bytes of the digest
string mattered, but alternative hashing schemes (like MD5),
higher level security schemes (like C2), and implementations on
non-UNIX platforms may produce different strings.
>>826 cryptがどうなってるか調べるより、デリミタでやばい文字を含む場合の
エスケープを実装しとけば今後何があっても安心だ。
よしんば crypt() の返り値にデリミタっぽいモノが混入してたとして、不具合が生じるような用途って思いつかないんだけれど…。 僕が知らないだけで色々あんのかな。
835 :
826 :2006/10/23(月) 23:33:24
>>832 おっと、うちのperlが古かったんだ(v5.6.1)。 そんなdocは出てこなかったです。
>>833 そのエスケープするロジックは、もう入ってるんすよ。
んで、[a-zA-Z0-9./]が保証されるんなら、無駄なロジックだから捨てようかと
今10万回ループさせてみたけど、何故か '0' だけ返ってこない
じゃあ 0 は除外すりゃいいだろ。 好きにしてくれ。
837 :
826 :2006/10/23(月) 23:47:47
まあまあ、そう怒らずに。。。
>>832 参考になりました。 感謝です。
しつもん!perlからSQLファイルをキックすることって出来ますかね? 既に.sqlファイルはあるんですが、それをperlで動かすことになってしまって・・
ちなみにpostgreです。バカ長いSQLウンコー!(゚∀゚)!
840 :
デフォルトの名無しさん :2006/10/24(火) 18:35:11
perldocの日本語版ください
842 :
デフォルトの名無しさん :2006/10/24(火) 20:55:00
perl入力された値がすべて英文字、数字、英文字と数字まじだ 判断方法を教えてくれ
日本語でおk
よし、無理やり脳内補完すると、 「perlに入力された値が 1. すべて英文字 2. すべて数字 3. 英文字と数字まじり 判断方法を教えてくれ」 \wとか\dでパターンマッチさせればいいんでない?
\w って初心者だと思って馬鹿にしないでください。
純粋なアルファメリックを一発で指定できないのはつらいよね
>>846 m/\p{alpha}/
でマッチするんじゃなかったっけ?
>>838 ええと、定石だけれど、DBI を使うといいんじゃないかな。
ええと、定石だけれど、DBIC を使うといいんじゃないかな。
849の優しさに溜飲
>>849 テキストファイルにSQLが書いてあるのをperl経由で流したいって話だから
O/Rマッパーはいらないんじゃね?
>>848-852 thx!
ただDBIを使ってSQL文を一文づつ実行してるプログラムは書いたことがあるのですが、
テキストファイルのSQLを流すサンプルが見つからなくてイマ混乱中ですた。
一生懸命探してみます。こんな教えて厨みたいな質問にかまってくれてありがとうございました!
悩むのがいやならsystemでpsqlに食わす手もあるがな。
>854 うーむ・・わからん漏れは厨房ネ申 不可能じゃないと分かっただけで収穫だ。 (;; @u@)ノシ おはようビームっ!!
856 :
デフォルトの名無しさん :2006/10/25(水) 17:49:36
マッチングで右辺を変数にしたいのですが・・・ if ( $hoge =~ /^abc/ ) { のつもりで $str = 'abc'; if ( $hoge =~ /^$str/ ) { としたのですが、うまくいきません。/^\$str/としてもやっぱりだめ。 右辺を変数にするにはどうしたらいいのでしょう?
>>856 それで間違っていない。何かのミスだと思うので再確認汁。
これだけじゃなんなので幾つかアドバイス
$strに入るのが正規表現じゃなくて単なる文字列なら/^\Q$str\E/としてエスケープしてやると吉。
逆に正規表現が入るならqr//を使うといいかもしれない。詳細はperlopをqrで検索。
858 :
デフォルトの名無しさん :2006/10/25(水) 18:23:47
あ、あの テキストファイルの中身を書き換えたり せ、正規表現というか、そういう物の具体例か定石がたくさんあるサイトか安い本紹介して欲しいんですけど
けどなに
>>857 そうですか
確認してみます〜ありがとん
ヒントもありがとうです。
while ( 1 ) { print "入力してください"; my $line = <STDIN>; chomp($line); makearray($line); print $#a; } sub makearray { my $number = shift; print $number, "個作成します\n"; my @a; for ( 1.. $number ) { push @a, "k"; } @a = (); } 上のような配列を作成するスクリプトを書いたのですが ループを抜けてもプログラムのメモリを開放してくれません。 OSはwindowsXP SP2なのですがどのようにしてメモリを開放させれば いいのでしょうか?
>>864 なんでmakearrayの外で配列を参照しようとしてるの?
メモリが開放されてるかどうかはどうやって確かめたの?
>>862 サンクス、いろいろ覗いてみるよ
>>863 ありがとう、
探してた本とピッタリっぽいから、注文してみる
>なんでmakearrayの外で配列を参照しようとしてるの? これは特に意味が無いです。検証用に書いたのを消し忘れました。 >メモリが開放されてるかどうかはどうやって確かめたの? ウィンドウズ付属のタスクマネージャーで 仮想メモリとメモリ使用量の項目で確かめました。 又、ProcessWalkerというソフトでも同じ結果になりました。
こんなのでもメモリ確保&開放されてるの普通に確認できたよ? while(1){ &a; print "Enterを押すと次のループに入ります"; my $in = <STDIN>; } sub a{ my @a = (); my $text = ""; print "Enterを押すと256*20000byte(5Mbyte)の配列を確保します"; my $in = <STDIN>; $text .= chr($_) for(0..255); push(@a , $text) for(1..20000); print "Enterを押すとブロックを抜けてメモリが開放されるはずです"; $in = <STDIN>; }
ちょっと疑問に思ったんだが、MovableTypeとかPerlで書かれてるソフトあるけど、あれってソース公開しなくていいのかな? 絶対GPLのライブラリとか使ってると思うんだが…
>>869 Perl言語に詳しい人に質問スレに回答しておいたよー
プギャー
873 :
デフォルトの名無しさん :2006/10/26(木) 00:34:57
質問なのですが テキストを1行ずつ読み、合致する文章があれば 置換するというプログラムを書いているのですが うまくいかず困っております・・・ @ARRAY = ("01 100 200", "02 100 300") ; @ARRAY_REP = ("01 100 200 300", "02 100 300 400");・ テキストを1行ずつ読み 配列ARRAYの中身と比較し、その文章があれば その1行をARRAY_REPのの中の要素に置換したいのです。 例えばテキストの中身1行が 01 100 200 700 800 という行であった場合 ARRAY[0]の要素と合致するのでARRAY_REP[0]の中身で 01 100 200 300 800 というように置換したいのですがうまくいかず困っております・・・ どなたか分かるお方いらっしゃいましたらご教授お願いします。
ハッシュを使って、 $HASH{"01 100 200"} = "01 100 200 300" $HASH{"02 100 300"} = "02 100 300 400" ・・・ というのを作っておく。 テキストがハッシュのキーにあれば、そのハッシュの値で置き換えればいい。
俺もハッシュ使った方がいいと思うが。 もしこの配列でやるならこんな感じ? 必要ならchompして。 open IN, "テキスト"; while (<IN>) { s/$ARRAY[$_]/$ARRAY_REP[$_]/ for (0 .. $#ARRAY); } close IN;
>>874 875
ありがとうございます!
ハッシュは難しそうだと断念しておりましたが
また勉強がてらやってみます。
回答どうもありがとうございました
877 :
デフォルトの名無しさん :2006/10/26(木) 01:02:38
>>869 わかんねーな。
GPLのライブラリ(CGIモジュールとか)使ってるならソース公開必須じゃね?
難しい問題だね。誰か詳しい香具師いないのかな?
答える気は無いが、とりあえずCGIモジュールはGPL一本じゃないとだけ言っておく。 | This library is free software; you can redistribute it and/or modify | it under the same terms as Perl itself. terms as Perl itselfとはGPLとArtistic Licenseのデュアルライセンスのことだ
っていうか、意味不明。
ソース公開しているじゃん
ゆとり教育の弊害か
まぁその言い回しも偏差値低い系のそれだけどね
○○系って日常会話では久々に聞いたな
日常会話w
887 :
デフォルトの名無しさん :2006/10/26(木) 07:15:13
これperlでやるとどうなるんだ 213 :名無しさん@お腹いっぱい。:2006/10/25(水) 16:35:32 第一フィールドがmm/dd/yyyy 第二フィールドがhh:mm:ss 第三フィールドが""で囲まれたアカウント名 となっている。 「アカウント名が重複しているものは、その最新日付のみを残して、 他の重複行はすべて削除」 という具合にしたい。 uniqを使えばいいのかもわからないが、やっぱりわからない。 どうすればいいだろう。 08/11/2006 14:29:50 "yamamoto" 03/03/2006 06:40:53 "yamada" 05/17/2005 07:45:07 "yamada" 07/13/2005 04:18:04 "yamada" 07/13/2005 13:17:56 "yamada" 08/04/2005 11:03:05 "yamada" 08/11/2005 05:54:56 "yamada" 08/11/2004 07:58:53 "yamada" 12/07/2005 13:54:19 "yamada" 12/22/2005 00:26:49 "yamada" 08/05/2005 02:48:41 "kinosita" 08/05/2005 11:49:58 "kinosita" 08/05/2004 11:51:45 "kinosita" 08/06/2005 04:55:50 "kinosita" 02/21/2005 16:34:40 "akie" 02/21/2005 17:47:14 "akie"
行がランダムだとするならDate::Manipあたりで日付と時間をパースして 比較する必要がありそうだが、例のデータをみるとユーザ別に古い ものから順にソートされているようにも見える。ソートされてるなら いちいち日付と時間を見る必要はない。その辺の条件はどうよ。
>>887 use Date::Manip;
my %e;
while (<>) {
my ($ymd, $hms, $u) = split;
my $t = ParseDate("$ymd $hms");
if (!exists $e{$u} || $t > $e{$u}->{t}) {
$e{$u} = { t => $t, lno => $., s => $_ };
}
}
for (sort { $e{$a}->{lno} <=> $e{$b}->{lno} } keys %e) {
print $e{$_}->{s};
}
ParseDate使わなくても6つの数字を取り出して並べ替えれば
比較できるからモジュール使うの嫌いな人はがんばれ。
入力時点でデータの先頭に余分な0をつけて入力する人がいます 例:01など これを01〜09の範囲で取り除く方法を教えてください。 Googleで Perl 0 取り除く等で検索しましたが、わかりませんでした・・
s/^0//
*1
>>887 雲丹板のシェルスクリプトスレで
答え出てんじゃねーかYO!!
あっちはシェルだからperlで書いたらどうなるって疑問は あってもいいのではないか。
昔、何かの言語で "printn"だか"println" とかいう関数で print文の最後を改行してくれるやつがあったと思うのですが perlで実現するには、どうすればいいですか? 使い捨てのスクリプトを書いてるときいちいち改行を最後に付け足すのが面倒です。
#!/usr/local/bin/perl -l use strict; use warnings; print "HOGE";
-lはprintで改行つけるだけじゃない(こともある)ので、マニュアル読んで 理解してから使えよ。
-lの原文: enable line ending processing, specifies line terminator
$_ = "feel like dance globe I BELIVE"; m/dance$.*^I/ms and print "1\n"; m/dance\$.*^I/ms and print "2\n"; m/dance\n.*^I/ms and print "3\n"; を実行すると、3 としか表示されないのですが、正規表現の `$' は正規表現の 最後でしか許されないのでしょうか? perl-5.8.7 を使用しています。 よろしくお願いします。
>>899 qr/dance$.*^I/ms
qr/dance\$.*^I/ms
qr/dance\n.*^I/ms
をそれぞれprintして見比べて見れ。
901 :
895 :2006/10/26(木) 20:21:56
>>896-898 レス thx!
あーーーでも"-l"だと多分使い捨てスクリプト中の全てのprintに影響
しチャ運ですよね。改行したくない場合もあるし。
alias みたいにちょこっとだけ動作を加えた関数を作れんもんかと思って
聴いてみたんですが、自分ではサブルーチン作るぐらいしか思いつかないし。
Smart::Commentsでも使うといいんじゃないか?
つPerl6::Say
904 :
デフォルトの名無しさん :2006/10/26(木) 21:47:05
.NETのDESCryptoServiceProviderで暗号化されたパスワードを Perlで復号化しなくちゃならなくなったんだけど、Crypt::DESじゃ 復号できないっす。鍵と初期化ベクタはわかっています。 何か良い方法知ってる人はいませんか?
905 :
895 :2006/10/26(木) 22:08:17
>>903 まさにこれです!
Perl6からは use しなくていいんですね。辛抱します。
>>902 こんなのが存在するのを知りませんでした。
スクリプトの書き方自体が変わりそうです。
ありがとうございました。
$\="\n"; じゃ駄目なん?
a b(cd ef) g(hij) k(lm no pq) r s(tu) のような入力がある時、 括弧内の空白文字だけアンダースコアに変換する スクリプトの書き方を教えてください。 ちなみに上の例だと a b(cd_ef) g(hij) k(lm_no_pq) r s(tu) となって欲しいんです。 お願いします。
こんなのしか思いつかないや s{\(.*?\)}{$_ = $&; tr/ /_/; $_}ge
909 :
907 :2006/10/26(木) 22:59:40
>908 ありがとうございます! 置換の中でeオプションを使うのがコツなんですね。 今日数時間考えてもわからなかったのに10分程度で解答をもらえるとは…。 精進します。
-wスイッチとuse warningsの違いが分からないんですが わかりやすく解説しているところがあれば教えてもらえないでしょうか? どちらを使うべきなんでしょうね…
>>910 perldoc perllexwarn
で、perlって何ができるの?
Perlでスクリプトを書けますよ^^
書けないんだもんっ
>>911 回答ありがとうございます。
ドキュメントの解読と自分が理解するための検証に時間がかかりました… orz
概ね、-wは全体に、use warningsは部分的に効くという感じでOKでしょうか?
結局みなさんはどちらを使ってますか?
他人が書いたモジュールの心配もしたいなら-w そうでなければwarnings もちろん5.6以降でだけど
>>900 (?ms-xi:dance*^I)
(?ms-xi:dance\$.*^I)
(?ms-xi:dance\n.*^I)
となりました。perlop と perlre を読んでみましたが、よくわからないです…。
もうちょっと、ヒントもらえませんでしょうか?
>>917 それはあんまり関係なくて、$.と続けて書くと変数$.が埋め込まれるから
期待しない動作になっていると思われる。$(?:).として変数に解釈されない
ようにするか、m'...'の形にして変数展開を抑制するとよい。
配列名を直接書いてサブルーチンに引き渡す時、サブルーチン側で配列の 中身を直接書き換えることができるってことは、配列のコピーを渡すので はなく、各要素へのポインタを渡しているって理解でOkですか? &func (@array)をCで書けば、 func (&array[0],&array[1],&array[2],,,,);
while (<>) { print } とすると、$_ にコマンド入力した文字が入っているようなのですが、 <>; print ; としても入っていないのは何故ですか?
>>920 while () や for (;;) の条件に書いたときだけ特別扱い。
詳しくはperldoc perlopのI/O Operators参照。
>>918 | only-once rule of "?PATTERN?" applies. If "'" is the delim-
| iter, no interpolation is performed on the PATTERN.
知りませんでしたー。ありがとうございました。
list.txtの中に次のように一行だけの文字列がはいっています 1\n2\n3\n4\n5\n ----------------------------------------- 次に、下のようにlist.txtを読み込んで open(OPEN,"<list.txt"); read(OPEN,$list,-s OPEN); close(OPEN); $list =~ s/\\n/\n/g; print $list; としても 下のように表示されません。、 読み込んだ時点で\nを文字列として認識してるみたいですが 改行として出力したいです 1 2 3 4 5
>>924 readしたあとs///で置換する前の$listの値ぐらいは確認しろよ。
>>916 遅くなりましたがありがとうございました。
自分の場合は自作ライブラリ全部にwarningsプラグマを書いてるのと
人が作った物の面倒は見たくないのでuse warningsで行こうと思います。
すっきりしますた〜
speedyCGIはモジュールインストール時に既にシステムにインストールされているPerlを内包するのでしょうか。 それと/usr/bin/perlが15KB少々ですがperl自体のサイズってこんなもので 配布サイズのほとんどが標準モジュールとmanが占めていると考えて宜しいのでしょうか。
>>927 perl の「本体」は lib/perl5/5.x.x/*/CORE/ 辺りに
置かれている libperl.so や bin/perl5x.dll だ。
929 :
890 :2006/10/29(日) 14:22:26
最近,Perlを使ったCGIで特定IPを拒否するルーチン入れてあり, そのリストにあるIPにも関わらず書き込みをされるのですが,どんな原因が考えられますか? 例えば,自分のIPが200.10.10.10の場合,正規表現で指定して(200.*.*.*)もきちんと自分は拒否されます。 それなのに,いくつかすり抜けてくる迷惑書き込みは,一体どのようにしてるのでしょうか? 当然,直接そのIPを指定しても,効果がありません。(上の場合なら,200.10.10.10) 考えられるのは,@Perlが取得するIPアドレスの関数が偽装される。←可能なんでしょうか?? A違うCGIで直接ログファイルに書き込まれている。 というくらいしか思いつきません。 @はともかく,Aに関しては,プロバイダがHi-HOなので,こちらで細かいパーミッションの指定ができません。(たぶん) 他にも原因や対策がありますか?
931 :
デフォルトの名無しさん :2006/10/29(日) 15:07:57
どなたかエスパーはおられませんかぁ〜
>>930 CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
933 :
930 :2006/10/29(日) 15:57:47
そちらのどこに書き込もうか迷ってこちらに・・・。 WebProg板のどこかで聞いてみます。
934 :
デフォルトの名無しさん :2006/10/30(月) 13:02:49
質問です。 eachを用いて処理する時に途中で(if が真になり) やめた場合、次にeach(%xxx)) を呼び出した時に全部処理されませんよね? $xxx{'t'} = "t" $xxx{'b'} = "b" 二回目の時は真にならないのですがそういう仕様なのでしょうか? while (($key, $value) = each(%xxx)) { if ($key eq "t") { return $value; } }
CGIで巨大ファイルを読みながら出力するプログラムを書いてるのですが これって相手が低速の場合、読み終わるまでの時間は変化しますか? 10MBぐらいで相手が10分かかる場合とか
スレ違いだけど、サーバー側の処理は相手の速度には関係ないでしょう
>>934 そういう仕様。
eachの繰り返しを途中でやめてまた最初からやりたければリセットが必要。
リセットするには(voidコンテキストで)keys %xxxしろということになっている。
詳しくはperldoc -f eachやperldoc -f keysをよく読め
938 :
935 :2006/10/30(月) 14:31:57
939 :
デフォルトの名無しさん :2006/10/30(月) 14:47:44
>>934 のようなマヌケなコードを書く人間に、
使いやすいか使いにくいかを判定する能力はない。
941 :
デフォルトの名無しさん :2006/10/30(月) 16:11:29
grepとか使えるんですか? keyとvalueが一緒ってことですか?
誰か exists を教えてやろうぜw つか each の仕様で困ったことないなあ……。
return map { $_->[0]->new } sort { $b->[1] <=> $a->[1] } map { [ $_, $priority{$_} // 10 ] } _plugins; return map { $_->new } sort { ( $priority{$b} // 10 ) <=> ( $priority{$a} // 10 ) } _plugins; 上の二つだったらどっちがいいと思う?ベンチマーク結果じゃなく読みやすさ優先で。 _pluginsはプラグインのリストを返す関数で、%priorityに優先度が入ってる。 $x // $y はdefined $x ? $x : $yになるようにソースフィルタを書いてある。
944 :
デフォルトの名無しさん :2006/10/30(月) 20:02:45
for(my $count = 0; $count < 10; $count = $count + 1); my $socket = IO::Socket::INET->new(PeerAddr => 'localhost', PeerPort => 6544, Proto => 'tcp'); my $live : shared = 1; my $t2 = undef; die "接続できませんでした。\n" if ( ! $socket ); { print "connect\n"; #### K (Kill) を受信したら、action 処理を中断させるスレッドを立てる $t2 = threads->create(sub { while(<$socket>) { print "受信: $_"; last if (!defined($live)); if ($_ =~ /^[kK]/){ \&abort_action(); } }
945 :
944 :2006/10/30(月) 20:03:47
$socket->close(); # これが動いてくれない。でもスレッドは終了しちゃう。 }); } \&action(); # スレッドから終了させたい。 $live = undef; } ActivePerlでこんなかんじの処理を書きました。 サーバーからのKill信号を受信して、長時間かかる処理を中断させるという処理です。 で、処理の中断まではちゃんと動くのですが、$socket->close を呼んでも $socket が閉じてくれません。 $socketをちゃんと閉じるにはどうすればいいのでしょうか?おしえてください。
>>942 だよねぇ。 根本的にeachの用途を間違ってるよね。
>>943 プラグインが1万個あるんじゃなければ後者でいいや。なんとなく無駄
っぽいけど添え字で見難いよりはややましな気がする。
自分なら、はじめから優先度順にならべたプラグインの配列をつくるか、
プラグイン->priority で優先度取れるようにするかな。
>>936 >スレ違いだけど、サーバー側の処理は相手の速度には関係ないでしょう
スレ違いだけど、クライアント側が遅いとサーバ側も引きずられるでしょ。
>>943 シュワルツ変換になれてるヒトだったら前者。
それよりも
> $x // $y はdefined $x ? $x : $yになるようにソースフィルタを書いてある。
sort { ( $priority{$b} || 10 ) <=> ( $priority{$a} || 10 ) }
|| 適用しないの?
>>949 priorityが0のことがあるんじゃないの?
>>948 バカなの?
CGIが全部データを書き出してからクライアントに送信されるだろ?
だからファイル全部読み込んだらCGIプロセスはおわるだろ?
……
あれ間違ってた?
……
956 :
デフォルトの名無しさん :2006/10/31(火) 12:48:52
元ネタは
>>935 か
>>948 はとりあえずおかしい
送信までのプロセスや回線速度、戻ってきたものの処理(表示とか)
に時間はかかるかもしれないが、そのせいでサーバ側の処理が遅れることはない
サーバ側がレスポンスを待つようなら別だけど。
で、合ってますか?
>>951 しむらー!出力!出力!!
>>957 もうすこし仕組みを勉強した方がいいよ。
みなさん、ここは「質問箱」であることを忘れずに。 教育的指導を行なう際は、ヒントや、学習を始めるポイントを提示しましょう。
961 :
957 :2006/10/31(火) 13:53:09
>>958 どこが間違ってる教えてください。
この流れだと誰も正解を言わないと思ったので流れ変えたんです
まぁスレ違いですが。
CGIでファイルをクライアントに送るとき、たいていは一度に全部読み込んで 送るようなコードは書かずに while (バッファに適当な量読む) { バッファを出力 } みたいな書き方になるだろう。出力はは最終的にはOSのTCPスタックまで行くわけ だが、クライアント側が読み出して残りがある一定量以下になるまではブロックする ので、ここで待たされて先にはいかない。したがってファイルの読み出しも間欠的に ちょろちょろ行われることになる。かかる時間をみるとクライアント側の読み出し時間 で大体決まる。読み出しのためにCPUなりIOなりが働いている時間はそのうちのごく わずかではあるが。 もちろんメモリを豪華に使って最初に全部読み込んだり、mmap使ったりsendfile使ったり するとまた話はいろいろ違ってくるだろうがね。
難しいのは日本語だということがよくわかった
要はプログラムは標準出力という宅配ボックスの中にデータを 出来た物からポンポン放り込み、宅配業者はそれを自分のペースで 取ってくんでしょ。
>>965 宅配ボックスがパムパムになるとプログラムは宅配業者を待つしかできなくなる。
967 :
957 :2006/10/31(火) 14:56:41
>>966 現実的にパンパンになるweb出力なんてあるのかい?
ストリーミングとかかい?
って、質問が何を10M、どう出力してんのか曖昧すぎて
話しにならん。 もうしーらねっと。
969 :
948 :2006/10/31(火) 16:21:00
>>957 >
>>948 はとりあえずおかしい
確かに日本語が曖昧だった。
オレはクライアントへの出力について言ったつもりで、
ファイルreadのつもりじゃなかった。
(ファイルreadがクライアント側と関係ないのは当たり前だと思ったので)
>>962 が書いていることで良いんじゃまいか。
970 :
935 :2006/10/31(火) 16:24:50
どうもです。 とあるアップローダーを無料サーバーで運営しています。 認証しないとダウンできないようにCGIを介してダウンロードさせる 仕組みなのですが無料サーバーゆえに30秒以上たつとプロセスが自動で 終わってしまうのです。サーバー側のバッファに溜まると思ったのですが 違うようですね。低速の方の場合は途中で切れてしまうようなので他の事 考えて見ます。ありがとうこざいました。 CGIはだだ ファイルを少し読み込んで出力のくりかえしです。
どうみてもPerlと関係ない話です。
CGIの話は
>>1 のテンプレに従って他のスレでやってください。
出力と、ソケットをごっちゃにしてる人がいるな。
win32::OLEとsamieで IEを操作しようと思うのですが、 アドレスとソースの取得はどのようにやればいいのでしょうか?
ume
975 :
948 :2006/10/31(火) 17:39:51
梅
976 :
943 :2006/10/31(火) 18:12:21
>947 せいぜい100程度のオーダーなので、シュワルツ変換持ち出すまでもないかなぁ。 Module::Pluggableをつかっているので、はじめから優先度順に並べるとかできないのです。 plugin->prioriryも考えたのですが、優先度の高い順に試して、最初にマッチしたプラグインを 使うようにしたので、その案は取りやめました。 >949 自分で書いてみてどっちにしようか悩んでいたので、参考になりました。 >950さんが言っているとおり、priotrityが0の場合があるので、||は使えませんでした。 とりあえずシュワルツ変換を使った方法にしようと思います。ありがとうございました。
質問です! CSVファイルのデータを元に、テキストファイル内の語句の検索・置換を行いたい。 CSVファイル(数十万行) あ,い う,え ・・・・・ 確認なしで一括置換 どのようにすればよいでしょうか? もしくは、どこか参考になるサイトをご紹介ください。
>>977 そのCSVファイルはデータとしてカンマや改行を含む? 含まない?
含まないなら本当のCSVとして全部解釈する必要がなくなるから
処理は簡略化できるよ。
含みません。
980 :
デフォルトの名無しさん :2006/10/31(火) 18:51:20
つエクセル
うーん エクセル、秀丸でやってみたんですけど、実行速度が遅すぎてどうにもなりません そこで、文字列処理に強いと謳われている、perlで処理すれば、パッとできるのかな、と。 perlもエクセル程度の速度ですか? そんなもんなんですか? perlって・・・・・・
>>981 perlの方が断然早いはず。
ファイルの読み書きと正規表現の勉強が必要だね。
perl入門と言ってるまともなサイトなら、
だいたいどこでもやり方は書いてあると思う。
早いですか! 1万行処理したぐらいで止まるようなアプリって、どうなんでしょうね perlに期待です。
perlエディタでお勧めのありますか?
>>984 ぶっちゃけJIS,ISO-2022,Shift_JIS,EUC-JP,UTF-8が扱えてればなんでもOK
>>984 主要文字コードの文字と数値の対応表を全部暗記すればバイナリエディタでもおk
988 :
デフォルトの名無しさん :2006/10/31(火) 21:54:47
>>979 じゃあ楽だな。
速度については処理によって微妙に変わる。
ところで具体的になにをどうしたいの?
読み込んだファイルの最初の空行以前と以後をそれぞれ別の配列に代入したくて @retsu = <FH>; push(@hai, shift @retsu) until ($retsu[-1] eq "\n"); こうしたのですが、いかにも効率が悪そうです。もっと良い方法はありますか。
until するなら最初から while で回せよ(´・ω・`)
読み込むときに別々にすりゃいいじゃん。
>>993 ,994
もう何ヶ月も考えていますが浮かびません。具体例をください。
while (<FH>) { 空行前 ? push (@前,$_) : push (@後,$_); }
997 :
977 :2006/11/01(水) 00:05:53
全く解りません。 ;;
フラグ
999 :
デフォルトの名無しさん :2006/11/01(水) 00:08:46
しゃぶれよ
1000 :
デフォルトの名無しさん :2006/11/01(水) 00:09:24
日テレはルパンにひどいことをしたよね(´・ω・`)
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。