【モダン推奨】Perlについての質問箱 50箱目
■ このスレッドは過去ログ倉庫に格納されています
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perl の区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: http://hibari.2ch.net/php/ )
回答する際はモダンな方法でお願いします
(例 jcode.plではなくEncodeモジュールを使った方法)
理由はもう2012年です。いい加減2000年以前の方法はやめましょう。
最新のPerlを使うほうがかっこいいです。
いつまで勉強しないつもりですか?
過去にとらわれるのはもうやめです。進歩しませんよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
http://www.perl.org/get.html
● 2011/10/30 現在の最新版: 5.14.2
▼ 前スレ
Perlについての質問箱 49箱目
http://toro.2ch.net/test/read.cgi/tech/1319953460/
リンク集は >>2-3辺り
Perl 日本語処理の基礎の基礎 >>4辺り
こういうのを見るたびに
足りないのは知識やスキルではなく羞恥心なんだなと思う 2つの文字列を文字ごとに分解して2つの配列を作ってから↓
ttp://perldoc.jp/docs/modules/Algorithm-Diff-1.15/Diff.pod diffは多少一致してない部分があってもいい、みたいな曖昧な判定をするから、
余計にややこしいんだよな ネットで検索する時は単語をスペースで区切ってそのANDで結果を得るけど、
同じことを正規表現でやりたい時はどう書けばいい? 「$s が hello と world の両方にマッチする」なら、単に
$s =~ /hello/ && $s =~ /world/
と書くだけじゃないの?質問がよく分からないのだけれども >>476
あえて無理やり正規表現のみでやるなら否定先読みを使う
if( /(hoge|piyo).*(?!\1)(hoge|piyo)/ ){ print "成功\n"; } 否定の先読みなんかせんでも
print ‘foobar’ if /(?:foo.*?bar|bar.*?foo)/ ;
で良いんじゃねーのか 仮に検索エンジンみたいなのを書くにしても
何を対象にするのかとか、検索単位とかを決めてもらわんと書きづらいぞ
「同じこと」の通り「対象:Webサイト、単位:ページ」ならGoogleに投げりゃ済むし 検索対象も文字列に決まってるだろ
正規表現でのマッチングだっつってるんだから
逃げてないで考えてみれ >>482
文字列?
テキストでもファイルでもなく?
それって何に使うんだろか…結局、目的は何よ?って話だよ
もしかしたらもっと良い方法があるんじゃ?と勘ぐってしまうのよどうしても またよく判らん屁理屈を
検索の単位が文字列に対してで、それがどこから来たかは問題にならないだろ
まあ、大抵はファイルからだろうけど
で、ファイルならこんなツールがあるよ、みたいな感じで本題から逃げたいのが見え見え >>484
いやまあ、文字列に対してなら
my $hit = 1;
for my $ptn (split(" ",$search)) {
$s =~ /$ptn/ or $hit = 0;
}
こんなんで出来ると思うけど、こんなんで本当に良いのか?
後出し条件とか大量に出てきそうな感じがするんだが お前は、「ワンライナーでどうやりますか」って質問に
スクリプト作成して答えるのか?
「正規表現でどうやりますか?」って質問には、
普通に正規表現で答えりゃいいだろうが。
実際、質問への答えは、
>>477->>479で終了してる。
後出しを心配するなら実際に後出しされてから
盛大に罵倒しろよ あえて制限をつけてパズルとして解くならともかく
現実的な解としては >>477 で十分だよな 元々の要求はただのスペース区切りだから、パラメータ数は不定で、
パラメータ抽出して、その全部に対してマッチングを繰り返すという当たり前の処理になる
でも、そんなことは最初から判っているのでわざわざ聞く筈がない
スペース区切りの文字列をそのまま使ってマッチングがしたいなら、
残念ながらperlの正規表現でそんなことは出来ない、が答えとなる 本物のコミュ障だなぁ
粘着されてる>>476が、可哀想だわ。 質問者のレベルまで勝手に想定するし、、、
>>476から読み取れるのは、拡大解釈しても
「ワンセンテンスの正規表現で書くにはどうしたらいい?」
程度だろーに ◯正規表現で、AND検索の実装って、どうやんの?
×正規表現で、「スペースを使って」AND検索の実装って、どうやんの?
「わざわざ聞く筈がない」まで、分かってんなら、
自分の解釈の仕方が間違ってないか、
自問しろよ 971 名前:名無しさん@七周年[] 投稿日:2006/11/11(土) 00:56:10 ID:M8+ahUZV0
自称スーパープログラマー某
強烈加齢臭
メール見ない メール無視
ドキュメント見ない ドキュメント無視
説明聞かない 説明無視
話聞かない 話無視
ガム→むっちゃー むっちゃー むっちゃー むっちゃー
煎餅→バリバリバリバリバリバリ
菓子パン→モグモグモグモグモグモグモグモグモグモグ
カップアイス→むっちゃー むっちゃー ペロペロペロペロ
フロアすべてに響き渡る 超ばかでかいくしゃみ 当然手でおさえない
異音と異振動
ドスーン!ドスーン! ドカーン!ドカーン! バコーン!バコーン! ズドン!ズドン!
机が近いとマウスポインターが飛ぶ 誤操作誘発
書類だしたりしまうだけでドカンドカン
30秒ごとに口と鼻から異音
ふんっっ! ふんっっ!
備品破壊 貸与P C 破壊 他人のもの破壊
奴の作ったスクリプトとプログラムは使えない バグ製造機
電話や共有携帯電話 キーボードが油ベタベタ
奴に電話とPCとコンソールは触らせてはいけない Perl 5 version 16の正規表現で、地の文の一部としてマッチさせたいときに
バックスラッシュでエスケープせねばならない文字の一覧を教えてください
文字集合[ ]の内外で違うとか、文脈依存があればそれも知りたいです 何をしたいのか知らないけど
http://perldoc.jp/index/core
で疑問のほとんどは解決すると思う。
まあ、エスケープすべき文字を知りたいということならそれは「英数字以外」だ。
\Q と quotemeta 関数について調べてみてほしい。 >>494
ありがとうございます。
質問の動機は単に手で正規表現を書くときエスケープすべきかどうか
悩ましかったから(実際には「+」や「:」や「#」とか「[ ]」の外の「-」はエスケープ無しでも通っていそう)
だったからですが、エスケープして無害ということであればそうします
それはそうとしてquotemeta便利杉、 >>496
おるけど?
まだ後10年は掛る。
触る必要無し
処理速度とか早くなってんのかも知れんけど、
起動が遅くて、使い物にならん。
挙動もバギー、docも揃ってない。
止事無き事情から、アルファ版を正式版として
リリースしただけじゃね? 外部コマンドの話が出てて思い出したけど、
外部コマンドを実行するときに任意の文字列を外部コマンドの引数として渡したい場合、
Linux環境でエスケープすべき文字は?
シングルクォートとバックスラッシュだけエスケープして、それをシングルクォートで括ればOK? なんかPerl 5.16.1のウィンドーズ版のUTF-8対応は中途半端な希ガス、
use utf8;としてUTF-8でソースコードを書いても
open()のファイル名とかsystem()に与えるコマンド文字列とかが'shiftjis'(正確には'cp932')のままだし、
コマンド引数も'shiftjis'(正確には'cp932')のままだし、
なんでああなんですかね… dankogaiがのらりくらりうまく回避しちゃうからじゃない?
俺はもうperlでsjis処理するのはあきらめた。 いろいろ面倒なんで、俺は use utf8; を使わないことにしたよ。 >>498
シェルを経由するのならシェルのマニュアルを読みなさいとしか言えない。
bash の場合なら「定義」の項のメタ文字と「クォート」の項。
シングルクォートなら大体大丈夫なはずだけど。
そういう心配をしなきゃならないならシェルを呼ばない方が無難。
シェル経由でなければシステムコールするだけだから。 >>498
もしかして、普段は Windows 使ってるからコマンドラインを作って渡す方法しか知らないとかそういうこと? 思い付きで気軽にコマンドライン作って出力をキャプチャできるのがLLの良いところなのにね。 >>504
助けてあげる気が無いなら引っ込んでてくれないか? >>498
" " 内では、「$(変数展開) \ `(コマンド置換) !(ヒストリ)」が展開される。
' ' 内では、展開されない。
\ は直後の1文字の機能を無効化する
メタキャラクタ・特殊文字なら、他にも多数。
? * > >> < << | ~ & など
ただし、「! ~」は、bashのみ いっぱーぃぁる
いっぱーぁある
いっぱーぁる
いっぱーる UNIXの歴史をエッセンスにしてUNIX以外でも使えるようにした言語だから学ぶ価値はある。
おれの場合はWindows上で毎日使ってる。慣れの問題もあるが他の言語だとこうはいかない。 バージョンをきにしなくていいなら、Perlは、Windows 2000のパソコンでもつかえる。
現在のRubyは、インストーラがうごかない。インストーラがうごいても、実行時にDLLがどうのこうのいってエラー
Pythonも同様だろう、インストールがめんどくさいのは、損ですよ
Ruby, PythonでもCygwinならいけるかも
Cygwinがきらいなひとは、こまります 今時Cigwinなんて使ってるやついるの?
使う理由が見当たらないんだけど…。 >>516
Windowsでコマンドラインを使うときに
一番便利な道具だよ。 >>516
cygwinはインストールが楽でいいんだよ >>517
その使い方こそがもう洋ナシなんじゃないの? >>519
おまえさん、何でム板にいんの?
WebProg板の住人の発言だったら、まだ分るけどさ。 >>517
cygwin+Perlでできて、バッチファイル(cmd.exe)+Perlでできないこととは…? >>521
その場合、Perlの部分は同じ。違うのは cmd.exe と bash (またはzsh) なので
コマンドプロンプトで出来ないこととは、シェルとシェルスクリプトの実行ということになる。
つまりbash(zsh)の快適な操作性が、cmd.exeにはない。
LinuxやMacで動くシェルスクリプトがcmd.exeでは動かない。 パスに日本語使わない運用ならね
でもそれって制限きついよね?仕事で使うのはまず無理だな そういやcygwinはファイル名に日本語ついていても
ちゃんと動くよな。凄いことだよな。
>>523
お前何の話してんのー? >>520
個人環境なら好きにやればいいんじゃない? ロブ・パイク語録。
>「UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている」 - 1991年ごろ
(中略)
>「そういった日々は過ぎ去り、賛辞は Perl にもたらされた」 - [7] 単機能ツールについて
賛辞は Perl にもたらされた! >>526
25年前の話だからな。
25年も経てば、SMAPも結成して6人から5人になり解散する。 win7でactiveperl
`コマンド` からの応答をファイルに書き出したい
テキストならうまくいくけど、バイナリで失敗する
書き出し用のファイルはbinmodeにしてるので、受取側がおかしい
binmode STDIN
にはしてるけど変わらないみたい
C:> コマンド > file.bin
でリダイレクトすると成功するので、コマンド自体はちゃんと動いてる
何が悪いんだろう どういう具合に失敗するんだ?
バイナリをテキストとして解釈するのか? バイナリエディタとか無いから詳しくは判らないけど、
pptファイルを開こうとしても怒られる 再現する最小コード書けや
バイナリエディタもフリーのあるやろ exe単体のもあるしそれさえアウトでも家の環境で再現させられるだろ
つか業務関連なら会社で聞けば 知らないなら黙ってればいいのに
何かバイナリを標準出力に吐くコマンドなら何でも試せる筈
なかなかそういうサンプルが無いけど これだけの情報で判らないならコード見ても判らないよ
binmode STDIN;
$result = `SomeCom.exe`;
open $out, '>', 'outfile.bin';
binmode $out;
print $result;
これだとNGで、
C:> SomeCom.exe > outfile.bin
これならOKになる >>536
どう見ても標準出力に吐いてるんだけどそのコードで再現することは当然確認したんだよね? STDINは関係ない
パイプをバイナリモードにしろ open $in, '-|', 'SomeCom.exe';
binmode $in;
$result = <$in>;
こんな感じか
` ` を使う限り解決できない? あ、違う
@result に受けて結合か
そこでもまた改行コードが何かしそうな不安が >>539が正解でした
ちなみに、結果を変数に受ける必要はなくて、
入力から出力にそのまま流す方がスマート 答えを知ってる人はシンプルにいきなり正解のみを示すんだよな
で、必要な知識のない人が見当違いのことをいろいろ書いて掻き回す ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ あれ?そういやこのスレは消化されないまま残ってたの?ちょっと前に63箱目が1000になったんだけど。
じゃあ新スレ立てずにそのままここ使う? >>545 ここで良いんじゃない?
Windows7 で ActivePerl 5.16.3 を使っているんだけど、改行が CR LF (0D 0A) のファイルを
<> で読み込むと、行末が LF (0A) だけになる。これはなぜに? >>546
ストリームがテキストモードだからでしょ。
それがイヤならbinmodeすれば? 63箱目のテンプレこぴっとく
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: http://kohada.2ch.net/php/)
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
www.perl.org/get.html
Download Latest Stable Source (5.18.2)
▼前スレ >>549
CGIの話題もム板でいい筈じゃ?
WEBプログラミング板に該当スレが無くなったってのが、理由だったような。
後は、下記を修正。
www.perl.org/get.html
Download Latest Stable Source (5.26.1)
▼前スレ
Perlについての質問箱 63箱目
http://mevius.5ch.net/test/read.cgi/tech/1392820583/ これが次スレになったのね。
おいらもそうだが、
最近、スレが立てられなくなった人が多いのかな? >>550
もしやあなたはCGIとPerlの区別がつかない人? websocketをやってみたいんですが、Net::WebSocketというのとProtocol::WebSocketというのが検索で掛かります。
どっちを使うのでしょうか >>555
フレームワークは勉強の為に避けようと思います。 正直websocketやるのにPeal選ぶ意味は無い気がする
やりたいってんなら止めないけど
node.jsとかgoでいいような
適材適所というか 汎用的なものが作れないかと思っています。
スピードを求めるならjavaで作ろうと思います。 perlでサーバーAで計算した値をサーバーBに送り表示することってできますか?
できるならどうやるんですか?
できればモジュールなくても使える方法がいいです。 サーバーAで計算した値をサーバーBに送るとはどういうことか、何に表示したいのか
perlの前にここを明らかにした方がいい >>561
もっとわかりやすいように質問変更する
サーバーAでログインIDとパスワード入力して
サーバーBに置いてあるユーザー情報と比較してログイン成功なら
サーバーAにログイン成功だと言う情報を送りたい
こういうこと use HTTP::Tiny; # v5.14から標準モジュール
my $response = HTTP::Tiny->new->post_form('サーバーBのURL', {id => $id, password => $password});
if ($response->{success}) {
print '成功';
}
else {
print '失敗';
}
----------
AからBに問い合わせてその結果をAで使うならこんな感じで行けるんじゃない ぜんぜんわかりやすくない。
「ログイン」といってもいろいろ。
Webサイトについてだったら、WWW::Mechanizeとかそういう?
https://www.google.co.jp/search?q=perl+mechanize 鯖へのログインなのか、それともHTMLページ等でのログインなのかも分からん Perlのソケット通信にて、とあるAPIへのリクエストに対して送られてきた全応答を全て取得した上で処理をしたいと思っています。
たとえば簡単な例だと
応答データ例:(00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10);
データは00〜FF全てを含み、終了は6連続"00 00 00 00 00 00"になった場合となります。
==
my $data = <$socket>; # data => 00 01 02 03 04 05 06 07 08 09 0a
my $data2 = <$socket>; # pending....
==
$/ = \x5;
my $data = <$socket>; # data => 00 01 02 03 04 05
my $data2 = <$socket>; # pending....
==
のように、$/に当たるデータで停止してしまいます。$data2は待てど暮らせど進みません。
また6バイトで1組なので、sysread($socket,$buf,6)や$socket->recv($buf,6,0)、recv($socket,$buf,6,0)
といった方法もしてみましたが、これら全てpending...状態で1こちらも待てど暮らせど進みませんでした。
一括で取得する方法はありませんでしょうか。 ■ このスレッドは過去ログ倉庫に格納されています