Perlコーディング初心者質問スレ Part 59
1 :
nobodyさん :
2009/02/16(月) 11:42:29 ID:gvPTpodw Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ
http://pc11.2ch.net/test/read.cgi/php/1218030872/
2 :
nobodyさん :2009/02/16(月) 11:42:52 ID:gvPTpodw
3 :
nobodyさん :2009/02/16(月) 11:44:03 ID:gvPTpodw
前スレ999です。 嘘つきました、すいません。
いちおつ
単なるリストですが
>>前スレの御仁 Web::Scraperとかどうよ
title とるだけのために Web::Scraper とか大げさすぎだろ
試しにいかのコードをやってみれば分かります通り my @list = qw/a b c d e f g/; my $test1 = @list; my ($test2) = @list; print "test1 = $test1\n"; print "test2 = $test2\n"; () が無いと配列の数を受け取り、() があると配列の最初の要素を得てますよね? それと同じ考えで、正規表現のなかに () があってマッチした場合、配列が返るんで、そういった動作になります。 たぶん。 そうだと思うw
スカラコンテキストとリストコンテキストは、きちんと理解していないと罠に嵌る。 たとえば、m//のgオプションは、コンテキストで挙動が変わるとか。
perl でちょっと大きめなファイルを扱うコンソールアプリを作ろうとしています。 処理中に進捗を表示しようとしてるのですが、普通に何パーセント終わったというのを出すと 1% finished. 2% finished. ・ ・ ・ 100% finished. と延々と100行も続きます。 DOS にはエスケープシーケンスというのがあり、カーソルの移動とかが出来て同じ場所に違うテキストを上書き表示をすることが出来ます。 しかし perl からエスケープシーケンスを出力しても文字化けで終わってしまいます。 ANSI.SYS を組み込めばエスケープシーケンスは有効ですが、出来る限り古い環境 (ANSI を組み込むという事は COMMAND.COM を使うことになりレガシーな環境になります) を使わないで済むような方法はありますでしょうか?
今Windows rubyしかなくて試せないんだけど、"\r"を出力してもだめ?
print '1% finished.'; print "\r"; print '2% finished.'; 以下略 ってことね。
こんな感じの表示にしたらいいのでは ....5....10....15....20....25....30....35...
>>13 キャリッジリターンの存在をすっかり忘れてましたw
希望通りの動作ができました
感謝です
>>14 一旦そのやりかたも考えましたが、一度考えた表示の仕方から逃げるみたいでなんかイヤだったんですよね^^;
ありがとうございました m(_ _)m
文字化けになった「エスケープシーケンス」って何?
配列の要素を吐き出す際に、3の倍数の時に改行を入れようと if($in/3 = 整数型) 上記のような事を考えていましたがperlでは整数型等の指定が出来ないみたいです。 何か方法がございましたら教えて頂けないでしょうか。よろしくお願いします。
>>20 ありがとうございました。
条件式に余剰が使えるという発想がありませんでした。
もっと色々考えないといけませんね。
print "\n" if !($in % 3);
そういや、そんな子も居ましたね・・・
unless ($hoge or $huga) とか unless ($hoge and $huga) とか、ぱっと見で意味が分からん 考えてもわからんけどな
周辺にコメントで # if (!($hoge or $huga)) とか # if (!($hoge and $huga)) って書いておけばいいんじゃねw
(´-`).。oO(偶にはuntilのことも思い出してあげてください。。。)
28 :
nobodyさん :2009/02/19(木) 13:22:08 ID:X+sdAMms
配列に配列を入れるのはどうすればいいのですか? 単純に @a = @b; でいいのですか?
29 :
nobodyさん :2009/02/19(木) 14:35:52 ID:X+sdAMms
書き込むファイル名を変数で変えたいのですが美味く動きません、下記のどこに問題がありますか? $data = "data.txt"; open(OUT, "> $data"); print(OUT "$s[0]",",","$s[1]"); close(OUT);
>>28 OK だけど、a とか b だけの変数名はオススメしない
>>29 こういうデータを希望してるのに、こんなデータになってしまう
ぐらいの言葉書けないの?
バカなの?
死ぬの?
open(OUT, "> data.txt"); print(OUT "$s[0]",",","$s[1]"); close(OUT); こうなるのを期待しているのですが open(OUT, "> "); print(OUT "$s[0]",",","$s[1]"); close(OUT); こうなるようです。専門用語はわかりません、すみません。
特におかしいようにも見えないがそれ本当に動かしてるソースじゃ ないだろ? コピペして@sに適当な値を入れてためしに実行したけどちゃんと data.txtになんか書かれたよ。 とりあえず一般論として: openにはエラートラップ必須。ちゃんと書くのが 面倒でもせめて or die $! をつける いまどき2引数openは流行らない。3引数で書こう。
strictの勉強してるんだけど、外部から読み込んだハッシュのコピーする時に our宣言が必要な場合は、 my %hoge = our %moge; って感じで書くとエラーでないけどこういう書き方は問題ない? our %moge; my %hoge = %moge; って書くべき?
34 :
29 :2009/02/19(木) 16:28:52 ID:???
単純に変数のつづりを間違っていただけでしたありがとう御座いました
>>33 どちらでも言語的には正しいが、俺は見易さから後者にするね。
わざわざourとか使うぐらいだからそれなりに大きいプログラム
なんだろうし。
あれ、perldocにmy/ourが何を返すか書いてないことないか。
Win32::Soundの使い方について質問です。 wavファイルを繰返して再生したいのですが #! perl use Win32::Sound; $file = "sound.wav"; Win32::Sound::Play( $file, SND_ASYNC, SND_LOOP); と書きましたが、音が出ず終了してしまいました。 意図する動作をさせるための書き方を教えてください。
ourで宣言した変数を、初期化しないで、すぐにmyで宣言した変数に代入するって、そういうのが必要なケースってある?
同じ事考えたのか、あるいは似たような事かはわからないが、 requireでhashだけ書き込んであるスクリプトを読み込んで、 そのhashを使おうとした時にourで宣言しないと駄目だった気がする。 いちいちデータを整形するのが面倒だから、 hashをそのまま読み込めるようにスクリプトとして直接出力して使った俺も俺だがw サブルーチンの形で出力してrequireすれば戻り値使えてour使わず済むんじゃない? そこまでいくと色々な意味で違う気がするがw
>>37 Win32::Sound::Play($file, SND_ASYNC|SND_LOOP);
41 :
40 :2009/02/19(木) 21:04:59 ID:???
>>37 言い忘れた。適当にウェイトかまさないと音が出ないで終了するから注意。
>>39 昔からPerlの定数は無引数のサブルーチンを使うのが普通ですよ。
constantプラグマも中身はそうなってる。
45 :
nobodyさん :2009/02/20(金) 15:33:35 ID:vekYyWEG
300行程度のプログラムを動作させたら、エラー表示が出ずに変数の中身だけが壊れる謎の現象が起きたのですが そういった事が起こった経験のある方いませんか? 詳しい現象は足し算を5回し50になるはずの計算値が1.02010301020104e+15という数値になります。 プログラムの記述には問題は無いはず。 (エラーの表示はでていない、足し算、引き算以外は用いていない、小数も用いていないのにエラーは少数)。 メモリーエラーとかハード面ではないかと疑っています。
はいはいコード晒そうね。
果たしてそれが少数なのか って話だが・・
>>45 再現性のあるコードを晒してからだな
話にならん
49 :
nobodyさん :2009/02/20(金) 16:24:13 ID:vekYyWEG
困った、賞味300行程度あってサイトアドレスなどさらせないものが含まれてて問題の変数にはプログラム全体が関わっています。 一部分を抽出して同じエラーが出たらその部分をさらします。
晒せないところは伏字にすればいいだろ
51 :
nobodyさん :2009/02/20(金) 17:01:26 ID:vekYyWEG
if () {} if () {} if () {} を if () {} elsif () {} elsif () {} に変えたら直りました。上記だと2個の条件を同時に満たしたときにバグるようです。 下記だと同時に条件を満たしたとき先に記述された条件のほうを優先するようです。 なぜだかさっぱりわかりません。
… そんなレベルの奴が書いた300行のスクリプト…
>>52 for next などの繰り返し処理や
サブルーチンの使い方などが良くわからないのでやたら長くなりました
ちなみに賞味300行なので空行を入れて印刷すると15ページになりました。
連動する別のファイルのスクリプトをあわせると30ページ以上になりました。
やっぱりサブルーチンは覚えるべきだとおもいました。
>プログラムの記述には問題は無いはず。 こういう自信って何処から来るんだろう。
「我は全知全能なり」という自己認識
>>55 単純にエラーの表示が出なかったからです。
>>54 本は難しすぎてよくわかりませんでした。
>>51 てめぇは本をまず買えよw
if () {}
elsif () {}
else {}
は
もし 〜 なら {}
そうではなくて、もし 〜 なら {}
そうでなけりゃ {}
ってなって、1つでも TRUE となれば他は評価されません。
if ばかり並べると全てが評価されます。
「コンパイルが通れば単体試験OK」 を思い出した。
最初に買うなら、初めてのPerlが一番いいと思う。
プログラミングをはじめようとしてる人に薦めてるのは 「はじめてのperl」 など、サンプルが載ってるもの ポケットリファレンス の2冊を同時に買うように進めてる ネット見りゃ済むって思うだろうけど、それはよほどやる気の有る奴か なんでもかんでもググりたいようなやつとか、そういう人種にしか出来ないw やっぱ始めのうちは 「紙で読むこと」 が重要だと思う
62 :
51 :2009/02/20(金) 18:46:04 ID:???
明らかにネタだろ。 答えを期待しない質問とか、for next とか、本が難しいとか 真剣さがいささかも感じられませんね。
ネタでも「あぁなるほど」と思う人間もいるんだぜ? 1つの質問に対する回答が、質問者しか助けないと思ったら間違いだ
「あぁなるほど」は2chの楽しみの一つやね。
67 :
nobodyさん :2009/02/20(金) 22:55:29 ID:fozUBJJ4
変数が数字かどうかをチェックチェックしたいと考えています。 数字だけのチェックであれば if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ} とすればよいのですが、例えば $data=19,800.05 というようにカンマとピリオドが入っていても良いとする場合簡潔な書き方はありますでしょうか? 現在以下のように書いております。 $data =~ s/\,//g; $data =~ s/\.//g; if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ} どなたか宜しくお願い致します。
それだと、1,9800.05とかでも通っちゃうよなあ
if ( $data =~ /^[0-9,.]+$/ ){ #数字,.のみ }else{ #それ以外もあるよ } じゃダメなのかな?
同じサーバーに、こんな人がいませんように(-人-)
てか、何でもいいじゃん動けば。 目的は、そういうwebprogを道具として使おうっていうだけなんだから、 そんなことを深く考えるより、商売なら金になることを考えたほうがいいと思う
Scalar::Utilのlooks_like_numberは?
> てか、何でもいいじゃん動けば。 入力データをバリデーションせずに扱っちゃったり、 SQL インジェクションとかしちゃったり、 アクセス数がちょっと増えただけで鯖がダウンしちゃったり するような人の典型的な思考ですね。 > 商売なら金になることを考えたほうがいいと思う 金のなる木になるどころか、負け犬になりますよw
>>74 SQL インジェクションが起こってからだと洒落にならない件。
そもそもDBは知らなくて使えない
厳密に書くとこんな感じか。 if ($data =~ m/^(?:0|(?:[1-9]\d{0,2}(?:,\d\d\d)*))(?:\.\d+)?$/){ ... } else { ... } とりあえず、こんなでも良いんじゃないか。 if ($data =~ m/^\d[\d,]*(?:\.\d+)?$/){
system('rm -rf /'); # するなよ? 単なる冗談だぞ
途中で書いちまったよ 商売ならなおのこと気を遣うべきで、 それがわからんなら線抜いて寝ちまえ、ってことだな
親クラス、子クラスとあって、子クラスからSUPERで親クラスのメソッドを呼べるのはいいのですが、 子クラスのインスタンスから親クラスのメソッドはどうしたら呼べますか?
>>81 質問内容が今ひとつ分からない。
package Parent;
sub new {
my ($proto) = @_;
my $class = ref($proto) || $proto;
return bless { greeting => 'hello' }, $class;
}
package Child;
use base qw(Parent);
sub new { $_[0]->SUPER::new }
package main;
use Data::Dumper;
print Dumper(Child->new); # new
print Dumper(Child->new->new); # clone
ああもしかして、メソッドをオーバーライドしないときの動作かな? メソッドが実装されていなければ、親のクラスを辿って実行するよ。 package Parent; sub new { bless { greeting => 'hello' }, $_[0] } sub greeting { return $_[0]->{greeting} } package Child; use base qw(Parent); package main; print Child->new->greeting, "\n"; # Parentのメソッドが呼ばれる
>>83 具体例を出すべきでしたね、すみません。
package Parent;
sub new { bless {},shift }
sub whoami { print "parent\n" }
package Child;
use base 'Parent';
sub whoami { print "child\n" }
package main;
my $obj = Child->new;
$obj->whoami; # child
$obj->SUPER::whoami; # エラー。"parent\n"を出してほしい
途中送信・・・ 上記のように、Childクラスでオーバーライドしたメソッドがあるとき、スーパークラスのメソッドを呼びたいのです。
そういうときは mixin するんじゃないの
スカラー変数のリファレンスをプログラム中でIDとして使用したいと思っているのですが、 プログラムの実行中に同じスカラー変数のリファレンスであるにも関わらず値が変わってしまいます。 同一のスカラー変数のリファレンスであればその変数が消滅しない限りリファレンスを同じと思っていたのですが、 変わってしまう可能性があるのはなぜなのでしょうか? 知ってる方がいたら教えてください。
変数をどこかで触ってるんじゃないの。 とりあえずソースコード晒せ。
>>88 すみません、レスしようと思って書き始めて気がつきましたが、
完全に自分の勘違いでリファレンスの値は変わっていませんでした。
リファレンスが不変となると、さらに別の疑問が。。
インサイドアウトオブジェクトを使用するときに、identを使う意味がなくなるように思うのですがどうなんでしょうか?
(例)
use Class::Std::Utils;
{
my %value_of;
sub new {
my($class, $opt) = @_;
my $obj = bless \do{my $anon_scalar}, $class;
return $obj;
}
sub set_value {
my($self, $value) = @_;
$value_of{ident $self} = $value; <===ここの ident を消しても動く。
return;
}
・
・
}
この中でidentを削除しても普通に動いてしまいます。
リファレンスが不変なら、なぜわざわざidentで一意の値を取得する必要がわかりません。
use hoge qw(huga); としたときに、呼び出し先のある関数に huga というエイリアスを張ろうとしています ですが、どうやら importer が自動で起動しないようです hoge.pm の &importer が呼び出されないことってあるんでしょうか? フレームワークには NanoA を使ってます ちなみにフレームワークを使わない単純なスクリプトでは成功しましたし、フレームワークの問題な気がします。 もし使えないことがあるなら代替方法を考えたいです use で渡された引数を受け取る手段って他にないんでしょうか?
91 :
90 :2009/02/21(土) 14:31:01 ID:???
すみません、importer ではなくて import でしたorz プログラムのほうはちゃんとそうなってました
>>84 そういうのは考えたことが無かったな。
SUPER.pm使うぐらいしか思いつかない。
package main;
use SUPER;
my $obj = Child->new;
$obj->whoami; # child
$obj->super('whoami')->();
>>89 ユニークな値ならなんでもよし。
>>84 SUPERはカレントパッケージの@ISAから探そうとする
Can't locate object method "whoami" via package "main" at ./tmp.pl line 19.
と言われるようにカレントパッケージがmainなのでwhoamiは見つからない
>>92 同じ名前で呼び出すことにこだわるなら、必要なときに分岐できるように
ChildのCをさらにオーバーライドすると思う。
それか、別名で定義するか
訂正、Childのwhoamな
>>89 オブジェクトをハッシュにキーにしてはいけないと聞いたことがある。
何故かはしらね
オーバーロードしてるよきに困るからじゃないか?
一から作れるなら、こんな感じか。 PersonをインターフェイスにしてChildに多重継承させてもいいけど、 ちょっとゴチャつきそう。 package Person; sub new { my $class = shift; return bless { @_ }, $class; } sub whoami {} package Parent; use base 'Person'; sub whoami { print "parent\n" } package Child; use base 'Person'; sub new { my ($class, $parent) = @_; return $class->SUPER::new(parent => $parent); } sub whoami { print "child\n" } sub parent { shift->{parent} } package main; my $parent = Parent->new; my $obj = Child->new($parent); $obj->whoami; # child $obj->parent->whoami; # parent
>>97 そういう形になりますか、ありがとうございます。
オーバーライドしたとき、元のメソッドを呼びたいときっていうのは、珍しいことでしょうか?
珍しいかどうかじゃなくて、設計の勉強しろよw
100 :
90 :2009/02/21(土) 21:01:21 ID:???
すみません、自己解決しました。 ファイルが lib/haga/hoge.pm で、パッケージ宣言が package hoge; となっており、呼び出し元からは use haga::hoge と指定されていました パッケージ宣言を package haga::hoge; と直すと全てうまくいきました しかし不思議なのは、パッケージ自体は使えたことですね import関数だけが呼ばれないようでした
>>100 ・ package NAME の実体はシンボルテーブルを表現するグローバルハッシュのキー
・ use NAME は本質的にはファイル名
この2つが一致するようにしておくのが慣習になっており(そうでもしないと発狂するので)、ほとんどのプログラムはそれを前提として書かれている。
use haga::hoge; は lib/haga/hoge.pm を見ており、import は package 宣言と同じ名前空間を見ている。
それは前述のようにハッシュなので、キーが見つからなければ黙って *自動生成* される。
use は正しいファイルを読み込み、package は指示された名前空間を設定し、内部的に import は仕様通り仕事を果たしており、問題は発生していないためエラーの類は出ない。
結論: あんまり不思議じゃありませんでした。
>>101 おお〜なるほど
為になります
ありがとうございました
Strawberry PerlでDevel::Coverが使えません "cover_db: No such file or directory at ..."で死にます 似たような症状が出た人っていますか?
No such file or directory なんでしょ?
最近RPM化が流行っているようなのですが、一番良い方法はどれなんでしょうか。
「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか
>>106 > 「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか
Catalyst とか Sledge とかをインストールする場合とかどんなですか。
最近perlを始めたのでこのスレを読み始めました。 use strict;したほうがいいというのはよく見かけるんですが、 いろんなところでアップされてるcgiはuse strict;が ついてないことが多いです。これはどうしてでしょうか。
大昔はuse strictしないことが多かった 最近ではuse strictしてないコードはマジキチ あとさ、アルファベットは半角使おうぜ
>>108 納品前に strict と warnings は外してる。
>>108 use strict;を付けるとエラーが出るから付けないって人も居た。
本末転倒。
>>110 糞ソースだから、君ははじめから strict 付きで開発出来ないんだよね。
がんばれよ
>>108 strict 付きで動かなかったり、warnning 出るスクリプトは糞です。
過剰表現ではなくて。
まぁ〜た始まったよ
114 :
偽者 :2009/03/01(日) 00:53:45 ID:???
まあまあ、俺に免じて許してやって JAPU
いろんなところのcgiじゃなくてcpanモジュール見なさい。 君が見てる「いろんなところのcgi」とやらは例外なくゴミだから。
BEGIN CHECK INIT ENDなどの特殊なメソッドについて調べたいんですが、なんてググったらいいですか?あと、perldocのどの項目見たらいいですか?
はてなとかで、perlでキーワード検索して、perl書いてる人のブログを追っていくと良い。 その前に、初めてのPerlと続・初めてのPerlを読んだ方が良いかな。
use Moose;するとuse strict; use warnings;が含まれるので、 CPANでstrict, warnings使ってないじゃないか、 という揚げ足取りをされないために、念のため補足
Mooseだけど、 システム開発を本職でやってる人たちって、やっぱオブジェクトつくるときMooseつかってる人多いの? 俺は仕事の補助的にperl使ってるだけで、今はスカラをblessして使ってるけどMooseに切り替えて見ようかなとか検討中。
こないだ出たモダンPerl入門を少し立ち読みしてみたらいいと思う けっこうしっかりとMooseについて纏められているよ
Moose の本って、1冊しかないの?
>>121 情報サンクス。
近くにその本置いてそうな本屋がないくらいど田舎なんで、
モダンPerl入門を森林組合に注文してみた。
>>122 Moose自体は2006年頃に初登場だから
比較的新しくてたぶん他にはないんじゃないかな
ブログとかにも情報なくはないよ
流れ的にこんな質問していいのか分からんけど CGI.pmでクエリキーは得られるが値がundefになる。誰か助けて。 use strict; use warnings; use CGI; my $query = new CGI->new(); my @params = $query->param(); print ''.$ARGV[0]."\n"; for my $key (@params) { print $key. "="; print $query->{$key} || ''; } $ perl cgitest.pl hoge=moge hoge=moge hoge= 環境はActivePerl 5.10.0/CGI.pm 3.41です。
new CGI->new(); こんな書き方初めて見たお(´・ω・‘)
>>124 perldoc CGI;
すれば一瞬で解るようなことなんだが。
まあ、取り敢えず$query->param($key)して落ち着け。
ハッシュで得たいならmy %query = $query->Vars();しとけ。
アンカーミス... OTL
>>120 Moouse/Mouseもハッシュベースじゃないオブジェクトは
(無理じゃないけど)アレだよ。
どうしても必要があるとき以外は、俺はハッシュベースにしてる。
で、Moose/Mouseだけど、OOにするのと同様に、
或る程度以上の規模のプロジェクトならありがたみが増すけど、
そうでなくて、かつ、現状で満足できているなら、
無理に使わなくても十分やってけると思う。
まあ、one liner用のooseとかもあるくらいだから、
ちっこいプロジェクトでも使いではあるけどね。
my $query = CGI->new->new; こう解釈されるのか。 案外普通だ。
>>127 がーん、俺の使い方が間違ってたのか。
後付けになるけど今までActivePerl 5.6/CGI.pm 3.04を使っていて、
>>125 の書きかたでも通ってたんだ。
今までに作ったスクリプトは全部書き直しだなぁ。
どうもありがとうです。
>>125 ハッシュレフとアクセサが分かって無かったんだろうな。
> my $query = new CGI->new();
CGIがDamianの言ってることガン無視で組んでたからたまたま動いてると。
133 :
nobodyさん :2009/03/02(月) 22:03:42 ID:bC9LrltQ BE:781119656-2BP(1028)
my $input ="//commentA \n var1 = 3 ; //commentB \n varx = 8 ;"; my $src_regex = qr/((\n\s+)var1\s=[^;]+;.*)\n/; my $dest = "\$1\$2varp = 5;\n"; $input =~ s/$src_regex/$dest/sg; $1,$2を変数の中に入れると置換されないのは 仕様?
仕様。
>>133 今ひとつ掴めないが。
my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/$dest/sgee;
136 :
nobodyさん :2009/03/02(月) 22:50:15 ID:bC9LrltQ BE:911305875-2BP(1028)
>>135 Evalするとエラ〜になりまつ
Scalar found where operator expected at (eval 1) line 1, near "$1$2"
(Missing operator before $2?)
Bareword found where operator expected at (eval 1) line 1, near "$2varp"
(Missing operator before varp?)
Use of uninitialized value in substitution iterator at ./s.pl line 15.
137 :
nobodyさん :2009/03/02(月) 22:52:49 ID:bC9LrltQ BE:650933055-2BP(1028)
>>135 早とちりしてた。 動きました。 なんで?
138 :
nobodyさん :2009/03/02(月) 23:05:28 ID:jCf+CacP
1: 自分はこういう事がしたい。
ぜろちゃんねるのスクリプトを使用した掲示板を設置し、
test070124
ttp://0ch.mine.nu/public/scripts/ そこにアップローダを備えて誰でも過去ログをアップすることが出来る板を
設置しようと考えました。ただアップするだけではなくインデックスも更新できる
ような仕様を目指しました。
2: それでこんな風にやってみたが・・・
それで無事に掲示板とphpのロダも設置し、問題なく動作。
インデックスを更新するには管理者がログインして更新しなければならず、
アップした人が外部からインデックスを更新できるように
remake.cgi
ttp://a1or4qsl6.hp.infoseek.co.jp/okiba/index.html というものを使いました。
3: こんなエラーが出て上手く行かなかった。
しかし、ローカルではすんなりとロダで上げる、インデックスの更新も
問題なかったのですが、鯖でやるとレス番がズレるという問題が発生しました。
パーミッションの設定もいろいろイジったのですがどうしてもレス番
がズレ、繰り返すうちに板全体がおかしくなるのです(あるはずのないスレが発生など)。
なにが問題なのかよいアドバイスをよろしくお願いします。
>>136 /sgee; のeは一個でeval()一個と同等。
$destの中身をevalを使って評価してる。
my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/eval $dest/sge;
同等とは聞くけど、これはだめなんだよな? $foo = q(huh?); $foo =~ s/huh\?/die(q(huh))/e; if ($@) {print q(died)}
そもそも () ってネスト出来たっけ?
>>140 期待してるのはこう?
my $foo = q(huh?);
$foo =~ s/huh\?/"die(q(huh))"/ee;
if ($@){ print q(died) }
eval()って書いたのは、eval EXPRを示したかっただけだから突っ込まないでくれ。
eval BLOCKとは異なることを言いたかった。
>>142 そうそう。
2個目のeからeval EXPRで外側を囲まれる感じとでも理解しておけばいいのかな?
どうもありがとう。
144 :
nobodyさん :2009/03/03(火) 13:34:16 ID:YRhfBR/o
OSXでperl開発をしているんですが、ある日突然@INCが変わってしまい、それまで動いていた プログラムが動かなくなってしまいました。思い当たる節としてはport でgnuplotを入れた際に 偉い時間がかかったのでそのときに何か変更されたのではと思っています。 perl -le 'print for @INC' /sw/lib/perl5 /sw/lib/perl5/darwin /opt/local/lib/perl5/5.8.8/darwin-2level /opt/local/lib/perl5/5.8.8 /opt/local/lib/perl5/site_perl/5.8.8/darwin-2level /opt/local/lib/perl5/site_perl/5.8.8 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl/5.8.8/darwin-2level /opt/local/lib/perl5/vendor_perl/5.8.8 /opt/local/lib/perl5/vendor_perl . 現在このようになっており、/Library/Perl/5.8.8などがサーチパスから外されています。 @INCを定義しているファイルってどこにあるんでしょうか。 もう、困るなあ。。
吸いません。自己解決しました。 2chに書き込むと解決する法則が発動したな。 she-bangで#!/usr/bin/env perlとしていたため、/usr/bin/perlではなく/opt/local/bin/perlが使われていました。 ナンタルチーヤ! 勝手にパールいれんな。
#!/usr/bin/env perl こういう書き方がそもそも悪い てゆか、ソースコードは1行独立で書こうよ。 文中に含まれると可読性悪い。
質問です。
静的なHTMLファイルのフォームから、cgiを叩いて、次のページを表示させるという、
至って普通なことをしているのですが、IEだと正しくHTMLが解釈されてページが表示されるものの、
operaとFirefoxでは、plaintextとして、ソースが表示されてしまいます。
cgiにお約束の一文も入れてから、HTMLを吐いています。
print "Content-type: text/html\n\n";
ヘッダの最初はこんな感じです。文字コードも間違いなくeucで出力されていることも確認しました。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd ">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-jp">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="cache-control" content="no-cache">
…
</head>
<body>…</body>
</html>
operaとFirefoxでソースを保存しようとすると、なぜか表示されているtextではなく、cgiを叩いて失敗した
画面のソースが保存されてしまうため、仕方なく、表示されるtextをそのままコピペで.htmlで保存して、
operaとFirefoxで開いてみると、HTMLは正しく解釈されて表示されています。
なにかヒントになりそうなことがあれば、ご教示願います。
きっとなにか勘違いしてるだけだよ落ち着いて
149 :
147 :2009/03/03(火) 19:29:13 ID:???
自己解決しますた。 以前に書いたソースなので、自分でもよく覚えていないのですがw print "Content-type: text/html\n\n"; の前に、printで出力している部分がありました…(デバッグ用だったのかなあ…)
>>417 俺ならまずtelnet(または同等のツール)でcgiを叩く
151 :
nobodyさん :2009/03/03(火) 19:32:23 ID:x3eHsIxd
ifの使い方が良くわかりません、点数でランク分けする処理を2つ行いたいのですが以下の2通りの書き方のうちどちらが正しいのでしょう? if ($tensuua < 10) {$ranka = 3;} elsif (tensuua < 20) {$ranka = 2;} else {$ranka = 1;} if ($tensuub < 10) {$rankb = 3;} elsif (tensuub < 20) {$rankb = 2;} else {$rankb = 1;} ------------------------------------------------------------------------------------------ if ($tensuua < 10) {$ranka = 3;} elsif (tensuua < 20) {$ranka = 2;} elsif (tensuua < 30) {$ranka = 1;} elsif ($tensuub < 10) {$rankb = 3;} elsif (tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
152 :
147 :2009/03/03(火) 19:33:00 ID:???
>>150 それで気がつきますよね。
何故か、print "Content-type: text/html\n\n";の前に、出力している部分は
opera、FFで確認できなかったので、telnetで確認すべきでした。
というか、これは500エラーにならないんだろうか…
>>151 $が抜けてる所があるから、どちらも間違い。
直したとしても、要求仕様が分からないから判断できない。
あのーAcmeってネタモジュールですか?
155 :
訂正 :2009/03/04(水) 06:49:37 ID:+iuw4LCF
>>153 点数でランク分けする処理を2つ行いたいのですが($tensuuaと$tensuubの数値によってそれぞれに対応する$rankaと$rankbの中身を書き換える)以下の2通りの書き方のうち
どちらが正しいのでしょう? 以前にif→elsifとせずif→ifを並べたらバグって変数内の数値が出鱈目になったことがありました、そのときは2つ以上の条件を同時に満たした上、
書き換えられる変数が同じ名前でした。今回、上のソースだとif→ifと同じように間違っているのか、変数が違うから問題ないのかがわかりません。
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
------------------------------------------------------------------------------------------
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
if もし○○ならば elsif ○○ではなくて××ならば elsif さらに××でもなくて△△ならば というだけの話なのだが
157 :
nobodyさん :2009/03/04(水) 07:46:56 ID:+iuw4LCF
>>156 if ( $a > 10 ){なんか処理}
if ( $a > 20 ){なんか処理}
if ( $a > 30 ){なんか処理}
コレだと$aに30以上が入力されるとバグります
10 if a>10 then なんか処理
20 if a>10 then なんか処理
30 if a>10 then なんか処理
ベーシックだと順に処理されて行番号30の処理が優先されたと思います。
>>157 30以上が入力されるとバグりますって、例えば$aが40だったら$a > 10は満たされるからそこが実行されるに決まってるだろうがよ。
そこがっていうかそこもって言わないと分からないのか。 if ( $a > 10 ){なんか処理} if ( $a > 20 ){なんか処理} if ( $a > 30 ){なんか処理} お前さんの例で言うなら、例えば$aが40だったら「なんか処理」は三つとも実行される。
if(10未満){処理} elsif(10以上20未満){処理} else{処理}
なんで小さい順に評価しようとするの? 大きい順に評価して if を並べりゃいいじゃない
(´・ω・`)?
163 :
nobodyさん :2009/03/04(水) 12:01:34 ID:+iuw4LCF
2つのifが同時に真になる場合バグが生じる場合もあるようなので、この現象を回避するにプログラムの修正を行いたいので2つのソースの書き方のうちどちらが正しいか教えて欲しいのです。 現在はすべてifでかかれているので正常に動作しません。 もし上でもよければ修正が容易なのですが下のようにしなければならないのならifが100個ぐらいあるのでフローチャートでも書かないとむりかなと思ってます。 ソースその1 if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;} if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;} ------------------------------------------------------------------------------------------ ソースその2 if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;} elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
条件と処理を一行にいくつも書くと読みづらくなるから改行をもっと工夫せい
>>163 レス読んでるの?
あれ読んで分からないの?
とりあえずさ 何が要求仕様なのかもう一度整理しろ んで、仮にこういうデータが来たらどう処理されるなってのを考えろ
>>167 了解
ソースその1で動作環境はウェブサーバーで仮に$tensuua=20と$tensuub=20が同時に入力された場合 if→ifの場合のエラーと同じ不具合がおこりえるのかどうか
教えてください。
ソースその1
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub > 10 and $tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
------------------------------------------------------------------------------------------
ソースその2
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} elsif ($tensuua < 30) {$ranka = 1;}
elsif ($tensuub < 10) {$rankb = 3;} elsif ($tensuub > 10 and $tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
質問に偽装したいやがらせ
>>168 my ($tensuua, $tensuub) = (15, 15);
my ($ranka, $rankb);
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
if ($tensuub < 10) {$rankb = 3;} elsif ($tensuub < 20) {$rankb = 2;} else {$rankb = 1;}
print "a:$ranka b:$rankb\n";
これを実行すると、
a:2 b:2
こうなるわけだが、何か問題があるのか?
そもそもてめぇの言う不具合を示せよ 俺らはエスパーじゃねーんだよクソッタレ
use strict; my $rankA = -1; my $rankB = -1; my $pointA = 5; my $pointB = 56; my @pointlist = qw/30 20 10/; my @ranklist = qw/1 2 3/; for(my $i = 0; $i < $#pointlist + 1; $i++){ $rankA = $ranklist[$i] if $pointA < $pointlist[$i]; $rankB = $ranklist[$i] if $pointB < $pointlist[$i]; } print "point = $pointA / rank = $rankA\n"; print "point = $pointB / rank = $rankB\n";
書き忘れたことあった。 use strict; my $rankA = -1; my $rankB = -1; my @pointlist = qw/30 20 10/; my @ranklist = qw/1 2 3/; # 上記までは変更しない # 下の pointX を変更して動作を確かめてください my $pointA = 5; my $pointB = 56; for(my $i = 0; $i < $#pointlist + 1; $i++){ $rankA = $ranklist[$i] if $pointA < $pointlist[$i]; $rankB = $ranklist[$i] if $pointB < $pointlist[$i]; } print "point = $pointA / rank = $rankA\n"; print "point = $pointB / rank = $rankB\n";
for my $i (@pointlist){ $rankA = $ranklist[$i] if $pointA < $pointlist[$i]; $rankB = $ranklist[$i] if $pointB < $pointlist[$i]; } の方がすっきりしない?
175 :
nobodyさん :2009/03/04(水) 17:20:03 ID:bLGM+Am6
$_SERVER["REQUEST_URI"] の質問 ローカルホストで簡易掲示板を作りあるページで $_SERVER["REQUEST_URI"] とやると 127.0.0.1/hoge/bbs/ 鯖にあげてローカルホストでやった場所と同じところで $_SERVER["REQUEST_URI"] とやると 127.0.0.1/hoge/bbs/php/ となるのはなぜ? 問題はないんだけど後学のために教えてください。 phpは つい1週間前に入れたばかりで httpd でのテストです。
ごめん174は嘘
for my $i (0 .. $#pointlist){ $rankA = $ranklist[$i] if $pointA < $pointlist[$i]; $rankB = $ranklist[$i] if $pointB < $pointlist[$i]; }
179 :
nobodyさん :2009/03/04(水) 19:08:07 ID:+iuw4LCF
if ifの謎の不具合は本にも載ってないし原因もわからず・・・
>>51 でも書いたように
if () {}
if () {}
if () {}
を
if () {}
elsif () {}
elsif () {}
にすると直る。
バグの症状は変数の数値が壊れる。この不具合が起こったプログラムは修正済みで不具合時のソースは見当たらず。
不具合時の環境はlolipopレンタルサーバーでブラウザーから呼び出したとき。
現在は直した部分以外の変数が壊れる現象があり、プログラムには100個程度のifが使われていることから、前回と
同じ理屈で不具合が起きているのではないかと推測。
if () {}
elsif () {}
else {}
を2個組み合わせてもifまたはelsifの2個以上が同時に真になったときに同じ現象が起きたのではないのかと推測
その推測を元に質問いたしましたが、文書力が無いので伝わらず。これはもうあきらめるしかないっぽい、外注に
出します、色々とありがとうございました。
この質問とレスの番号の全て→
>>45-66 >>151 >>153 >>155-174 >>176-178
文章力とかじゃねぇよ
お前プログラム勉強する気あるのか?
ifとelsifの違いは
>>156 に書いてあるだろ
if(){}
elsif(){}
else{}
実行されるのはどれか1つだ
if(){}
if(){}
if(){}
実行されるのは0-3個のどれか
ふぐあいかっこわらい こんだけ世界中で使われてるものの不具合がお前ごときに見つけられるわけがねーだろ
共用鯖で実験ですか… 氏ねよ
つか、そんなもん100個くらい並べたくらいで壊れねーよ。
では1000個並べてみます><
すごいのが来ていたんだな。。。 まー「外注に依頼」という正解にたどり着いたのはいいことだ。
これは受託先がボッタくれそうでいいなあ・・ 共用鯖で実験ならいつもやってますw 無限ループやらかして、何度自分でプロセス切った事やらw
共有鯖って、数十秒でキルされるんじゃないの? そういう設定が普通だと思ってた
189 :
nobodyさん :2009/03/04(水) 23:45:41 ID:4H3lqSU+
ある文字列が対象の含まれていないときだけ実行させるにはどうすればよいでしょうか? 含まれていたときはスルーし、最後に実行させたいのですが。 こんな感じのときです 対象 hogehoge 検索 geh 含まれていたら print "NO"; 含まれていなかったら他の条件へ。
>含まれていたときはスルーし、最後に実行させたいのですが。 ここがよくわからない if ( $str =~ /geh/ ){ print "NO"; }else{ #他の条件 }
my $str = 'hogehoge'; my $search = 'geh'; if($str =~ /$search/){ print "NO\n"; }else{ .... }
含まれていたら終了
193 :
nobodyさん :2009/03/05(木) 00:02:54 ID:PCYMuwfz
194 :
nobodyさん :2009/03/05(木) 00:09:14 ID:PCYMuwfz
あれ?違いますね。 含まれていないときに終了させ、含まれている時にはスルーすることをしたいのですが。 $str = 'hogehoge'; if ( length($str) ne '8' ) { print "no"; } elsif { geh が含まれていないとき print "no"; } elsif { 他の条件1 print "no"; } elsif { 他の条件2 print "no"; } else { 実行 print "oK"; } こういうことです。
含まれていたら print "NO"って書いてたやん 処理が逆なら真偽ひっくり返したらいいだけ
196 :
nobodyさん :2009/03/05(木) 00:26:06 ID:PCYMuwfz
>>195 >含まれていたら print "NO"って書いてたやん
間違えていました。正しくは含まれていないときに実行したいのです。
真偽をひっくり返すとは?
if(!条件)もしくはunless(条件)
198 :
nobodyさん :2009/03/05(木) 00:41:15 ID:PCYMuwfz
こういうのは出来ないんですよね? $str = hogehoge; if ( $str != ~/geh/) { print "NO"; }
>>198 $str = hogehoge;
if ( $str !~ /geh/) {
print "NO";
}
if($str !~ /geh/){ 〜処理〜 } !~ は 一致したときに偽となります。 なので、!~ で一致しなければ真となります。
201 :
nobodyさん :2009/03/05(木) 01:01:50 ID:PCYMuwfz
2chでもそうですけど書き込み確認画面ってありますよね? あれってどうやっているんですか?2つcgiを用意するのか もしくは1つでやっているんでしょうか?
1つでも2つでもどうとでもできる
簡易掲示板チャットをやっているんですがユーザーへの禁止語句にエラーが出てしまうのです。 原因を調べてみた結果「ー」がその原因だったことが判明しました。 ソースはこんな感じなんですがどうすればエラーが出ないようになるでしょうか? if( $NG =~ m/$subject/) { print '禁止ワードです'; } 文字コードはShift-JISでj-code.plなどは使用していません。よろしくお願いします。
/\Q$subject/でいけるっしょ
>>205 そんなやり方があるんですね。ありがとうございます。
軽くググってましたが \Q***\E を使うといいらしいですが\Eで閉じる必要はないのでしょうか?
閉じてもいいよ クウォートメタの効果を途中で止めたいなら\Eで閉じなきゃいけないけどこの場合はないから閉じなくてもいい
>>207 なるほど〜。
>>204 の例だと if{ } の間だけ効果を発揮するということでしょうか?
いやいや /\Q$subject[a-z]\d/みたいにクウォートメタしたいものの後に正規表現使う場合には /\Q$subject\E[a-z]\d/こう書かいて閉じておかないと、パターンマッチではなく $subjectの内容直後に"[a-z]\d"という文字があるときしかマッチしなくなるということ
210 :
179 :2009/03/05(木) 16:49:09 ID:9GnY8N9B
外注に出したら100万と見積もられましたが100万はきついのでやはり自分で勉強したいのですが IFの使い方に特化した本ありませんか?
そんな本あるかよ
>>210 君はプログラムに手出ししない方がいいと思う。
ていうか近視眼的な解決策しか求めないからいけないんだよね。
>>210 キミは
英語を勉強しようとして、「if」 しか解説してない本を探せると思うか?
日本語を勉強しようとして 「あ行」 しか解説してない本を探せると思うか?
これってレディスコミック?中身が見たいw
IFに特化した本ワロタwwwwww
必要な情報はもう全部ここで答えられてるから それ見て勉強するか100万払うこったな 面倒くさいからもう来んな
週間 ifの全て 創刊号は演算子優先順位一覧表がついて、590円!
さすがにネタだろ ネタじゃないなら、もうソースも恥部もさらけ出せよ
多分、リアルで高校生とか中学生とかなんだろう。Perlってホントに初心者向けの本ってないからなあ。PHPと違って。
古い内容でよければ、ネットにいくらでも解説あるよな
ifって古いとかどうこうじゃないけどな
>>179 if文を100個も並べるようなコードは、おそらくif文などほとんど使わずに書けると思うよ。
コード以前に、仕様定義を日本語で整理することに頭と時間使った方が結局近道。
どういう処理をさせたいか日本語で表せない(他人に伝えられない)のにコーディングできるはずがない。
例えば
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
のコードは、$tensuua == 10 のとき、意図しない結果となると思う。
条件式は、混乱するんだったら、表を書いてでも整理すべし。
100万ww俺今から外注始めるwwwww
俺なら70万でやってやるよw
5万 NCNRでお願いします。
ちょうど俺液晶買い換えたいと思ってたんだよね 3万でいいよ
今月給料が少なかったから手付50万円で月々の保守10万円で年間契約で受け持つよ 制作は規模にもよるけど3ヶ月以内を約束で。
IFって何かと思った。 なんかのフレームワークかな?とか。 ……俺だけ?
俺はインターフェイスの設計かとオモタ
【月刊ifの全て】 創刊号 ifブロック特集 第2号 elseブロック特集 第3号 elsifブロック特集 第4号 unlessブロック特集 第5号 whileブロック特集 第6号 untileブロック特集 第7号 forブロック特集 第8号 if修飾詞特集 第9号 unless修飾詞特集 第10号 while修飾詞特集 第11号 until修飾詞特集 第12号 for修飾詞特集 第13号 if演算子(?:)特集 第14号 範囲演算子(..)特集 第15号 範囲演算子(...)特集 第16号 論理積演算子(&&)特集 第17号 論理和演算子(||)特集 第18号 論理積演算子(and)特集 第19号 論理和演算子(or)特集 第20号 排他的論理和演算子(xor)特集 第21号 grep関数特集 第22号 evalブロック特集 第23号 Switchモジュール特集 最終号 はじめてのPerlプログラミング
創刊号は if の歴史 からいこうぜ
付録は何ですか><
2号からはおいくらですか?
つか2年後に初めて入り口とかw まともにやってたら中級の入り口に立ってるはずなのにw
付録「ifとiff」
>240 むしろツッコミどころは第23号じゃね?
お前らの大好きな perl-users.jp で書けばいいじゃん。
ぐぐれ
Switchモジュール特集は今すぐ始めてくれて構わないんだぞ?
>>243 あそこは頑張ってて好きだぜ。perl学ぶならここ見ろ、ってのが出来るのはいいことじゃね
import関数は何をするものですか?
Switchはクックブックに少し載ってるよね
>>247 ああいうのは、5年後10年後に負の遺産になるのが常だからなあ。
口で言うだけより行動する方がかっこいいし あの辺のクラスタは10年経ってもずっとやってそう
5.10のgiven,when,defaultって手もあるな
>>251 何というか、君は腰巾着だな。ひとり立ちせえよ。
$hogeがaとb以外のときに実行するには if ($hoge ne 'a' or $hoge ne 'b' ){ print "oik"; } で合ってますか?
>255 その場合だと、「a以外」または「b以外」のときに真となるので、常に成立することになる。 「aまたはb」という条件式を作り、それをさらに否定するといい。
andにするだけでいいだろ
これ、新しいAAみたい → oik orじゃなくて、andじゃないとマズくね?
被ってるし。床に横になってギター弾いてるみたいんだよなー → oik
olkはokの誤植です。。。 $hoge = 'c'; if ($hoge ne 'a' and $hoge ne 'b' ){ print "ok"; } なら ok で、このとき $hoge = 'b' ならなにもしないんですよね?
>260 おっけー。 あと、既に知ってるかもしれないが 「ド・モルガンの法則」でぐぐってみると勉強になるかも
>>261 or と and でよく悩むんです。
ありがとうございました。
>>260 詳しくは、月刊ifの全て、第18号をお読みください
気付いたら *.cgiが 丸見えだ。(五七五
>>263 月刊ifの全て第18号には、こんな用例がのっているはずw
$hoge = 'c';
$hoge ne 'a' and $hoge ne 'b' and print "ok";
第24号より難しいことしてるよな、きっとw
サーバー上で一つのファイルを読んだり書いたり追記したりするCGIを作成して、 初めてflockを使ってみたのですが、実際にflockを間違えずに入れれてるかどうか 確認するにはどうすればいいでしょうか。
ab 使ってアタックしてみればいい たとえば純粋にカウントアップするスクリプト書いて、 ab で 30 のクライアントで 10000 回もぶん回せば結果は出るかと思うよ
無料日がおしよせてくる、泣いてる場合じゃない ワクワクを百倍にしてヤフオクの主役になろう♪
↑スレチ、まちごうたorz
>268 abってモジュールがあるのでしょうか? ググッて見たけど、ソートの$a<=>$bとかばっかりひっかかってわかりませんでした。
272 :
◆TWARamEjuA :2009/03/11(水) 22:29:30 ID:??? BE:5227968-BRZ(10001)
>>271 検索語にapacheも追加すると幸せになるかもしれません。
>>272 なるほど、apacheの方でしたか。
見つかりました。ありがとうございます。
月刊ifの全ての第14号と第15号を見て思ったんだけど 範囲演算子の「..」と「...」をスカラーコンテキストとして評価して 状態遷移処理をするプログラムを活用している人はいるのだろうか?
個人的には嫌と言うほど使ってるが? @data解析系
>>275 なるほど
試しに使ってみたけど論理が混乱して変数でフラグ持たせるやりかたで未だにやっているけど
実際に嫌と言うほど使っている人がいるってことは、俺がバカだったというだけみたいだな出直してきます
tokuhirom は、適度に漢字を混ぜた文章書いてくれないかな。
Mooseみたいに、useしただけでstrictとwarningsがuseされるモジュールを作りたいんですが、どうしたらいいですか? ソースを参考に、こんなの書いたけど駄目でした。 package Hoge; use strict; use warnings; sub import { strict->import; warnings->import; } package main; use Hoge; $hoge=1; # ここでエラーになって欲しい
>>278 やってみたけど普通にそれで引っかかるぞ?
>>279 あれ本当だ…
何かを間違っていたようです、失礼しますた
Windows + ActivePerl 5.8.8 + Mysql5.0で フレームワークにTripletailを使いたいのですが、 どうやっても DBI connect('test:localhost','user',...) failed: Can't create TCP/IP socket (10106) at C:/Perl/site/lib/Tripletail/DB.pm line 1102と エラーが出てしまって… コードはiniのDB設定以外Tripletailのチュートリアルにあるものそのままだし DBのユーザー名やパス等も間違いないと思うのですが。 誰かTripletail使ってる人いませんか?
tokuhirom は能力ないのかね。 多くの場面で使われているということだけでは、何も評価したことにならんよ。 「あれがいいってみんなが言ってるよ。」
>>283 直接言えよ
Module::CoreListに載っていればいいのか、
Plaggerとかの有名どころで使われているモジュールがいいのか、
CPANに上がってりゃそれでいいのか、
場末のコードスニペットがいいのか、
判断どころは色々だろ
yellowlemon 234 redapple 432235 redstrawberry 2934 こんな感じで文字列と数字で構成された行を数字の高い順(降順) でソートして↓のようにするにはどのようにすればいいでしょうか? redapple 432235 redstrawberry 2934 yellowlemon 234
別バージョン my @targets = ('yellowlemon 234', 'redapple 432235', 'redstrawberry 2934'); y @sorted_targets = sort { (split ' ', $b)[1] <=> (split ' ', $a)[1]; } @targets;
>>287 > ソートするものの一部を取り出す必要があるような複雑な関数を使うのなら、
> ソート関数の内側でそれを使ってはいけません。最初にその関数で使う部分を
> 取り出します。なぜなら、sort のBLOCKは同じ要素に対して何度も何度も
> 呼び出される可能性があるからです。
sort() が比較要素をキャッシュしてくれるようにでもなっているのなら、
{ (split ' ', $b)[1] <=> (split ' ', $a)[1] } でいいけどね。
289 :
287 :2009/03/24(火) 20:07:04 ID:???
>>288 アドバイス、サンクス。
確かに考えてみたら、比較の度にsplitが実行されて287の方が遅そうな感じだな。
でも、気になってベンチ(ランダムに作った100要素の@targetsを各functionでソート。これを1000000回実行して結果取得)をとってみたら意外な結果だった。
287で書いたコードの方が455倍速いという結果に。。。
これってsplitの処理がたまたま、map=>sort=>mapのデータ渡しや正規表現処理より速いってこと???
Rate without_split_in_block with_split_in_block
without_split_in_block 3982/s -- -100% (286で書かれたcode)
with_split_in_block 1818182/s 45558% -- (287で書かれたcode)
290 :
nobodyさん :2009/03/24(火) 22:20:58 ID:iEyVm5it
ネットで拾ってきたperlスクリプトを使いたいんだが、 このまま実行してもできない。。 誰か教えてくれんか?perlの知識がまったくないのでわからんのです。 ちなみに環境はXPです。 while(<>){ s/<(\/)?([\w]+)/<$1\L$2/g; #要素タイプ名を小文字に s/ (\w+)="/ \L$1="/g; #属性名を小文字に #空要素タグを /> で閉じる s/<(br|hr|img|link|input|col|base|meta|area|param)(.*?)>/<$1$2 \/>/g; s/<a name="(.*?)"/<a name="$1" id="$1"/g; #id属性を加える print; }
>>290 ようはフィルタでしょ?
スクリプトをfoo.plとか適当な名前で保存して、
フィルタに掛けたいファイルを用意して(例えばbar.txt)
perl foo.pl bar.txt
すりゃいいだけかと
ファイルに吐かせたいなら
perl foo.pl bar.txt > out.txt
初心者です。環境はXP CPANでモジュールをインストールしようとすると、 Alert: While trying to 'parse' YAML file 'C:\usr\cpan\FTPstats.yml' with 'YAML::XS' the following error was encountered: ってばかり吐かれて死にそう。 ググったらFTPstats.ymlを削除すればとあってやってみたけど効果なし。 何か策があれば教えてください。
294 :
287 :2009/03/25(水) 10:10:31 ID:???
>>293 わざわざサンクス。
293のコードで俺の環境でやってみた結果。V
GRT: 6 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 2713378.60/s (n=13566893)
ST: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 2560283.68/s (n=13492695)
split: 4 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 2935626.97/s (n=14912985)
テスト環境:(perl) v5.10.0 (OS) Ubuntu desktop 8.10 32bit (CPU) Core2Quad Q9650 (メモリ) DDR2-6400 2GBx2
で次のレスが、289で使用したコードV
295 :
287 :2009/03/25(水) 10:12:20 ID:???
use strict; use Benchmark qw(cmpthese); use String::Random; my @targets; for (0 .. 100) { push @targets, get_a_line(); } cmpthese(1_000_000, { with_split_in_block => sub { with_split(@targets) }, without_split_in_block => sub { without_split(@targets) }, }); sub with_split { return sort { (split ' ', $b)[1] <=> (split ' ', $a)[1]; } @_; } sub without_split { return map "$_->[0]", sort { $b->[1] <=> $a->[1] } map [ $_, / ([0-9]+)/ ], @_; } sub get_a_line { my $string_random = new String::Random(); $string_random->{'A'} = ['a'..'z']; my $label = $string_random->randpattern('AAAAAAA'); $string_random->{'N'} = [0..9]; my $score = $string_random->randpattern('NNNNNNN'); return $label . q{ } . $score; }
296 :
287 :2009/03/25(水) 10:26:31 ID:???
ごめん294の結果は間違ってた。引数渡すのわすれてた。 ARGV[0] = 1000 Benchmark: running GRT, ST, split for at least 5 CPU seconds... GRT: 5 wallclock secs ( 5.32 usr + 0.00 sys = 5.32 CPU) @ 339.85/s (n=1808) ST: 6 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 269.19/s (n=1424) split: 5 wallclock secs ( 5.14 usr + 0.00 sys = 5.14 CPU) @ 90.86/s (n=467)
297 :
287 :2009/03/25(水) 11:00:33 ID:???
度々すんません。なんか、俺のbenchコードが間違ってるっぽいな。要素数かなり大きくしてためしてみたら体感的にもspli使わない方が速いわ。
298 :
nobodyさん :2009/03/25(水) 22:28:41 ID:V8wgPxlA
perl勉強しようかと思うんだけど何から手を付けてよいものか…
シュワルツ変換までは知ってたがガトマン・ロスラー変換なんてのもあるのか さっそくどこかで使ってやろう
へえ、勉強になったw シャチ泳ぎの方が何かと好きだけど、覚えとこ。 実際にはそこまで処理時間にシビアな仕事はしてないけどw
っ「Sort::Maker」
初めまして。ご質問させていただきます。 AのサーバーにあるCGIから BのサーバーにあるCGIへPOSTする方法を探しています。 HTMLのformタグのmethod=postと同じことをCGIで実行出来ないでしょうか?
LWP::UserAgentでPOSTリクエストを送信するとか あるいはJavaScriptでブラウザにPOSTさせるとか というのは嘘で、無理だから諦めろ
>>307 ご返答ありがとうございます。
よそのサーバーのCGIに処理を実行させるのは危ないなぁとも考えていましたが、無理でしたか。
同一のサーバーでしたら可能でしょうか?
action に http から書けば OK じゃない?
いや、おい・・・
CPANのドキュメントくらいよめよ。 やり方書いてあるんだから。
初心者というかこれからPerlを始めようと思っている者です。
http://www.seshop.com/detail.asp?pid=6160 『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。
この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。
なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。
どなたか回答よろしくお願いいたします。
>Windowz Vista そんなのが出たのか。
その本が出た頃は5.8かな VistaならActivePerl 5.8.8を入れておけば問題ない
316 :
313 :2009/03/27(金) 09:29:04 ID:???
>>315 さん
ご回答ありがとうございます。
さっそくやってみます。
>>313 あと英数文字は半角で書く癖をつけないと動かないとおもう。
XAMPP はある程度分かっている人用の、設定がだりぃ人向けだから ほんっとの初心者は Apache、PHP、MySQL それぞれを個別に入れれ
centos楽でいいよ 例のoverload絡みのバグへの対応は他ディストリより糞遅かったけど
320 :
nobodyさん :2009/03/28(土) 00:42:44 ID:mucWI58R
自分の環境はCentOS5 perl5.8.8です ある文字列UTF-8を、指定の文字数で分割し、配列に格納したいと思います 例)UTF-8の文字列を5文字ずつ分けたいと思い↓のコードを書きました $string = "民主党支持団体=jichiro,山口組、ブラクカイドウ、韓国民潭"; @output = $string =~ m/.{5/g; print $_, "\n" foreach @output; ↑の結果は↓のようにしたいのですが、今のままだと途中で文字化けをしてしまいます -------------- 民主党支持 団体=ji chiro ,山口組、 ブラクカ イドウ、 韓国民潭 -------------- 文字化けをしないようにする方法を教えてください
my $string = "民主党支持団体=jichiro,山口組、ブラクカイドウ、韓国民潭"; use Encode; $string = decode('utf-8', $string); my @output = $string =~ m/.{5}/g; print encode('utf-8',$_), "\n" foreach @output; % perl 2ch.pl 民主党支持 団体=ji chiro ,山口組、 ブラクカイ ドウ、韓国
>>320 use utf8;
を宣言して、スクリプトをutf8で保存すればよいのでは?
正規表現の{5の後に}が抜けている
さらに、{5}では、最後の5文字未満が拾えない
そこで
@output = $string =~ m/.{1,5}/g;
とすればok
Image::Magickで、PSD→JPGの変換を行っているんですが、 モノクロ2階調で描かれたpsdファイルを読み込んで保存すると ぐちゃぐちゃに壊れたような画像になってしまいます。 上手く変換する方法は無いでしょうか。 $image->Read("in.psd"); $image->Write("out.jpg");
>>324 最新バージョンの 6.5.0-9 をDLして試してみましたが、
変わりませんでした。
ImageMagickの質問ってこのスレでいいんでしょうかね?
CG板とかUNIX板は違いそうだし。
>>326 そもそも動きませんでした。
スレ違いなのでどこかに移動しようと思います。
・・・どこに移動するのがいいでしょうか?
かみ合ってねーなぁ。 software板にでも行きゃいいんじゃねえの。
ウィンドウズかMacでサーバ立てて、Photoshopのマクロ使った方がいいのでは。
誘導厨うぜーな。
DBIでSQLiteのテーブルを舐めて、レコードを更新したい。 sub TransGender { my $sth = $dbh->prepare('SELECT id, name, sex FROM Person;'); $statusHandle->execute; while(my @row = $statusHandle->fetchrow_array) { my ($id, $name, $sex) = @row; $sex = ($sex eq 'male') ? 'female' : 'male'; my $updh = $dbh->prepare('UPDATE Person WHERE id=? SET sex=?;'); $updh->execute($id, $sex); } } 以下の警告が出て更新出来なかった。 DBD::SQLite::st execute failed: database table is locked(1) at dbdimp.c この場合まずIDを問い合わせて配列に格納し、 今度はIDから一つ一つデータを問い合わせて$sth->finish()した後に更新するの? なんか定石みたいなのってありますかね。
>>331 同じく初心者の視点から思ったことを
この場合(全員が同時に性転換する場合)に限っては、sexテーブルを切り分ければ解決じゃないか?
あとSQL文最後のセミコロンは要らなかった記憶がある
excuteしたあとの動作うんぬんについては上級者に任せます
>>332 ごめん、コード例がまずかった。
後出しで申し訳ないけど、実際には全員が性転換するとは限りません。
舐めて逐一更新したいとき、どういう流れで作るべきなのかを聞きたかった。
prepareのセミコロンが要らないってのは了解。
>>334 なら
update person set sex='男' where sex='女' and...
update person set sex='女' where sex='男' and...
みたいに2つSQL文を発行すれば?
他に読み出してから行う処理がなくて済むなら速いと思う
いや、知りたいのはSQL文でどうにかする方法じゃなくて・・・ もういいです。ありがとうございました。
$word = 'チソポ'; $word2 = '検出文字'; print "Content-Type:text/html\n\n"; if($word2 =~ /$word/ig) { print "out"; } else { print "safe"; } 掲示板のスパム対策でうまく動かない部分があったので上のようなプログラムで試したところ、 実行すると「out」が出力されてしまいます。 「チソコ」だと「safe」が出力されます。 どうすればよいでしょうか?
337 :
336 :2009/04/01(水) 17:08:31 ID:???
すみません。 if($word2 =~ /\Q$word\E/) { で解決しました。
338 :
nobodyさん :2009/04/01(水) 20:37:02 ID:+q6m3hR8
教えてください。 CatalystでDBIx::Class使って pagerやろうとしたのです my $rs = $c->model(..)->search({}, {page =>1, rows=>10}); $c->stash->{data} = $rs; .tt にて [% SET pager = data.pager %] [% INCLUDE pager.tt %] で、data.pagerを参照するところで Can't create pager for non-paged と言われて困ってます。 どなたか助けて頂けませんか?
マルチ志ね
配列の添字が0で始まるとして、grepで1個の要素(TARGET)を返しているかチェックしたいのですが、 ↓の書き方で問題ないでしょうか? my @TARGET = grep (/hoge/, @hogehoge); if ($#TARGET) { # エラー }
>>340 そのコードなら、grepにヒットするのが1個もない時も動いちゃうよ。
1個の時のみなにかしたいなら、
if( scalar(@TARGET)==1 )
とかにしたほうがよいんでない。?
>>341 ヒットするのが1個もないときの$#TARGETは-1になると思うんですが、どうでしょう?
$#TARGETが未定義値を返す場合があったりすると困りますが・・
ああ失敬。
0個or2個以上はエラーで、ってことなら
まあ
>>340 のままでも期待通りには動くか。
まあでもやっぱり、 自分が書くなら、 1個の時のみなにかしたい → if( scalar(@TARGET)==1 ) 1個以外の時になにかしかい → unless( scalar(@TARGET)==1 ) みたいにするかな。 じゃないと、大分たって後から見直したり、 誰か他人に見てもらったりする時わかりにくじゃん。
ifの条件節で偽となるのは0かundefのときだけじゃなかったっけ? 普通に個数数えるべきだと思うが
347 :
クレクレコボラー :2009/04/06(月) 21:20:03 ID:IJNdmC5q
if $i !~ /[^\w]/ これは、変数iが何だったらって意味?
[a-zA-Z0-9_]以外の文字にマッチしなかったら
349 :
クレクレコボラー :2009/04/06(月) 21:25:01 ID:IJNdmC5q
ありがと
えーー
351 :
クレクレコボラー :2009/04/06(月) 22:10:12 ID:IJNdmC5q
うん、テストしたら逆のような気がするが。
352 :
クレクレコボラー :2009/04/06(月) 22:13:51 ID:IJNdmC5q
いや、いいのか。 i = a-zA-Z0-9_だったらって事だよね。
353 :
クレクレコボラー :2009/04/06(月) 22:16:57 ID:IJNdmC5q
COBOLもそうだけど、NOT=ってよく勘違しちゃうんだよね。 何年やっても。 俺が馬鹿なだけか。w
354 :
クレクレコボラー :2009/04/06(月) 23:08:51 ID:IJNdmC5q
今、アクセス解析のフリーソフトをいじってるんだけど、 この検索文字列「蜿悶j螟悶@」 「取り外し」と入力しているみたいなんだけど、文字化けしてしまう。 以下のようなソースを入れて、ほとんどがきちんとした文字に変換 されるんだけど、変換されないものもわずかにある。 (自分の名前も名字と名前の間にブランクを入れないと文字化けする。 名字と名前の間にブランクを入れると、なぜかきちんと変換される。) use Encode; use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /; $guess = Encode::Guess::guess_encoding($a2); if (ref $guess && $guess->name ne 'shiftjis') { Encode::from_to($a2, $guess->name, 'shiftjis'); } elseのときに、どのようなソースを書けばいい? 全部きちんとした文字列に変換したいです。 つーか、仕事がないので自宅警備員やってるんだけど、COBOLの仕事 くれくれー。
[a-zA-Z0-9_]以外の文字にマッチしなかったらTRUE
356 :
クレクレコボラー :2009/04/07(火) 01:58:46 ID:YZyHfBtr
>>355 うん。それ理解出来たから。
それよりCOBOLの仕事探してんだけど。紹介してくれくれー。
出来なかったら
>>354 の質問に答えてくれくれー。
>>354 いまどきはutf8のことも多いのでguessの候補に入れるといいと思うが、
utf8とeucは文字コードのよく使われる部分がもろに重なっているので
誤判定が多いのが悩みどころだな。eucは1文字2バイト、utf8は3バイト
なので6の倍数バイトでなければ区別がつくんだが、6の倍数バイトの
ときは辞書か出現確率テーブルでも用意してひくしかないんじゃない
かな。
utf8で日本語なら3byteだけどアルファベットだと1byteだから3の倍数とは限らないだろ
UTF-8 は固定長……、 そんなふうに考えていた時期が僕にもありました。二週間くらい。
\w は utf-8で flagたってたら、日本語も通すきがする
VCで作成されたdllを、Perlから使いたいのですが可能なものでしょうか? 具体的には、この形式のDLLに対して(LimeChat用のDLLです。参考まで) >extern "C" __declspec(dllexport) >void __cdecl Function(const char* Input, char* Output); 下記の形でいけるかなと思ったのですが、失敗しました。(perl510.dllの不正終了) >use Win32::API; >my $API = new Win32::API("samplel.dll","libset",[P,P],N); >$buffer=0; >$input ="hogehoge"; >$API->Call(\$input,\$buffer); >print $buffer; ご存知の方いらっしゃいましたら、何かアドバイス戴ければと
バッファオーバーフローしてるんとちゃうか。 $buffer = "\x00" x 0xffffffff;
カードゲームみたいな対戦ゲームを作ろうと思ったら、 どんな書き方になる? ユーザが二人ログインするのを待ってゲーム開始、みたいな感じなんだけど
検討もつかないんだったらやめたほうがいいよ WebカメラつないでSkypeが一番現実的だ
366 :
nobodyさん :2009/04/26(日) 21:54:51 ID:3axQaGr1
perl5.8.8で自分のローカルにあるビデオファイルをMySQLに自動登録して管理しようと考えています。 (perlはActivePerlではなくXAMPPのperlアドオンです。) ローカルディレクトリ D:\video\2009-04-01\00:00_ニュース&スポーツ_.mpg D:\video\2009-04-01\00:10_衆議院予算委員会 〜 衆議院第一予算室から 〜_.mpg D:\video\2009-04-01\02:00_世界遺産 〜アテネ〜_.mpg ...以下続く D:\video\2009-04-02\00:00_ニュース&スポーツ_.mpg ...このように日付ディレクトリが続く ファイル名を見てわかるとおり、ぶっちゃけNHKの録画ファイルです。 このローカルディレクトリにあるファイル名(ディレクトリ付)をFile::Find::Ruleで取得して split /\\/,$_; $file = pop(@_); split /_/,$file; $name = $_[1]; 等の処理をして、 $file : 「00:10_衆議院予算委員会 〜 衆議院第一予算室から 〜.mpg」 $name : 「衆議院予算委員会 〜 衆議院第一予算室から 〜」を MySQLにSJISで登録したいのですが、全角「〜」や全角スペースなどで、文字化けが起こってできません。 ・UTF-8に変換すればいいのでしょうか? ・SJISでの文字化けはどのようにしたら回避できますか?
URLエンコードやBASE64などでエスケープすれば回避できるだろうけど どうしてもSJISのままでってことならSQLエスケープするとか
>>366 Windows上では、"SJIS"ではなくて"cp932"でMySQLの文字コード指定してみ。
けど、DBで管理するんなら、日本語(マルチバイト)使うのは、ファイルのタグとゆうかDB上での
説明としてだけにして、実際のファイル(パス)名はシングルバイトだけにするのが無難。
(上でもやってるように、局と日付、放送時間にするとか)
>>367 ,368
ありがとうございます。
MySQLはPHPmyadminで管理しているので、なるべく平文で入力したいと思っています。
ファイル管理と実際のファイル名を別にすることも考えたのですが、
DLNAでファイルそのものをLAN内配信しているので、日本語ファイル名を使いたいのです。
そもそも、\もしくは/のディレクトリ符号と、SJIS文字が一行に入っているのが悪いのでしょうか。。。
PHPmyadmin上のcp932の指定を勉強してきます。。。
すみません 正規表現について質問です 掲示板等の本文で特定の文字があった場合正規表現でリンクを生成したいんですが (#a#検索文字#/a#) 携帯の場合検索文字にスペースがあった場合スペース以降が無視されてしまうので URLエンコードをしようと思っています。 そこで質問ですが、$1に入っている「検索文字」をURLエンコードするにはどうしたら いいのでしょうか? $text =~ s/#a#(.*?)#\/a#/<a href=\"s.cgi\?word=$1\">$1<\/a>/g; 今現在はこのようにしています。 このword=$1の$1部分だけURLエンコードがしたいんです。 よろしくお願いします。
$text =~ s!#a#(.*?)#/a#!sprintf("<a href=\"s.cgi?word=%s\">$1</a>",((local $tmp=$1)=~s/(\W)/'%'.unpack('H2',$1)/ge,$tmp)[1])!ges;
372 :
371 :2009/05/01(金) 10:54:17 ID:???
掲示板で不特定の人が書くならサニタイズしないといけないか。。
>>371 動作確認しました。
ありがとうございます。
…正規表現ってこういう書き方も出来るんですね
勉強になりました
まぁ今は理解してない部分もあるんで調べてみようと思います。
374 :
nobodyさん :2009/05/02(土) 05:07:16 ID:sYtZpFZz
forを使って構文を書いてみたのですが、思うような結果が出ません。 どなたか間違っている箇所がわかれば教えてくださいませ。 ------------------------------------ txt形式のデータに 119 110 049 025 のように数字が並んでいます。 これを@datalistに開くことまではできました。 やりたいことは、この中から$eraseに該当する数字だけは消し、 あとの数字はそのまま残す、という処理です。 for ( my $k = 0 ; $k < @datalist ; $k++ ) { if ( $datalist[$k] ne $erase ) { $newlist[$k] = $datalist[$k]; } } で、@newlistを再び元のログtxtに書き込む。 ------------------------------------ というような感じで行けないかと思ったんですが、処理し終わったログtxtを開くと、 元のまんまの数字が並んでいてまったくかわっていません。 ftpで見ると、ログそのものは更新されているので、 一度スクリプトがログを開いてはいるみたいなのですが…。 どうかよろしくおねがいします!
375 :
◆TWARamEjuA :2009/05/02(土) 08:04:20 ID:??? BE:1960092-BRZ(10072)
>>374 chomp @datalist;
@newlist = grep $erase != $_, @datalist;
改行が含まれていそうね♪
それと併せて、$newlist[$k] = $datalist[$k];行は push(@newlist, $datalist[$k]);に換えないといけないんじゃないかな? 前後の処理がよくわからないし、もっと効率のいい方法あるとは思うけど・・
配列に対してフィルタというと、普通にgrepだなあ
全くデバッグしていないのがスゴイ
379 :
374 :2009/05/02(土) 12:47:26 ID:???
>>375 ありがとうございます
そのとおりやってみたら、見事に$erase以外がログに書き込まれていました。
おっしゃる通り、改行が含まれていたせいみたいです。
しかし、修正されたログにも同じように数字ごとに改行を含んでおきたいのですが、
この処理だと
119049025
のように改行なしで一気に書かれてしまいました。
そこで、元の自分の書いたものに
>>376 さんのアドバイスで修正を加え
chomp @datalist;
for ( my $k = 0 ; $k < @datalist ; $k++ ) {
if ( $datalist[$k] ne $erase ) {
push(@newlist, "$datalist[$k]\n");
}
}
としてみると、一応、望み通りの結果を出すことができました。
二晩くらい悩みまくったので、とても助かりました。
ほんとうにありがとうございました。
grepを使った方法は今まで使ったことが無くて、一行で処理できる
美しいコードに感激したので、もしよろしければ自分の書いた方法以外で
同じ結果の出せる(改行含む)書き方があれば教えてやってください。
>>379 map { s/$erase\n//; } @datalist;
>>380 それは部分一致だからs/^\Q$erase\E$//
^\Q$erase\E\n$
でも、リストを作る時に改行は外した方が
$は改行にマッチするので¥nは不要
385 :
384 :2009/05/02(土) 18:15:58 ID:???
と思ったが、要るか
386 :
374 :2009/05/02(土) 18:37:39 ID:???
みなさんありがとうございます map { s/^\Q$erasedat\E\n$//; } @datalist; で希望通りに処理されるのを確認できました。 mapとかgrepというのを使いこなせば、いま自分の書いてる現行のスクリプトで 改善できるところがすごく多そうなので、ちょっと勉強してみます。。 ほんとに助かりました。親切にありがとうございました
387 :
374 :2009/05/02(土) 18:39:02 ID:???
$erasedatではなくて$eraseでした
mapの結果は要素数同じでヌルがいっぱい入ってないか?
ヌルはないがぬるぽがいっぱいだお
390 :
◆TWARamEjuA :2009/05/03(日) 09:41:50 ID:??? BE:2614638-BRZ(10072)
ヌコはいないがガッがいっぱいだお
やっぱmapとgrepそして正規表現を使いまくってこそperlと言う気がするな
あと pack と unpack ね
そして数日後自分でも読めなくなると。
コメントがちゃんと書かれているなら、まあいいかなという気がする
splitとgrepとsortとforが一行で並んでる感じ
とあるサイトの中にある自分のステータス情報を LWP::UserAgent を使って取得したいんですが、 リンクを幾つかたどっていく必要があります。 cookie は何とかなったんですが、 1つ前の html ファイルにあるパラメータを取得して POST メソッド時に引き渡すところの 解析に手を焼いています。 # パラメータ名は判っているので現在は文字列検索で取得しています。 a href などではなく、POST メソッドのパラメータも解析してくれる 便利なパッケージって無いでしょうか
配列をサブルーチンに渡すときって &sub (@hoge); ではダメなんでしょうか? この記述で渡して、受け取ったサブルーチン側でログに書きだしたら 各行に空白が入るようになってしまったんですが。。。
配列に元々改行コード入ってるんじゃない?
399 :
nobodyさん :2009/05/06(水) 11:50:51 ID:Ms7+WRwl
>>397 もともとの値がちゃんと期待通りの値か確認してみ
他の可能性としては
my(@args);
としてるだけで
@args = @_;
みたいにするの忘れててサブルーチン側でちゃんと受け取ってないとか
>>396 HTML::Form(LWPの付属モジュール)
WWW::Mechanize(LWPのスーパークラス的なモジュール)
401 :
396 :2009/05/06(水) 17:22:28 ID:???
>>400 情報dくす。ググって調べてみる。 いい感じに逝きたい、これ試してみて。
>>401 わざわざぐぐらなくても、pod 読めばいいと思う。
>>400 > WWW::Mechanize(LWPのスーパークラス的なモジュール)
謎
404 :
397 :2009/05/06(水) 19:32:33 ID:???
>>398 同じルーチンの中でやると普通に綺麗に書き出されるんだけど
別のサブルーチンに引き渡すと、データそのままで、各行の頭に半角空白が1個ずつ挿入されてる、って感じです。
>>399 &sub (@hoge);
で渡して、受け取る側で
@data = $_[0];
と書いてます。
つか配列のリファレンス渡せ
>>404 とりあえず周辺のソースを晒してみたら?
先物で現受けする時に倉荷証券で受け取るのって参照渡しだよな
>>400 簡単なスクリプト作ってみたらイイ感じに出来た。
無事思惑通りのことができそう。
今まで URL を解析して UserAgent で get していたのが楽になる (T-T)
次はWeb::Scraperとの組み合わせを覚えてもいいかもな
>>396 の用途ならピッタリだと思うぜ
htmlがきちっとしてれば、そんな苦労は要らんという気もする
412 :
キュウティイハニ- :2009/05/07(木) 17:35:14 ID:EGaRRr78
以下のようにあるWEBページを取得しようとしています。
use LWP::Simple;
getstore('
http://www.yahoo.co.jp ','d:\\test\\nikki.tmp2');
しかし、上記のyahooの場合は全てが取得されますが、
サイズの大きいサイトでは途中まで切れてしまいます。
(サイズの大きいサイトのサンプルが具体的に言えません、すみません)
サイズは128kBくらいまでなら、取得できるようです。
取得サイズを指定する何かがあるのでしょうか?
414 :
キュウティイハニ- :2009/05/07(木) 20:20:10 ID:EGaRRr78
>>413 回答ありがとうございます。
ためしためしで先程からテストしていたんですが、
どうも、対象のサイトに依存するようです。。。
タイムアウトでもしてんじゃねえのかね そちらの環境で同様の現象が起こるサイトが出せない限り、これ以上は無理だね
UAをちゃんと設定してみそみそ
417 :
キュウティイハニ- :2009/05/07(木) 21:47:42 ID:EGaRRr78
>>415-416 あるアクセス解析のページなんですが、
IEでソース表示を行った場合も、
同様の場所で、ソースが切れています。
ブラウザ上では切れていなく表示されているのに。
なんで???
420 :
キュウティイハニ- :2009/05/08(金) 16:41:50 ID:CAAVVdSZ
>>416 こんな感じでもダメでした。。。
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$ua->timeout(30);
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
$req =
HTTP::Request- >new(GET => $kw_url);
$res = $ua->request($req);
$status = $res->status_line;
$content = $res->content;
421 :
キュウティイハニ- :2009/05/08(金) 16:42:32 ID:CAAVVdSZ
こうしたら? $ua->timeout(3000000000000000000000000000000000すげえ);
128KB を越えるページを教えてください テストしてみたい
424 :
キュウティイハニ- :2009/05/08(金) 17:05:05 ID:CAAVVdSZ
それじゃぁもう無理だ てめーで解決しろよ
426 :
キュウティイハニ- :2009/05/08(金) 17:11:45 ID:CAAVVdSZ
他の日も試してみましたが、クエリーストリングに%00が含まれていると、 そこで、切られるみたいです。 でも、ブラウザ(IE8)上では、切れていないんです。
427 :
キュウティイハニ- :2009/05/08(金) 17:12:10 ID:CAAVVdSZ
428 :
キュウティイハニ- :2009/05/08(金) 17:13:41 ID:CAAVVdSZ
apacheのログを舐めて、リファラー部分を集計するようなperlライブラリってないですかね?
それぐらい自力で組めるだろw
430 :
キュウティイハニ- :2009/05/08(金) 17:27:31 ID:CAAVVdSZ
>>429 顕著な検索エンジンを経由してきた検索語と回数をカウントしたいんですが、簡単なんですか?
432 :
キュウティイハニ- :2009/05/08(金) 17:39:56 ID:CAAVVdSZ
死ぬほど絞るからでしょう。 q=apache+log+perl \0 でつまずいてるようだから今後も苦労すると思う。
434 :
キュウティイハニ- :2009/05/08(金) 18:15:10 ID:CAAVVdSZ
私、馬鹿なんだな。。。 よくわからない。 apacheのログを入力として、 検索語(日本語)とその検索回数を 表示してくれるだけでいいのに。
それのどこにリファラーが関係あるのさ
436 :
キュウティイハニ- :2009/05/08(金) 18:21:55 ID:CAAVVdSZ
%00はどういう意味なんだろう?
437 :
キュウティイハニ- :2009/05/08(金) 18:24:51 ID:CAAVVdSZ
>>435 リファラーにq="なんたら"
って書いてある"なんたら"の
"なんたら"と、その回数が知りたいのです
438 :
nobodyさん :2009/05/08(金) 18:37:21 ID:/tMyodOD
検索語からして馬鹿を露呈してると思うよ。
>>432 から"検索語"を抜いた"apache referer 集計 perl"でググっただけで死ぬほど出てくるというのに。
439 :
nobodyさん :2009/05/08(金) 18:38:33 ID:/tMyodOD
リファラ集計 open IN, '<', '/apache/logs/access.log'; my%ref_cnt;foreach my$log(<IN>){$log=~m/^.*? .*? .*?\[.*?\] ".*?" [0-9]{3} .+ "(.*?)" ".*?"/;$ref_cnt{$1}++;} my@keys=sort{$ref_cnt{$b}<=>$ref_cnt{$a}}keys%ref_cnt;for my$key(@keys){print$ref_cnt{$key}.":".$key."\n";}
440 :
キュウティイハニ- :2009/05/08(金) 18:39:16 ID:CAAVVdSZ
簡単に漠然と言っちゃえば % を \ を置き換えたもの %00 は \0 の NULL 文字となる だったような気がするんだマイハニー
442 :
キュウティイハニ- :2009/05/08(金) 18:52:02 ID:CAAVVdSZ
443 :
nobodyさん :2009/05/08(金) 18:54:48 ID:/tMyodOD
集計したら、あとはそこから検索語を取り出すだけだろ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ もう君Analogでも使ってればいいと思うよ
444 :
キュウティイハニ- :2009/05/08(金) 18:56:58 ID:CAAVVdSZ
馬鹿は死んでも直らないって本当だな
前にくだすれで大暴れしたりしてた人か
447 :
キュウティイハニ- :2009/05/08(金) 19:01:25 ID:CAAVVdSZ
頭を冷やして考えます。
>>412 まずレスポンスヘッダのチェックからだろ。
もう相手にしないで はい次の方どーぞ
450 :
アルモコニ :2009/05/08(金) 19:54:33 ID:???
数値のソートはsort関数が早いのかな。 試したら圧倒的になったんだけど。 文字列だとGuttman Rosler変換が断トツだった。
で?
じ?
こ?
にょ!
457 :
nobodyさん :2009/05/10(日) 08:47:53 ID:P8pR48B+
i2iアクセス解析のサーチワード一覧のソースが欲しいんです。
459 :
nobodyさん :2009/05/13(水) 13:11:51 ID:oMl7P+AA
すいません。おそらくかなり初心者質問なのですが xamppの環境で、Shift_JISで書いたコードが、問題なく動作するように use encoding 'shiftjis', STDOUT => "shiftjis"; を加えたのですが、即座に動かなくなりました。 搭載されているperlはvar5.8.7なので、動かないはずがないのですが・・・ どなたか原因ご存知ありませんでしょうか?
エラーログぐらい出せクソ野郎
URLを要素ごとに分解したいのですが、色々調べた結果、自分では以下のような形になりました
一応結果は求めたものなのですが、正解なのかどうかわかりません
普通はこうやるとか、間違ってるからこう直せってのがあったら教えてください
my $url = '
http://www.google.co.jp/ ';
my($scheme, $userinfo, $host, $port, $path, $query, $anchor) =
$url =~ m/
(https?|shttp):\/\/
(?:((?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)@)?
(\d+\.\d+\.\d+\.\d+|(?:[a-zA-Z0-9][\-a-zA-Z0-9]*[a-zA-Z0-9]\.)*[a-zA-Z0-9]*)
(?::(\d+))?
(?:((?:\/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f])*)*))?
(?:\?((?:[-_.!~*'()a-zA-Z0-9;\/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*))?
(?:\#((?:[-_.!~*'()a-zA-Z0-9;\/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*))?
/ox;
463 :
nobodyさん :2009/05/16(土) 17:28:43 ID:C7qkfi2d
use CGI::Lite; use encoding 'shiftjis', STDOUT => "shiftjis"; print "Content-Type:text/html\n\n"; my $cgi = new CGI::Lite; my %g = $cgi->parse_form_data('GET'); print $g{'all-text'}; ---表示結果--- \x{0093}\x{008c}\x{008b}\x{009e}\x{0093}s\x{008d}]\x{008c}Ë\x{0090}\x{00ec}\x{008b}\x{00e6} (本当は「東京都江戸川区」とprintされる) CGI::Liteは最新版。perl5.8.5 unix環境です
変換元のコードが判別出来てない
465 :
nobodyさん :2009/05/17(日) 15:36:49 ID:dGMXPYwm
$BB =~ s/:/&url_encode(:)/g; url_encodeはサブルーチンで普通に使えています 上記のように$BBに入っている文字列の中の「:」だけを全てエンコードしたいのですが、上記のコードだと「:」が「&url_encode(:)」という文字列に変換されてしまいます 正規表現の中でサブルーチンを呼び出すにはどうすればいいでしょうか?
e
1byteで回答
一体全体、なんでマニュアル調べないんだろうね? 「マニュアルに書いてあることを質問するな」とか云うはるか前の話として、 マニュアルをちょっと調べれば、3秒とか、長くても20秒くらいで 解決することを、わざわざ文章書いてポストするって、 どんだけ時間の無駄づかいなの?
スレタイをよく見るんだ
親切な人なら $BB =~ s/:/&url_encode(':')/ge; よりも↓の方が負荷がかからない $BB =~ s/:/%3a/g; と教えるだろうけどPerl使ってて負荷のこと言うと叩かれそうだから言わない
use URI::Escape; my $safe = uri_escape($bb, ":"); これで、おk。
473 :
nobodyさん :2009/05/18(月) 20:45:50 ID:gm/uB6Cl
>>472 おまえさんには「教えてください」なんて口が裂けても言わないから
ダイジョウブダヨ。
マニュアル見てもよくわからんってことも少なくないけどな
構文チェックでokが出てるのに500吐くんですけど、こういった場合ってどういった原因が考えられるんでしょうか? サーバがUnixなので改行コードはLFにしてあります。アスキーで転送しました。 use strict;が原因かと思ってコメントアウトしたけど500のままなのです。
>>476 おお!動いた!ありがとうございます。
FFFTPの方で700に設定してたのが悪かったのかな・・・。他はこれで動いてるのに。
>>477 当たっちゃったか
apacheは、apacheユーザとかnobodyユーザとかで動くから、
700じゃ実行権限ないの。この設定はhttpd.confで出来るよ。
他で動いてる理由は、4700か2700になってるとかかもしれないね
もしくはrootユーザに設定されてるか。もしされてるなら危険なので変えよう。
あとよくあるのが、cgiの場合HTMLを吐かずに終了してる場合
>>478 自己レス。
ごめん。勘違いに気づいた
4700、2700じゃ実行できるわけないや
ディレクトリ内のファイルを更新日時でソートして表示するにはどうしますか?
opendir stat map sort
mapで何するの?
qx|ls -tl|
open IN, "ls -t ./ |"; while(<IN>){ print $_; } close IN; 時刻も取りたいなら、-tlにして、\sでsplit
フォルダ内のファイルを更新日時でソートして表示するにはどうしますか?
@files = `ls -t`; (新しい順) @flies = `ls -tr`;(古い順)
>>486 use strict;
use File::stat;
opendir(DIR, "./") or die;
my @file = readdir(DIR);
closedir(DIR);
my @new = ();
for (@file) {
my $fi = stat($_);
push @new, {name=>$_, mtime=>$fi->mtime};
}
@new = sort { $a->{mtime} <=> $b->{mtime} } @new;
あとは@newが順番は更新日時順でハッシュの配列になってるから。
. .. ↑これ消さないと
ほら、初心者の頃って、余計なの入ってると理解が遅れたりするじゃん まずこれが理解できるようになってから、自分で消してもらうってことで。
@fileの更新日時ソートを、map、stat、sortで一行で書くにはどうしますか?
自分でやれw 俺map嫌いなんだよ
$dir= "."; opendir(IN, $dir); @files= map{$_->[0]}sort{$a->[1]<=>$b->[1]}map{[$_,(stat("$dir/$_"))[9]]}grep(-f"$dir/$_", readdir(IN)); closedir(IN);
ありがとう。みなさんありがとう。
まさに黒魔術だよな
どいつもこいつも古いopen/opendirの書き方しやがって
openとか、デバッグくらいにしか使わないからなぁ
新しいのってどんな書き方?
open IN, ">", $file;
my @file = glob("./aaa");
とか?
でもこれはopendir+readdirだな
なんかのモジュール使うとかだと、結局はopenのラップだしなぁ
>>496 答えは?
openは3引数で書くようになったが opendirは相変わらず2引数だなぁ
>>500 ファイルハンドルはグローバルだから使うべからず(STDINとかの例外を除く)
>502の言うように3引数でmyつけて使うべし
新しい書き方では、出力ファイルのハンドラをINと書く 俺は古いのでいいや、なんか混乱しそうだし
自分もファイルハンドルにmy 付けて$変数にするのはもうクセになってるけど、 入出力に文字コード絡みの指定をしない時は、相変わらず2引数使ってることが多いかな。 けど、使い捨ての短いスクリプト書く時は、文字コード絡みがあっても、ついつい、 open(my $f,"$file_name"); binmode($f,":encoding(cp932)"); とかやっちゃうことも多い。
ファイルハンドラとかopendirのハンドラとか、なんで変数じゃなくていいんだろうな 逆に不思議だ
open my $fh, '+<', 'path' or die $!; 何のことだろって思って調べたんだが、こんな感じであってる?
そんな感じであってる
どうせなら die "$file:$!";
$hog に何が入っているか利用する前に調べる関数とかあるのでしょうか? $hog にblessされたハッシュが入っているのか、テキストが入っているのか、 数値が入っているのかを利用する前に知りたい状況です。
511 :
510 :2009/05/20(水) 13:52:55 ID:???
×blessされたハッシュ ○blessされたハッシュのリファレンス
513 :
510 :2009/05/20(水) 14:21:19 ID:???
>>512 ありがとうございます。
これでいけそうです。
正規表現を教えてください。 やりたいことは、"「で始まって」って終わる文字列"を置換したいです。 例えば、"「あ」「い」"を"「★」「★」"に置換したのです。 下記のように記述すると、多分2バイトコードである為、うまくいく場合と行かない場合が あります。どのように記述すればよいか教えてください。 $data =~ s/「[^「」]*」/「★」/gi;
s/「(?:あ|い)」/「★」/g
>>514 # 例えば入力がCP932(≒Shift JIS)なら……
# foo.pl (UTF-8で保存すること)
use strict;
use warnings;
use utf8;
use Encode;
my $encoding = find_encoding('cp932');
my $data = $encoding->decode(shift);
$data =~ s{
(?<= 「 )
( .+? )
(?= 」 )
}{★}xmsg;
print $encoding->encode($data);
__END__
入力
perl foo.pl 「あ」「い」「ほげほげ」
出力
「★」「★」「★」
まああれだ、正規表現を通さなくても、
入れるときデコード、出すときエンコードの癖を付けような
ちなみに「ほげほげ」を「★★★★」にする要件なら、 {★}xmsg; を {'★' x length($1)}xmsge; にする感じで。
(´-`).。oO(.xlsの変換なんだろうなぁ。。。)
>>517 「原理原則」や「机上の空論」を正論と思って賞賛してよいのは中学二年生まで
>>514 の質問は不明な点が多すぎ。
>>517 氏の言うように、入出力時に変換するのが基本だから、
どこから読み込んで、どこに出力して、入力、出力、スクリプトそれぞれの
文字コードの情報があると、回答も得られやすいと思う。
古いPerlの場合、CPANからモジュールを突っ込んで使うか、
自分でガリガリ正規表現を書くことになる。
質問に条件をつければ、答えてくれる奇特な人がいるかもしれない。
全て文字コードCP932(日本語Windows環境)と仮定して、
ファイルから読んで、標準出力に出力する場合。
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);
open(my $fh, "foo.txt") or die $!;
my $data = join('', readline($fh));
close($fh);
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;
522 :
514 :2009/05/21(木) 16:41:46 ID:???
説明足らずですみません。 文字コードはShift_JISです。 具体的に説明します。 以下のコードを実行すると 2番目の「」の部分が置換されないのです。 プログラムを始めたばかりの未熟ですみません。 $data = "あ「い」う「ニ世、三世」え"; $data =~ s/「(?:[^」]+)」/「★」/g; print $data; exit(0);
ワラタ
$data = "あ「い」う「ニ世、三世」え"; $data =~ s/「.+?」/「★」/g; print $data; v(★0★)v
なぜ(?:を知ってて+?を知らぬ
それは
>>521 を丸コピペしただけだからだと思うよぉ
*?と+?は今後よく使うはずだから覚えておこう
あんな便利というか必須な機能が、perl4には無いんだよな
perl4は忘れなさい
>>522 use strict;
use warnings;
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);
my $data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;
exit;
[^x]+より.+?の方が速いは、衝撃的。
531 :
514 :2009/05/22(金) 13:01:09 ID:???
>>524-528 ありがとうございます。
しかし、.+?とは、どういう意味なのかしらん?
「1文字以上」 の 「何らかの文字」 の 「最短マッチ」 左から + . ?
えっ
>>528 で確認すると
> +? +と同様ですが、マッチングがものぐさ(non-greedy)に行われる点が異なります。
とあるが、ものぐさと言われてもわけが分からんだろうな。
greedyが「貪欲な」という意味になるので、non-greedyなら「慎ましく」あたりが該当するのではないか。
だが、慎ましくと言われてもなお意味不明なことだろう。
しかし同時に、分からない者は置いてけぼりで構わないという高潔さも感じたことだろう。
正規表現を覗くものは、正規表現からも覗かれているのだ。
なんか見つかったらそれで終わり、というあたりがものぐさなんだろうけど 何故原文も翻訳もそんなあいまいな表現をしたがるんだ
昔読んだ本には最長マッチ、最短マッチと書いてあった気がする
ものぐさとか、貪欲とか、どういう訳なのかしらんが 最短マッチとかで、十分知られてると思うんだが
選り好み?だかもな、意味わかんね。
最短にしたらしたで文句言う人がいるんだよ。
Perlに限らず、正規表現/正則言語の世界ではnon-greedyで通ってるもんな。 ちなみにlazyと表す場合もあるらしい。'ものぐさ'はこっちから来てるようだね。
次のように―を半角スペースに置換したいのですが、エラーがでてしまいます ―を別のもの変えれば動くので、―に問題があるようです \―にしてもできません $cha =~ s/―/ /g;
sjisでやるとそうなる
試してないけど\Q―\E
545 :
nobodyさん :2009/05/24(日) 03:43:48 ID:51A7n5Gq
perlで 年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、 わかりません。 どうやって求めたらいいでしょう。 例えば、2009年第2週という情報からその週の初めの日である1/5 その週の最後の日である1/11を算出したいのですが・・(週は月曜始まり) なかなか探しても見つかりません。 localtime,POSIXあたりを使ってできませんかね? どなたかわかる方いましたらよろしくお願いします。
ム板で見つかるんじゃないの
失礼します。 二次元配列の特定要素をjoinしたいんですが、 ベタに回して代入する以外の方法で、そういうことって可能でしょうか? my $result; my @array = (["id1", "name1"], ["id2", "name2"], ["id3", "name3"], ["id4", "name4"], ["id5", "name5"]); #「,」でjoin後 $result ⇒ "id1,id2,id3,id4,id5"
print join(',', map($_->[0], @array)),"\n";
>>548 ありがとうございます!
冷静に考えれば、内部的にはどっちにしろ回すんですね…
とりあえず下記のようにだいぶすっきりしました。
-------
my @aNotIn;
foreach (@$rItem) {
push @aNotIn, $$_{id};
}
$sNotIn = "AND (id NOT IN(".(join ',', @aNotIn)."))";
-------
↓
-------
$sNotIn = "AND (id NOT IN(".(join(',', (map($$_{id}, @$rItem))))."))";
-------
大文字と小文字を区別しないでマッチングを行いたいのですが特殊な条件なので難しいです 検索される文字が変数$moziに入っており $mozi='ARTRYI'; 検索キーワードが配列の一要素に入っている状態です $keyword[0]='y' $keyword[0]のyが$moziのYにマッチすればOKです index関数ではindex($content,$keyword)とやっても大文字小文字が区別できないので-1が返されてしまいます。 正規表現でoptionのiを使う場合も変数展開できず失敗します。optionのeを使うことも考えましたが、これも置換のときのみに使えるようなので、マッチングでは使えません。 $mozi =~ /$keyword[0]/i 何かよい方法はないでしょうか
index lc $content, lc keyword でよさそうな。
何文字目かとれればいいの? use strict; use warnings; printf "result:%d\n",index2('ARTRYI' , 'y'); sub index2 {$_[0] =~ /$_[1]/i ? length($`) : -1}
とりあえず\Q使わないと
use strict; use warnings; my $mozi = 'ARTRYI'; my @keyword = qw(y); print ("position:", index(uc $mozi, uc $keyword[0]), "\n"); print ("position:", index(lc $mozi, lc $keyword[0]), "\n"); print (($mozi =~ /(?=$keyword[0])/gi ? ("position:", pos($mozi)) : "no match"), "\n");
>>374 >>379 >>386 の者なんですが、また質問させてください。
map { s/^\Q$erase\E\n$//; } @datalist;
の処理によって該当箇所は問題なく消去できているのですが、
「リストの最初の行だけが2度書き込まれる」という現象が起きているみたいなのです。
1240
985
766
みたいなリストから、1240を消した時、1240が消えている代わりに
985
766
766
のように最初の行が2度重なっている、という感じです。
何か考えられるミスはありますでしょうか。
なんでこいつデバッグしないの?
557 :
555 :2009/05/28(木) 11:05:47 ID:???
どうもすいません。自分で何とかします。 失礼しました。
その map を使ってるところから、ファイル書き込みまでの部分が無いと分からんでしょ もっと質問の仕方を学んでください
クイズスレじゃないんだからw
とりあえずお前はActivePerlをインストールしろ 話はそれからだ
561 :
nobodyさん :2009/05/28(木) 20:50:21 ID:IiL6Ub9r
>>560 macbook で ActivePerlする方法お願いします
あるんだw
皮肉でレスしたつもりだろうが恥晒しただけになってるなw
みんな仲良く
複数のプログラムで使うサブルーチンをexample.pmとして保存し読み込ませる際に質問なのですが、 useとrequireどちらで読み込ませればいいのでしょうか? 今一違いがよくわかりません。
つ perlfunc を読むとか。
apache 2.2.9とperl 5.8.8とmod_perl2-2.0.4を使ってCGIを作ろうとしています。 コードにエラーがあった場合、 Software error: ほげほげ という出力がブラウザに出てしまうのですが、 これを抑制してInternal Server Error等を返すようするにはどうしたらよいのでしょうか。
コードにエラーがあればプログラムが実行されずにInternal Server Error返すと思うが
570 :
568 :2009/05/29(金) 18:38:59 ID:???
すいません 参考にしていた入門記事の use CGI::Carp qw(fatalsToBrowser); をのせいだったみたいです お手数をおかけしました。
571 :
nobodyさん :2009/06/05(金) 03:14:34 ID:N+0uLK7Z
以下のようのものをイメージしております。パスワードを入力して認証後に 、HP上のある特定のテーブル(枠内)に画像をUPしたり、コメントを記入 できるようにしようとしております。枠は例えば一列を(名前・画像・ コメント)としてそれぞれの会員へ割り当てます。あくまでもその枠は、 割り当てられたメンバーしか入力と更新ができない仕組みにしたいと思いま す。画面としては、HP枠テーブル内に設置されている「更新ボタン」を押す →パスワード入力画面(認証)→画像UP/コメント記載入力フォーム→HPに 画像UP/コメント修正反映。という形です。パスワードは、会員それぞれが 違うPWをもっていて、他人の入力可能枠に入力をしようとしてもパスワード が合わない限り、画像UP/コメント入力ができない形です。全般的に初心者と いうこともあり、教えていただければ助かりますが、特に行き詰っているの が 1.会員ごとにPWを割り振り、上記のように更新場所を分けた場合、認証 CGIは会員ごとそれぞれに作成する必要があるのでしょうか。それとも、こ のPWで認証された会員はこの場所の更新を許可させるというような設定 はできるのでしょうか。 2.フォームで入力したデータを既存のhtml形式のhpに更新処理をする ことは可能なのでしょうか。フォームで入力したデータを 掲示板(cgi)に書き込む事はできるようですが、htmlのテーブル(枠)に 書き込む事はできるのでしょうか。 3.フォーム(cgi)で入力したデータを指定した場所へ書き込むにはどう したらよろしいのでしょうか。指定の方法はどうやればよろしいのでしょう か 以上です。
>>571 複数ユーザーで使える画廊のようなページですかね
まだバイトの身なので見当違いなことを言ってるかもしれませんがアドバイスを。。。
1はCGI2つで実現できると思います。
例えば、画廊ページをhtmlで作り、認証フォームページ表示CGIを作り、実際の処理を認証CGIでするとします
画廊ページからは更新をクリックしたときに、認証フォームページ表示CGIに枠IDを渡します
認証フォームページ表示CGIでは、ユーザーID、ユーザーパスワードなど必要事項を入力する欄とともに、
このcgiに渡された枠IDを hidden 属性で渡せるフォームを出力します
これで3も解決です
認証CGI側ではあらかじめ枠IDとユーザーID・ユーザーパスワードを関連付けたデータを持っておき、
(多分選択肢はデータベースに入れるか他のファイルに書いておくかcgiに直書きかくらい)
フォームから渡ってきたデータと照合します
2の画像の更新については、画廊ページの雛形をまず用意しておき、(画像の入るところなどには{Image}のような仮の文字列を入れておく)
認証CGI側で読み込み本来の画像のurlなどに置換して出力します
こんな感じでいけるかと
こんな説明で分かりますかね?
573 :
nobodyさん :2009/06/05(金) 17:20:18 ID:N+0uLK7Z
>>572 さん、ありがとうございます。571です。複数のユーザで使える画廊ページ
のイメージはあっております。私が素人のため、ぱっと読んだだけでは、
よく分かりませんが、hidden属性等キーワードをいくつかいただきましたので、
少し、やり方などを調べてみます。また、分からないことがありましたらよろしく
お願いします。
ハッシュについての質問です。 \t区切りにして保存したdatファイルからデータを読み込む際に foreachでハッシュに入れて$example{$hoge}{$huga}で読み込めばいいのか、 foreach+正規表現使ってdatから1行だけ抜き出すのがいいのか、どちらがいいやり方なのでしょうか。
俺はgrepが好き
>>575 ぐぐってみました。
こんなのがあったんですね。参考になりました。
早速試してみようと思います。
>>574 じゃないけど質問
grep って foreach みたいにメモリにがっつり読み込むの?
それとも While みたいに逐一読みに行ってくれるの?
foreach みたいにメモリにがっつりの意味がわからん
メモリにがっつりでも、レンタル鯖なので気にしません!
>>579 何か勘違いがあるんだろ
恐らくファイル読み込み関連でそういう混乱が生まれたんじゃないかと。
>>578 フィルタみたいなものだから、がっつりメモリ取るよ。
つか、Perlは基本的に何でもリスト展開してから動くように出来てる。
foreachの昇順の範囲演算子は最適化されるけど。
>>582 端折りすぎた感のある文を読み取ってくれてありがとう
やっぱそうなってるんですね。
数メガならだいじょうだろうけど、十数メガ〜数十メガの TSV を扱うにあたって考えてるとこだったので。
やっぱ DB にプッシュしろってとこかな ^^;
>>583 十数メガのTSVをバシバシ扱ってるけど、鯖屋は文句言わないよ
本当は文句を言うべきところなのに 鯖屋が気づいてないだけって可能性もあるな 美味しくいただいちゃいましょう
mapを使用するときに今何番目の要素を処理しているのか上手く知る方法はあるのでしょうか? やりたいことは、@before = ('a', 'b', 'c')とう配列があったときに、 ”この配列の要素”をkey、”その配列要素の場所”をvaluとしてハッシュを作ることです。 今はmapの外に$iを用意して下記の様にしています。 my @before = ('a', 'b', 'c'); my $i=-1; my @after = map { ++$i => $_ } @before; この$iを使わずに実現する方法があったら教えて欲しいです。 この$iがとれない様であれば、forでやった方がキレイかなと思ってしまいます。
すみません。書き間違えました。 × @after ○ %after
ハッシュのスライスでぐぐれ
>>587 my %after = map +($before[$_] => $_), 0..$#before;
591 :
590 :2009/06/07(日) 14:41:30 ID:???
>>589 の言いたいのはこうか
my %after;
@after{@before} = (0..$#before);
592 :
587 :2009/06/07(日) 15:03:39 ID:???
>>589-591 ありがとうございます。
590, 591 の方法はおもいつきませんでした。。
# 因みに map() やスライスを使わない場合: $after{$_} = $before[$_] for 0 .. $#before;
catalystを使ってるんですが、 forwardメソッドで呼ばれるメソッドに 引数を渡す際に複数の変数を渡したいと思っています。 このときqw/$a $b/と書くと変数展開されませんし、 qq/$a $b/と書くと渡される値が"$aの中身 $bの中身"という1つの変数になってしまいます。 これを$a,$bそれぞれの値として渡すにはどのようにすればよろしいでしょうか?
$c->forward('foo',[$a,$b]); sub foo : Private { my $c = shift; my $args = shift; my $a = $args->[0]; my $b = $args->[1]; } ???? }
cpanのモジュールのトップレベルの名前空間の一覧はどこかで見れませんか? Test とか Class とかが知りたいです。
597 :
594 :2009/06/07(日) 23:53:56 ID:???
>595 その方法でうまくいきました。 ありがとうございました。 いろいろな形を試してみて、 ( 'foo', [$a],[$b] )の形で動いたので とりあえずこの方法でやっていこうかと思っていました。
>>598 cpan.orgの方のページで解決しました。そんな便利なところがあると知りませんでしたorz
ありがとうございました。
ソートについての質問です。 例えば以下のようなハッシュの配列をソートしたいのですが、 my @member = ( { 'name' => 'SUZUKI', 'point' => 80, 'pref' => 'TOKYO', 'flag' => '1'}, { 'name' => 'TANAKA', 'point' => 100, 'pref' => 'OSAKA', 'flag' => '1' }, { 'name' => 'SATOH', 'point' => 100, 'pref' => 'TOKYO', 'flag' => '0' }, ); 1.ハッシュの'name'の値の昇順で配列をソートするにはどうすればよいでしょうか? 2.ハッシュの'flag'の昇順・'pref'の昇順で配列をソートするにはどうすればよいでしょうか? 3.ハッシュの'pref'の昇順・'point'の降順で配列をソートするにはどうすればよいでしょうか? よろしくお願いします。
@member= sort{$a->{name}cmp$b->{name}}@member; @member= sort{$a->{flag}<=>$b->{flag} || $a->{pref}cmp$b->{pref}}@member; @member= sort{$a->{pref}cmp$b->{pref} || $b->{point}<=>$a->{point}}@member; 簡単な宿題だな
OSを再インストールした後から なぜかPerlのオートフラッシュが有効にならなくなってしまいました。 Debianをetchからlennyに変更したのでバージョン関係の 問題のような気もするのですが解決策が見つかりません… 何かご存じの方がいたら教えてください。 環境は下記のような感じです。 Debian/lenny Apache/2.2.9 mod_perl/2.0.4 Perl/v5.10.0 よろしくお願いします。
ユーザーアイコンをアップロードできるようなものを考えています。 アップロードできる形式はgif、png、jpegで、 アップロードすると(ユーザーID).gifのような名前になります。 アイコンを更新する場合、アップロード前に 古いアイコンを削除する必要があるので、以下のように書きました。 opendir DIR, "./icon" || die("directory open error"); my @icons = readdir DIR; @icons = grep $_ =~ /$id/, @icons; closedir DIR || die("directory close error"); foreach my $icon (@icons) { unlink "./icon/" . $icon; } ところが、これを実行したところ、プログラムがそこで止まってしまいます。 エラー等は吐かずにただ止まってしまうので、原因が分かりません。 $idとマッチするファイル名を@iconsに集めるまでは上手くいっているようなので foreach以降に問題があるようですが、解決策がどうしても見つかりません。 どこに問題があるかご存知の方がいましたら、ご教示ください。 よろしくお願いします。
解決するか分からないけど opendir DIR, "./icon" || die("directory open error"); while (my $icon = readdir DIR) { unlink "./icon/" . $icon or die $! if /^$id\.(?:gif|png|jpe?g$)/i; } closedir DIR || die("directory close error"); ユーザー増えると遅くなるからディレクトリなめるやり方は良くないよ
ファイルグロブを使わない限り、ディレクトリをなめるのは仕方ないんじゃないか。 メモリ使用量の問題はあるが。 opendir DIR, "./icon" || die("directory open error"); これと opendir(DIR, "./icon" || die("directory open error")); これは 等価なので、括弧使って優先順位を変えるか、優先順位の低いorを使う。 あと、複数ファイルをまとめて消した方がサーバに優しいと思われ。
606が指摘している問題のためopendirのエラーを拾えてないから closedirに失敗してエラーで止まっているに100カノッサ。 実行時のカレントディレクトリの位置が期待したところと違うか パーミッション関係かどっちかあたりかな。
>>604 書き直してて気が付いたことを。
ID の割り当てがどうなってるかわかりませんが、例えば ID が 60 って人がファイルをアップしたとしますよね?
600 の人も 6000 の人も 160 の人もファイルが上書きされたり、消されたりするので、そのマッチの仕方はやめた方がいいです。
またユーザーアイコンが1つしか無さそうなので、-e でファイルの有無を確認してから作業したほうがいいかと思います。
>>608 ファイル名がわかってて削除するだけなら、-eすんの無駄じゃね?
いきなりunlinkでいいと思う。
png か gif か jpg か確認する必要があるかと
一律 jpeg に固定しちゃえば
>>609 さんの言うとおり決め打ちで OK
my @fext = qw/jpeg jpg png gif/; my $newicon; # ここに既に新しいファイルデータが入ってるとする my $newfext; # 新しいファイルの拡張子 my $userid = 60; # ファイル検索 my $userfname = ''; foreach (@fext){ $userfname = "./icon/$userid.$_" if -e "./icon/$userid.$_" } # 仮出力 if(open(OUTFH, '>', "./tmp/$userfname.tmp")){ binmode OUFH; print OUTFH $newicon; close(OUTFH); # 移動 move("./tmp/$userfname.tmp", "$userid.$newfext"); } こんな感じか
ディレクトリをもう1階層作って、 その名前を $userid / 100 とかにするのも、運用回避としてはアリか。
ファイル一つしかないことが分かっていて、サフィックスも限定できるなら、 my $complete = unlink(map{ "./icon/$id.$_" } qw(gif png jpg jpeg)); こんなでもいけるだろうけど。
615 :
604 :2009/06/11(木) 14:30:45 ID:???
皆様、ご助言ありがとうございます。
>>606 さんのご指摘を受け、上記部分以外も含め open および close まわりは
すべて or に修正いたしました。
また、IDですが、アルファベット3文字+数字5文字の固定長にしており
ID発行時に重複もチェックしておりますので、
>>608 さんのご指摘のようなIDマッチの重複はありません。
それでもまだ止まるので、もう少し止まる箇所を絞り込んでみたのですが、
どうもunlinkで止まっているようです。
unlinkで止まる原因にはどういったものが考えられますでしょうか。
ドメインとかPATHとかファイル名は消していいので、エラーログをさらしてみて
固定長のIDにするならアルファベット部分を5文字にして大文字小文字を区別しないと 「そんなにユーザー居ないし」でスクリプト組むのはやめたほうがいいですよ
unlink $file or die $!; だけにして実行するとかrm $fileでコマンドラインから は消えるのかとかして原因の切り分けしろよ。 止まるなんて抽象的な表現じゃ分かんないだろ
Perl超初心者ですが、よろしくお願いします。 読み込んだファイルの'key'という文字が出てくる次の行から アウトプットさせたいんだが、うまくいかないです。 $flag = 0; while($line = <IN1>){ chomp $line; if($line =~ m/^key/){ $flag = 1; print OUT1 $flag; } } while($line){ if($flag == 1){ print OUT1 "$line\n"; } } みたいな感じで書いてみたんですが if($line =~ m/key/)が認めらんねぇ、みたいなこと言われました。 どうしたらうまくいくか、教えてください。
$line=~ /key/ and print OUT1 <IN1>;
my $flag = 0; while(my $line = <IN1>){ print OUT1 $line if $flag; $flag = 1 if $line =~ /key/; } 試してないけど、これでおk
>>619 行の終わりに全角スペースが入ってたから、それが原因だと思う。
全角スペースを可視化できるエディタを使うといいよ。
624 :
619 :2009/06/11(木) 18:16:41 ID:???
>>620-623 皆、ありがとうございます。
>>621 さんのプログラムで早速やってみたところ、なぜか
print OUT1 $line if $flag;
の行におかしなものがあるぜ、と言われて、動いてくれませんでした。
考えられる原因としては、何があるでしょうか?
625 :
619 :2009/06/11(木) 18:25:39 ID:???
ご、ごめむ。
>>622 さんの意見を適用するとできました。
皆、ほんとにありがとー。
627 :
◆TWARamEjuA :2009/06/11(木) 19:54:12 ID:??? BE:2287837-BRZ(10072)
旧Rock54鯖(banana238.maido3.com)にて、perl5.8.6/FreeBSD5.4だったかな? unlinkがうまく動かなかったので、、、 unlink $file; で済ませられるところを、、、 unlink $file unless -f $file; と描いた記憶が蘇りました。 OS由来の変な誤動作とかかもしれないですね。 あと、単純にdiskがあやうすかも。 smartmontools等で確認するのも良いかも。
単純に、パーティションが違うだけじゃね unlinkは、inodeの削除でつよ > unlink $file unless -f $file; ファイルが無いならunlinkって・・・
通常ファイルじゃないならunlinkって・・・ unlink $file if -e $file; って書きたかったわけじゃなくて?
わははー♪@笑って誤魔化す if -f $file ですm(_ _)m
経験上、ブロックしちゃうのは大抵ファイルシステムの問題が多いかな。 ネットワークドライブだったり不良セクタが発生してたりという事が多い。
632 :
604 :2009/06/12(金) 02:45:55 ID:???
申し訳ないです。 抽象的とのことですが、実際、CGIにフォームを送信するとそこから進まなくなってしまい ブラウザを閉じるまで画面遷移も一切無く、エラー画面もログも表示されないという 文字通り「止まる」としか表現しようがない状態だったのです。 切り分け不足だったのはひとえに自分の力不足です。 その後、unlink $file or die $!;に記述を修正して実行したところ 以下のようなログが表示されました。 [error] [client ::1] Operation not permitted at huga line 122., referer: hoge 122行目はやはりunlink $file or die $!;です。 Operation not permittedを調べてみましたが、実行権に関するエラーのようですね。 もう少し実行権まわりを検証してみて、まだ動かないようでしたら またお知恵を借りにくるかもしれません。勉強になりました。ありがとうございます。
>>605 で
unlink "./icon/" . $icon or die $!
って書いてあるじゃん。力不足とかいう話じゃなくて姿勢の問題。
他にもいっぱいアドバイス貰ってるのに相手に失礼だろ。
utimeで更新時刻の変更は出来るようですが、 作成日時を変更することは出来ますか?
出来ないだろうな i領域書き換えないといけないわけだし
う、出来ませんか…。 タイムスタンプ変更ソフトだと一括変更が多くて、 拡張子で分けたり条件で時刻だけ変更したり出来ないので Perlでやりたいと思ったのですが残念です。
じゃあ一時ファイル作成してリネームを繰り返すしか
640 :
604 :2009/06/12(金) 14:18:45 ID:???
>>634 ごめんなさい。
>>605 さんの発言を見て、
初めてunlink "./icon/" . $icon or die $!を試すことに気づきました。
それでやってみて初めてエラーログに表示されたので、
他の方のアドバイスもすべて見て参考にしつつ
自力でもなんとかしないと逆に失礼だと思って
>>632 のように書いたのです。
書き方等、不快にさせてしまって本当に申し訳ないです。ごめんなさい。
635です、すみませんOS書いていませんでした…。
Windowsなので、
>>639 さんのリンクで解決しました!
ありがとうございました。
始めまして。質問させて頂きます。 『2009.6.15.火』という文字列を 『2009/6/15-火』という状態に置き換えしたいです。 $hoge=~ s/./\//g で置き換え、 『2009/6/15/火』にしたあと一番最後の/を-に置き換えする事を考えていますが、 似たような処理が複数あるため、もっとシンプルに 『2009/6/15-火』に置き換えする方法をご教授頂ければ幸いです。
>>642 方法はそれでいいんじゃねーの? たくさんあるならサブルーチンで。
$hoge =~ s|『(\d+).(\d+).(\d+).(.{1})』|『$1/$2/$3-$4』|; これでいいんじゃね
数字全角みたいよ。
s/./\//g and s/(.*)\//$1-/ または s/.(.*?).(.*?)./\/$1\/$2-/
>>645 じゃあこれでいいや
$hoge =~ s|『(.+).(.+).(.+).(.{1})』|『$1/$2/$3-$4』|;
あと、なんでみんな無理して/使うんだろ
> .{1} これが妙に気になる あとエスケープが面倒なときは {}!|# 辺りを見かけることのほうが多いよ
初心者に示すときにわざわざ別のデリミタ使うほうが二度手間だろ また聞き返されてそれの説明しなきゃいけないし
>>646 下の方法で対応できました。
どうもありがとうございました。
utf8かencodingを宣言しつつ、
$str =~ s{(\d\d\d\d).(\d\d?).(\d\d?).(.)}{$1/$2/$3-$4}g;
>>644 >>648 さんに近いな。
なんでわざわざ正規表現使うんだ? $str = sprintf '%s/%s/%s-%s', split '.', $str; これでいいだろ 汎用性も十分
654 :
652 :2009/06/16(火) 17:17:40 ID:???
>>653 文章中に複数埋め込まれることを想定してるから。
わざわざっつーか、正規表現使う方が簡単だろjk
正規表現読みにくい
>>656 最初だけ。
その最初を越えないと、ずっとだけど。
誰も読めないなんて言ってないぞ 特に今回なんかはセパレータが全角ピリオドだし見分けつかんよ 正規表現書くにしても二度手間とか思わず読みやすくして欲しい
2chの回答で、その水準を要求されても困るわけだが。
正規表現を使う時は、コメントをつけてるなあ。 処理の内容そのものを示すコメントって あんまり良いコメントとは言えないのかもしれないけど。
662 :
660 :2009/06/16(火) 23:17:31 ID:???
>661 え? 何が?
正規表現は読みにくいものだ 人間を機械に近づける代わりにエッセンスで書ける
664 :
661 :2009/06/16(火) 23:45:46 ID:???
>>662 Perlコーディング初心者質問スレなので、
コメントの書かれた正規表現での回答。
>664 ぼく質問する側だもん
変数に入ったリファレンスが、配列のリファレンスか、 ハッシュのリファレンスかを知る上手い方法はありますでしょうか? 今考えているのはsprintfでリファレンスを書き出してみて その文字列の中にHASH かARRAYのどちらがあるかでやろうかと考えています。 他におすすめの方法があればお願いします。
ref
669 :
666 :2009/06/17(水) 01:08:36 ID:???
>>667-668 ありがとうございます。
refの返り値がHASHかARRAYになってるんですね。。
リファレンスかどうかの真偽のみに使っていたので気がつきませんでした。
助かりました。
よくできてるなあ
質問です、よろしくお願いします。 読み込んだデータ($sample)が120行ほどあって、 各行の先頭全てに’1−1’という文字列を放り込みたいんですが 全くプログラムが書けません。 どうか、教えてください。
$sample=~ s/(.*\n)/1-1$1/g;
>>672 最終行に改行コードがないと最終行が痴漢されない
$sample =~ s/^/1-1/gm;
$sample=~ s/(.*\n)/1-1$1/g;
$sample =~ s{^}{1-1}xmsg;
677 :
671 :2009/06/17(水) 19:54:39 ID:???
>>672-676 みなさん、ありがとうございます。
ばっちりできました。
が、初心者なんで皆さんのプログラムで
なぜちゃんと走ったのかが理解できてないので
出直してきますorz
改行を含んだデータの取り扱いが弱いよな
@csv = (["am","a"],["au","a"]); @list = map(split(//, $_[0]), @csv); @csv のすべての要素の最初の要素(文字列"am","au")を文字に分解したいのですがうまくいきません。 解決方法を教えてください。お願いします。
>>679 $_[0]じゃ@_の0番目だよ。$_->[0]だろ。
こんにちわ。 データの中にある特定の文字を消したいんですが、うまくいかないです。 while(<IN1>){ chomp; @data = split(/-/, $_); #これは無視して下さい @data2 = join(' ', @data); という手続きで読み込んだデータをタブでつないで格納しましたが 都合上、全ての行に red apple red fire てな感じで、タブで区切られずひとくくりにされてしまう箇所があります。 この中の"red "だけを全ての行から取り除いて残りをそのまま出力したいんですが 可能ですか? 初心者ながら置換をしてみようと $data2 =~ s/Level1 //g print OUT1 "$data2\n"; というプログラムを書いてみましたが、printできねーと返されましたorz よろしくお願いします。
682 :
681 :2009/06/18(木) 18:12:27 ID:???
すんません。 下から4行目は Level1 とか意味わからんのじゃなくて'red 'ですorz
$data2 =~ s/Level1 //gに ; が無いからprintの行でエラーのお知らせなんじゃね?
684 :
681 :2009/06/18(木) 18:29:39 ID:???
>>683 ホンマや!
と思って、;付け足してやってみたところ
今度はこのマッチングの表現がおかしいみたいなこと言われました。。
どこが間違ってるんでしょうか??
>>683 でないならもしや open してない or できてない or 書き込みモードでないのでは?
ファイル名隠して、エラー内容晒せ。 該当行前後のソースも。
688 :
681 :2009/06/18(木) 19:00:13 ID:???
>>686 redを空白に置換しようとしてるんで、文字列に使っちゃってることになるんですかね??
>>687 Use of uninitialized value in substitution (s///) at data_split line 15, <IN1> line 5788.
Use of uninitialized value in concatenation (.) or string at data_split line 16, <IN1> line 5788.
この2種類がガーっと出てきます。
ちなみにline15が$data2 =~ s/red //g;
line16がprint OUT1 "$data2\n";
です
joinは配列を返さないぞ
>>688 そのエラーは$data2が未定義だと言っている。
681に書いてある付け加える前の元の部分には
@data2しか登場してないぞ。
>>688 redならそうはならないっす><
このエラー見る限り違う
つーかどういうフォーマットのデータをどういうフォーマットにしたいか教えてくれ
692 :
681 :2009/06/18(木) 19:27:49 ID:???
>>689 そうだったんですか。。完全にわかってなかったです。
>>690 689さんが言うてるようにjoinが配列を返さないから
未定義だったんすね。。。
となると、、、
この"red "だけを消すにはどんな手が有効ですかね??
$data2の内容がないよう ↓ どこかで設定したはず?→設定したはずの場所を正しく書き直す ↓ 設定し忘れ?→設定すべき場所を考える ↓ わからない→とりあえず寝ちゃおう
結果 strict しておけ
つ use Any::Mouse; ごめん言ってみただけ
696 :
681 :2009/06/18(木) 20:59:17 ID:???
元のデータが 1 1 2 red fire 1232 0 [n] みたいなのがざっと200行近くあって この'red fire'がタブで区切れない、ひとくくりのデータになっちゃってます。 この中の'red'だけを一気にそぎ落とそうとしてる・・・って感じです どうしたら良いですか??
while(@data){ my @tmp = $_ =~ /[^\t\n]+/g; print join "\t", map{$tmp[$_] unless $_ == 3}(1..8); } こんな感じ?テストはしてない
X }(1..8); O }(0..7);
>>696 $data2 =~ s/\bred\t//g;
$data2 =~ s/^red\t|(?<=\t)red\t|\tred\z//g;
$data2 = join("\t", grep{$_ ne 'red'} split(/\t/, $data2));
お好きなのをどうぞ。
700 :
681 :2009/06/18(木) 22:01:42 ID:???
>>697-699 ありがとうございました。
せっかく教えてくれたのに申し訳ないですが、
やはり
>>688 と同じようなエラーが出てしまいました。
見つけれる限りの間違いは直してみたつもりなんですが。。。
701 :
◆TWARamEjuA :2009/06/18(木) 22:32:31 ID:??? BE:5336677-BRZ(10072)
while以前の行に変なのがあるんじゃないかな? while行から上に向かって exit; を入れてみてデバグしてみるとか。 あと~の文字コードとかとか。
702 :
681 :2009/06/18(木) 23:16:28 ID:???
>>701 >>699 さんの教えてくれた
$data2 =~ s/\bred\t//g;
が僕自身も一番わかりやすかったので使わせてもらってるんですが
エラーはこの文に対してだけ出てまして、その内容が
Use of uninitialized value in substitution (s///) at data_split line 13, <IN1> line 5788.
Use of uninitialized value in concatenation (.) or string at data_split line 15, <IN1> line 5788.
てな感じになってるんです。
ちなみに、line15は
print OUT1 "$data\n";
です。
文字コードも大丈夫なはずなんですが、、、
$data2に中身がねえと言われてるのに分からん奴だな。 スクリプト全部晒せばいいのに。
IN1 なファイルの line 5788 が空行でした、とかいう話ではないの?
@data2に何を入れても$data2とは関係ないってわかってる?
というか、このままじゃ$data2が何処から来たのか誰にも分からん。
>>703 威張ってはいない。
しょせんは他人事だがそれでも、いつまでも問題が解決しないことに
焦りと苛立ちと好奇心を感じている。
== と eq について質問があります 今、会員限定のサイトに電話番号 (ハイフン無し) によるログインをさせています。 家電話が無い人は携帯番号というふうにさせています。 認証自体は Basic 認証を使い、サイトの中で 「○○さん、こんにちわ」 といった具合で名前を表示させています。 (パスワードファイルは Shift_JIS、HTML は euc-jp です) my $username; my $userid; my $usertel; my $userktai; open(INFH, '<', $config->{'file_passwd'}); while(my $line = <INFH>){ my $utf8 = decode('shiftjis', $line); my $eucjp = encode('euc-jp', $utf8); chomp $line; ($userid, $username, undef, $usertel, $userktai) = split(/\t/, $eucjp); $usertel = $userktai if !$usertel; # 家電話が無ければ携帯番号がユーザー名 last if $ENV{'REMOTE_USER'} eq $usertel; } close(INFH); 上記でスクリプトを書くと、家の電話番号がある人はちゃんと名前が表示されますが、携帯しか無い人を $usertel に代入させると判定できません。 ユーザー名がパスワード一覧のファイルに記述されているのは確認しています。 last if $ENV{'REMOTE_USER'} eq $usertel; の行を last if $ENV{'REMOTE_USER'} == $usertel; にすると判定は上手くいき、理想どおりの動作はします。 しかしパスワードが 「数値」 というのになんか気持ち悪い感じがしますし、なぜ eq で判別できなくて == で判別できるのでしょうか? 書き方が悪いというのがあれば指摘していただきたく書き込みしました。 print によるデバッグでパスワードを出力させてみたところ、$ENV{'REMOTE_USER'} と $usertel が一致する行を目視で確認しました。
$usertel = $userktai if !$usertel; の行で$userktaiを代入してるけどこの変数には 末尾に改行がある きみは目視で改行が見えるか?
chomp $line;の位置が問題ってことだね
改行は見えるようにしとかないと。
あ〜、あまりにもくだらないミスでごめんなさい orz ありがとうございました m(._.)m
今、データの正誤判定のための模範解答作成みたいなのやってます。 読み込むデータには "animal"と"plant"と"food"の3種類がランダムに並んでます。 「animal plant food food animal」 というようなのが5000個近く並んでいます。 ここから、animalについては"n"、 他の2つについては"m"という文字を出力を出したいんですが、 perlを最近始めたばかりなので、全然できません。 助けてください。 のせるのも恥ずかしいぐらいですが、 とりあえず、稚拙ながらも作ったプログラムを置いておきます。 while($line = <IN1>){ chomp; if($_ eq "animal"){ print OUT1 "n\n" } else { print OUT1 "m\n" } }
(´・ω・)つ ;
なんで$lineに読み込んでるのに$_を比較してんのよw
while (<IN1>) {
にしてみたらどう?
IN1 とか OUT1 を見て思うんだけど
>>681 や
>>702 に心当たりはないか?
>>715 いっけね。これだから初心者わw
>>716 いろんなことやってたらごっちゃになっちゃって
直すの忘れてました。
$lineに直してもムリポでした、、、
>>717 うまくいきませんでした。
て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
心当たり?はわかんないす。
>>718 food なら m であってるんじゃないの?
それだけで終了するのはなぜかわからないけど。
修正後のスクリプトを見てみたい。
>>718 > $lineに直してもムリポでした、、、
おおかたchompを直し忘れたんじゃないか。
$lineで統一するんなら明示的に引数書かないと。
> て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
> 心当たり?はわかんないす。
animalのときn,他のときはmだからfoodでmがでて
終了なら正しい動作なんじゃねーの?
721 :
713 :2009/06/19(金) 17:17:06 ID:???
use strict; while(my $line = <DATA>){ chomp $line; if($line eq "animal"){ print "n\n"; }else{ print "m\n"; } } exit; __DATA__ animal plant food food animal 原因は、$line に入れてるのに、chomp は $_ 対して行ってるから。 自分と似たようなミスですねww
722 :
714 :2009/06/19(金) 17:26:50 ID:???
すんません、僕の説明がヘタくそすぎたし、
>>718 での報告は完全に間違ってたので、もう一度チャンスをください。
望ましい出力が
animalからのn と
plant, foodからのmです。
>>721 さんのやつでやってみると
5000行ほどあるうちの最初がanimalなのにnが出てきまして、
その1つで出力が終わってしまってます。
ご教授、よろしくお願いします。
>>719 >>721 さんのをまんま使わせてもらったところ
上に書いたような出力になっちゃいました。
723 :
714 :2009/06/19(金) 17:28:42 ID:???
あーもう、また間違ってる! foodlなのにnが出ちゃったんですw ほんますいません。
724 :
713 :2009/06/19(金) 17:35:12 ID:???
__DATA__ は削除しないと・・・ while(my $line = <IN1>){ chomp $line; if($line eq "animal"){ print OUT1 "n\n"; }else{ print OUT1 "m\n"; } }
落ち着けよ 原因はきっとキミがパニクってるからだと思う
726 :
719 :2009/06/19(金) 17:44:12 ID:???
727 :
714 :2009/06/19(金) 17:46:28 ID:???
>>724 あ、大丈夫です。そこは消したんですが
>>722 みたいな感じになっちゃったんです・・
>>725 確かにw
今日中にこれを何とか片付けないとだめなんで若干の焦りがありますよねw
目茶目茶短いだろうに載せないのはネタだから?
729 :
714 :2009/06/19(金) 17:56:40 ID:???
>>726 while($line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
て感じです。
出力は、nが1つ出ているだけです。
しかも、データの1行目はfoodなのでmが出てほしいんですが。。
ホントにfoodでmが出てるか↓こう書いて確認したら? print OUT1 "n: $line\n"; print OUT1 "m: $line\n";
>>729 とりあえず、chompを外して
条件を
$line =~ /animal/
に変えて試してみれば?
あと、chompの後でも前でもいいけど、$lineをダンプ
732 :
719 :2009/06/19(金) 18:06:13 ID:???
>>729 その前後に問題があるのでは?
ファイルの open, close がうまくいってないとか?
# test.pl
use strict;
open IN1, '<', 'data_in.txt' or die $!;
open OUT1, '>', 'data_out.txt' or die $!;
while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close OUT1;
close IN1;
# data_in.txt
food
animal
plant
food
animal
#data_out.txt
m
n
m
m
n
ほんとに animal なのか? animal とかじゃないよね?
>>721 ので上手くいくんだから、もうデータが間違えてるだとか
その前後が間違えてるとしか思えない
スクリプトデータを頂戴
記述間違いから何から何まで直してやる
use strict; use warnings; open IN1, '<', 'testdata.txt'; open OUT1, '>', 'results.txt'; while(my $line = <IN1>){ chomp $line; if($line eq "animal"){ print OUT1 "n\n"; }else{ print OUT1 "m\n"; } } close OUT1; close IN1; 5000個のデータ作ってやってみたけど、ちゃんと動くし、簡単なチェックスクリプトで確認したけど、 animal なのに m になってしまうなんてのは無かった。 キミの組み方の問題かと思われ。
736 :
714 :2009/06/19(金) 18:30:29 ID:???
>>733 はい、一番処理しないといけないデータはanimalとかじゃなくて別の言葉です。
このanimalとかは、練習用で使ってたデータです。
下に生のデータを掲載させてもらいます。
>>734 スクリプトデータって読み込んだデータのことですよね?
animalとかじゃなくて、実際に処理したいデータはこんなのです。
NonWord
NonWord
NonScriptWord
NonScriptWord
NonWord
NonWord
NonWord
NonWord
ScriptA
ScriptC
こんなのが5000ほどあります。
この中のNonWordについてのみ"n"と返してほしいんです。
書いたプログラムは
>>729 から進歩してません。
>>736 > 書いたプログラムは
>>729 から進歩してません。
だから、そのスクリプト(プログラム)を見せろって
738 :
714 :2009/06/19(金) 18:56:47 ID:???
>>737 use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
use open IN => ":utf8";
use open OUT => ":utf8";
open(IN1, "<data_in.txt");
open(OUT1, ">data_out.txt");
while(my $line = <IN1>){
chomp $line;
if($line eq "NonWord"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close(IN1);
close(OUT1);
これが全貌です。
やはり、生のデータの方を扱っても1行目のNonWordに対してmと出るだけです。
つまり出力はm一文字しか出てない状態です
アスキーファイルじゃないのかよ まずUTF-8のBOM付きファイルかどうか確認しろよ
740 :
714 :2009/06/19(金) 19:08:30 ID:???
みなさん、本当にありがとうございました。 今ツレに言われたんですが 「その作業、エクセルでできんじゃね?」て言われて、やってみたらできちゃいました。 たくさん協力してもらったのに、ほんと、すいません。
全部ASCIIだからBOMが無ければutf8かどうかは関係ないな。 隠された部分が無ければの話だが。
このスレだけでも3人の質問者が IN1 と書いていて 全員初心者を自称しているわけだが(初心者質問スレだから当たり前ではあるが)、 すると恐らく、参考にした入門書・入門サイトも一緒なのだろう。 いったいどこが出自なんだろうな?
同一人物じゃねーの?
はじめは IN1 と OUT1 を open するところも書かないし IN1 は5000行ばかしのファイルらしいしコードを見せたがらない という入門サイトを参考にしてるんだろう
おなじ宿題だろ
>>738 それをコピペして動かしたけど、ちゃんと動くよ
まだ隠してるトコあんじゃね?
それかデータファイルそのものを、どこかにアップしてみてよ
データファイルを見ないと、もう解決できんよ
727で今日中にって言ってるだろ もう終わった話なんだよ 落第すりゃいいのにね
宿題を2chで質問しちゃうような奴は、どの道向いてない
新しく環境を構築したんですけど、 以下のコードをApache2.2のlocalhostで実行すると 一度起動するたびに「てすと」と2回書き込みされてしまいます。 どうしてもコーディングにミスが見当たらないんですが 環境が悪いんでしょうか? 対処法ありましたら教えてください #!/usr/bin/perl use strict; use encoding 'utf8',STDOUT=>'shift_jis'; open(ADD,">>",'./txt.txt') or die; print ADD 'てすと'."\n"; close(ADD);
OSが壊れてるね
>open(ADD,">>",'./txt.txt') or die; open(ADD,">./txt.txt") or die; これでもだめ?
>>751 そうすると何度実行しても一行だけになります。
普通ですねw
ブラウザのキャッシュ消したり、プロクシ見直したりしてもだめでした。
httpd.confにも異常なしです。
最近デュアルディスプレイにしたんですけど関係ないですよねぇ
まずログ見ろよ 2回リクエストされてればブラウザが悪さしてる そうやって可能性を推測していけ、サルじゃなければできる
標準出力に何も吐いてないからブラウザには500が返るよね
>>753 Apacheのアクセスログも2重になってましたorz
3種類のブラウザで試しましたが同じでした。
どこら辺が悪いかわかるでしょうか?
>>754 そこら辺は省略してますが問題ない内容です。
ヘッダと少しのテキストをprintしてます。
じゃあabで1リクエストしたらどうよ
>>756 ab -n 1 -c 1 http...
'ab'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
o...rz
今更ですがerror.log見たら
utf8フラグをprintしてるとか書いてありました。
ダメなんですか
apache のディレクトリまで Path 通ってたっけ? ab の Path をフルで指定しれ
とりあえず
use open ':encoding(utf8)';
lwp-requestはある?
バージョンが古いと別の名前だったような気がするけど。
lwp-request -USe
http://localhost/ こんな感じで。
>>758 やってみたら理想通り動きました。
>>759 こちらも理想通り動きました。
それと、よくわかりませんが
200 ok
だそうです。
apacheとPerl,Ruby,PHP入ってたんですが一度全部消してみました。
で、同じバージョンで再インストールして
Perlの事だけ考えて設定してみましたが変化なしです。
何度もすいませんがどうすればいいんでしょうか?
>>760 レスポンスヘッダの時刻に注目して。オプション付けると出てくるから。
スクリプトに warn('hoehoe'); とか書いといて。実行される度にエラーログに載るから。
それと、apacheのアクセスログ。
どのリクエストが、どうスクリプトを動かして、どのレスポンス出してるのか、
タイムスタンプで照らし合わせて見て。
一致するならapacheに問題ないから。
解決しますた。 原因はその後のコードにありました。 全く関係ないと思ってたんですが ヒアドキュメントで print <<EOM; ほにゃらら <link rel="stylesheet" href="" type="text/css" /> ほげほげ EOM としてたんですが 上記のタグを削除したら直りました。 たぶんスタイルシートが読み込めなかったから ブラウザが自動的にリロードしたんだとおもいます。 くだらないエラーですいません。ありがとうございました
後出しジャンケンうぜぇええええええええええええ
すこし慣れてくるとコツコツとデバッグしなくなるから困るw
www
>>766 サンクス!やっぱfirefoxはいいね
Safariに入っているWeb インスペクタは重宝していますm(_ _)m
デバッグの時、
HTTP::Proxyで 、localhostに仮想プロ串立てて、
そこから全てのリクエスト(ヘッダやPOSTの中身、Javascript絡みの通信も)を
監視してるオレは、マイノリティなのかな・・・。
wiresharkで通信全部見る。httpsには使えないが。
5.10って色々不便そうだな 6が出るまで5.8でいいわ
5.005のときも5.6のときもそんなことを思ったw
まぁライブラリ/モジュールの対応が遅れるのは仕方ないだろ。 ところで // ってどんなときに使うん?
my $d = $v; 但し$vの内容がundefなら$d = '' にしたい ↓ my $d = $v || ''; ↓ $v = 0 でも$d = '' になっちゃうじゃん ↓ my $d = $v // '';
質問です。 値をリファレンスにして、サブルーチンに渡す。 あるいはサブルーチンで処理したデータをリファレンスで受け取った後に、 そのリファレンスの値が参照できない・・・ということはありますか?
あったら大変じゃん
>>776 いまいち話が掴めないけど、
普通に使っていれば、無いんじゃないか。
内部コードをutf8で書きhtml出力をshiftjisで書いてるんですが、 フォームから「テストあいうえお日本語」等と送っても正常に処理出来るんですが 「テスト&」と送ると Wide character in subroutine entry at C:/usr/lib/Encode.pm line 162 となりエラーになります。 「&」だけでは大丈夫なんですが「ト&」ではエラーになります。 デコード前に処理が必要なんでしょうか?
ソース無しにデバッグしろとな。 エスパーすると、decodeした文字列をもう一回decodeしてる。
>>780 見苦しいですが思いあたるとこはこの辺りです。
use Encode qw(from_to decode encode encode_utf8);
use open ':utf8';
use encoding 'utf8',STDOUT=>'shiftjis';
my %param = parse_form();
my $query;
if (exists $param{'query'}) {
$query = decode('shiftjis',$param{'query'});
#$query = $param{'query'};
}
sub parse_form { my $buffer; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } my %param; foreach (split(/&/,$buffer)) { my ($name,$value) = split(/=/); #form要素のname属性が/^[A-Za-z]+$/でなければ無視する $name = uri_decode($name); next unless $name =~ /^[A-Za-z]+$/; $value = escape_string(uri_decode($value)); if (defined $param{$name}) { my @values = sort((split(/\t/,$param{$name}),$value)); $param{$name} = join("\t",@values); } else { $param{$name} = $value; } }
sub uri_decode { my $string = shift; $string =~ tr/+/ /; $string = encode_utf8($string); $string =~ s/%([0-9A-Fa-f]{2})/pack("H2",$1)/eg; return $string; } sub escape_string { my $string = shift; $string =~ s/&/\&\;/g; $string =~ s/"/\"\;/g; $string =~ s/$string =~ s/>/\>\;/g; $string =~ s/\t/\ /g; $string =~ s/\r\n/\n/g; $string =~ s/\r/\n/g; return $string; } return %param; }
そんな適当なデコードするくらいならモジュール使ったほうがいい
>>784 ふだんはuse CGIしてるんですけど、
URIデコードの途中でutf8フラグを落とさないと
上手くいかなかったんで試行錯誤してます
具体的にやり方教えてもらえるならお願いします
use utf8; use open ':utf8'; binmode(STDIN => ':raw'); binmode(STDOUT => ':encoding(Shift_JIS)'); use CGI qw(-utf8 :cgi); my $cgi = CGI->new; my $query = $cgi->param('query');
>>775 あぁなるほどね。
"0"も0も、||オペランドでは数値の0として評価されるから必要になるのか。
このノリでrubyやると躓くんだよな
>>786 おお!ありがとうございます。
と思ってprintしてみたらデコードされてなかったorz
もうやだ文字コードめんどくさい。
もうutf-8駄目な環境は無視していいのかな?
なるべくshiftjisで粘るのが吉
>>789 STDINがutf8で、STDOUTがShift_JISで、コードがutf8なんだよね?
デコードされてなかったってのは、\x{0081}とかで表示される?
うーん、分からん。
でも、CGI.pmとencodingの相性が最悪なのは分かった。
use encodingせずにCGI.pmのparamを自前でdecodeしてから 使うのが今のところ確実かな。
>>791 >デコード
例えば「テスト&」と送ると
\x{fffd}e\x{fffd}X\x{fffd}g&
となりutf8::is_utf8はtrueになります。
まだ勉強しなきゃいけない部分が多く出て来たんで
対処のしようが無いorz
>>792 CGI.pmはインスタンス作った時点でデコードされてるんではないんですか?
てことは、paramを自前でデコードしても2重デコードになったりしないんですよね?
あれ?俺なんか変?
入力がShift_JISなのね。 use utf8; use open ':utf8'; binmode(STDIN=>':raw'); binmode(STDOUT=>':encoding(Shift_JIS)'); use CGI qw(:cgi); my $cgi = CGI->new; my $query = decode 'Shift_JIS' => $cgi->param('query');
797 :
796 :2009/06/26(金) 19:27:16 ID:???
一応動くと思うけど、paramの返り値のundefチェック忘れてるので適宜入れておいてね。 ソース見て気になったけど、サブルーチン内でサブルーチンの定義はPerlではやめた方がいいよ。
>>796-797 ぅわぁぁぁぁ完璧です。
いままで何度も挫折したんですが初めて解決しました。
まじで感謝してもしきれないですw
>サブルーチン内でサブルーチン サブルーチンからサブルーチン呼ぶ場合はいつもそうしてました(汗
mplayer だかなんだかわすれたけど、パッケージマネージャーを見てれば発見できるよ
801 :
799 :2009/07/01(水) 02:27:40 ID:???
>>800 さん
>mplayer
なるほど.一度外部のアプリを使って画像を生成して
それの大きさを取得するってことですかね?
ちょっとやってみます.
アドバイスありがとうございます.
パッケージマネージャーのほうはよくわかりませんでした.
会社に行ったらPCから書きまする
今は使ってないので、使い方は試行錯誤してもらうとして。 ppm から Audio-Play-MPlayer っていうパッケージを入れて、 実行する CGI/pl と同じディレクトリに MPlayer を置いてください。 使い方は、、、がんばれw 書いてて思ったけど、自分は system() で起動して情報を取得してた気がするw
804 :
799 :2009/07/02(木) 23:42:04 ID:???
>>802-803 さん
継続してアドバイスありがとうございます。
自分でも色々試行錯誤した結果なんですが、
エンコで使うffmpegが入力する動画情報も返してくれることが
分かったので、そっちを使うことにしました。その結果、
my @out = `ffmpegのパス -i 動画ファイル名 2>&1`;
my ($width, $height);
foreach my $line(@out){
$line =~ /Stream .+ Video: .+ ([0-9]+)x([0-9]+), /;
if($1){
$width = $1;
$height = $2;
last;
}
}
print "$width x $height\n";
こんなかんじで取得することができました。
>>802-803 さんや、見守って頂いたスレの皆様に感謝致します。
ありがとうございました。
Encode::Guessなんだけど、候補が複数あるときに どれを採用すればいいのかって話は確立してる? 今のところ、すべての候補でdecodeして文字列長の短いものを採用しているんだけど 良い方法があるなら知りたい。
それが確立されてればとっくに文字コード誤判別問題は解決してる
それもそうか。
幸いにも
>>806 の方法でまだ文字化けには遭遇してないけど、もしバケたら諦めよう。
Guess で or って文字列が無ければ決め打ち or って文字が入ってれば、最初に来たエンコードでやってみる すごくあいまいだけど、それで済ましてる
それだけだとバケると思うけど。 use strict; use Encode; use Encode::Guess qw/euc-jp shiftjis/; my @words = ( "\xE3\x83\xAF\xE3\x83\xB3", # UTF-8 "ワン" "\xE6\x8E\x88\xE6\xA5\xAD", # UTF-8 "授業" "\xE7\x86\xB1\xE3\x81\x84", # UTF-8 "熱い" ); for my $word (@words) { my $enc = Encode::Guess->guess( $word ); if( ref $enc ) { print $enc->name,"\n"; } else { print $enc,"\n"; } } 結果は shiftjis or utf8 shiftjis or utf8 utf8
形態素解析にかけてだな
それで?
形態素解析といえば、Yahoo! APIに丸投げする手があったか。 ・・・コストたけえよ。
array、scalar両方をreturnすることのできる関数を使用するときに、 arrayを期待して関数を実行する一般的は方法はどのようなものでしょうか? スカラーを期待するときは print scalar any_func(); とscalarを使えばいける用ですが、arrayを期待するやり方が分かりません。
例えば @{[ func()]}; とか? 要素だけ欲しいなら [ func()]->[0] とか使ってる もうちょっといい方法があるかもしんないけど
印字ならprint any_func();でいける 代入なら($x)= any_func();でいける
>>515-516 即レスありがとうございます。
any_func() のなかでwantarrayを使用しているのですが、
sub any_func {
my @a = (1, 2, 3);
my $s = 6;
return wantarry ? @a : $s;
}
print文のなかで使用するにはやはり一旦変数にとってからprintでしょうか。
print文のなかで直接any_func()を使用するとscalarのreturnが表示されて困ってました。
use strict; use warnings; sub any_func { my @a = (1, 2, 3); my $s = 6; return wantarray ? @a : $s; } print any_func(); wantarryをwantarrayに直しただけで、ちゃんと123が表示されるよ?
820 :
nobodyさん :2009/07/11(土) 19:10:03 ID:??? BE:221100555-PLT(54324)
print +(any_func());
>>819 すみません。勘違いでした。printのなかで使用した場合arrayがかえってきました。
>>820 こんな指定の仕方もあるんですね。知らなかった。。
マジレスすると、 リストを返す関数からリストを得る為には、関数を「リストコンテキストで評価してやる」だけでよろしいです。 wantarray() の名の通り、array を want してやるだけ(ここは Perl 用語としては array でなく list と呼ぶべきだけれど)。 リストコンテキストの例としては、リスト代入(配列、ハッシュ、あるいはスカラー変数のリストに対する代入)、リストを取る関数の引数部などがそれにあたります。 print() は引数にリストを取る関数なので print の引数はリストコンテキストで評価されます。ですからこの場合、特別な仕掛けは要りません。 Perl の組込関数は、単項演算子として振舞ういくつかを除き、ほとんどが引数をフラットなリストとして扱います。 そのため scalar() はあっても、対となるはずの list() 組込関数は存在しません。(和ラクダ第3版v2 P.925 参照) # ちなみに scalar() 自身は単項演算子として振舞う関数のひとつです。
823 :
nobodyさん :2009/07/16(木) 14:08:29 ID:XeS/olXC
すみません、質問です。 サーバーはXREAを使っています。 MIME::Parser を使おうと思い、他の箇所は問題無いCGIファイル内に use MIME::Parser; という記述を入れると Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 119. Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 120. Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Head.pm line 143. Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Entity.pm line 230. Argument "2.00_01" isn't numeric in subroutine entry at /usr/local/lib/perl5/site_perl/5.8.8/MIME/Entity.pm line 231. というエラーが発生してしまいます。 これの回避方法をご教示ください。 よろしくお願いします。
>>823 該当ファイルの該当行の前後がどうなってるのか分からないとね。
826 :
nobodyさん :2009/07/21(火) 03:06:34 ID:uwULaVde
誘導により、プログラム板より移動していきました。 CGIを作っているのですが、<input type="file" name="file">の扱いがよくわかりません。 ファイルが入力されているかいないかの判別を、definedで判別できるかと思ったのですが、 $cgi = new CGI; if( defined( $cgi->param( "cgi"))) {} これだと、いつもifの中にはいってしまいます。 わたしが謝ったコードを書いているのでしょうか? 今は、 if( 4 < length( $cgi->param( "cgi"))) で処理していますが、通常はどのような条件分岐を行うのでしょうか? (上記の条件分岐は、ファイルをzipファイルをアップロード対象としているため、拡張子の分のファイル名を4文字と考えています。
大体のブラウザではファイルが選択されていない場合、空文字が入りますのでdefinedでは常に真になります。 ベターなチェック方法は if( defined( $cgi->upload( "cgi"))) {} です。 この方法ならファイル選択をせずテキストボックスに適当な文字を入力されたケースにも対応できます(偽が返る)。
>>827 それだと2回も uplodad メソッドが呼ばれるからなんか無駄な気分
if( defined( my $file = $cgi->upload("cgi") ) ){
print $file;
}
こんな感じのがよくね?
パスワード付きのzipファイルをPerlで解凍する方法を教えてください。 sample.zipのパスパードはtestです。ここまで書きました。 #!/usr/bin/perl use strict; my $zipfile = 'sample.zip'; my $pass = 'test';
>>829 my $unzip = "/usr/bin/unzip";
my $file = "$unzip -p -P $pass $zipfile |";
open my $fh, $file;
my @lines = <$fh>;
close $fh;
あとは@linesを書けばOK
それ、コマンド叩いてるだけじゃ...
自力でやる意味がどこにあるんだ 勉強の為だとしたら質問するんじゃない
コマンド叩くのが一番自然
Archive::Zip はencryptに対応してないってマニュアルに 明記されてるし、IO::Uncompress::Unzipははっきりとは 書いてないけどパスワード与えるインタフェースがなさげ なのでこちらも多分対応してない。
> IO::Uncompress::Unzipははっきりとは > 書いてないけどパスワード与えるインタフェースがなさげ > なのでこちらも多分対応してない。 return $self->HeaderError("Encrypted content not supported") if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK); そうみたいだね。
my @bar = (scalar(@{$foo}) > $N) ? @{$foo}[0..($N-1)] : @{$foo}; というコードがあるんですが、何をやっているのかわからないので教えてください。 ・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。 ・scalar(@{$foo}) は結局何をしているんでしょうか?
> ・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。 $fooというリファレンスを、デリファレンスしてる > ・scalar(@{$foo}) は結局何をしているんでしょうか? 配列の要素数を得てる スカラーコンテキスト。 my $count = @array; ってやると、コンテキストで要素数が得られるのと同じ。
ふと心配になったので、念のため @{$foo} と書くのも @$foo と書くのも一緒だから、覚えとくといいよ。むしろ後者で書く人の方が多い気がするから。
>>837-838 ありがとうございます。@{$foo}と@$fooは同じなんですね。
@{$foo}なんて書き方、初めてみたんですが、これどんなときにつかうんですか。@$fooだけでいいように思いました。
>>839 Perlはいろんな書き方出来る言語だから、そんなことでいちいち疑問に思ってたら前に進まないよ
というより、@{$foo}の方が丁寧な書き方っていう印象がある。
俺がそう思うということは、たぶん、オライリーのプログラミングPerlや初めてのPerlにはそう書いてあるはず。
>>839 あくまで @{...} が基本形。{} の中はリストリファレンスを返すものなら何でもいい。
@{ ['A'..'Z'] }
@{ $flag ? $bar : baz() }
@{ $foo[1] }
${ $quux }[1]
@{ $quux }[ 1..3 ]
@{"symbolic"} # 文字列ならシンボリックリファレンス
@{bareword} # トークンなら普通の変数
{} の中が単純なスカラー変数の場合は{}を*省略*できる (そして省略する人が多い)。
…と覚えた方が、後で悩まずに済むよ。
${foo}
バイナリに関してです。 my $head = 0x00000000; #空の4バイト確保 print (pack( "V", $head) . "\n"); #挙動がおかしいのでちょっと出力してみた しっかり消滅してるしw どうしればいいですか。
>>843 よくわからんがhoge.plにそのまま書き込んで実行してみた。
% perl hoge.pl |hex
0x00000000: 00 00 00 00 0a - @@@@J
ちゃんと4バイトの0が出てるので書いてるとおりの動作だな。
これで不満ならどうやって確かめて何がおかしいと思ったのか説明
してもらわないと。
すみません。 俺が勝手に使ってるテキストエディタ内の新タブに出力させてたら、エディタの問題だったみたいです。 プロンプト、ファイル出力、共に4バイトありました。
この↓ようなモジュールないですかね?
use CGI::Sendmail;
my %mail = (
To => '
[email protected] ',
Cc => '
[email protected] ',
Bcc => '
[email protected] ',
From => '
[email protected] ',
Name => "ひろゆき",
Subject => "こんにちは",
Body => <<EOL,
お元気ですか?
では、さようなら
EOL
"Sendmail-path" => "/usr/sbin/sendmail",
"Character-code" => "euc-jp",
);
if ( CGI::Sendmail->new(%mail)->send ) { print "送信完了" }
else { print "送信できませんでした" }
848 :
nobodyさん :2009/08/12(水) 18:05:46 ID:XtZqM+tg
超低レベルな質問なんですが フォームで受け取った$pass(値はhoge)と 同じくフォームで受け取った$idをファイル名に含んだファイルの二行目をfile()で読み込んで $data[1](値はhoge)に代入して if($pass==$data[1]){ print"値は同じです".$pass"==".$data[1]; } else{ print"値は違います".$pass"==".$data[1]; } を実行すると 「値は違います hoge==hoge」 と表示されるのですが「値は同じです」と表示させるにはどうしたらいいですか?
eq
それか改行入ってるとかありがち
851 :
nobodyさん :2009/08/12(水) 18:14:13 ID:XtZqM+tg
PHPスレと間違えましたすみませんでした
>>847 d
文字コード変換とMIME-base64?変換を自分でやれば使えそうです。
853 :
nobodyさん :2009/08/13(木) 20:16:07 ID:CNJ7rD2p
Perl勉強したときは printfと書きましょうと習ったんだけど printでも普通に使えるよね? 昔は使えなかったの?
>>853 >printfと書きましょうと習ったんだけど
まずそれがおかしい
誰からどう習ったんだよw
printfのfの意味わかってんの?
こういう場合は という限定的な意味で教えたが、
習った
>>853 は、全ての場合でと勝手に解釈したってことだろ
会話で生じる誤解としては良くある例
printf が使えるなんて知らなかった print と sprintf だけ使ってた びっくらこいた
人のソースみるとびっくりすること多いよね こんな書き方できたのか!?って
糞質問失礼します html表示するときのフォントをverdanaにしてるんですが そうすると半角¥がバックスラッシュで表示されてうざいので $hoge=~ s/\\/¥/ig; としようと考えたのですが、すると今度は特定の日本語文字が 化けてしまいます $hogeの中の英数記号だけを変換するにはどう書いたらよいでしょうか
861 :
860 :2009/08/14(金) 02:12:28 ID:???
あっ $hoge=~ s/\\/&yen/ig; です
use utf8
>>859 $hash{$1} = $2 while $str =~ /(.+):(.+)/g;
とかな
864 :
nobodyさん :2009/08/14(金) 14:02:57 ID:dh+Y7m4l
>>860 バイトコードで書く
\5Cの次にS-JISの2バイト目が来なかった場合のみ置換
>>864 正規表現で書くことはできますか?
すみません初心者で
>>865 肯定の戻り読みを使って、単語の後と行の先頭のときのみを置換するようにしたらどうだろう?
$hoge =~ s/((?<=^)|(?<=[\x00-\x7F\xA1-\xDF])|(?<=[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))\\/¥/g;
>>867 おおおおおおお成功しました。感謝です
?<=なんて初めて知りました
>>866 勉強します
それだと例えば「や・ら・わ行」の次に「能」の字とかが来ると化けるけどな
以下のようなコードで、 use Data::Dumper; print @Data::Dumper::EXPORT; #=>Dumper パスを文字列にしてアクセスする場合は、シンボリックリファレンスにするしかないですかね? my $path = "Data::Dumper"; print @{$path."::EXPORT"}; #=>Dumper
use strict でエラーにならない?
>>870 print eval "\@${path}::EXPORT";
873 :
nobodyさん :2009/08/17(月) 00:52:26 ID:PDEfAFzM
linuxのperlモジュールについての質問はここで良いのでしょうか?
いいんじゃないのー
>>870 {package Data::Dumper;
print EXPORT}
とかは?
試してないけど
あー意味不明でした { package $path; print @EXPORT} package で変数使えるならいけそうだけど使えなかった記憶が…
それ eval "package $path" ってしないとダメだよ。 前に一度そういうコード書いたことあるからわかる
878 :
nobodyさん :2009/08/17(月) 09:09:05 ID:QR35H0tn
あげ
879 :
nobodyさん :2009/08/18(火) 00:44:13 ID:jmGn/Iui
>>879 UserAgentがLWPだから
はじかれてるとか?
882 :
nobodyさん :2009/08/18(火) 02:57:59 ID:B/cB/Ta1
本当にからなの?
>>879 お父さんが設定した、未成年向け有害情報フィルタでフィルタリングされた。
>>879 ありがちなのはUserAgentとかRefererとかCookieとかトークンで弾かれてるってパターンだな。
全部偽装してみりゃいい
886 :
879 :2009/08/18(火) 13:44:36 ID:9U61OqMG
use LWP::Simple;
my $url = "
http://headlines.yahoo.co.jp/rss/indonews_c_int.xml ";
my $file = "./rss.xml";
my $rc = getstore($url, $file);
is_success($rc) or die status_message($rc);
こっちはこれでアクセスできてるけど。
これがダメなら、一度LWPのパッケージのバージョン上げてみて、
それでもダメなら別の角度からどうぞ。
それ以前に、ブラウザでアクセスできてるんかいな。
889 :
879 :2009/08/18(火) 18:56:58 ID:2nsUhaJf
>>888 最後の行でサーバエラーが出ました…
またブラウザでアクセスは出来ます。
あとアップデートはrootでrpm -Uvh perl-libwww-perlを行って出来ませんでした。
間違いを指摘して貰えると助かります。
パッケージマネージャからではなくて、cpanを使ってバージョン上げるとどうなる? 依存関係でcpan使いたくないのなら、別に/usr/localにソースからPerl突っ込んでみるとか。 ここまで来るとlynxかwget使って取得した方が早そうだけど。
891 :
879 :2009/08/18(火) 22:21:49 ID:2nsUhaJf
>>890 cpanでinstall LWPとした所、LWP is up to date(5.830)となりました。
892 :
nobodyさん :2009/08/19(水) 01:47:46 ID:1hmn0Zu+
てす
>>889 rpmで削除できないか?できないなら@INCから自力でLPW探して
LPWを手動で削除してもっかいcpanから入れてみろ。
>>889 つーか、ブラウザではプロキシ経由とかそういうオチじゃないだろうな・・・。
プログラム板から誘導されてきました perl+htmlで掲示板を作っています。PC・携帯共に基本的には正常動作するのですが、auの機種のみ ■html側(shift_jis) <form action="bbs.cgi" method="post"> <textarea name="comment" rows=4 cols=30></textarea> <input type=submit value=発言> </form> ↓「あいうえお」と入力 ■bbs.cgi(EUC_JP) use CGI; $query = CGI->new; @params = $query->param(); foreach $param (@params) { $in{$param} = $query->param($param); } ↓ $in{comment}の中身は「??????????」 のような動作になってしまいます。 URLエンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら…… 何か解決法は無いでしょうか。 よろしくお願いいたします。
Encode Guess
EUC-JPの文字コードはShift_JISとどっかぶりだから、判定できないことがしばしばある。 携帯向けコンテンツはShift_JIS/UTF8のどっちかで作っとくことをお勧めしとく。
898 :
nobodyさん :2009/08/19(水) 23:39:59 ID:1hmn0Zu+
>>895 $in{comment}の中身は、shift_jisコードで「あいうえお」なのだから、この中身をeucに変換する必要があるでしょ。
変換するとき自動にすると誤作動するから、my $str = Jcode->new($str, "sjis")->euc; などと元のコードを指定するべし。
あと、ページを出力するときにcontent-typeヘッダにcharsetを指定するべし。
DBIでcreate databaseとdrop databaseは出来ますか?
>>980 できるだろ
適切に設定してあれば
もし外部に操作させようってんなら愚行だと思うが
こちらでいいか分かりませんが、質問させてください 今PATH_INFOの汚染チェックでヌルバイト(%00等)があれば消去という処理を したいんですが、なぜかマッチしてくれません $PATH = shift; $PATH =~ s/(\0|\x00|%00)//g; POSTやGETでは上記の処理で消すことが出来たんですが PATH_INFOの場合はやり方が違うのでしょうか? ちなみにタグのサニタイジングは出来ました
>>902 サニタイズ脳乙。
つーかapacheだとNULLは受け付けてくれないんだが(Not Foundになる)。
PATH_INFOを16進ダンプとかしてみた?
>>903 あー
だからPCからだと404に飛んだんだ
test.cgi/test/%00/aaa/
でPATH_INFOを表示させた場合
PC→404エラー
携帯(au)→/test/
となりました
16進ダンプ…調べてきます
あとクライアントが蹴ってるのかサーバーが蹴ってるのか分かんないから、 見れるならサーバーのログもみとくといい。 クライアントが蹴って単にサーバーまで届いてない可能性もある。
906 :
895 :2009/08/20(木) 11:42:27 ID:???
>>896-899 ご回答ありがとうございました、いくつか試してみました。
1.EUC-JPとShift_JISの判定問題が疑われるので、両方sjisに揃えてみる
→揃えても$in{comment}の中身は「??????????」で変わらず。この判定問題ではない?
Jcode変換しても全く変わらないので、そもそも「??????????」はshift_jisコードですらなさそう。
2.Encode Guessの使用
→両方sjisに揃えたうえで実行してみましたが、「??????????」はasciiコードとのこと。(「??????????」そのものになっている?)
UTF-8での作成も試してみようと思います。
これで出来なかったら素直にPHPに行ってくる……
携帯電話なら、Shift_JISが今でも定番だったりするしな。
>>895 Encode関連と見た。SJISだと「あいうえお」は全部MSBが立ってるから、
UTF-8ではマップできない。で、?に置換される。
MSBの立ってないのが混じってる「01234」で試してみ?
「?」以外の文字が混ざるようならビンゴだ。
>>897 今のUAでcharset=を解釈しないものとかHTMLの文字コードと送られてくる
文字コードが食い違うものって残ってる?
>>899 Encode使えよ
>>908 auはページがUTF8でもフォーム内容はShift_JISで送られてくるんじゃなかったっけ?
てか、 > ■bbs.cgi(EUC_JP) を見て反応して、 > ■html側(shift_jis) を見逃してた。 なるほどEncode.pm絡みか。
これってEncodeの問題? CGI.pmって URLデコードが失敗すると?になったような use CGI; use URI::Escape; print CGI::unescape( uri_escape( 'あいうえお' ) ); とかで試してダメならCGI.pmのバージョン上げてみるとか
912 :
Name_Not_Found :2009/08/21(金) 00:52:35 ID:nWh8czvG
Wep製作板から乗り移ってきました。以後よろしくお願いします。 肝心な質問ですが、 検索ボタンと一緒に付随しているコンボボックス?の事についてですが、何か1つコンボボックスの中の項目を選択して検索ボタンを押した後、その選択したコンボボックスを残した状態で検索結果を表示させたいです。 ただ検索ボタンとコンボボックスの領域は別のhtmlになっていて、検索結果を表示するCGI側で、その検索ボタンとコンボボックスがあるhtmlを読む込みようになっています。 前の検索項目を残すようにすることは可能でしょうか? よろしくお願いします。
可能
914 :
nobodyさん :2009/08/21(金) 03:36:54 ID:kHQe2rHZ
てす
915 :
Name_Not_Found :2009/08/21(金) 09:53:12 ID:nWh8czvG
LWP 使った書き方が沢山ありすぎて迷う LWP の使い方はここを見ておけば、大概は困ることないよ っていうサイトはありますか?
質問です。 どこで聞いていいのかわからないので適切なスレがあれば誘導お願いいたします。 たとえば下記のようなディレクトリ環境をサーバに上げた場合、 a1以下全ての属性を777にしようとffftpのソフトでやると一つずつしか変更できないようでした。 そこでDOSプロンプトからftpで入り quote site chmod 777 a1 としたところうまくいったので、下記のように再帰オプションをつけたところエラーになりました。 quote site chmod -R 777 a1 ヘルプをみると引数が2とあったので、ここでのchmodにはオプションが使えないのだと思います。 a1/ |---b1/ | |---text.txt |---b2/ | |---c1 | |---text.txt |---b3/ telnetなどがサポートされていないサーバなのですが、再帰処理ができるソフトやコマンドはありますでしょうか。
>>915 html読み込まず、
cgiから吐き出せば?
>>912 まず html 側に独自タグを定義して、読み込んだときに置換すればいいかな
例えば
------- test.html -------
<form action="hoge.cgi" method="post">
<input name="nanka_no_flag" value="1"{checked} />
</form>
-------- test.cgi --------
$q = new CGI;
open FH, 'test.html';
print "Content-Type: text/html;\n\n";
while my $line(<FH>){
if($q->param('nanka_no_flag') == 1){
$line =~ s/{checked}/ checked="checked"/;
}
print $line;
}
こんな感じ?
ニュアンスが伝わればいいけど
あとはJavaScript使うとか
X <input name="nanka_no_flag" value="1"{checked} /> O <input type="radio" name="nanka_no_flag" value="1"{checked} /> orz
セレクト値も送っといて、その値に合わせてselectedをつけるか、 javascriptでセレクト値のクッキー食わせといて、javascriptで選択済みにするかぐらいか。 コンボボックスなら入力値を手入力できるだろうから、その辺もきちんと処理しないとね。
923 :
nobodyさん :2009/08/22(土) 01:27:58 ID:R3OZ89h5
SSI使用ページ(shml)があって、その中でcgiを複数呼び出している。 そのshtmlページをサーバのロックでなくて、パスワードでアクセス制限したい。 なら素直に全部をトータルでcgi使えという声もあろうが、全部がスクリプトだと レイアウト変更や更新が面倒。それに、一部iFrameなんかは楽だしね。 で、shtmlページを完全にアクセス制限する手はなんか内でスカイ?
いや、それperl関係無いし
925 :
Name_Not_Found :2009/08/22(土) 10:13:30 ID:egsrQGCy
>>919-922 の皆さんご回答ありがとうございます。
早速それらの方法を真似て修正したいと思います。
またつまづいてしまったらきます。
ありがとうございました。
926 :
879 :2009/08/22(土) 20:07:07 ID:???
cpanで「install libwww::perl」と行っらインストールできなかったのですが、 何が原因でしょうか?今はもう無くなってしまったのでしょうか? 他のモジュールは通常通りインストールできます。
928 :
879 :2009/08/23(日) 18:08:57 ID:???
通常プロキシ経由で外部と通信しているのですが、私のPCは外部との直接通信を許可してあります。 他の許可してあるPCではis_successで成功するのですが、私のでは出来ません。 firefoxでプロキシなしでネットに繋ごうとすると繋がりません。 いろいろ試したのですがよく分からないので、考えられる原因を教えてください。
>>928 それってつまり、プロクシなしで正常に外部と通信出来てないってことじゃん。
それじゃあLWP云々の前に、そのPCで正常にアクセス出来るよう
設定見直すなり、会社(組織?)の管理者あたりに相談だな。
>>929 あぶねえ、同じようなこと投稿するところだったw
perlの問題じゃなさそうだし、直接そのPCを見ることのできる人に相談だろうな。
931 :
nobodyさん :2009/08/23(日) 19:12:32 ID:dufUiF83
>>928 コマンドプロンプトから
pingとtracerouteで接続状況を確認したら?
perlの問題じゃないと思ふ
932 :
nobodyさん :2009/08/24(月) 15:05:19 ID:+a5IC9tF
こんなの初めてだよ $aには1002が入ってて、$bには002001が入ってるはずだから、print "$a$b" ってすると1002002001となるはずが 1002 002001 と表示される、勝手に改行されている chomp $aやchop $aしてみたけど、chompをやった結果は最初と変わらんし、chopをやると 100 002001 という結果になる 原因も対処法もわからない ちなみに$a<>$bってやると 1002<> 002001 <>が上に来る不思議
>>932 パズルの問題でもつくっているのか?
変数毎に検証すれば何も難しくないと思うが。
$a = '1002';
$b = "\n002001";
これで、望み通りの結果だ。
print "$a$b"; # => 1002\n002001
print "$a<>$b"; # => 1002<>\n002001
chomp $a;
print "$a$b"; # => 1002\n002001
chop $a;
print "$a$b"; # => 100\n002001
$aと$bは使うなと何度言ったら・・・って突っ込みは置いといて 変数にs/[\r\n\s]//g;を通してからprintしたら治ったり? URI::Escape;してprint uri_escape($a,"\0-\377");とかして 変なコードはいってないか見てみたら?
>>935 「改行」は行の後につく、という固定観念なんだろう。
文字列というデータ列がターミナル上で「改行」として表示されている、
という概念に辿り着けていないんだろうな。
937 :
934 :2009/08/24(月) 15:24:07 ID:???
>>933 あぁそういう文章問題だったのか!
真剣に答えちゃったよorz
938 :
nobodyさん :2009/08/24(月) 15:33:51 ID:+a5IC9tF
ちょい待てぃ $bも先頭も最後もいじってみたが解決しなかったぞ、俺を甘く見るな 934ためしてくるぞ、ためしてきてからレスしたほうがいいな
>>938 まあ、自分で検証してみなって。
>>933 の入力で、
>>932 の文章による結果は満たしている。
十分合理的で簡潔な解だと思う。
他の条件で異なる結果が得られるのなら、
それも示さなければ、他人には絶対理解できない。
940 :
nobodyさん :2009/08/24(月) 15:39:03 ID:+a5IC9tF
無理ですたorz 俺は何も悪いことしてない 俺も933は思いついたんだが、やはり無理でした
「入ってるはずだから」って何だよ
942 :
nobodyさん :2009/08/24(月) 15:48:02 ID:+a5IC9tF
入ってるはずなのに結果がああなったという日本語 まぁ、もうちょっと一人でなんとかしてみるわノシ
>>942 本当に「入っている」のならば、そのデータと eq で比較すればいいだろうに。
print "a is ok. " if $a eq '1002';
print "b is ok. " if $b eq '002001';
>>934 をしてみてよ。
use URI::Escape;
print '$a = ', uri_escape($a,"\0-\377"), "\n";
print '$b = ', uri_escape($b,"\0-\377"), "\n";
>>932 print "$a$b";
print "$a$b";
print "-$a-$b-";
これで少しは問題の切り分けができるだろ。
俺は他の部分のケアレスミスと踏んでるがな。
946 :
nobodyさん :2009/08/24(月) 16:09:28 ID:+a5IC9tF
みんなありがとう、本当にありがとうb uri_escapeしたら$bの先頭に%0Aがでてきた しかし対処の仕方は $b =~ s/%0A//; しか思いつかなかった
>>946 \nでダメだったんなら多分\rだろ。このメタ文字は環境依存するからな。
>>946 これ↓でもいいんじゃないかな?
$a =~ tr/\r\n//d;
$b =~ tr/\r\n//d;
得体の知れない文字列データの0x0d, 0x0a を削除する、なら、そんな感じでしょうね。
しかし、元の問題をそんな対症療法で逃げていいのか?という気がしますけど。
>>932 は unpack('H*', $a) での確認を覚えておくと手軽でいいかな。
まあ改行削りたくて環境依存したくないなら
tr/\r\n//dにしとけってこった。
Macだったり、Windowsのファイルで\nだけ取れて\rだけ
残っちゃったとかそういうオチだろ。
でだな、何であるはずのない改行が混じってんだよ?ってことなら、
>>949 の言うように
原因追求が次の課題だな。そういうのはほっとくとろくなことにならん。
>>950 Mac上で、WindowsのCRLFなファイルをCR区切りで分割した、という線が濃厚ですね。
Mac perlのそのへんの仕様までは詳しく知らないので、予想ですけど。
UNIXベースの最近のMacは、もうCRな改行コードじゃないらしい、とも聞いてますが、どうなんでしょうか?
>>951 実家にiMac OS Xが健在だから見てみるよ。
>>952 だが、どれがメモ帳に相当するものか分からんかった。すまん。
TeachTextとかないのかよ。
956 :
nobodyさん :2009/08/25(火) 16:14:13 ID:fNKwG09N
スレたてれんかった
>>955 MacOS Xなら、テキストエディットっていうアプリがある筈ですよ。
デフォルトだと文字コードは、Mac Japaneseていうshiftjis互換で
改行は、CRのみです。
しかし、コマンドラインツールなどが吐きだす改行はLFのみです。
目的に応じて変換しないと、分け判らん状態にww
958 :
nobodyさん :2009/08/25(火) 23:56:21 ID:fNKwG09N
mac os xってLFだとおもってた
ここまでくると、単なる罠だな
>>957 thx。俺は漢字
で、Mac OS Xの\nはCRなのかLFなのか。
俺は漢字Talk時代しか知らんので、今のMacは全然使い方が分からない。
>>960 それは、アプリの設定次第。
perlでコーディングするなら、文字コードはUTF8改行は、LFに
アプリ側で設定しましょうって事です。>MacOS X
補足 perlが、吐き出す改行の事を言ってるならデフォルトで ¥n は、LF ですよ。
964 :
nobodyさん :2009/08/26(水) 19:55:07 ID:uFgoj7x+
エラーコード 500 が表示されたんですが、内部の処理(画像を変換する処理)はされてるようなんです。 エラーコード 500の表示がみっともないので、「print "Content-Type: text/html\n\n";」を追加したらエラーコードは表示されなくなりました。 なぜこの「print "Content-Type: text/html\n\n";」だけで、解消されたんでしょうか? 文字はブラウザに表示させてないのに。なぞです。 よろしくお願いします。
クエリパラメータの付いたurlからパラメータ抜きのurlを取り出したいんですが、どんな方法がありますか?
m/^(.*?)\?/ でいいんじゃないの?
$ENV{SCRIPT_NAME}とか。 えっ!?そうゆうことじゃない?
use URI::Split qw(uri_split uri_join); my $str = "..."; my $uri = uri_join((uri_split($str))[0..2], undef, undef);
>>967 どちらかと言うと ? 以降を削った方が、
クエリの付かないURLを渡されても意図通り働くのでロバスト。
/^([^?]*)/ で良いんじゃね
973 :
nobodyさん :2009/08/27(木) 19:11:36 ID:lnXiS6J7
なんか昔のソース見てたら push(@hoge,$&); てあったんだけど、$&て何?
>>974 ありがとう。
英文なのでわかったような判らないような。
正規表現にマッチする箇所”だけ”拾ってくれるって事でいいのかな?
とりあえず理解する糸口を教えてもらって感謝です
>>975 趣味ならいいけど仕事にするなら英語の勉強もしっかり
しといた方がいい。マニュアル読む程度ならTOEIC550点程度でいい。
読んでるうちになれる。
ただし海外のブログやニュースで情報収集したいなら750程度は欲しいかも。
役に立たない正論来ましたね。
TOEIC の話は板違いだろ
ム板で、英語知識の話になるのはよくあること もちろんウザイという意味で
>>980 趣味なら自分で調べるとか、らくだ本くらい投資しましょう。
趣味とはそういうものです。
>>980 最新のパターンマッチで成功した文字列(ただし当該ブロック中で、ブロックやeval()文
で隠れた部分のマッチは勘定に入れない)。
(覚え方:いくつかのエディターでの&のようなもの)この変数は呼び出し専用で当該ブ
ロックに対して動的なスコープを持ちます。
プログラムのどこかでこの変数を使用すると、全ての正規表現マッチにおいてかなりの
性能低下をもたらします。"BUGS"を参照してください。
これの代替として"@-"を参照してください。
>>982 横からすまないが、今まで知らなかったので勉強になった。
perldoc perlvar によると
$& is the same as "substr($var, $-[0], $+[0] - $-[0])"
らしいけど、$& と比較すると使いにくいね..
覚えにくくて可読性の低い特殊変数なんか使わずに普通に括弧で全体囲めよ。
保守
986 :
nobodyさん :2009/09/01(火) 21:03:00 ID:jzXz2QoA
yahooニュースからrssでタイトル(title)やリンク(link)は取得できるのですが、 本文(description)だけが取得できません。考えられる原因があれば教えてください。 何度も確認したのでケアレスミスはない(はず)です。
<< < 1 2 3 4 5 ... 100 > >> みたいなリンクってなんか名前ついてたと思うんだけど、なんて名前だか分かります? CPANにモジュールがあった記憶があるのに、探そうにも名前が浮かんでこない。。。
990 :
988 :2009/09/01(火) 23:18:52 ID:???
自己解決。navigation linkでした。
このスレにはエスパーが何人居ても足りないな
>>989 ありがとうございます。その様でした。
スレチなのですが、ニュース記事のRSSでdescriptionも配信されているサイトがあれば
教えてくれませんか。
ブログ記事でのdescriptionはありますが、ニュース記事だと見つからないので・・・
ほしゅ
断る
保守もなにも980超えたら即死するがな。 webprogは2日か3日だっけ?
せめて次スレが立つまでは保守しようってことさ
999
このスレは1000の風になりました
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。