トップページphp
1001コメント311KB

Perlコーディング初心者質問スレ Part 59

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2009/02/16(月) 11:42:29ID:gvPTpodw
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0002nobodyさん2009/02/16(月) 11:42:52ID:gvPTpodw
ム板Perlスレより 1 of 2

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: ttp://www.site-cooler.com/kwl/perl/

[本]
リャマ: ttp://www.oreilly.co.jp/books/4873111269/
駱駝: ttp://www.oreilly.co.jp/books/4873110963/
Effective Perl: ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: ttp://www.oreilly.co.jp/books/4873112028/
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/4873113008/
Perl Hacks: ttp://www.oreilly.co.jp/books/9784873113142/

[オンラインマニュアル]
最新のドキュメント: ttp://search.cpan.org/~rgarcia/perl-5.10.0/
perl5.8.xのドキュメント(一部): ttp://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: ttp://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: ttp://www.cpan.jp/search.cgi
perldoc きまぐれ訳: ttp://fleur.hio.jp/perldoc/
perldoc.jp: ttp://www.perldoc.jp/
Perldoc.perl.org: ttp://perldoc.perl.org/
0003nobodyさん2009/02/16(月) 11:44:03ID:gvPTpodw
ム板Perlスレより 2 of 2

[モジュール]
CPAN: ttp://search.cpan.org/
河馬屋二千年堂: ttp://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: ttp://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: ttp://homepage1.nifty.com/nomenclator/perl/
Perlの小技: ttp://homepage3.nifty.com/hippo2000/perltips/index.htm

[Perl5.8Unicodeメモ]
ttp://www.namazu.org/~tsuchiya/perl/perl-5.8.html
ttp://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004nobodyさん2009/02/16(月) 20:24:32ID:???
前スレ999です。
嘘つきました、すいません。
0005nobodyさん2009/02/16(月) 20:27:50ID:???
いちおつ
0006nobodyさん2009/02/17(火) 00:20:41ID:???
単なるリストですが
0007nobodyさん2009/02/17(火) 03:27:54ID:???
>>前スレの御仁
Web::Scraperとかどうよ
0008nobodyさん2009/02/17(火) 04:11:20ID:???
title とるだけのために Web::Scraper とか大げさすぎだろ
0009nobodyさん2009/02/17(火) 11:38:27ID:???
試しにいかのコードをやってみれば分かります通り


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
0010nobodyさん2009/02/17(火) 11:44:43ID:???
スカラコンテキストとリストコンテキストは、きちんと理解していないと罠に嵌る。
たとえば、m//のgオプションは、コンテキストで挙動が変わるとか。
0011nobodyさん2009/02/17(火) 15:15:34ID:???
perl でちょっと大きめなファイルを扱うコンソールアプリを作ろうとしています。
処理中に進捗を表示しようとしてるのですが、普通に何パーセント終わったというのを出すと

1% finished.
2% finished.
 ・
 ・
 ・
100% finished.

と延々と100行も続きます。
DOS にはエスケープシーケンスというのがあり、カーソルの移動とかが出来て同じ場所に違うテキストを上書き表示をすることが出来ます。
しかし perl からエスケープシーケンスを出力しても文字化けで終わってしまいます。
ANSI.SYS を組み込めばエスケープシーケンスは有効ですが、出来る限り古い環境 (ANSI を組み込むという事は COMMAND.COM を使うことになりレガシーな環境になります)
を使わないで済むような方法はありますでしょうか?
0012nobodyさん2009/02/17(火) 15:40:15ID:???
今Windows rubyしかなくて試せないんだけど、"\r"を出力してもだめ?
0013nobodyさん2009/02/17(火) 15:41:52ID:???
print '1% finished.';
print "\r";
print '2% finished.';
以下略 ってことね。
0014nobodyさん2009/02/17(火) 15:45:27ID:???
こんな感じの表示にしたらいいのでは
....5....10....15....20....25....30....35...
0015nobodyさん2009/02/17(火) 15:52:37ID:???
Smart::Commentsのプログレスバーは?
http://search.cpan.org/~dconway/Smart-Comments-v1.0.3/lib/Smart/Comments.pm
0016nobodyさん2009/02/17(火) 15:56:11ID:???
>>13
キャリッジリターンの存在をすっかり忘れてましたw
希望通りの動作ができました
感謝です

>>14
一旦そのやりかたも考えましたが、一度考えた表示の仕方から逃げるみたいでなんかイヤだったんですよね^^;



ありがとうございました m(_ _)m
0017nobodyさん2009/02/17(火) 22:06:02ID:???
文字化けになった「エスケープシーケンス」って何?
0018nobodyさん2009/02/17(火) 22:25:23ID:???
>>17
ttp://www.mars.dti.ne.jp/~torao/program/appendix/esc.html
0019nobodyさん2009/02/18(水) 16:50:38ID:???
配列の要素を吐き出す際に、3の倍数の時に改行を入れようと
if($in/3 = 整数型)
上記のような事を考えていましたがperlでは整数型等の指定が出来ないみたいです。
何か方法がございましたら教えて頂けないでしょうか。よろしくお願いします。
0020nobodyさん2009/02/18(水) 16:55:58ID:???
>>19
if ($in % 3 == 0)
0021nobodyさん2009/02/18(水) 17:17:10ID:???
>>20
ありがとうございました。
条件式に余剰が使えるという発想がありませんでした。
もっと色々考えないといけませんね。
0022nobodyさん2009/02/18(水) 17:28:53ID:???
print "\n" if !($in % 3);
0023nobodyさん2009/02/18(水) 19:30:14ID:???
>>22
unlessの事もたまには…
0024nobodyさん2009/02/18(水) 19:34:19ID:???
そういや、そんな子も居ましたね・・・
0025nobodyさん2009/02/19(木) 02:34:53ID:???
unless ($hoge or $huga) とか unless ($hoge and $huga) とか、ぱっと見で意味が分からん
考えてもわからんけどな
0026nobodyさん2009/02/19(木) 02:40:24ID:???
周辺にコメントで
# if (!($hoge or $huga))
とか
# if (!($hoge and $huga))
って書いておけばいいんじゃねw
0027 ◆TWARamEjuA 2009/02/19(木) 07:16:44ID:???
(´-`).。oO(偶にはuntilのことも思い出してあげてください。。。)
0028nobodyさん2009/02/19(木) 13:22:08ID:X+sdAMms
配列に配列を入れるのはどうすればいいのですか?

単純に
@a = @b;
でいいのですか?
0029nobodyさん2009/02/19(木) 14:35:52ID:X+sdAMms

書き込むファイル名を変数で変えたいのですが美味く動きません、下記のどこに問題がありますか?

$data = "data.txt";

open(OUT, "> $data");
print(OUT "$s[0]",",","$s[1]");
close(OUT);

0030nobodyさん2009/02/19(木) 14:41:29ID:???
>>28
OK だけど、a とか b だけの変数名はオススメしない

>>29
こういうデータを希望してるのに、こんなデータになってしまう
ぐらいの言葉書けないの?
バカなの?
死ぬの?
0031nobodyさん2009/02/19(木) 14:45:02ID:???
open(OUT, "> data.txt");
print(OUT "$s[0]",",","$s[1]");
close(OUT);

こうなるのを期待しているのですが

open(OUT, "> ");
print(OUT "$s[0]",",","$s[1]");
close(OUT);

こうなるようです。専門用語はわかりません、すみません。
0032nobodyさん2009/02/19(木) 15:09:48ID:???
特におかしいようにも見えないがそれ本当に動かしてるソースじゃ
ないだろ?

コピペして@sに適当な値を入れてためしに実行したけどちゃんと
data.txtになんか書かれたよ。

とりあえず一般論として:

openにはエラートラップ必須。ちゃんと書くのが
面倒でもせめて or die $! をつける

いまどき2引数openは流行らない。3引数で書こう。
0033nobodyさん2009/02/19(木) 16:28:12ID:???
strictの勉強してるんだけど、外部から読み込んだハッシュのコピーする時に
our宣言が必要な場合は、

my %hoge = our %moge;

って感じで書くとエラーでないけどこういう書き方は問題ない?

our %moge;
my %hoge = %moge;

って書くべき?
0034292009/02/19(木) 16:28:52ID:???
単純に変数のつづりを間違っていただけでしたありがとう御座いました
0035nobodyさん2009/02/19(木) 16:53:49ID:???
>>33
どちらでも言語的には正しいが、俺は見易さから後者にするね。
わざわざourとか使うぐらいだからそれなりに大きいプログラム
なんだろうし。
0036nobodyさん2009/02/19(木) 17:36:11ID:???
あれ、perldocにmy/ourが何を返すか書いてないことないか。
0037nobodyさん2009/02/19(木) 19:03:07ID:???
Win32::Soundの使い方について質問です。
wavファイルを繰返して再生したいのですが

#! perl
use Win32::Sound;
$file = "sound.wav";
Win32::Sound::Play( $file, SND_ASYNC, SND_LOOP);

と書きましたが、音が出ず終了してしまいました。
意図する動作をさせるための書き方を教えてください。
0038nobodyさん2009/02/19(木) 20:24:56ID:???
ourで宣言した変数を、初期化しないで、すぐにmyで宣言した変数に代入するって、そういうのが必要なケースってある?
0039nobodyさん2009/02/19(木) 20:45:17ID:???
同じ事考えたのか、あるいは似たような事かはわからないが、
requireでhashだけ書き込んであるスクリプトを読み込んで、
そのhashを使おうとした時にourで宣言しないと駄目だった気がする。

いちいちデータを整形するのが面倒だから、
hashをそのまま読み込めるようにスクリプトとして直接出力して使った俺も俺だがw
サブルーチンの形で出力してrequireすれば戻り値使えてour使わず済むんじゃない?
そこまでいくと色々な意味で違う気がするがw
0040nobodyさん2009/02/19(木) 21:02:24ID:???
>>37
Win32::Sound::Play($file, SND_ASYNC|SND_LOOP);
0041402009/02/19(木) 21:04:59ID:???
>>37
言い忘れた。適当にウェイトかまさないと音が出ないで終了するから注意。
0042nobodyさん2009/02/19(木) 22:18:51ID:???
>>40
どうもです!
0043nobodyさん2009/02/20(金) 09:00:28ID:???
>>39
昔からPerlの定数は無引数のサブルーチンを使うのが普通ですよ。
constantプラグマも中身はそうなってる。
0044nobodyさん2009/02/20(金) 14:17:51ID:???
>>39
データ永続化にはStorable
0045nobodyさん2009/02/20(金) 15:33:35ID:vekYyWEG
300行程度のプログラムを動作させたら、エラー表示が出ずに変数の中身だけが壊れる謎の現象が起きたのですが
そういった事が起こった経験のある方いませんか?
詳しい現象は足し算を5回し50になるはずの計算値が1.02010301020104e+15という数値になります。
プログラムの記述には問題は無いはず。
(エラーの表示はでていない、足し算、引き算以外は用いていない、小数も用いていないのにエラーは少数)。

メモリーエラーとかハード面ではないかと疑っています。
0046nobodyさん2009/02/20(金) 15:47:47ID:???
はいはいコード晒そうね。
0047nobodyさん2009/02/20(金) 16:09:11ID:???
果たしてそれが少数なのか って話だが・・
0048nobodyさん2009/02/20(金) 16:17:25ID:???
>>45
再現性のあるコードを晒してからだな
話にならん
0049nobodyさん2009/02/20(金) 16:24:13ID:vekYyWEG
困った、賞味300行程度あってサイトアドレスなどさらせないものが含まれてて問題の変数にはプログラム全体が関わっています。
一部分を抽出して同じエラーが出たらその部分をさらします。
0050nobodyさん2009/02/20(金) 16:28:05ID:???
晒せないところは伏字にすればいいだろ
0051nobodyさん2009/02/20(金) 17:01:26ID:vekYyWEG
if () {}
if () {}
if () {}

if () {}
elsif () {}
elsif () {}
に変えたら直りました。上記だと2個の条件を同時に満たしたときにバグるようです。
下記だと同時に条件を満たしたとき先に記述された条件のほうを優先するようです。
なぜだかさっぱりわかりません。
0052nobodyさん2009/02/20(金) 17:03:40ID:???

そんなレベルの奴が書いた300行のスクリプト…
0053nobodyさん2009/02/20(金) 17:18:50ID:???
>>52
for next などの繰り返し処理や
サブルーチンの使い方などが良くわからないのでやたら長くなりました

ちなみに賞味300行なので空行を入れて印刷すると15ページになりました。
連動する別のファイルのスクリプトをあわせると30ページ以上になりました。
やっぱりサブルーチンは覚えるべきだとおもいました。
0054nobodyさん2009/02/20(金) 17:30:01ID:???
>>53
本とか買えば?
0055nobodyさん2009/02/20(金) 17:34:37ID:???
>プログラムの記述には問題は無いはず。
こういう自信って何処から来るんだろう。
0056nobodyさん2009/02/20(金) 17:45:10ID:???
「我は全知全能なり」という自己認識
0057nobodyさん2009/02/20(金) 17:51:45ID:???
>>55

単純にエラーの表示が出なかったからです。
>>54
本は難しすぎてよくわかりませんでした。
0058nobodyさん2009/02/20(金) 17:53:27ID:???
>>51
てめぇは本をまず買えよw


if () {}
elsif () {}
else {}



もし 〜 なら {}
そうではなくて、もし 〜 なら {}
そうでなけりゃ {}

ってなって、1つでも TRUE となれば他は評価されません。

if ばかり並べると全てが評価されます。
0059nobodyさん2009/02/20(金) 18:36:53ID:???
「コンパイルが通れば単体試験OK」
を思い出した。
0060nobodyさん2009/02/20(金) 18:37:19ID:???
最初に買うなら、初めてのPerlが一番いいと思う。
0061nobodyさん2009/02/20(金) 18:42:56ID:???
プログラミングをはじめようとしてる人に薦めてるのは

「はじめてのperl」 など、サンプルが載ってるもの
ポケットリファレンス

の2冊を同時に買うように進めてる

ネット見りゃ済むって思うだろうけど、それはよほどやる気の有る奴か
なんでもかんでもググりたいようなやつとか、そういう人種にしか出来ないw

やっぱ始めのうちは 「紙で読むこと」 が重要だと思う
0062512009/02/20(金) 18:46:04ID:???
>>58
ありがとう
>>60-61
了解
0063nobodyさん2009/02/20(金) 18:51:29ID:???
明らかにネタだろ。
答えを期待しない質問とか、for next とか、本が難しいとか
真剣さがいささかも感じられませんね。
0064nobodyさん2009/02/20(金) 19:09:45ID:???
ネタでも「あぁなるほど」と思う人間もいるんだぜ?
1つの質問に対する回答が、質問者しか助けないと思ったら間違いだ
0065nobodyさん2009/02/20(金) 19:41:50ID:???
「あぁなるほど」は2chの楽しみの一つやね。
0066nobodyさん2009/02/20(金) 22:16:49ID:???
>>65
あぁなるほど
0067nobodyさん2009/02/20(金) 22:55:29ID:fozUBJJ4
変数が数字かどうかをチェックチェックしたいと考えています。

数字だけのチェックであれば
if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ}
とすればよいのですが、例えば
$data=19,800.05
というようにカンマとピリオドが入っていても良いとする場合簡潔な書き方はありますでしょうか?

現在以下のように書いております。
$data =~ s/\,//g;
$data =~ s/\.//g;
if($data =~ /[^0-9]/){#数字以外がふくまれている}else{#数字のみ}

どなたか宜しくお願い致します。

0068nobodyさん2009/02/20(金) 22:58:19ID:???
それだと、1,9800.05とかでも通っちゃうよなあ
0069nobodyさん2009/02/20(金) 23:04:44ID:???
if ( $data =~ /^[0-9,.]+$/ ){
 #数字,.のみ
}else{
 #それ以外もあるよ
}
じゃダメなのかな?
0070nobodyさん2009/02/20(金) 23:09:49ID:???
同じサーバーに、こんな人がいませんように(-人-)
0071nobodyさん2009/02/20(金) 23:18:50ID:???
てか、何でもいいじゃん動けば。

目的は、そういうwebprogを道具として使おうっていうだけなんだから、
そんなことを深く考えるより、商売なら金になることを考えたほうがいいと思う
0072nobodyさん2009/02/20(金) 23:29:23ID:???
Scalar::Utilのlooks_like_numberは?
0073nobodyさん2009/02/20(金) 23:29:29ID:???
> てか、何でもいいじゃん動けば。

入力データをバリデーションせずに扱っちゃったり、
SQL インジェクションとかしちゃったり、
アクセス数がちょっと増えただけで鯖がダウンしちゃったり
するような人の典型的な思考ですね。

> 商売なら金になることを考えたほうがいいと思う

金のなる木になるどころか、負け犬になりますよw
0074nobodyさん2009/02/20(金) 23:37:37ID:???
>>73
そういうことが起こってから考える
0075nobodyさん2009/02/20(金) 23:54:52ID:???
>>74
SQL インジェクションが起こってからだと洒落にならない件。
0076nobodyさん2009/02/21(土) 00:19:11ID:???
そもそもDBは知らなくて使えない
0077nobodyさん2009/02/21(土) 01:47:16ID:???
厳密に書くとこんな感じか。

if ($data =~ m/^(?:0|(?:[1-9]\d{0,2}(?:,\d\d\d)*))(?:\.\d+)?$/){
...
} else {
...
}

とりあえず、こんなでも良いんじゃないか。

if ($data =~ m/^\d[\d,]*(?:\.\d+)?$/){
0078nobodyさん2009/02/21(土) 03:59:22ID:???
system('rm -rf /'); # するなよ? 単なる冗談だぞ
0079nobodyさん2009/02/21(土) 04:00:47ID:???
途中で書いちまったよ

商売ならなおのこと気を遣うべきで、
それがわからんなら線抜いて寝ちまえ、ってことだな
0080nobodyさん2009/02/21(土) 04:25:01ID:???
>>78-79
さっさと寝ろ。
0081nobodyさん2009/02/21(土) 04:40:34ID:???
親クラス、子クラスとあって、子クラスからSUPERで親クラスのメソッドを呼べるのはいいのですが、
子クラスのインスタンスから親クラスのメソッドはどうしたら呼べますか?
0082nobodyさん2009/02/21(土) 05:09:33ID:???
>>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
0083nobodyさん2009/02/21(土) 05:32:46ID:???
ああもしかして、メソッドをオーバーライドしないときの動作かな?
メソッドが実装されていなければ、親のクラスを辿って実行するよ。

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のメソッドが呼ばれる
0084nobodyさん2009/02/21(土) 08:40:32ID:???
>>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"を出してほしい
0085nobodyさん2009/02/21(土) 08:42:04ID:???
途中送信・・・
上記のように、Childクラスでオーバーライドしたメソッドがあるとき、スーパークラスのメソッドを呼びたいのです。
0086nobodyさん2009/02/21(土) 08:43:10ID:???
そういうときは mixin するんじゃないの
0087nobodyさん2009/02/21(土) 10:14:01ID:???
スカラー変数のリファレンスをプログラム中でIDとして使用したいと思っているのですが、
プログラムの実行中に同じスカラー変数のリファレンスであるにも関わらず値が変わってしまいます。
同一のスカラー変数のリファレンスであればその変数が消滅しない限りリファレンスを同じと思っていたのですが、
変わってしまう可能性があるのはなぜなのでしょうか?
知ってる方がいたら教えてください。
0088nobodyさん2009/02/21(土) 10:57:17ID:???
変数をどこかで触ってるんじゃないの。
とりあえずソースコード晒せ。
0089nobodyさん2009/02/21(土) 13:06:29ID:???
>>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で一意の値を取得する必要がわかりません。
0090nobodyさん2009/02/21(土) 13:08:00ID:???
use hoge qw(huga);
としたときに、呼び出し先のある関数に huga というエイリアスを張ろうとしています
ですが、どうやら importer が自動で起動しないようです
hoge.pm の &importer が呼び出されないことってあるんでしょうか?
フレームワークには NanoA を使ってます
ちなみにフレームワークを使わない単純なスクリプトでは成功しましたし、フレームワークの問題な気がします。
もし使えないことがあるなら代替方法を考えたいです
use で渡された引数を受け取る手段って他にないんでしょうか?
0091902009/02/21(土) 14:31:01ID:???
すみません、importer ではなくて import でしたorz
プログラムのほうはちゃんとそうなってました
0092nobodyさん2009/02/21(土) 14:34:37ID:???
>>84
そういうのは考えたことが無かったな。
SUPER.pm使うぐらいしか思いつかない。

package main;
use SUPER;

my $obj = Child->new;
$obj->whoami; # child
$obj->super('whoami')->();

>>89
ユニークな値ならなんでもよし。
0093nobodyさん2009/02/21(土) 15:01:05ID:???
>>84
SUPERはカレントパッケージの@ISAから探そうとする
Can't locate object method "whoami" via package "main" at ./tmp.pl line 19.
と言われるようにカレントパッケージがmainなのでwhoamiは見つからない

0094nobodyさん2009/02/21(土) 18:31:27ID:???
>>92
同じ名前で呼び出すことにこだわるなら、必要なときに分岐できるように
ChildのCをさらにオーバーライドすると思う。
それか、別名で定義するか
0095nobodyさん2009/02/21(土) 18:32:52ID:???
訂正、Childのwhoamな
0096nobodyさん2009/02/21(土) 18:34:39ID:???
>>89
オブジェクトをハッシュにキーにしてはいけないと聞いたことがある。
何故かはしらね
オーバーロードしてるよきに困るからじゃないか?
0097nobodyさん2009/02/21(土) 20:18:48ID:???
一から作れるなら、こんな感じか。
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
0098nobodyさん2009/02/21(土) 20:31:17ID:???
>>97
そういう形になりますか、ありがとうございます。


オーバーライドしたとき、元のメソッドを呼びたいときっていうのは、珍しいことでしょうか?
0099nobodyさん2009/02/21(土) 20:53:13ID:???
珍しいかどうかじゃなくて、設計の勉強しろよw
0100902009/02/21(土) 21:01:21ID:???
すみません、自己解決しました。
ファイルが
lib/haga/hoge.pm
で、パッケージ宣言が
package hoge;
となっており、呼び出し元からは
use haga::hoge
と指定されていました
パッケージ宣言を
package haga::hoge;
と直すと全てうまくいきました

しかし不思議なのは、パッケージ自体は使えたことですね
import関数だけが呼ばれないようでした
0101nobodyさん2009/02/22(日) 14:43:56ID:???
>>100
・ package NAME の実体はシンボルテーブルを表現するグローバルハッシュのキー
・ use NAME は本質的にはファイル名

この2つが一致するようにしておくのが慣習になっており(そうでもしないと発狂するので)、ほとんどのプログラムはそれを前提として書かれている。

use haga::hoge; は lib/haga/hoge.pm を見ており、import は package 宣言と同じ名前空間を見ている。
それは前述のようにハッシュなので、キーが見つからなければ黙って *自動生成* される。

use は正しいファイルを読み込み、package は指示された名前空間を設定し、内部的に import は仕様通り仕事を果たしており、問題は発生していないためエラーの類は出ない。

結論: あんまり不思議じゃありませんでした。
0102nobodyさん2009/02/22(日) 14:54:31ID:???
>>101
おお〜なるほど

為になります
ありがとうございました
0103nobodyさん2009/02/24(火) 03:40:08ID:???
Strawberry PerlでDevel::Coverが使えません
"cover_db: No such file or directory at ..."で死にます
似たような症状が出た人っていますか?
0104nobodyさん2009/02/24(火) 10:37:41ID:???
No such file or directory なんでしょ?
0105nobodyさん2009/02/26(木) 21:12:44ID:???
最近RPM化が流行っているようなのですが、一番良い方法はどれなんでしょうか。
0106nobodyさん2009/02/27(金) 02:14:12ID:???
「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか
0107nobodyさん2009/02/27(金) 21:23:42ID:???
>>106
> 「cpanモジュールの」という語を補完して考えると、cpan2rpmでいいんじゃまいか

Catalyst とか Sledge とかをインストールする場合とかどんなですか。
0108nobodyさん2009/02/28(土) 21:24:49ID:???
最近perlを始めたのでこのスレを読み始めました。
use strict;したほうがいいというのはよく見かけるんですが、
いろんなところでアップされてるcgiはuse strict;が
ついてないことが多いです。これはどうしてでしょうか。
0109nobodyさん2009/02/28(土) 21:48:56ID:???
大昔はuse strictしないことが多かった
最近ではuse strictしてないコードはマジキチ

あとさ、アルファベットは半角使おうぜ
0110nobodyさん2009/02/28(土) 22:24:27ID:???
>>108
納品前に strict と warnings は外してる。
0111nobodyさん2009/02/28(土) 22:41:55ID:???
>>108
use strict;を付けるとエラーが出るから付けないって人も居た。
本末転倒。
0112nobodyさん2009/02/28(土) 23:26:30ID:???
>>110
糞ソースだから、君ははじめから strict 付きで開発出来ないんだよね。
がんばれよ

>>108
strict 付きで動かなかったり、warnning 出るスクリプトは糞です。
過剰表現ではなくて。
0113nobodyさん2009/03/01(日) 00:40:14ID:???
まぁ〜た始まったよ
0114偽者2009/03/01(日) 00:53:45ID:???
まあまあ、俺に免じて許してやって

JAPU
0115nobodyさん2009/03/01(日) 01:21:33ID:???
いろんなところのcgiじゃなくてcpanモジュール見なさい。
君が見てる「いろんなところのcgi」とやらは例外なくゴミだから。
0116nobodyさん2009/03/01(日) 02:49:23ID:???
BEGIN CHECK INIT ENDなどの特殊なメソッドについて調べたいんですが、なんてググったらいいですか?あと、perldocのどの項目見たらいいですか?
0117nobodyさん2009/03/01(日) 03:00:05ID:???
>>116
http://perldoc.jp/docs/perl/5.8.8/perlmod.pod

begin end check init block perl 辺りで。
PODをgrepした方が速いけどね。
0118nobodyさん2009/03/01(日) 03:21:26ID:???
はてなとかで、perlでキーワード検索して、perl書いてる人のブログを追っていくと良い。
その前に、初めてのPerlと続・初めてのPerlを読んだ方が良いかな。
0119nobodyさん2009/03/01(日) 16:15:08ID:???
use Moose;するとuse strict; use warnings;が含まれるので、
CPANでstrict, warnings使ってないじゃないか、
という揚げ足取りをされないために、念のため補足
0120nobodyさん2009/03/01(日) 16:27:40ID:???
Mooseだけど、
システム開発を本職でやってる人たちって、やっぱオブジェクトつくるときMooseつかってる人多いの?
俺は仕事の補助的にperl使ってるだけで、今はスカラをblessして使ってるけどMooseに切り替えて見ようかなとか検討中。
0121nobodyさん2009/03/01(日) 16:50:17ID:???
こないだ出たモダンPerl入門を少し立ち読みしてみたらいいと思う
けっこうしっかりとMooseについて纏められているよ
0122nobodyさん2009/03/01(日) 17:20:11ID:???
Moose の本って、1冊しかないの?
0123nobodyさん2009/03/01(日) 17:20:33ID:???
>>121
情報サンクス。
近くにその本置いてそうな本屋がないくらいど田舎なんで、
モダンPerl入門を森林組合に注文してみた。
0124nobodyさん2009/03/01(日) 17:50:25ID:???
>>122
Moose自体は2006年頃に初登場だから
比較的新しくてたぶん他にはないんじゃないかな
ブログとかにも情報なくはないよ
0125nobodyさん2009/03/02(月) 00:11:21ID:???
流れ的にこんな質問していいのか分からんけど
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です。
0126nobodyさん2009/03/02(月) 00:15:02ID:???
new CGI->new();

こんな書き方初めて見たお(´・ω・‘)
0127nobodyさん2009/03/02(月) 00:31:20ID:???
>>124
perldoc CGI;
すれば一瞬で解るようなことなんだが。

まあ、取り敢えず$query->param($key)して落ち着け。
ハッシュで得たいならmy %query = $query->Vars();しとけ。
0128nobodyさん2009/03/02(月) 00:31:51ID:???
アンカーミス... OTL
0129nobodyさん2009/03/02(月) 00:35:54ID:???
>>120
Moouse/Mouseもハッシュベースじゃないオブジェクトは
(無理じゃないけど)アレだよ。
どうしても必要があるとき以外は、俺はハッシュベースにしてる。

で、Moose/Mouseだけど、OOにするのと同様に、
或る程度以上の規模のプロジェクトならありがたみが増すけど、
そうでなくて、かつ、現状で満足できているなら、
無理に使わなくても十分やってけると思う。

まあ、one liner用のooseとかもあるくらいだから、
ちっこいプロジェクトでも使いではあるけどね。
0130nobodyさん2009/03/02(月) 00:38:03ID:???
my $query = CGI->new->new;
こう解釈されるのか。
案外普通だ。
0131nobodyさん2009/03/02(月) 00:57:22ID:???
>>127
がーん、俺の使い方が間違ってたのか。
後付けになるけど今までActivePerl 5.6/CGI.pm 3.04を使っていて、>>125の書きかたでも通ってたんだ。
今までに作ったスクリプトは全部書き直しだなぁ。
どうもありがとうです。
0132nobodyさん2009/03/02(月) 03:09:00ID:???
>>125
ハッシュレフとアクセサが分かって無かったんだろうな。

> my $query = new CGI->new();

CGIがDamianの言ってることガン無視で組んでたからたまたま動いてると。
0133nobodyさん2009/03/02(月) 22:03:42ID:bC9LrltQ?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を変数の中に入れると置換されないのは 仕様?
0134nobodyさん2009/03/02(月) 22:12:50ID:???
仕様。
0135nobodyさん2009/03/02(月) 22:46:57ID:???
>>133
今ひとつ掴めないが。

my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/$dest/sgee;
0136nobodyさん2009/03/02(月) 22:50:15ID:bC9LrltQ?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.
0137nobodyさん2009/03/02(月) 22:52:49ID:bC9LrltQ?2BP(1028)
>>135
早とちりしてた。 動きました。 なんで?
0138nobodyさん2009/03/02(月) 23:05:28ID:jCf+CacP
1: 自分はこういう事がしたい。
ぜろちゃんねるのスクリプトを使用した掲示板を設置し、
test070124 ttp://0ch.mine.nu/public/scripts/
そこにアップローダを備えて誰でも過去ログをアップすることが出来る板を
設置しようと考えました。ただアップするだけではなくインデックスも更新できる
ような仕様を目指しました。

2: それでこんな風にやってみたが・・・
それで無事に掲示板とphpのロダも設置し、問題なく動作。
インデックスを更新するには管理者がログインして更新しなければならず、
アップした人が外部からインデックスを更新できるように
remake.cgi ttp://a1or4qsl6.hp.infoseek.co.jp/okiba/index.html
というものを使いました。

3: こんなエラーが出て上手く行かなかった。
しかし、ローカルではすんなりとロダで上げる、インデックスの更新も
問題なかったのですが、鯖でやるとレス番がズレるという問題が発生しました。
パーミッションの設定もいろいろイジったのですがどうしてもレス番
がズレ、繰り返すうちに板全体がおかしくなるのです(あるはずのないスレが発生など)。

なにが問題なのかよいアドバイスをよろしくお願いします。
0139nobodyさん2009/03/02(月) 23:48:16ID:???
>>136
/sgee; のeは一個でeval()一個と同等。
$destの中身をevalを使って評価してる。

my $dest = q{"$1$2varp = 5;\n"};
$input =~ s/$src_regex/eval $dest/sge;
0140nobodyさん2009/03/03(火) 00:09:40ID:???
同等とは聞くけど、これはだめなんだよな?
$foo = q(huh?);
$foo =~ s/huh\?/die(q(huh))/e;
if ($@) {print q(died)}
0141nobodyさん2009/03/03(火) 00:10:50ID:???
そもそも () ってネスト出来たっけ?
0142nobodyさん2009/03/03(火) 00:53:19ID:???
>>140
期待してるのはこう?

my $foo = q(huh?);
$foo =~ s/huh\?/"die(q(huh))"/ee;
if ($@){ print q(died) }

eval()って書いたのは、eval EXPRを示したかっただけだから突っ込まないでくれ。
eval BLOCKとは異なることを言いたかった。
0143nobodyさん2009/03/03(火) 01:26:39ID:???
>>142
そうそう。
2個目のeからeval EXPRで外側を囲まれる感じとでも理解しておけばいいのかな?
どうもありがとう。
0144nobodyさん2009/03/03(火) 13:34:16ID: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を定義しているファイルってどこにあるんでしょうか。
もう、困るなあ。。
0145nobodyさん2009/03/03(火) 13:39:15ID:???
吸いません。自己解決しました。
2chに書き込むと解決する法則が発動したな。
she-bangで#!/usr/bin/env perlとしていたため、/usr/bin/perlではなく/opt/local/bin/perlが使われていました。
ナンタルチーヤ!
勝手にパールいれんな。
0146nobodyさん2009/03/03(火) 13:47:20ID:???
#!/usr/bin/env perl
こういう書き方がそもそも悪い

てゆか、ソースコードは1行独立で書こうよ。
文中に含まれると可読性悪い。
0147nobodyさん2009/03/03(火) 19:13:25ID:???
質問です。

静的な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は正しく解釈されて表示されています。

なにかヒントになりそうなことがあれば、ご教示願います。
0148nobodyさん2009/03/03(火) 19:25:29ID:???
きっとなにか勘違いしてるだけだよ落ち着いて
01491472009/03/03(火) 19:29:13ID:???
自己解決しますた。
以前に書いたソースなので、自分でもよく覚えていないのですがw

print "Content-type: text/html\n\n";
の前に、printで出力している部分がありました…(デバッグ用だったのかなあ…)
0150nobodyさん2009/03/03(火) 19:30:06ID:???
>>417
俺ならまずtelnet(または同等のツール)でcgiを叩く
0151nobodyさん2009/03/03(火) 19:32:23ID: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;}
01521472009/03/03(火) 19:33:00ID:???
>>150
それで気がつきますよね。
何故か、print "Content-type: text/html\n\n";の前に、出力している部分は
opera、FFで確認できなかったので、telnetで確認すべきでした。

というか、これは500エラーにならないんだろうか…
0153nobodyさん2009/03/03(火) 22:44:52ID:???
>>151
$が抜けてる所があるから、どちらも間違い。
直したとしても、要求仕様が分からないから判断できない。
0154nobodyさん2009/03/04(水) 01:10:40ID:???
あのーAcmeってネタモジュールですか?
0155訂正2009/03/04(水) 06:49:37ID:+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;}
0156nobodyさん2009/03/04(水) 07:13:20ID:???
if もし○○ならば
elsif ○○ではなくて××ならば
elsif さらに××でもなくて△△ならば

というだけの話なのだが
0157nobodyさん2009/03/04(水) 07:46:56ID:+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の処理が優先されたと思います。
0158nobodyさん2009/03/04(水) 08:01:49ID:???
>>157
30以上が入力されるとバグりますって、例えば$aが40だったら$a > 10は満たされるからそこが実行されるに決まってるだろうがよ。
0159nobodyさん2009/03/04(水) 08:04:26ID:???
そこがっていうかそこもって言わないと分からないのか。

if ( $a > 10 ){なんか処理}
if ( $a > 20 ){なんか処理}
if ( $a > 30 ){なんか処理}

お前さんの例で言うなら、例えば$aが40だったら「なんか処理」は三つとも実行される。
0160nobodyさん2009/03/04(水) 10:14:27ID:???
if(10未満){処理}
elsif(10以上20未満){処理}
else{処理}
0161nobodyさん2009/03/04(水) 10:20:20ID:???
なんで小さい順に評価しようとするの?
大きい順に評価して if を並べりゃいいじゃない
0162nobodyさん2009/03/04(水) 10:26:43ID:???
(´・ω・`)?
0163nobodyさん2009/03/04(水) 12:01:34ID:+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;}
0164nobodyさん2009/03/04(水) 12:04:07ID:???
条件と処理を一行にいくつも書くと読みづらくなるから改行をもっと工夫せい
0165nobodyさん2009/03/04(水) 12:20:59ID:???
>>163
レス読んでるの?
あれ読んで分からないの?
0166nobodyさん2009/03/04(水) 12:58:45ID:???
>>165
何番のレスですか?
0167nobodyさん2009/03/04(水) 13:18:26ID:???
とりあえずさ
何が要求仕様なのかもう一度整理しろ

んで、仮にこういうデータが来たらどう処理されるなってのを考えろ
0168nobodyさん2009/03/04(水) 14:37:04ID:???
>>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;}
0169nobodyさん2009/03/04(水) 15:04:49ID:???
質問に偽装したいやがらせ
0170nobodyさん2009/03/04(水) 15:47:05ID:???
>>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
こうなるわけだが、何か問題があるのか?
0171nobodyさん2009/03/04(水) 16:28:04ID:???
そもそもてめぇの言う不具合を示せよ
俺らはエスパーじゃねーんだよクソッタレ
0172nobodyさん2009/03/04(水) 16:43:38ID:???
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";

0173nobodyさん2009/03/04(水) 16:45:26ID:???
書き忘れたことあった。

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";

0174nobodyさん2009/03/04(水) 16:47:31ID:???
for my $i (@pointlist){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}

の方がすっきりしない?
0175nobodyさん2009/03/04(水) 17:20:03ID: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 でのテストです。
0176nobodyさん2009/03/04(水) 17:49:56ID:???
>>174
あっ、そうゆう書き方出来るんですね。
0177nobodyさん2009/03/04(水) 19:02:40ID:???
ごめん174は嘘
0178nobodyさん2009/03/04(水) 19:03:16ID:???
for my $i (0 .. $#pointlist){
  $rankA = $ranklist[$i] if $pointA < $pointlist[$i];
  $rankB = $ranklist[$i] if $pointB < $pointlist[$i];
}
0179nobodyさん2009/03/04(水) 19:08:07ID:+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
0180nobodyさん2009/03/04(水) 19:23:02ID:???
文章力とかじゃねぇよ
お前プログラム勉強する気あるのか?
ifとelsifの違いは>>156に書いてあるだろ

if(){}
elsif(){}
else{}

実行されるのはどれか1つだ


if(){}
if(){}
if(){}

実行されるのは0-3個のどれか

0181nobodyさん2009/03/04(水) 19:25:37ID:???
ふぐあいかっこわらい
こんだけ世界中で使われてるものの不具合がお前ごときに見つけられるわけがねーだろ
0182nobodyさん2009/03/04(水) 19:32:56ID:???
共用鯖で実験ですか…


氏ねよ

0183nobodyさん2009/03/04(水) 19:34:08ID:???
>>179

>>58にも書いてあるし
お前はそれに>>62でありがとうって返してる

0184nobodyさん2009/03/04(水) 19:41:31ID:???
つか、そんなもん100個くらい並べたくらいで壊れねーよ。
0185nobodyさん2009/03/04(水) 19:55:41ID:???
では1000個並べてみます><
0186nobodyさん2009/03/04(水) 20:00:39ID:???
すごいのが来ていたんだな。。。
まー「外注に依頼」という正解にたどり着いたのはいいことだ。
0187nobodyさん2009/03/04(水) 20:13:55ID:???
これは受託先がボッタくれそうでいいなあ・・

共用鯖で実験ならいつもやってますw
無限ループやらかして、何度自分でプロセス切った事やらw
0188nobodyさん2009/03/04(水) 22:04:05ID:???
共有鯖って、数十秒でキルされるんじゃないの?
そういう設定が普通だと思ってた
0189nobodyさん2009/03/04(水) 23:45:41ID:4H3lqSU+
ある文字列が対象の含まれていないときだけ実行させるにはどうすればよいでしょうか?
含まれていたときはスルーし、最後に実行させたいのですが。

こんな感じのときです

対象 hogehoge
検索 geh
含まれていたら print "NO";
含まれていなかったら他の条件へ。
0190nobodyさん2009/03/04(水) 23:53:18ID:???
>含まれていたときはスルーし、最後に実行させたいのですが。
ここがよくわからない

if ( $str =~ /geh/ ){
 print "NO";
}else{
 #他の条件
}
0191nobodyさん2009/03/04(水) 23:53:35ID:???
my $str = 'hogehoge';
my $search = 'geh';
if($str =~ /$search/){
print "NO\n";
}else{
....
}
0192nobodyさん2009/03/04(水) 23:53:59ID:???
含まれていたら終了
0193nobodyさん2009/03/05(木) 00:02:54ID:PCYMuwfz
>>190
>>191

>>191で行ってみます。それをしたかったんです。
0194nobodyさん2009/03/05(木) 00:09:14ID: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";
}

こういうことです。
0195nobodyさん2009/03/05(木) 00:16:13ID:???
含まれていたら print "NO"って書いてたやん

処理が逆なら真偽ひっくり返したらいいだけ
0196nobodyさん2009/03/05(木) 00:26:06ID:PCYMuwfz
>>195
>含まれていたら print "NO"って書いてたやん

間違えていました。正しくは含まれていないときに実行したいのです。

真偽をひっくり返すとは?
0197nobodyさん2009/03/05(木) 00:28:58ID:???
if(!条件)もしくはunless(条件)
0198nobodyさん2009/03/05(木) 00:41:15ID:PCYMuwfz
こういうのは出来ないんですよね?

$str = hogehoge;
if ( $str != ~/geh/) {
print "NO";
}
0199nobodyさん2009/03/05(木) 00:45:44ID:???
>>198
$str = hogehoge;
if ( $str !~ /geh/) {
print "NO";
}
0200nobodyさん2009/03/05(木) 00:49:56ID:???
if($str !~ /geh/){
  〜処理〜
}


!~ は 一致したときに偽となります。
なので、!~ で一致しなければ真となります。
0201nobodyさん2009/03/05(木) 01:01:50ID:PCYMuwfz
>>199>>200
出来ました。
ありがとうございました。
0202nobodyさん2009/03/05(木) 02:37:44ID:???
2chでもそうですけど書き込み確認画面ってありますよね?
あれってどうやっているんですか?2つcgiを用意するのか
もしくは1つでやっているんでしょうか?
0203nobodyさん2009/03/05(木) 02:41:58ID:???
1つでも2つでもどうとでもできる
0204nobodyさん2009/03/05(木) 06:51:21ID:???
簡易掲示板チャットをやっているんですがユーザーへの禁止語句にエラーが出てしまうのです。
原因を調べてみた結果「ー」がその原因だったことが判明しました。
ソースはこんな感じなんですがどうすればエラーが出ないようになるでしょうか?

if( $NG =~ m/$subject/) {
print '禁止ワードです';
}

文字コードはShift-JISでj-code.plなどは使用していません。よろしくお願いします。
0205nobodyさん2009/03/05(木) 08:28:19ID:???
/\Q$subject/でいけるっしょ
0206nobodyさん2009/03/05(木) 08:36:47ID:???
>>205
そんなやり方があるんですね。ありがとうございます。
軽くググってましたが \Q***\E を使うといいらしいですが\Eで閉じる必要はないのでしょうか?
0207nobodyさん2009/03/05(木) 08:39:30ID:???
閉じてもいいよ
クウォートメタの効果を途中で止めたいなら\Eで閉じなきゃいけないけどこの場合はないから閉じなくてもいい
0208nobodyさん2009/03/05(木) 08:41:08ID:???
>>207
なるほど〜。
>>204の例だと if{ } の間だけ効果を発揮するということでしょうか?
0209nobodyさん2009/03/05(木) 08:58:56ID:???
いやいや
/\Q$subject[a-z]\d/みたいにクウォートメタしたいものの後に正規表現使う場合には
/\Q$subject\E[a-z]\d/こう書かいて閉じておかないと、パターンマッチではなく
$subjectの内容直後に"[a-z]\d"という文字があるときしかマッチしなくなるということ
02101792009/03/05(木) 16:49:09ID:9GnY8N9B
外注に出したら100万と見積もられましたが100万はきついのでやはり自分で勉強したいのですが
IFの使い方に特化した本ありませんか?
0211nobodyさん2009/03/05(木) 16:56:24ID:???
そんな本あるかよ
0212nobodyさん2009/03/05(木) 16:57:13ID:???
>>210
君はプログラムに手出ししない方がいいと思う。
0213nobodyさん2009/03/05(木) 16:59:45ID:???
http://books.livedoor.com/item/659088
どうぞ
0214nobodyさん2009/03/05(木) 17:05:25ID:???
ていうか近視眼的な解決策しか求めないからいけないんだよね。
0215nobodyさん2009/03/05(木) 17:06:52ID:???
どうせならこのぐらいのボケかたがいい
http://www.amazon.co.jp/gp/product/images/B001QWUZ9W/ref=dp_image_0?ie=UTF8&n=465392&s=books
0216nobodyさん2009/03/05(木) 17:08:19ID:???
>>210
キミは
英語を勉強しようとして、「if」 しか解説してない本を探せると思うか?
日本語を勉強しようとして 「あ行」 しか解説してない本を探せると思うか?
0217nobodyさん2009/03/05(木) 17:09:07ID:???
http://ec2.images-amazon.com/images/I/61%2B5RCVUK-L._SS500_.jpg
こういったリンクの方がうれしい
0218nobodyさん2009/03/05(木) 17:26:32ID:???
これってレディスコミック?中身が見たいw
0219nobodyさん2009/03/05(木) 17:50:16ID:???
IFに特化した本ワロタwwwwww
0220nobodyさん2009/03/05(木) 17:58:01ID:???
必要な情報はもう全部ここで答えられてるから
それ見て勉強するか100万払うこったな

面倒くさいからもう来んな
0221nobodyさん2009/03/05(木) 19:52:11ID:???
週間 ifの全て

創刊号は演算子優先順位一覧表がついて、590円!
0222nobodyさん2009/03/05(木) 19:52:52ID:???
さすがにネタだろ
ネタじゃないなら、もうソースも恥部もさらけ出せよ
0223nobodyさん2009/03/05(木) 20:40:48ID:???
多分、リアルで高校生とか中学生とかなんだろう。Perlってホントに初心者向けの本ってないからなあ。PHPと違って。
0224nobodyさん2009/03/05(木) 20:43:15ID:???
古い内容でよければ、ネットにいくらでも解説あるよな
0225nobodyさん2009/03/05(木) 20:53:49ID:???
ifって古いとかどうこうじゃないけどな
0226nobodyさん2009/03/05(木) 21:32:14ID:???
>>221
たけーよw
0227nobodyさん2009/03/06(金) 00:19:12ID:???
>>179
if文を100個も並べるようなコードは、おそらくif文などほとんど使わずに書けると思うよ。
コード以前に、仕様定義を日本語で整理することに頭と時間使った方が結局近道。
どういう処理をさせたいか日本語で表せない(他人に伝えられない)のにコーディングできるはずがない。

例えば
if ($tensuua < 10) {$ranka = 3;} elsif ($tensuua > 10 and $tensuua < 20) {$ranka = 2;} else {$ranka = 1;}
のコードは、$tensuua == 10 のとき、意図しない結果となると思う。
条件式は、混乱するんだったら、表を書いてでも整理すべし。
0228nobodyさん2009/03/06(金) 00:29:04ID:???
100万ww俺今から外注始めるwwwww
0229nobodyさん2009/03/06(金) 01:14:19ID:???
俺なら70万でやってやるよw
0230nobodyさん2009/03/06(金) 01:57:58ID:???
5万
NCNRでお願いします。
0231nobodyさん2009/03/06(金) 05:12:13ID:???
ちょうど俺液晶買い換えたいと思ってたんだよね
3万でいいよ
0232nobodyさん2009/03/06(金) 13:15:46ID:???
今月給料が少なかったから手付50万円で月々の保守10万円で年間契約で受け持つよ
制作は規模にもよるけど3ヶ月以内を約束で。
0233nobodyさん2009/03/06(金) 14:24:55ID:???
IFって何かと思った。
なんかのフレームワークかな?とか。

……俺だけ?
0234nobodyさん2009/03/06(金) 14:28:56ID:???
>>233
君を入れて3人だけだね。
0235nobodyさん2009/03/06(金) 18:09:13ID:???
俺はインターフェイスの設計かとオモタ
0236nobodyさん2009/03/06(金) 22:21:27ID:???
【月刊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プログラミング
0237nobodyさん2009/03/06(金) 23:18:44ID:???
創刊号は
if の歴史
からいこうぜ
0238nobodyさん2009/03/06(金) 23:27:43ID:???
付録は何ですか><
0239nobodyさん2009/03/06(金) 23:36:05ID:???
2号からはおいくらですか?
0240nobodyさん2009/03/07(土) 00:03:23ID:???
つか2年後に初めて入り口とかw
まともにやってたら中級の入り口に立ってるはずなのにw
0241nobodyさん2009/03/07(土) 02:52:57ID:???
付録「ifとiff」

0242nobodyさん2009/03/07(土) 02:58:51ID:???
>240
むしろツッコミどころは第23号じゃね?
0243nobodyさん2009/03/07(土) 14:31:06ID:???
お前らの大好きな perl-users.jp で書けばいいじゃん。
0244nobodyさん2009/03/07(土) 14:53:41ID:???
>>243
なにそれ?
0245nobodyさん2009/03/07(土) 15:05:38ID:???
ぐぐれ
0246nobodyさん2009/03/07(土) 18:31:27ID:???
Switchモジュール特集は今すぐ始めてくれて構わないんだぞ?
0247nobodyさん2009/03/07(土) 22:21:11ID:???
>>243
あそこは頑張ってて好きだぜ。perl学ぶならここ見ろ、ってのが出来るのはいいことじゃね
0248nobodyさん2009/03/08(日) 01:43:51ID:???
import関数は何をするものですか?
0249nobodyさん2009/03/08(日) 11:38:53ID:???
Switchはクックブックに少し載ってるよね
0250nobodyさん2009/03/08(日) 13:14:22ID:???
>>247
ああいうのは、5年後10年後に負の遺産になるのが常だからなあ。
0251nobodyさん2009/03/08(日) 21:55:46ID:???
口で言うだけより行動する方がかっこいいし
あの辺のクラスタは10年経ってもずっとやってそう
0252nobodyさん2009/03/08(日) 22:16:42ID:???
5.10のgiven,when,defaultって手もあるな
0253nobodyさん2009/03/09(月) 00:06:15ID:???
>>251
何というか、君は腰巾着だな。ひとり立ちせえよ。
0254nobodyさん2009/03/09(月) 00:38:08ID:???
>>253
煽りたいんですね、わかります
0255nobodyさん2009/03/09(月) 01:19:00ID:???

$hogeがaとb以外のときに実行するには

if ($hoge ne 'a' or $hoge ne 'b' ){
 print "oik";
}

で合ってますか?
0256nobodyさん2009/03/09(月) 01:26:29ID:???
>255
その場合だと、「a以外」または「b以外」のときに真となるので、常に成立することになる。
「aまたはb」という条件式を作り、それをさらに否定するといい。
0257nobodyさん2009/03/09(月) 01:27:09ID:???
andにするだけでいいだろ
0258nobodyさん2009/03/09(月) 01:28:42ID:???
これ、新しいAAみたい → oik
orじゃなくて、andじゃないとマズくね?
0259nobodyさん2009/03/09(月) 01:30:03ID:???
被ってるし。床に横になってギター弾いてるみたいんだよなー → oik
0260nobodyさん2009/03/09(月) 01:40:09ID:???
olkはokの誤植です。。。

$hoge = 'c';

if ($hoge ne 'a' and $hoge ne 'b' ){
 print "ok";
}

なら ok で、このとき $hoge = 'b' ならなにもしないんですよね?
0261nobodyさん2009/03/09(月) 01:46:15ID:???
>260
おっけー。

あと、既に知ってるかもしれないが
「ド・モルガンの法則」でぐぐってみると勉強になるかも
0262nobodyさん2009/03/09(月) 03:04:23ID:???
>>261
or と and でよく悩むんです。
ありがとうございました。
0263nobodyさん2009/03/09(月) 03:26:47ID:???
>>260
詳しくは、月刊ifの全て、第18号をお読みください
0264nobodyさん2009/03/09(月) 04:12:13ID:???
気付いたら *.cgiが 丸見えだ。(五七五
0265nobodyさん2009/03/09(月) 04:36:41ID:???
>>263
月刊ifの全て第18号には、こんな用例がのっているはずw

$hoge = 'c';

$hoge ne 'a' and $hoge ne 'b' and print "ok";
0266nobodyさん2009/03/09(月) 19:03:15ID:???
第24号より難しいことしてるよな、きっとw
0267nobodyさん2009/03/09(月) 23:14:05ID:???
サーバー上で一つのファイルを読んだり書いたり追記したりするCGIを作成して、
初めてflockを使ってみたのですが、実際にflockを間違えずに入れれてるかどうか
確認するにはどうすればいいでしょうか。
0268nobodyさん2009/03/10(火) 00:01:48ID:???
ab 使ってアタックしてみればいい

たとえば純粋にカウントアップするスクリプト書いて、
ab で 30 のクライアントで 10000 回もぶん回せば結果は出るかと思うよ
0269nobodyさん2009/03/10(火) 11:58:59ID:???
無料日がおしよせてくる、泣いてる場合じゃない
ワクワクを百倍にしてヤフオクの主役になろう♪
0270nobodyさん2009/03/10(火) 11:59:31ID:???
↑スレチ、まちごうたorz
0271nobodyさん2009/03/11(水) 22:07:23ID:???
>268
abってモジュールがあるのでしょうか?
ググッて見たけど、ソートの$a<=>$bとかばっかりひっかかってわかりませんでした。
0272 ◆TWARamEjuA 2009/03/11(水) 22:29:30ID:????BRZ(10001)
>>271
検索語にapacheも追加すると幸せになるかもしれません。
0273nobodyさん2009/03/11(水) 23:11:50ID:???
>>272
なるほど、apacheの方でしたか。
見つかりました。ありがとうございます。
0274nobodyさん2009/03/12(木) 16:37:21ID:???
月刊ifの全ての第14号と第15号を見て思ったんだけど
範囲演算子の「..」と「...」をスカラーコンテキストとして評価して
状態遷移処理をするプログラムを活用している人はいるのだろうか?
0275nobodyさん2009/03/12(木) 17:06:33ID:???
個人的には嫌と言うほど使ってるが? @data解析系
0276nobodyさん2009/03/12(木) 19:29:47ID:???
>>275
なるほど
試しに使ってみたけど論理が混乱して変数でフラグ持たせるやりかたで未だにやっているけど
実際に嫌と言うほど使っている人がいるってことは、俺がバカだったというだけみたいだな出直してきます
0277nobodyさん2009/03/14(土) 16:39:37ID:???
tokuhirom は、適度に漢字を混ぜた文章書いてくれないかな。
0278nobodyさん2009/03/14(土) 20:53:02ID:???
Mooseみたいに、useしただけでstrictとwarningsがuseされるモジュールを作りたいんですが、どうしたらいいですか?
ソースを参考に、こんなの書いたけど駄目でした。

package Hoge;
use strict;
use warnings;

sub import {
 strict->import;
 warnings->import;
}

package main;
use Hoge;

$hoge=1; # ここでエラーになって欲しい
0279nobodyさん2009/03/14(土) 21:37:49ID:???
>>278
やってみたけど普通にそれで引っかかるぞ?
0280nobodyさん2009/03/14(土) 22:00:06ID:???
>>279
あれ本当だ…
何かを間違っていたようです、失礼しますた
0281nobodyさん2009/03/16(月) 00:10:49ID:???
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使ってる人いませんか?
0282nobodyさん2009/03/16(月) 13:27:07ID:???
>>281
デバッグしろよ!!
0283nobodyさん2009/03/23(月) 00:31:29ID:???
tokuhirom は能力ないのかね。
多くの場面で使われているということだけでは、何も評価したことにならんよ。

「あれがいいってみんなが言ってるよ。」
0284nobodyさん2009/03/23(月) 01:06:40ID:???
>>283
直接言えよ

Module::CoreListに載っていればいいのか、
Plaggerとかの有名どころで使われているモジュールがいいのか、
CPANに上がってりゃそれでいいのか、
場末のコードスニペットがいいのか、
判断どころは色々だろ
0285Nobodyさん2009/03/24(火) 02:30:18ID:???
yellowlemon 234
redapple 432235
redstrawberry 2934

こんな感じで文字列と数字で構成された行を数字の高い順(降順)
でソートして↓のようにするにはどのようにすればいいでしょうか?

redapple 432235
redstrawberry 2934
yellowlemon 234
0286nobodyさん2009/03/24(火) 04:35:51ID:???
>>285
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_an_array_by__anything_

my @sorted = map "$_->[0]\n",
  sort { $b->[1] <=> $a->[1] }
  map [ $_, / ([0-9]+)/ ],
  ('yellowlemon 234', 'redapple 432235', 'redstrawberry 2934')
;
0287nobodyさん2009/03/24(火) 06:28:56ID:???
別バージョン

my @targets = ('yellowlemon 234', 'redapple 432235', 'redstrawberry 2934');
y @sorted_targets = sort {
(split ' ', $b)[1] <=> (split ' ', $a)[1];
} @targets;
0288nobodyさん2009/03/24(火) 16:58:27ID:???
>>287
> ソートするものの一部を取り出す必要があるような複雑な関数を使うのなら、
> ソート関数の内側でそれを使ってはいけません。最初にその関数で使う部分を
> 取り出します。なぜなら、sort のBLOCKは同じ要素に対して何度も何度も
> 呼び出される可能性があるからです。

sort() が比較要素をキャッシュしてくれるようにでもなっているのなら、
{ (split ' ', $b)[1] <=> (split ' ', $a)[1] } でいいけどね。
02892872009/03/24(火) 20:07:04ID:???
>>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)
0290nobodyさん2009/03/24(火) 22:20:58ID: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;
}
0291nobodyさん2009/03/25(水) 04:28:21ID:???
>>290
ようはフィルタでしょ?
スクリプトをfoo.plとか適当な名前で保存して、
フィルタに掛けたいファイルを用意して(例えばbar.txt)
perl foo.pl bar.txt
すりゃいいだけかと
ファイルに吐かせたいなら
perl foo.pl bar.txt > out.txt
0292nobodyさん2009/03/25(水) 04:53:50ID:???
初心者です。環境はXP
CPANでモジュールをインストールしようとすると、
Alert: While trying to 'parse' YAML file
'C:\usr\cpan\FTPstats.yml'
with 'YAML::XS' the following error was encountered:
ってばかり吐かれて死にそう。
ググったらFTPstats.ymlを削除すればとあってやってみたけど効果なし。
何か策があれば教えてください。
0293nobodyさん2009/03/25(水) 08:15:32ID:???
>>289
ベンチコードが分からんと追試しようが無い。
http://boobar.hp.infoseek.co.jp/bench/sort.txt
02942872009/03/25(水) 10:10:31ID:???
>>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
02952872009/03/25(水) 10:12:20ID:???
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;
}
02962872009/03/25(水) 10:26:31ID:???
ごめん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)
02972872009/03/25(水) 11:00:33ID:???
度々すんません。なんか、俺のbenchコードが間違ってるっぽいな。要素数かなり大きくしてためしてみたら体感的にもspli使わない方が速いわ。
0298nobodyさん2009/03/25(水) 22:28:41ID:V8wgPxlA
>>291
ありがとう!おかげで助かった。
0299nobodyさん2009/03/25(水) 22:41:59ID:???
perl勉強しようかと思うんだけど何から手を付けてよいものか…
0300nobodyさん2009/03/25(水) 23:19:39ID:???
>>299
>>2
0301nobodyさん2009/03/25(水) 23:22:54ID:???
>>300
何から手を付けてよいものか…
0302nobodyさん2009/03/26(木) 01:34:45ID:???
>>301
http://ja.wikipedia.org/wiki/Hello_world
まず画面上に "Hello, world!"、と表示することから始めるんだ。
0303nobodyさん2009/03/26(木) 11:24:01ID:???
シュワルツ変換までは知ってたがガトマン・ロスラー変換なんてのもあるのか
さっそくどこかで使ってやろう
0304nobodyさん2009/03/26(木) 12:07:44ID:???
へえ、勉強になったw
シャチ泳ぎの方が何かと好きだけど、覚えとこ。
実際にはそこまで処理時間にシビアな仕事はしてないけどw
0305nobodyさん2009/03/26(木) 14:19:19ID:???
っ「Sort::Maker」



0306nobodyさん2009/03/26(木) 15:38:08ID:???
初めまして。ご質問させていただきます。
AのサーバーにあるCGIから
BのサーバーにあるCGIへPOSTする方法を探しています。
HTMLのformタグのmethod=postと同じことをCGIで実行出来ないでしょうか?

0307nobodyさん2009/03/26(木) 15:49:55ID:???
LWP::UserAgentでPOSTリクエストを送信するとか
あるいはJavaScriptでブラウザにPOSTさせるとか
というのは嘘で、無理だから諦めろ
0308nobodyさん2009/03/26(木) 16:00:49ID:???
>>307
ご返答ありがとうございます。
よそのサーバーのCGIに処理を実行させるのは危ないなぁとも考えていましたが、無理でしたか。
同一のサーバーでしたら可能でしょうか?
0309nobodyさん2009/03/26(木) 17:29:37ID:???
action に http から書けば OK じゃない?
0310nobodyさん2009/03/26(木) 23:43:53ID:???
いや、おい・・・
0311nobodyさん2009/03/27(金) 00:10:05ID:???
>>308

普通にできるから
0312nobodyさん2009/03/27(金) 01:22:46ID:???
CPANのドキュメントくらいよめよ。
やり方書いてあるんだから。
0313nobodyさん2009/03/27(金) 07:22:34ID:???
初心者というかこれから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の書籍にありました。


どなたか回答よろしくお願いいたします。
0314nobodyさん2009/03/27(金) 08:24:05ID:???
>Windowz Vista

そんなのが出たのか。
0315nobodyさん2009/03/27(金) 09:14:42ID:???
その本が出た頃は5.8かな
VistaならActivePerl 5.8.8を入れておけば問題ない
03163132009/03/27(金) 09:29:04ID:???
>>315さん
ご回答ありがとうございます。
さっそくやってみます。
0317nobodyさん2009/03/27(金) 19:36:05ID:???
>>313
あと英数文字は半角で書く癖をつけないと動かないとおもう。
0318nobodyさん2009/03/27(金) 20:16:13ID:???
XAMPP はある程度分かっている人用の、設定がだりぃ人向けだから
ほんっとの初心者は Apache、PHP、MySQL それぞれを個別に入れれ
0319nobodyさん2009/03/27(金) 21:58:01ID:???
centos楽でいいよ
例のoverload絡みのバグへの対応は他ディストリより糞遅かったけど
0320nobodyさん2009/03/28(土) 00:42:44ID:mucWI58R
自分の環境はCentOS5 perl5.8.8です
ある文字列UTF-8を、指定の文字数で分割し、配列に格納したいと思います

例)UTF-8の文字列を5文字ずつ分けたいと思い↓のコードを書きました

$string = "民主党支持団体=jichiro,山口組、ブラクカイドウ、韓国民潭";
@output = $string =~ m/.{5/g;
print $_, "\n" foreach @output;

↑の結果は↓のようにしたいのですが、今のままだと途中で文字化けをしてしまいます
--------------
民主党支持
団体=ji
chiro
,山口組、
ブラクカ
イドウ、
韓国民潭
--------------

文字化けをしないようにする方法を教えてください
0321nobodyさん2009/03/28(土) 00:53:26ID:???
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
,山口組、
ブラクカイ
ドウ、韓国
0322nobodyさん2009/03/28(土) 01:03:13ID:???
>>320
use utf8;
を宣言して、スクリプトをutf8で保存すればよいのでは?
正規表現の{5の後に}が抜けている
さらに、{5}では、最後の5文字未満が拾えない
そこで
@output = $string =~ m/.{1,5}/g;
とすればok
0323nobodyさん2009/03/29(日) 14:40:26ID:???
Image::Magickで、PSD→JPGの変換を行っているんですが、
モノクロ2階調で描かれたpsdファイルを読み込んで保存すると
ぐちゃぐちゃに壊れたような画像になってしまいます。
上手く変換する方法は無いでしょうか。

 $image->Read("in.psd");
 $image->Write("out.jpg");

0324nobodyさん2009/03/29(日) 21:07:47ID:???
>>323

http://www.imagemagick.org/script/formats.php

とりあえず、最新バージョンは対応はしてみてるようだから、
perlじゃなくて、command lineからためしてみたら。
0325nobodyさん2009/03/29(日) 22:55:28ID:???
>>324
最新バージョンの 6.5.0-9 をDLして試してみましたが、
変わりませんでした。

ImageMagickの質問ってこのスレでいいんでしょうかね?
CG板とかUNIX板は違いそうだし。
0326nobodyさん2009/03/29(日) 23:40:56ID:???
>>325

ImageMagickはコマンドラインで提供されてるから、
perlをそもそも使わないで試したらってことです。

まず、psd,jpgサポートしてるか調べる

identify -list format

この辺ためす
http://www.imagemagick.org/script/command-line-tools.php

このへんで動くのに、perlだと動かない場合はここで良いいと思うけど、
そもそも動かない場合は、perl関係ない。
0327nobodyさん2009/03/30(月) 00:10:07ID:???
>>326
そもそも動きませんでした。
スレ違いなのでどこかに移動しようと思います。

・・・どこに移動するのがいいでしょうか?
0328nobodyさん2009/03/30(月) 11:49:19ID:???
かみ合ってねーなぁ。
software板にでも行きゃいいんじゃねえの。
0329nobodyさん2009/03/30(月) 19:04:34ID:???
ウィンドウズかMacでサーバ立てて、Photoshopのマクロ使った方がいいのでは。
0330nobodyさん2009/03/30(月) 20:35:52ID:???
誘導厨うぜーな。
0331nobodyさん2009/03/31(火) 16:12:44ID:???
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()した後に更新するの?
なんか定石みたいなのってありますかね。
0332nobodyさん2009/03/31(火) 16:35:28ID:???
>>331
同じく初心者の視点から思ったことを
この場合(全員が同時に性転換する場合)に限っては、sexテーブルを切り分ければ解決じゃないか?
あとSQL文最後のセミコロンは要らなかった記憶がある

excuteしたあとの動作うんぬんについては上級者に任せます
0333nobodyさん2009/03/31(火) 16:55:11ID:???
>>332
ごめん、コード例がまずかった。
後出しで申し訳ないけど、実際には全員が性転換するとは限りません。
舐めて逐一更新したいとき、どういう流れで作るべきなのかを聞きたかった。

prepareのセミコロンが要らないってのは了解。
0334nobodyさん2009/03/31(火) 17:17:50ID:???
>>334
なら
update person set sex='男' where sex='女' and...
update person set sex='女' where sex='男' and...
みたいに2つSQL文を発行すれば?
他に読み出してから行う処理がなくて済むなら速いと思う
0335nobodyさん2009/04/01(水) 11:55:36ID:???
いや、知りたいのはSQL文でどうにかする方法じゃなくて・・・
もういいです。ありがとうございました。
0336nobodyさん2009/04/01(水) 16:46:55ID:???
$word = 'チソポ';
$word2 = '検出文字';
print "Content-Type:text/html\n\n";
if($word2 =~ /$word/ig) {
print "out";
} else {
print "safe";
}

掲示板のスパム対策でうまく動かない部分があったので上のようなプログラムで試したところ、
実行すると「out」が出力されてしまいます。
「チソコ」だと「safe」が出力されます。

どうすればよいでしょうか?
03373362009/04/01(水) 17:08:31ID:???
すみません。
if($word2 =~ /\Q$word\E/) {
で解決しました。
0338nobodyさん2009/04/01(水) 20:37:02ID:+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
と言われて困ってます。
どなたか助けて頂けませんか?
0339nobodyさん2009/04/01(水) 21:01:56ID:???
マルチ志ね
0340nobodyさん2009/04/02(木) 04:32:48ID:???
配列の添字が0で始まるとして、grepで1個の要素(TARGET)を返しているかチェックしたいのですが、
↓の書き方で問題ないでしょうか?

my @TARGET = grep (/hoge/, @hogehoge);
if ($#TARGET) {
 # エラー
}
0341nobodyさん2009/04/02(木) 05:02:24ID:???
>>340
そのコードなら、grepにヒットするのが1個もない時も動いちゃうよ。
1個の時のみなにかしたいなら、
 if( scalar(@TARGET)==1 )
とかにしたほうがよいんでない。?
0342nobodyさん2009/04/02(木) 05:20:44ID:???
>>341
ヒットするのが1個もないときの$#TARGETは-1になると思うんですが、どうでしょう?
$#TARGETが未定義値を返す場合があったりすると困りますが・・
0343nobodyさん2009/04/02(木) 05:21:49ID:???
ああ失敬。
0個or2個以上はエラーで、ってことなら
まあ>>340のままでも期待通りには動くか。
0344nobodyさん2009/04/02(木) 05:34:02ID:???
まあでもやっぱり、
自分が書くなら、

1個の時のみなにかしたい
→ if( scalar(@TARGET)==1 )

1個以外の時になにかしかい
→ unless( scalar(@TARGET)==1 )

みたいにするかな。
じゃないと、大分たって後から見直したり、
誰か他人に見てもらったりする時わかりにくじゃん。
0345nobodyさん2009/04/04(土) 18:14:39ID:???
ifの条件節で偽となるのは0かundefのときだけじゃなかったっけ?

普通に個数数えるべきだと思うが
0346nobodyさん2009/04/04(土) 20:48:24ID:???
>>345
http://search.cpan.org/dist/perl-5.10.0/pod/perlsyn.pod#Truth_and_Falsehood________
> The number 0, the strings '0' and '', the empty list (), and undef are all false in a boolean context.
0347クレクレコボラー2009/04/06(月) 21:20:03ID:IJNdmC5q
if $i !~ /[^\w]/

これは、変数iが何だったらって意味?
0348nobodyさん2009/04/06(月) 21:23:51ID:???
[a-zA-Z0-9_]以外の文字にマッチしなかったら
0349クレクレコボラー2009/04/06(月) 21:25:01ID:IJNdmC5q
ありがと
0350nobodyさん2009/04/06(月) 21:54:57ID:???
えーー
0351クレクレコボラー2009/04/06(月) 22:10:12ID:IJNdmC5q
うん、テストしたら逆のような気がするが。
0352クレクレコボラー2009/04/06(月) 22:13:51ID:IJNdmC5q
いや、いいのか。
i = a-zA-Z0-9_だったらって事だよね。
0353クレクレコボラー2009/04/06(月) 22:16:57ID:IJNdmC5q
COBOLもそうだけど、NOT=ってよく勘違しちゃうんだよね。
何年やっても。
俺が馬鹿なだけか。w
0354クレクレコボラー2009/04/06(月) 23:08:51ID: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の仕事
くれくれー。
0355nobodyさん2009/04/07(火) 00:12:40ID:???
[a-zA-Z0-9_]以外の文字にマッチしなかったらTRUE
0356クレクレコボラー2009/04/07(火) 01:58:46ID:YZyHfBtr
>>355
うん。それ理解出来たから。
それよりCOBOLの仕事探してんだけど。紹介してくれくれー。
出来なかったら
>>354の質問に答えてくれくれー。
0357nobodyさん2009/04/07(火) 10:01:01ID:???
>>354
いまどきはutf8のことも多いのでguessの候補に入れるといいと思うが、
utf8とeucは文字コードのよく使われる部分がもろに重なっているので
誤判定が多いのが悩みどころだな。eucは1文字2バイト、utf8は3バイト
なので6の倍数バイトでなければ区別がつくんだが、6の倍数バイトの
ときは辞書か出現確率テーブルでも用意してひくしかないんじゃない
かな。
0358nobodyさん2009/04/07(火) 21:56:59ID:???
utf8で日本語なら3byteだけどアルファベットだと1byteだから3の倍数とは限らないだろ
0359nobodyさん2009/04/07(火) 22:22:56ID:???
UTF-8 は固定長……、
そんなふうに考えていた時期が僕にもありました。二週間くらい。
0360nobodyさん2009/04/08(水) 18:43:51ID:???
http://www.itmedia.co.jp/news/articles/0904/08/news088.html
0361nobodyさん2009/04/08(水) 21:41:46ID:???
\w は utf-8で flagたってたら、日本語も通すきがする
0362nobodyさん2009/04/14(火) 17:42:33ID:???
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;

ご存知の方いらっしゃいましたら、何かアドバイス戴ければと
0363nobodyさん2009/04/14(火) 18:57:46ID:???
バッファオーバーフローしてるんとちゃうか。
$buffer = "\x00" x 0xffffffff;
0364nobodyさん2009/04/25(土) 20:26:28ID:???
カードゲームみたいな対戦ゲームを作ろうと思ったら、
どんな書き方になる?
ユーザが二人ログインするのを待ってゲーム開始、みたいな感じなんだけど
0365nobodyさん2009/04/26(日) 18:39:33ID:???
検討もつかないんだったらやめたほうがいいよ

WebカメラつないでSkypeが一番現実的だ
0366nobodyさん2009/04/26(日) 21:54:51ID: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での文字化けはどのようにしたら回避できますか?
0367nobodyさん2009/04/26(日) 22:46:55ID:???
URLエンコードやBASE64などでエスケープすれば回避できるだろうけど
どうしてもSJISのままでってことならSQLエスケープするとか
0368nobodyさん2009/04/27(月) 02:18:16ID:???
>>366
Windows上では、"SJIS"ではなくて"cp932"でMySQLの文字コード指定してみ。
けど、DBで管理するんなら、日本語(マャ泣`バイト)使うのは、ファイルのタグとゆうかDB上での
説明としてだけにして、実際のファイル(パス)名はシングルバイトだけにするのが無難。
(上でもやってるように、局と日付、放送時間にするとか)
0369nobodyさん2009/04/27(月) 08:43:15ID:???
>>367,368
ありがとうございます。
MySQLはPHPmyadminで管理しているので、なるべく平文で入力したいと思っています。
ファイル管理と実際のファイル名を別にすることも考えたのですが、
DLNAでファイルそのものをLAN内配信しているので、日本語ファイル名を使いたいのです。

そもそも、\もしくは/のディレクトリ符号と、SJIS文字が一行に入っているのが悪いのでしょうか。。。
PHPmyadmin上のcp932の指定を勉強してきます。。。
0370nobodyさん2009/05/01(金) 04:37:55ID:???
すみません
正規表現について質問です

掲示板等の本文で特定の文字があった場合正規表現でリンクを生成したいんですが
(#a#検索文字#/a#)
携帯の場合検索文字にスペースがあった場合スペース以降が無視されてしまうので
URLエンコードをしようと思っています。
そこで質問ですが、$1に入っている「検索文字」をURLエンコードするにはどうしたら
いいのでしょうか?

$text =~ s/#a#(.*?)#\/a#/<a href=\"s.cgi\?word=$1\">$1<\/a>/g;
今現在はこのようにしています。
このword=$1の$1部分だけURLエンコードがしたいんです。

よろしくお願いします。
0371nobodyさん2009/05/01(金) 10:43:26ID:???
$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;
03723712009/05/01(金) 10:54:17ID:???
掲示板で不特定の人が書くならサニタイズしないといけないか。。
0373nobodyさん2009/05/01(金) 19:16:23ID:???
>>371
動作確認しました。
ありがとうございます。

…正規表現ってこういう書き方も出来るんですね
勉強になりました

まぁ今は理解してない部分もあるんで調べてみようと思います。
0374nobodyさん2009/05/02(土) 05:07:16ID: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で見ると、ログそのものは更新されているので、
一度スクリプトがログを開いてはいるみたいなのですが…。
どうかよろしくおねがいします!
0375 ◆TWARamEjuA 2009/05/02(土) 08:04:20ID:????BRZ(10072)
>>374
chomp @datalist;
@newlist = grep $erase != $_, @datalist;

改行が含まれていそうね♪
0376nobodyさん2009/05/02(土) 10:31:24ID:???
それと併せて、$newlist[$k] = $datalist[$k];行は
push(@newlist, $datalist[$k]);に換えないといけないんじゃないかな?
前後の処理がよくわからないし、もっと効率のいい方法あるとは思うけど・・
0377nobodyさん2009/05/02(土) 12:08:08ID:???
配列に対してフィルタというと、普通にgrepだなあ
0378nobodyさん2009/05/02(土) 12:44:54ID:???
全くデバッグしていないのがスゴイ
03793742009/05/02(土) 12:47:26ID:???
>>375
ありがとうございます
そのとおりやってみたら、見事に$erase以外がログに書き込まれていました。
おっしゃる通り、改行が含まれていたせいみたいです。

しかし、修正されたログにも同じように数字ごとに改行を含んでおきたいのですが、
この処理だと

119049025

のように改行なしで一気に書かれてしまいました。

そこで、元の自分の書いたものに>>376さんのアドバイスで修正を加え

chomp @datalist;
for ( my $k = 0 ; $k < @datalist ; $k++ ) {
if ( $datalist[$k] ne $erase ) {
push(@newlist, "$datalist[$k]\n");
}
}

としてみると、一応、望み通りの結果を出すことができました。
二晩くらい悩みまくったので、とても助かりました。
ほんとうにありがとうございました。

grepを使った方法は今まで使ったことが無くて、一行で処理できる
美しいコードに感激したので、もしよろしければ自分の書いた方法以外で
同じ結果の出せる(改行含む)書き方があれば教えてやってください。
0380nobodyさん2009/05/02(土) 15:42:19ID:???
>>379
map { s/$erase\n//; } @datalist;
0381nobodyさん2009/05/02(土) 16:15:37ID:???
>>380
それは部分一致だからs/^\Q$erase\E$//
0382nobodyさん2009/05/02(土) 17:09:01ID:???
^\Q$erase\E\n$
0383nobodyさん2009/05/02(土) 17:44:55ID:???
でも、リストを作る時に改行は外した方が
0384nobodyさん2009/05/02(土) 18:10:31ID:???
$は改行にマッチするので¥nは不要
03853842009/05/02(土) 18:15:58ID:???
と思ったが、要るか
03863742009/05/02(土) 18:37:39ID:???
みなさんありがとうございます

map { s/^\Q$erasedat\E\n$//; } @datalist;

で希望通りに処理されるのを確認できました。

mapとかgrepというのを使いこなせば、いま自分の書いてる現行のスクリプトで
改善できるところがすごく多そうなので、ちょっと勉強してみます。。

ほんとに助かりました。親切にありがとうございました
03873742009/05/02(土) 18:39:02ID:???
$erasedatではなくて$eraseでした
0388nobodyさん2009/05/02(土) 19:51:16ID:???
mapの結果は要素数同じでヌルがいっぱい入ってないか?
0389nobodyさん2009/05/02(土) 21:04:48ID:???
ヌルはないがぬるぽがいっぱいだお
0390 ◆TWARamEjuA 2009/05/03(日) 09:41:50ID:????BRZ(10072)
ヌコはいないがガッがいっぱいだお
0391nobodyさん2009/05/05(火) 04:15:46ID:???
やっぱmapとgrepそして正規表現を使いまくってこそperlと言う気がするな
0392nobodyさん2009/05/05(火) 10:06:17ID:???
あと pack と unpack ね
0393nobodyさん2009/05/05(火) 13:43:50ID:???
そして数日後自分でも読めなくなると。
0394nobodyさん2009/05/05(火) 14:21:29ID:???
コメントがちゃんと書かれているなら、まあいいかなという気がする
0395nobodyさん2009/05/06(水) 01:57:30ID:???
splitとgrepとsortとforが一行で並んでる感じ
0396nobodyさん2009/05/06(水) 08:18:31ID:???
とあるサイトの中にある自分のステータス情報を
LWP::UserAgent を使って取得したいんですが、
リンクを幾つかたどっていく必要があります。

cookie は何とかなったんですが、
1つ前の html ファイルにあるパラメータを取得して POST メソッド時に引き渡すところの
解析に手を焼いています。
# パラメータ名は判っているので現在は文字列検索で取得しています。

a href などではなく、POST メソッドのパラメータも解析してくれる
便利なパッケージって無いでしょうか
0397nobodyさん2009/05/06(水) 11:03:19ID:???
配列をサブルーチンに渡すときって
&sub (@hoge);
ではダメなんでしょうか?

この記述で渡して、受け取ったサブルーチン側でログに書きだしたら
各行に空白が入るようになってしまったんですが。。。
0398nobodyさん2009/05/06(水) 11:35:46ID:???
配列に元々改行コード入ってるんじゃない?
0399nobodyさん2009/05/06(水) 11:50:51ID:Ms7+WRwl
>>397
もともとの値がちゃんと期待通りの値か確認してみ
他の可能性としては
my(@args);
としてるだけで
@args = @_;
みたいにするの忘れててサブルーチン側でちゃんと受け取ってないとか
0400nobodyさん2009/05/06(水) 13:42:27ID:???
>>396
HTML::Form(LWPの付属モジュール)
WWW::Mechanize(LWPのスーパークラス的なモジュール)
04013962009/05/06(水) 17:22:28ID:???
>>400 情報dくす。ググって調べてみる。 いい感じに逝きたい、これ試してみて。
0402nobodyさん2009/05/06(水) 17:46:16ID:???
>>401
わざわざぐぐらなくても、pod 読めばいいと思う。
0403nobodyさん2009/05/06(水) 18:05:57ID:???
>>400
> WWW::Mechanize(LWPのスーパークラス的なモジュール)

04043972009/05/06(水) 19:32:33ID:???
>>398
同じルーチンの中でやると普通に綺麗に書き出されるんだけど
別のサブルーチンに引き渡すと、データそのままで、各行の頭に半角空白が1個ずつ挿入されてる、って感じです。

>>399
&sub (@hoge);
で渡して、受け取る側で
@data = $_[0];
と書いてます。
0405nobodyさん2009/05/06(水) 19:53:17ID:???
>>404
@data = @_;
0406nobodyさん2009/05/06(水) 21:07:16ID:???
つか配列のリファレンス渡せ
0407nobodyさん2009/05/06(水) 21:09:34ID:???
>>404
とりあえず周辺のソースを晒してみたら?
0408nobodyさん2009/05/06(水) 21:33:27ID:???
先物で現受けする時に倉荷証券で受け取るのって参照渡しだよな
0409nobodyさん2009/05/06(水) 23:48:47ID:???
>>400
簡単なスクリプト作ってみたらイイ感じに出来た。
無事思惑通りのことができそう。
今まで URL を解析して UserAgent で get していたのが楽になる (T-T)
0410nobodyさん2009/05/07(木) 04:36:51ID:???
次はWeb::Scraperとの組み合わせを覚えてもいいかもな
>>396の用途ならピッタリだと思うぜ
0411nobodyさん2009/05/07(木) 12:48:09ID:???
htmlがきちっとしてれば、そんな苦労は要らんという気もする
0412キュウティイハニ-2009/05/07(木) 17:35:14ID:EGaRRr78
以下のようにあるWEBページを取得しようとしています。

use LWP::Simple;

getstore('http://www.yahoo.co.jp','d:\\test\\nikki.tmp2');

しかし、上記のyahooの場合は全てが取得されますが、
サイズの大きいサイトでは途中まで切れてしまいます。
(サイズの大きいサイトのサンプルが具体的に言えません、すみません)
サイズは128kBくらいまでなら、取得できるようです。
取得サイズを指定する何かがあるのでしょうか?
0413nobodyさん2009/05/07(木) 18:57:38ID:???
use LWP::Simple;
getstore('http://d.hatena.ne.jp/diarylist?mode=lirs','./lirs.dat');

> dir lirs.dat
2009/05/07 18:56 57,602,778 lirs.dat
1 File(s) 57,602,778 bytes


?
0414キュウティイハニ-2009/05/07(木) 20:20:10ID:EGaRRr78
>>413
回答ありがとうございます。
ためしためしで先程からテストしていたんですが、
どうも、対象のサイトに依存するようです。。。
0415nobodyさん2009/05/07(木) 21:00:25ID:???
タイムアウトでもしてんじゃねえのかね
そちらの環境で同様の現象が起こるサイトが出せない限り、これ以上は無理だね
0416nobodyさん2009/05/07(木) 21:40:07ID:???
UAをちゃんと設定してみそみそ
0417キュウティイハニ-2009/05/07(木) 21:47:42ID:EGaRRr78
>>415-416

あるアクセス解析のページなんですが、
IEでソース表示を行った場合も、
同様の場所で、ソースが切れています。
ブラウザ上では切れていなく表示されているのに。
なんで???
0418nobodyさん2009/05/07(木) 22:02:57ID:???
こちらへどうぞ
ttp://sakura_editor.at.infoseek.co.jp/
0419nobodyさん2009/05/07(木) 22:03:41ID:???
ついでにこれも
ttp://www2a.biglobe.ne.jp/~qpon/html/ie_edit.htm
0420キュウティイハニ-2009/05/08(金) 16:41:50ID: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;
0421キュウティイハニ-2009/05/08(金) 16:42:32ID:CAAVVdSZ
>>418-419

自動的にプログラムで取得してファイルに書きたいのです。
0422nobodyさん2009/05/08(金) 16:44:17ID:???
こうしたら?
$ua->timeout(3000000000000000000000000000000000すげえ);
0423nobodyさん2009/05/08(金) 16:49:19ID:???
128KB を越えるページを教えてください
テストしてみたい
0424キュウティイハニ-2009/05/08(金) 17:05:05ID:CAAVVdSZ
>>423
具体的に教えられないんです。
i2iアクセス解析のサーチワード一覧のソースが欲しいんです。

一例ですが、以下のようにget出来ますが、4番目の"q=%00"が出てくると、
ソースがちょん切られるみたいです。(※のところに[EOF]がくる)

<td align="right">3</td>
<td><a href=http://www.google.co.jp/search?hl=ja&q=BOSS&lr= target=_blank>BOSS</a></td>
<td align="right">4</td>
</tr>
<tr>
<td align="right">4</td>
<td><a href=http://www.google.co.jp/search?hl=ja&q=%00&lr= target=_blank>※
0425nobodyさん2009/05/08(金) 17:08:59ID:???
それじゃぁもう無理だ
てめーで解決しろよ
0426キュウティイハニ-2009/05/08(金) 17:11:45ID:CAAVVdSZ
他の日も試してみましたが、クエリーストリングに%00が含まれていると、
そこで、切られるみたいです。
でも、ブラウザ(IE8)上では、切れていないんです。
0427キュウティイハニ-2009/05/08(金) 17:12:10ID:CAAVVdSZ
>>425
冷たいなぁ。。。
0428キュウティイハニ-2009/05/08(金) 17:13:41ID:CAAVVdSZ
apacheのログを舐めて、リファラー部分を集計するようなperlライブラリってないですかね?
0429nobodyさん2009/05/08(金) 17:20:09ID:???
それぐらい自力で組めるだろw
0430キュウティイハニ-2009/05/08(金) 17:27:31ID:CAAVVdSZ
>>429
顕著な検索エンジンを経由してきた検索語と回数をカウントしたいんですが、簡単なんですか?
0431nobodyさん2009/05/08(金) 17:36:41ID:???
>>428
「死ぬほどある」に1票
0432キュウティイハニ-2009/05/08(金) 17:39:56ID:CAAVVdSZ
>>431
死ぬほどないんですけど><
http://www.google.co.jp/search?hl=ja&q=apache+referer+%E9%9B%86%E8%A8%88+%E6%A4%9C%E7%B4%A2%E8%AA%9E+perl&btnG=%E6%A4%9C%E7%B4%A2&lr=
0433nobodyさん2009/05/08(金) 18:01:07ID:???
死ぬほど絞るからでしょう。
q=apache+log+perl

\0 でつまずいてるようだから今後も苦労すると思う。
0434キュウティイハニ-2009/05/08(金) 18:15:10ID:CAAVVdSZ
私、馬鹿なんだな。。。
よくわからない。

apacheのログを入力として、
検索語(日本語)とその検索回数を
表示してくれるだけでいいのに。
0435nobodyさん2009/05/08(金) 18:20:44ID:???
それのどこにリファラーが関係あるのさ
0436キュウティイハニ-2009/05/08(金) 18:21:55ID:CAAVVdSZ
%00はどういう意味なんだろう?
0437キュウティイハニ-2009/05/08(金) 18:24:51ID:CAAVVdSZ
>>435
リファラーにq="なんたら"
って書いてある"なんたら"の
"なんたら"と、その回数が知りたいのです
0438nobodyさん2009/05/08(金) 18:37:21ID:/tMyodOD
検索語からして馬鹿を露呈してると思うよ。
>>432から"検索語"を抜いた"apache referer 集計 perl"でググっただけで死ぬほど出てくるというのに。
0439nobodyさん2009/05/08(金) 18:38:33ID:/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";}
0440キュウティイハニ-2009/05/08(金) 18:39:16ID:CAAVVdSZ
>>438
うむ!頑張ってみる!
0441nobodyさん2009/05/08(金) 18:42:59ID:???
簡単に漠然と言っちゃえば % を \ を置き換えたもの
%00 は \0 の NULL 文字となる



だったような気がするんだマイハニー
0442キュウティイハニ-2009/05/08(金) 18:52:02ID:CAAVVdSZ
>>439
検索語が知りたいんです。
0443nobodyさん2009/05/08(金) 18:54:48ID:/tMyodOD
集計したら、あとはそこから検索語を取り出すだけだろ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
もう君Analogでも使ってればいいと思うよ
0444キュウティイハニ-2009/05/08(金) 18:56:58ID:CAAVVdSZ
>>443
バッチで取得したいのですぅ
0445nobodyさん2009/05/08(金) 18:57:50ID:???
馬鹿は死んでも直らないって本当だな
0446nobodyさん2009/05/08(金) 18:59:36ID:???
前にくだすれで大暴れしたりしてた人か
0447キュウティイハニ-2009/05/08(金) 19:01:25ID:CAAVVdSZ
頭を冷やして考えます。
0448nobodyさん2009/05/08(金) 19:34:43ID:???
>>412
まずレスポンスヘッダのチェックからだろ。
0449nobodyさん2009/05/08(金) 19:49:09ID:???
もう相手にしないで

はい次の方どーぞ
0450アルモコニ2009/05/08(金) 19:54:33ID:???
これはどういう意味ですか?


米を煮たいと所存だす。
http://www.google.co.jp/search?hl=ja&q=%E3%83%8B%E3%83%AB%E3%82%B3%E3%83%A1&lr=

ケロロゲ?ムで火をつけリソウシを入れました。
いいぐあいにリソウシは紫の汁を出し、
結局、アルモコニでした。
http://www.google.co.jp/search?hl=ja&q=%E3%82%A2%E3%83%AB%E3%83%A2%E3%82%B3%E3%83%8B&lr=
0451nobodyさん2009/05/08(金) 20:25:18ID:???
数値のソートはsort関数が早いのかな。
試したら圧倒的になったんだけど。
文字列だとGuttman Rosler変換が断トツだった。
0452nobodyさん2009/05/08(金) 21:03:07ID:???
で?
0453nobodyさん2009/05/09(土) 00:02:11ID:???
じ?
0454nobodyさん2009/05/09(土) 01:54:05ID:???
こ?
0455nobodyさん2009/05/09(土) 10:19:40ID:???
 
0456nobodyさん2009/05/09(土) 10:20:01ID:???
にょ!
0457nobodyさん2009/05/10(日) 08:47:53ID:P8pR48B+
i2iアクセス解析のサーチワード一覧のソースが欲しいんです。
0458nobodyさん2009/05/11(月) 20:26:11ID:???
>>457
http://www.google.co.jp/search?q=%CE%B4%CE%B8%CE%BD%CE%B2&lr=
0459nobodyさん2009/05/13(水) 13:11:51ID:oMl7P+AA
すいません。おそらくかなり初心者質問なのですが
xamppの環境で、Shift_JISで書いたコードが、問題なく動作するように
use encoding 'shiftjis', STDOUT => "shiftjis";
を加えたのですが、即座に動かなくなりました。
搭載されているperlはvar5.8.7なので、動かないはずがないのですが・・・
どなたか原因ご存知ありませんでしょうか?
0460nobodyさん2009/05/13(水) 13:24:51ID:???
エラーログぐらい出せクソ野郎
0461nobodyさん2009/05/15(金) 15:32:32ID:???
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;
0462nobodyさん2009/05/15(金) 16:04:16ID:???
>>461
つttp://search.cpan.org/~gaas/URI-1.37/
0463nobodyさん2009/05/16(土) 17:28:43ID: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環境です
0464nobodyさん2009/05/16(土) 18:01:49ID:???
変換元のコードが判別出来てない
0465nobodyさん2009/05/17(日) 15:36:49ID:dGMXPYwm
$BB =~ s/:/&url_encode(:)/g;

url_encodeはサブルーチンで普通に使えています
上記のように$BBに入っている文字列の中の「:」だけを全てエンコードしたいのですが、上記のコードだと「:」が「&url_encode(:)」という文字列に変換されてしまいます
正規表現の中でサブルーチンを呼び出すにはどうすればいいでしょうか?
0466nobodyさん2009/05/17(日) 15:47:36ID:???
e
0467nobodyさん2009/05/18(月) 01:28:52ID:???
1byteで回答
0468nobodyさん2009/05/18(月) 05:31:12ID:???
一体全体、なんでマニュアル調べないんだろうね?
「マニュアルに書いてあることを質問するな」とか云うはるか前の話として、
マニュアルをちょっと調べれば、3秒とか、長くても20秒くらいで
解決することを、わざわざ文章書いてポストするって、
どんだけ時間の無駄づかいなの?
0469nobodyさん2009/05/18(月) 09:09:13ID:???
スレタイをよく見るんだ
0470nobodyさん2009/05/18(月) 09:58:34ID:???
親切な人なら
$BB =~ s/:/&url_encode(':')/ge;
よりも↓の方が負荷がかからない
$BB =~ s/:/%3a/g;
と教えるだろうけどPerl使ってて負荷のこと言うと叩かれそうだから言わない
0471nobodyさん2009/05/18(月) 12:45:23ID:???
use URI::Escape;

my $safe = uri_escape($bb, ":");

これで、おk。
0472nobodyさん2009/05/18(月) 19:48:23ID:???
>>470
質問の本質はそこじゃないしな
0473nobodyさん2009/05/18(月) 20:45:50ID:gm/uB6Cl
>>472
おまえさんには「教えてください」なんて口が裂けても言わないから
ダイジョウブダヨ。
0474nobodyさん2009/05/19(火) 01:35:37ID:???
マニュアル見てもよくわからんってことも少なくないけどな
0475nobodyさん2009/05/19(火) 18:36:32ID:???
構文チェックでokが出てるのに500吐くんですけど、こういった場合ってどういった原因が考えられるんでしょうか?
サーバがUnixなので改行コードはLFにしてあります。アスキーで転送しました。
use strict;が原因かと思ってコメントアウトしたけど500のままなのです。
0476nobodyさん2009/05/19(火) 18:41:42ID:???
>>475
chmod ago+x *.cgi
0477nobodyさん2009/05/19(火) 19:34:05ID:???
>>476
おお!動いた!ありがとうございます。
FFFTPの方で700に設定してたのが悪かったのかな・・・。他はこれで動いてるのに。
0478nobodyさん2009/05/19(火) 19:44:30ID:???
>>477
当たっちゃったか

apacheは、apacheユーザとかnobodyユーザとかで動くから、
700じゃ実行権限ないの。この設定はhttpd.confで出来るよ。

他で動いてる理由は、4700か2700になってるとかかもしれないね
もしくはrootユーザに設定されてるか。もしされてるなら危険なので変えよう。
0479nobodyさん2009/05/19(火) 20:22:03ID:???
あとよくあるのが、cgiの場合HTMLを吐かずに終了してる場合
0480nobodyさん2009/05/19(火) 20:32:44ID:???
>>478
自己レス。
ごめん。勘違いに気づいた
4700、2700じゃ実行できるわけないや
0481nobodyさん2009/05/19(火) 20:38:57ID:???
ディレクトリ内のファイルを更新日時でソートして表示するにはどうしますか?
0482nobodyさん2009/05/19(火) 20:40:03ID:???
opendir
stat
map
sort
0483nobodyさん2009/05/19(火) 20:44:51ID:???
mapで何するの?
0484nobodyさん2009/05/19(火) 20:48:58ID:???
qx|ls -tl|
0485nobodyさん2009/05/19(火) 20:50:50ID:???
open IN, "ls -t ./ |";
while(<IN>){
print $_;
}
close IN;

時刻も取りたいなら、-tlにして、\sでsplit
0486nobodyさん2009/05/19(火) 20:51:15ID:???
フォルダ内のファイルを更新日時でソートして表示するにはどうしますか?
0487nobodyさん2009/05/19(火) 21:15:24ID:???
@files = `ls -t`; (新しい順)
@flies = `ls -tr`;(古い順)
0488nobodyさん2009/05/19(火) 21:20:16ID:???
>>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が順番は更新日時順でハッシュの配列になってるから。
0489nobodyさん2009/05/19(火) 21:22:11ID:???
.
..

↑これ消さないと
0490nobodyさん2009/05/19(火) 21:26:11ID:???
ほら、初心者の頃って、余計なの入ってると理解が遅れたりするじゃん
まずこれが理解できるようになってから、自分で消してもらうってことで。
0491nobodyさん2009/05/19(火) 21:28:16ID:???
@fileの更新日時ソートを、map、stat、sortで一行で書くにはどうしますか?
0492nobodyさん2009/05/19(火) 21:30:22ID:???
自分でやれw
俺map嫌いなんだよ
0493nobodyさん2009/05/19(火) 21:36:48ID:???
$dir= ".";
opendir(IN, $dir);
@files= map{$_->[0]}sort{$a->[1]<=>$b->[1]}map{[$_,(stat("$dir/$_"))[9]]}grep(-f"$dir/$_", readdir(IN));
closedir(IN);
0494更新日時でソート2009/05/19(火) 21:49:48ID:???
ありがとう。みなさんありがとう。
0495nobodyさん2009/05/19(火) 21:52:56ID:???
まさに黒魔術だよな
0496nobodyさん2009/05/19(火) 23:18:27ID:???
どいつもこいつも古いopen/opendirの書き方しやがって
0497nobodyさん2009/05/19(火) 23:28:19ID:???
openとか、デバッグくらいにしか使わないからなぁ
0498nobodyさん2009/05/20(水) 00:12:40ID:???
新しいのってどんな書き方?
0499nobodyさん2009/05/20(水) 00:15:44ID:???
open IN, ">", $file;
0500nobodyさん2009/05/20(水) 00:21:19ID:???
my @file = glob("./aaa");
とか?
でもこれはopendir+readdirだな

なんかのモジュール使うとかだと、結局はopenのラップだしなぁ

>>496
答えは?
0501nobodyさん2009/05/20(水) 00:31:37ID:???
>>499
入力ファイルが消えてしまったんだが
0502nobodyさん2009/05/20(水) 01:06:52ID:???
openは3引数で書くようになったが
opendirは相変わらず2引数だなぁ
0503nobodyさん2009/05/20(水) 01:15:45ID:???
>>500
ファイルハンドルはグローバルだから使うべからず(STDINとかの例外を除く)
>502の言うように3引数でmyつけて使うべし
0504nobodyさん2009/05/20(水) 01:28:30ID:???
新しい書き方では、出力ファイルのハンドラをINと書く

俺は古いのでいいや、なんか混乱しそうだし
0505nobodyさん2009/05/20(水) 01:33:39ID:???
自分もファイルハンドルにmy 付けて$変数にするのはもうクセになってるけど、
入出力に文字コード絡みの指定をしない時は、相変わらず2引数使ってることが多いかな。

けど、使い捨ての短いスクリプト書く時は、文字コード絡みがあっても、ついつい、
open(my $f,"$file_name");
binmode($f,":encoding(cp932)");
とかやっちゃうことも多い。
0506nobodyさん2009/05/20(水) 01:36:09ID:???
ファイルハンドラとかopendirのハンドラとか、なんで変数じゃなくていいんだろうな
逆に不思議だ
0507nobodyさん2009/05/20(水) 01:39:23ID:???
open my $fh, '+<', 'path' or die $!;

何のことだろって思って調べたんだが、こんな感じであってる?
0508nobodyさん2009/05/20(水) 01:48:12ID:???
そんな感じであってる
0509nobodyさん2009/05/20(水) 02:03:59ID:???
どうせなら die "$file:$!";
0510nobodyさん2009/05/20(水) 13:51:48ID:???
$hog に何が入っているか利用する前に調べる関数とかあるのでしょうか?
$hog にblessされたハッシュが入っているのか、テキストが入っているのか、
数値が入っているのかを利用する前に知りたい状況です。
05115102009/05/20(水) 13:52:55ID:???
×blessされたハッシュ
○blessされたハッシュのリファレンス
0512nobodyさん2009/05/20(水) 13:57:10ID:???
>>510
ref
05135102009/05/20(水) 14:21:19ID:???
>>512
ありがとうございます。
これでいけそうです。
0514nobodyさん2009/05/20(水) 20:33:00ID:???
正規表現を教えてください。
やりたいことは、"「で始まって」って終わる文字列"を置換したいです。
例えば、"「あ」「い」"を"「★」「★」"に置換したのです。
下記のように記述すると、多分2バイトコードである為、うまくいく場合と行かない場合が
あります。どのように記述すればよいか教えてください。

$data =~ s/「[^「」]*」/「★」/gi;
0515nobodyさん2009/05/20(水) 20:40:54ID:???
s/「(?:あ|い)」/「★」/g
0516nobodyさん2009/05/20(水) 20:55:54ID:???
>>515
ダメ
0517nobodyさん2009/05/20(水) 22:23:39ID:???
>>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 「あ」「い」「ほげほげ」

出力
「★」「★」「★」

まああれだ、正規表現を通さなくても、
入れるときデコード、出すときエンコードの癖を付けような
0518nobodyさん2009/05/21(木) 01:23:27ID:???
ちなみに「ほげほげ」を「★★★★」にする要件なら、
{★}xmsg;

{'★' x length($1)}xmsge;
にする感じで。
0519nobodyさん2009/05/21(木) 02:45:24ID:???
(´-`).。oO(.xlsの変換なんだろうなぁ。。。)
0520nobodyさん2009/05/21(木) 10:31:35ID:???
>>517
「原理原則」や「机上の空論」を正論と思って賞賛してよいのは中学二年生まで
0521nobodyさん2009/05/21(木) 15:48:56ID:???
>>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;
05225142009/05/21(木) 16:41:46ID:???
説明足らずですみません。
文字コードはShift_JISです。
具体的に説明します。
以下のコードを実行すると
2番目の「」の部分が置換されないのです。
プログラムを始めたばかりの未熟ですみません。


$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;

exit(0);
0523nobodyさん2009/05/21(木) 16:42:15ID:???
ワラタ
0524nobodyさん2009/05/21(木) 19:18:34ID:???
$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;

v(★0★)v
0525nobodyさん2009/05/21(木) 21:18:35ID:???
なぜ(?:を知ってて+?を知らぬ
0526nobodyさん2009/05/21(木) 21:47:57ID:???
それは>>521を丸コピペしただけだからだと思うよぉ
*?と+?は今後よく使うはずだから覚えておこう
0527nobodyさん2009/05/21(木) 22:17:03ID:???
あんな便利というか必須な機能が、perl4には無いんだよな
0528nobodyさん2009/05/21(木) 22:37:14ID:???
ちなみにperlの正規表現についてはここを見ておくと吉
ttp://www.kt.rim.or.jp/~kbk/regex/regex.html#PERL
0529nobodyさん2009/05/21(木) 22:58:52ID:???
perl4は忘れなさい
0530nobodyさん2009/05/22(金) 12:59:45ID:???
>>522
use strict;
use warnings;
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);

my $data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;

exit;

[^x]+より.+?の方が速いは、衝撃的。
05315142009/05/22(金) 13:01:09ID:???
>>524-528

ありがとうございます。
しかし、.+?とは、どういう意味なのかしらん?
0532nobodyさん2009/05/22(金) 13:20:16ID:???
「1文字以上」 の 「何らかの文字」 の 「最短マッチ」 

左から
+ . ?
0533nobodyさん2009/05/22(金) 15:52:26ID:???
えっ
0534nobodyさん2009/05/22(金) 16:25:07ID:???
>>528で確認すると

> +? +と同様ですが、マッチングがものぐさ(non-greedy)に行われる点が異なります。

とあるが、ものぐさと言われてもわけが分からんだろうな。
greedyが「貪欲な」という意味になるので、non-greedyなら「慎ましく」あたりが該当するのではないか。

だが、慎ましくと言われてもなお意味不明なことだろう。
しかし同時に、分からない者は置いてけぼりで構わないという高潔さも感じたことだろう。
正規表現を覗くものは、正規表現からも覗かれているのだ。
0535nobodyさん2009/05/22(金) 19:12:35ID:???
なんか見つかったらそれで終わり、というあたりがものぐさなんだろうけど

何故原文も翻訳もそんなあいまいな表現をしたがるんだ
0536nobodyさん2009/05/22(金) 21:15:21ID:???
昔読んだ本には最長マッチ、最短マッチと書いてあった気がする
0537nobodyさん2009/05/22(金) 23:04:55ID:???
ものぐさとか、貪欲とか、どういう訳なのかしらんが
最短マッチとかで、十分知られてると思うんだが
0538nobodyさん2009/05/22(金) 23:47:28ID:???
選り好み?だかもな、意味わかんね。
0539nobodyさん2009/05/23(土) 03:20:57ID:???
最短にしたらしたで文句言う人がいるんだよ。
0540nobodyさん2009/05/23(土) 09:02:31ID:???
Perlに限らず、正規表現/正則言語の世界ではnon-greedyで通ってるもんな。
ちなみにlazyと表す場合もあるらしい。'ものぐさ'はこっちから来てるようだね。
0541nobodyさん2009/05/23(土) 19:55:34ID:???
次のように―を半角スペースに置換したいのですが、エラーがでてしまいます
―を別のもの変えれば動くので、―に問題があるようです
\―にしてもできません

$cha =~ s/―/ /g;
0542nobodyさん2009/05/23(土) 20:28:09ID:???
sjisでやるとそうなる
0543nobodyさん2009/05/23(土) 20:36:10ID:???
試してないけど\Q―\E
0544nobodyさん2009/05/23(土) 21:58:57ID:???
>>541
やあ、弾先生のブログは読んでるかい?
いささか古いけど、Jcode.pmの代わりに使うぐらいなら丁度いいかもね。
http://blog.livedoor.jp/dankogai/archives/51031595.html

あとは、マニュアルを読んでほしい。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/encode.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/open.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/guess.html
0545nobodyさん2009/05/24(日) 03:43:48ID:51A7n5Gq
perlで
年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。 どうやって求めたらいいでしょう。

例えば、2009年第2週という情報からその週の初めの日である1/5
その週の最後の日である1/11を算出したいのですが・・(週は月曜始まり)
なかなか探しても見つかりません。

localtime,POSIXあたりを使ってできませんかね?
どなたかわかる方いましたらよろしくお願いします。
0546nobodyさん2009/05/24(日) 04:01:51ID:???
ム板で見つかるんじゃないの
0547nobodyさん2009/05/24(日) 14:21:03ID:???
失礼します。
二次元配列の特定要素をjoinしたいんですが、
ベタに回して代入する以外の方法で、そういうことって可能でしょうか?

my $result;
my @array = (["id1", "name1"], ["id2", "name2"], ["id3", "name3"], ["id4", "name4"], ["id5", "name5"]);

#「,」でjoin後
$result ⇒ "id1,id2,id3,id4,id5"
0548nobodyさん2009/05/24(日) 14:41:40ID:???
print join(',', map($_->[0], @array)),"\n";
0549nobodyさん2009/05/24(日) 14:53:03ID:???
>>548
ありがとうございます!
冷静に考えれば、内部的にはどっちにしろ回すんですね…

とりあえず下記のようにだいぶすっきりしました。
-------
my @aNotIn;
foreach (@$rItem) {
 push @aNotIn, $$_{id};
}
$sNotIn = "AND (id NOT IN(".(join ',', @aNotIn)."))";
-------

-------
$sNotIn = "AND (id NOT IN(".(join(',', (map($$_{id}, @$rItem))))."))";
-------
0550nobodyさん2009/05/27(水) 18:17:04ID:???
大文字と小文字を区別しないでマッチングを行いたいのですが特殊な条件なので難しいです
検索される文字が変数$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
何かよい方法はないでしょうか
0551nobodyさん2009/05/27(水) 18:24:55ID:???
index lc $content, lc keyword
でよさそうな。
0552nobodyさん2009/05/27(水) 18:30:36ID:???
何文字目かとれればいいの?
use strict;
use warnings;
printf "result:%d\n",index2('ARTRYI' , 'y');
sub index2 {$_[0] =~ /$_[1]/i ? length($`) : -1}

0553nobodyさん2009/05/27(水) 18:33:50ID:???
とりあえず\Q使わないと
0554nobodyさん2009/05/27(水) 22:42:22ID:???
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");
0555nobodyさん2009/05/28(木) 10:34:19ID:???
>>374
>>379
>>386

の者なんですが、また質問させてください。
map { s/^\Q$erase\E\n$//; } @datalist;
の処理によって該当箇所は問題なく消去できているのですが、
「リストの最初の行だけが2度書き込まれる」という現象が起きているみたいなのです。

1240
985
766

みたいなリストから、1240を消した時、1240が消えている代わりに

985
766
766

のように最初の行が2度重なっている、という感じです。
何か考えられるミスはありますでしょうか。
0556nobodyさん2009/05/28(木) 10:54:29ID:???
なんでこいつデバッグしないの?
05575552009/05/28(木) 11:05:47ID:???
どうもすいません。自分で何とかします。
失礼しました。
0558nobodyさん2009/05/28(木) 12:52:03ID:???
その map を使ってるところから、ファイル書き込みまでの部分が無いと分からんでしょ

もっと質問の仕方を学んでください
0559nobodyさん2009/05/28(木) 13:13:18ID:???
クイズスレじゃないんだからw
0560nobodyさん2009/05/28(木) 15:45:21ID:???
とりあえずお前はActivePerlをインストールしろ
話はそれからだ
0561nobodyさん2009/05/28(木) 20:50:21ID:IiL6Ub9r
>>560
macbook で ActivePerlする方法お願いします
0562nobodyさん2009/05/28(木) 21:22:06ID:???
http://downloads.activestate.com/ActivePerl/MacOSX/5.10/ActivePerl-5.10.0.1005-darwin-9.6.0-290470.dmg
ダウソしたら勝手にマウントするんで
ActivePerl-5.10.pkg
をダボクリク。
0563nobodyさん2009/05/28(木) 22:53:03ID:???
あるんだw
0564nobodyさん2009/05/29(金) 02:01:40ID:???
皮肉でレスしたつもりだろうが恥晒しただけになってるなw
0565nobodyさん2009/05/29(金) 02:57:59ID:???
みんな仲良く
0566nobodyさん2009/05/29(金) 17:59:48ID:???
複数のプログラムで使うサブルーチンをexample.pmとして保存し読み込ませる際に質問なのですが、
useとrequireどちらで読み込ませればいいのでしょうか?
今一違いがよくわかりません。
0567nobodyさん2009/05/29(金) 18:09:51ID:???
つ perlfunc を読むとか。
0568nobodyさん2009/05/29(金) 18:20:24ID:???
apache 2.2.9とperl 5.8.8とmod_perl2-2.0.4を使ってCGIを作ろうとしています。
コードにエラーがあった場合、
Software error: ほげほげ
という出力がブラウザに出てしまうのですが、
これを抑制してInternal Server Error等を返すようするにはどうしたらよいのでしょうか。
0569nobodyさん2009/05/29(金) 18:33:00ID:???
コードにエラーがあればプログラムが実行されずにInternal Server Error返すと思うが
05705682009/05/29(金) 18:38:59ID:???
すいません
参考にしていた入門記事の
use CGI::Carp qw(fatalsToBrowser);
をのせいだったみたいです
お手数をおかけしました。
0571nobodyさん2009/06/05(金) 03:14:34ID:N+0uLK7Z
以下のようのものをイメージしております。パスワードを入力して認証後に
、HP上のある特定のテーブル(枠内)に画像をUPしたり、コメントを記入
できるようにしようとしております。枠は例えば一列を(名前・画像・
コメント)としてそれぞれの会員へ割り当てます。あくまでもその枠は、
割り当てられたメンバーしか入力と更新ができない仕組みにしたいと思いま
す。画面としては、HP枠テーブル内に設置されている「更新ボタン」を押す
→パスワード入力画面(認証)→画像UP/コメント記載入力フォーム→HPに
画像UP/コメント修正反映。という形です。パスワードは、会員それぞれが
違うPWをもっていて、他人の入力可能枠に入力をしようとしてもパスワード
が合わない限り、画像UP/コメント入力ができない形です。全般的に初心者と
いうこともあり、教えていただければ助かりますが、特に行き詰っているの

1.会員ごとにPWを割り振り、上記のように更新場所を分けた場合、認証
CGIは会員ごとそれぞれに作成する必要があるのでしょうか。それとも、こ
のPWで認証された会員はこの場所の更新を許可させるというような設定
はできるのでしょうか。
2.フォームで入力したデータを既存のhtml形式のhpに更新処理をする
ことは可能なのでしょうか。フォームで入力したデータを
掲示板(cgi)に書き込む事はできるようですが、htmlのテーブル(枠)に
書き込む事はできるのでしょうか。
3.フォーム(cgi)で入力したデータを指定した場所へ書き込むにはどう
したらよろしいのでしょうか。指定の方法はどうやればよろしいのでしょう


以上です。

0572nobodyさん2009/06/05(金) 05:00:07ID:???
>>571
複数ユーザーで使える画廊のようなページですかね
まだバイトの身なので見当違いなことを言ってるかもしれませんがアドバイスを。。。

1はCGI2つで実現できると思います。
例えば、画廊ページをhtmlで作り、認証フォームページ表示CGIを作り、実際の処理を認証CGIでするとします
画廊ページからは更新をクリックしたときに、認証フォームページ表示CGIに枠IDを渡します
認証フォームページ表示CGIでは、ユーザーID、ユーザーパスワードなど必要事項を入力する欄とともに、
このcgiに渡された枠IDを hidden 属性で渡せるフォームを出力します
これで3も解決です
認証CGI側ではあらかじめ枠IDとユーザーID・ユーザーパスワードを関連付けたデータを持っておき、
(多分選択肢はデータベースに入れるか他のファイルに書いておくかcgiに直書きかくらい)
フォームから渡ってきたデータと照合します
2の画像の更新については、画廊ページの雛形をまず用意しておき、(画像の入るところなどには{Image}のような仮の文字列を入れておく)
認証CGI側で読み込み本来の画像のurlなどに置換して出力します
こんな感じでいけるかと

こんな説明で分かりますかね?
0573nobodyさん2009/06/05(金) 17:20:18ID:N+0uLK7Z
>>572さん、ありがとうございます。571です。複数のユーザで使える画廊ページ
のイメージはあっております。私が素人のため、ぱっと読んだだけでは、
よく分かりませんが、hidden属性等キーワードをいくつかいただきましたので、
少し、やり方などを調べてみます。また、分からないことがありましたらよろしく
お願いします。
0574nobodyさん2009/06/06(土) 16:54:15ID:???
ハッシュについての質問です。
\t区切りにして保存したdatファイルからデータを読み込む際に
foreachでハッシュに入れて$example{$hoge}{$huga}で読み込めばいいのか、
foreach+正規表現使ってdatから1行だけ抜き出すのがいいのか、どちらがいいやり方なのでしょうか。

0575nobodyさん2009/06/06(土) 16:59:43ID:???
俺はgrepが好き
0576nobodyさん2009/06/06(土) 18:05:42ID:???
>>575
ぐぐってみました。
こんなのがあったんですね。参考になりました。
早速試してみようと思います。
0577nobodyさん2009/06/06(土) 18:14:36ID:???
>>574
データの使われ方による
0578nobodyさん2009/06/06(土) 18:43:32ID:???
>>574 じゃないけど質問

grep って foreach みたいにメモリにがっつり読み込むの?
それとも While みたいに逐一読みに行ってくれるの?
0579nobodyさん2009/06/06(土) 18:49:55ID:???
foreach みたいにメモリにがっつりの意味がわからん
0580nobodyさん2009/06/06(土) 18:55:37ID:???
メモリにがっつりでも、レンタル鯖なので気にしません!
0581nobodyさん2009/06/06(土) 18:58:33ID:???
>>579
何か勘違いがあるんだろ

恐らくファイル読み込み関連でそういう混乱が生まれたんじゃないかと。
0582nobodyさん2009/06/06(土) 19:10:32ID:???
>>578
フィルタみたいなものだから、がっつりメモリ取るよ。
つか、Perlは基本的に何でもリスト展開してから動くように出来てる。
foreachの昇順の範囲演算子は最適化されるけど。
0583nobodyさん2009/06/07(日) 00:15:37ID:???
>>582
端折りすぎた感のある文を読み取ってくれてありがとう

やっぱそうなってるんですね。
数メガならだいじょうだろうけど、十数メガ〜数十メガの TSV を扱うにあたって考えてるとこだったので。

やっぱ DB にプッシュしろってとこかな ^^;
0584nobodyさん2009/06/07(日) 00:20:57ID:???
>>583
その方が有りえない
0585nobodyさん2009/06/07(日) 00:33:27ID:???
>>583
十数メガのTSVをバシバシ扱ってるけど、鯖屋は文句言わないよ
0586nobodyさん2009/06/07(日) 02:47:53ID:???
本当は文句を言うべきところなのに
鯖屋が気づいてないだけって可能性もあるな
美味しくいただいちゃいましょう
0587nobodyさん2009/06/07(日) 13:52:57ID:???
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でやった方がキレイかなと思ってしまいます。
0588nobodyさん2009/06/07(日) 13:54:15ID:???
すみません。書き間違えました。
× @after
○ %after
0589nobodyさん2009/06/07(日) 14:03:51ID:???
ハッシュのスライスでぐぐれ
0590nobodyさん2009/06/07(日) 14:39:07ID:???
>>587
my %after = map +($before[$_] => $_), 0..$#before;
05915902009/06/07(日) 14:41:30ID:???
>>589の言いたいのはこうか
my %after;
@after{@before} = (0..$#before);
05925872009/06/07(日) 15:03:39ID:???
>>589-591
ありがとうございます。
590, 591 の方法はおもいつきませんでした。。
0593nobodyさん2009/06/07(日) 15:09:57ID:???
# 因みに map() やスライスを使わない場合:
$after{$_} = $before[$_] for 0 .. $#before;
0594nobodyさん2009/06/07(日) 16:38:29ID:???
catalystを使ってるんですが、
forwardメソッドで呼ばれるメソッドに
引数を渡す際に複数の変数を渡したいと思っています。
このときqw/$a $b/と書くと変数展開されませんし、
qq/$a $b/と書くと渡される値が"$aの中身 $bの中身"という1つの変数になってしまいます。

これを$a,$bそれぞれの値として渡すにはどのようにすればよろしいでしょうか?
0595nobodyさん2009/06/07(日) 23:16:10ID:???
$c->forward('foo',[$a,$b]);

sub foo : Private {
my $c = shift;
my $args = shift;
my $a = $args->[0];
my $b = $args->[1];

}


????
}


0596nobodyさん2009/06/07(日) 23:23:24ID:???
cpanのモジュールのトップレベルの名前空間の一覧はどこかで見れませんか?
Test とか Class とかが知りたいです。
05975942009/06/07(日) 23:53:56ID:???
>595
その方法でうまくいきました。
ありがとうございました。

いろいろな形を試してみて、
( 'foo', [$a],[$b] )の形で動いたので
とりあえずこの方法でやっていこうかと思っていました。
0598nobodyさん2009/06/08(月) 00:08:41ID:???
>>596
そのまんま、cpanをby-moduleで見るのじゃあかんの?
ttp://www.cpan.org/modules/by-module/

それともこういう話?
ttp://d.hatena.ne.jp/yappo/20081010/1223630386
0599nobodyさん2009/06/08(月) 00:39:27ID:???
>>598
cpan.orgの方のページで解決しました。そんな便利なところがあると知りませんでしたorz
ありがとうございました。
0600nobodyさん2009/06/08(月) 20:56:10ID:???
ソートについての質問です。
例えば以下のようなハッシュの配列をソートしたいのですが、

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'の降順で配列をソートするにはどうすればよいでしょうか?

よろしくお願いします。
0601nobodyさん2009/06/08(月) 21:13:22ID:???
@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;

簡単な宿題だな
0602 ◆TWARamEjuA 2009/06/08(月) 23:13:57ID:???
>>600
>>1
だと思う。。。
0603nobodyさん2009/06/10(水) 20:00:53ID:???
OSを再インストールした後から
なぜかPerlのオートフラッシュが有効にならなくなってしまいました。
Debianをetchからlennyに変更したのでバージョン関係の
問題のような気もするのですが解決策が見つかりません…
何かご存じの方がいたら教えてください。
環境は下記のような感じです。
Debian/lenny Apache/2.2.9 mod_perl/2.0.4 Perl/v5.10.0
よろしくお願いします。
0604nobodyさん2009/06/11(木) 04:02:08ID:???
ユーザーアイコンをアップロードできるようなものを考えています。
アップロードできる形式は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以降に問題があるようですが、解決策がどうしても見つかりません。
どこに問題があるかご存知の方がいましたら、ご教示ください。
よろしくお願いします。
0605nobodyさん2009/06/11(木) 08:20:11ID:???
解決するか分からないけど
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");

ユーザー増えると遅くなるからディレクトリなめるやり方は良くないよ
0606nobodyさん2009/06/11(木) 09:00:08ID:???
ファイルグロブを使わない限り、ディレクトリをなめるのは仕方ないんじゃないか。
メモリ使用量の問題はあるが。

opendir DIR, "./icon" || die("directory open error"); これと
opendir(DIR, "./icon" || die("directory open error")); これは
等価なので、括弧使って優先順位を変えるか、優先順位の低いorを使う。

あと、複数ファイルをまとめて消した方がサーバに優しいと思われ。
0607nobodyさん2009/06/11(木) 10:11:35ID:???
606が指摘している問題のためopendirのエラーを拾えてないから
closedirに失敗してエラーで止まっているに100カノッサ。

実行時のカレントディレクトリの位置が期待したところと違うか
パーミッション関係かどっちかあたりかな。
0608nobodyさん2009/06/11(木) 11:59:18ID:???
>>604
書き直してて気が付いたことを。

ID の割り当てがどうなってるかわかりませんが、例えば ID が 60 って人がファイルをアップしたとしますよね?
600 の人も 6000 の人も 160 の人もファイルが上書きされたり、消されたりするので、そのマッチの仕方はやめた方がいいです。

またユーザーアイコンが1つしか無さそうなので、-e でファイルの有無を確認してから作業したほうがいいかと思います。
0609nobodyさん2009/06/11(木) 12:05:54ID:???
>>608
ファイル名がわかってて削除するだけなら、-eすんの無駄じゃね?
いきなりunlinkでいいと思う。
0610nobodyさん2009/06/11(木) 12:17:45ID:???
png か gif か jpg か確認する必要があるかと
0611nobodyさん2009/06/11(木) 12:18:21ID:???
一律 jpeg に固定しちゃえば >>609 さんの言うとおり決め打ちで OK
0612nobodyさん2009/06/11(木) 12:19:39ID:???
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");
}


こんな感じか
0613nobodyさん2009/06/11(木) 13:07:23ID:???
ディレクトリをもう1階層作って、
その名前を $userid / 100 とかにするのも、運用回避としてはアリか。
0614nobodyさん2009/06/11(木) 13:36:13ID:???
ファイル一つしかないことが分かっていて、サフィックスも限定できるなら、
my $complete = unlink(map{ "./icon/$id.$_" } qw(gif png jpg jpeg));
こんなでもいけるだろうけど。
06156042009/06/11(木) 14:30:45ID:???
皆様、ご助言ありがとうございます。
>>606さんのご指摘を受け、上記部分以外も含め open および close まわりは
すべて or に修正いたしました。

また、IDですが、アルファベット3文字+数字5文字の固定長にしており
ID発行時に重複もチェックしておりますので、
>>608さんのご指摘のようなIDマッチの重複はありません。

それでもまだ止まるので、もう少し止まる箇所を絞り込んでみたのですが、
どうもunlinkで止まっているようです。
unlinkで止まる原因にはどういったものが考えられますでしょうか。
0616nobodyさん2009/06/11(木) 15:49:34ID:???
ドメインとかPATHとかファイル名は消していいので、エラーログをさらしてみて
0617nobodyさん2009/06/11(木) 15:50:59ID:???
固定長のIDにするならアルファベット部分を5文字にして大文字小文字を区別しないと
「そんなにユーザー居ないし」でスクリプト組むのはやめたほうがいいですよ
0618nobodyさん2009/06/11(木) 16:21:44ID:???
unlink $file or die $!;
だけにして実行するとかrm $fileでコマンドラインから
は消えるのかとかして原因の切り分けしろよ。
止まるなんて抽象的な表現じゃ分かんないだろ
0619nobodyさん2009/06/11(木) 17:33:08ID:???
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/)が認めらんねぇ、みたいなこと言われました。

どうしたらうまくいくか、教えてください。
0620nobodyさん2009/06/11(木) 17:50:32ID:???
$line=~ /key/ and print OUT1 <IN1>;
0621nobodyさん2009/06/11(木) 17:56:42ID:???
my $flag = 0;
while(my $line = <IN1>){
  print OUT1 $line if $flag;
  $flag = 1 if $line =~ /key/;
}

試してないけど、これでおk
0622nobodyさん2009/06/11(木) 18:05:02ID:???
>>619
行の終わりに全角スペースが入ってたから、それが原因だと思う。
全角スペースを可視化できるエディタを使うといいよ。
0623nobodyさん2009/06/11(木) 18:05:22ID:???
>>620さんのは質問者の希望する動作にならない
>>621さんので確認した
俺はテストしただけ
06246192009/06/11(木) 18:16:41ID:???
>>620-623
皆、ありがとうございます。
>>621さんのプログラムで早速やってみたところ、なぜか
print OUT1 $line if $flag;
の行におかしなものがあるぜ、と言われて、動いてくれませんでした。
考えられる原因としては、何があるでしょうか?
06256192009/06/11(木) 18:25:39ID:???
ご、ごめむ。
>>622さんの意見を適用するとできました。
皆、ほんとにありがとー。
0626nobodyさん2009/06/11(木) 18:45:20ID:???
>>615
パーミッションとかは関係ない?
0627 ◆TWARamEjuA 2009/06/11(木) 19:54:12ID:????BRZ(10072)
旧Rock54鯖(banana238.maido3.com)にて、perl5.8.6/FreeBSD5.4だったかな?
unlinkがうまく動かなかったので、、、
unlink $file;
で済ませられるところを、、、
unlink $file unless -f $file;
と描いた記憶が蘇りました。

OS由来の変な誤動作とかかもしれないですね。
あと、単純にdiskがあやうすかも。
smartmontools等で確認するのも良いかも。
0628nobodyさん2009/06/11(木) 20:10:41ID:???
単純に、パーティションが違うだけじゃね
unlinkは、inodeの削除でつよ

> unlink $file unless -f $file;

ファイルが無いならunlinkって・・・
0629nobodyさん2009/06/11(木) 20:23:23ID:???
通常ファイルじゃないならunlinkって・・・
unlink $file if -e $file;
って書きたかったわけじゃなくて?
0630 ◆TWARamEjuA 2009/06/11(木) 21:34:14ID:???
わははー♪@笑って誤魔化す

if -f $file ですm(_ _)m
0631nobodyさん2009/06/11(木) 21:56:39ID:???
経験上、ブロックしちゃうのは大抵ファイルシステムの問題が多いかな。
ネットワークドライブだったり不良セクタが発生してたりという事が多い。
06326042009/06/12(金) 02:45:55ID:???
申し訳ないです。
抽象的とのことですが、実際、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を調べてみましたが、実行権に関するエラーのようですね。
もう少し実行権まわりを検証してみて、まだ動かないようでしたら
またお知恵を借りにくるかもしれません。勉強になりました。ありがとうございます。
0633nobodyさん2009/06/12(金) 08:03:34ID:???
>>632
パーティションが違うんじゃないの?
0634nobodyさん2009/06/12(金) 08:22:59ID:???
>>605
unlink "./icon/" . $icon or die $!
って書いてあるじゃん。力不足とかいう話じゃなくて姿勢の問題。
他にもいっぱいアドバイス貰ってるのに相手に失礼だろ。
0635nobodyさん2009/06/12(金) 11:12:28ID:???
utimeで更新時刻の変更は出来るようですが、
作成日時を変更することは出来ますか?
0636nobodyさん2009/06/12(金) 11:19:41ID:???
出来ないだろうな
i領域書き換えないといけないわけだし
0637nobodyさん2009/06/12(金) 11:38:04ID:???
う、出来ませんか…。
タイムスタンプ変更ソフトだと一括変更が多くて、
拡張子で分けたり条件で時刻だけ変更したり出来ないので
Perlでやりたいと思ったのですが残念です。
0638nobodyさん2009/06/12(金) 11:43:59ID:???
じゃあ一時ファイル作成してリネームを繰り返すしか
0639nobodyさん2009/06/12(金) 13:20:19ID:???
OSがWindowsなら、こんなのがあるけどね。
http://search.cpan.org/~wyant/Win32API-File-Time-0.006/lib/Win32API/File/Time.pm
06406042009/06/12(金) 14:18:45ID:???
>>634
ごめんなさい。
>>605さんの発言を見て、
初めてunlink "./icon/" . $icon or die $!を試すことに気づきました。
それでやってみて初めてエラーログに表示されたので、
他の方のアドバイスもすべて見て参考にしつつ
自力でもなんとかしないと逆に失礼だと思って>>632のように書いたのです。

書き方等、不快にさせてしまって本当に申し訳ないです。ごめんなさい。
0641nobodyさん2009/06/12(金) 16:46:11ID:???
635です、すみませんOS書いていませんでした…。
Windowsなので、>>639さんのリンクで解決しました!
ありがとうございました。
0642nobodyさん2009/06/16(火) 12:04:02ID:???
始めまして。質問させて頂きます。
『2009.6.15.火』という文字列を
『2009/6/15-火』という状態に置き換えしたいです。
$hoge=~ s/./\//g で置き換え、
『2009/6/15/火』にしたあと一番最後の/を-に置き換えする事を考えていますが、
似たような処理が複数あるため、もっとシンプルに
『2009/6/15-火』に置き換えする方法をご教授頂ければ幸いです。
0643nobodyさん2009/06/16(火) 12:12:35ID:???
>>642
方法はそれでいいんじゃねーの? たくさんあるならサブルーチンで。
0644nobodyさん2009/06/16(火) 12:29:59ID:???
$hoge =~ s|『(\d+).(\d+).(\d+).(.{1})』|『$1/$2/$3-$4』|;

これでいいんじゃね

0645nobodyさん2009/06/16(火) 12:36:28ID:???
数字全角みたいよ。
0646nobodyさん2009/06/16(火) 12:42:00ID:???
s/./\//g and s/(.*)\//$1-/ または
s/.(.*?).(.*?)./\/$1\/$2-/
0647nobodyさん2009/06/16(火) 12:58:04ID:???
>>646
*じゃなくて、+にすべき
0648nobodyさん2009/06/16(火) 12:59:39ID:???
>>645
じゃあこれでいいや

$hoge =~ s|『(.+).(.+).(.+).(.{1})』|『$1/$2/$3-$4』|;

あと、なんでみんな無理して/使うんだろ
0649nobodyさん2009/06/16(火) 13:05:01ID:???
> .{1}
これが妙に気になる

あとエスケープが面倒なときは {}!|# 辺りを見かけることのほうが多いよ
0650nobodyさん2009/06/16(火) 13:14:08ID:???
初心者に示すときにわざわざ別のデリミタ使うほうが二度手間だろ
また聞き返されてそれの説明しなきゃいけないし
0651nobodyさん2009/06/16(火) 14:00:37ID:???
>>646
下の方法で対応できました。
どうもありがとうございました。
0652nobodyさん2009/06/16(火) 14:34:08ID:???
utf8かencodingを宣言しつつ、
$str =~ s{(\d\d\d\d).(\d\d?).(\d\d?).(.)}{$1/$2/$3-$4}g;

>>644>>648さんに近いな。
0653nobodyさん2009/06/16(火) 16:23:50ID:???
なんでわざわざ正規表現使うんだ?
$str = sprintf '%s/%s/%s-%s', split '.', $str;

これでいいだろ
汎用性も十分
06546522009/06/16(火) 17:17:40ID:???
>>653
文章中に複数埋め込まれることを想定してるから。
0655nobodyさん2009/06/16(火) 17:40:25ID:???
わざわざっつーか、正規表現使う方が簡単だろjk
0656nobodyさん2009/06/16(火) 17:49:48ID:???
正規表現読みにくい
0657nobodyさん2009/06/16(火) 17:51:54ID:???
>>656
最初だけ。
その最初を越えないと、ずっとだけど。
0658nobodyさん2009/06/16(火) 17:58:20ID:???
誰も読めないなんて言ってないぞ
特に今回なんかはセパレータが全角ピリオドだし見分けつかんよ
正規表現書くにしても二度手間とか思わず読みやすくして欲しい
0659nobodyさん2009/06/16(火) 19:40:53ID:???
2chの回答で、その水準を要求されても困るわけだが。
0660nobodyさん2009/06/16(火) 19:54:36ID:???
正規表現を使う時は、コメントをつけてるなあ。

処理の内容そのものを示すコメントって
あんまり良いコメントとは言えないのかもしれないけど。
0661nobodyさん2009/06/16(火) 20:19:22ID:???
では、今後よろしく >>660
06626602009/06/16(火) 23:17:31ID:???
>661
え? 何が?
0663nobodyさん2009/06/16(火) 23:19:47ID:???
正規表現は読みにくいものだ
人間を機械に近づける代わりにエッセンスで書ける
06646612009/06/16(火) 23:45:46ID:???
>>662
Perlコーディング初心者質問スレなので、
コメントの書かれた正規表現での回答。
0665nobodyさん2009/06/16(火) 23:53:35ID:???
>664
ぼく質問する側だもん
0666nobodyさん2009/06/17(水) 00:46:18ID:???
変数に入ったリファレンスが、配列のリファレンスか、
ハッシュのリファレンスかを知る上手い方法はありますでしょうか?

今考えているのはsprintfでリファレンスを書き出してみて
その文字列の中にHASH かARRAYのどちらがあるかでやろうかと考えています。
他におすすめの方法があればお願いします。
0667nobodyさん2009/06/17(水) 00:54:03ID:???
>>666
print ref $ref;
0668nobodyさん2009/06/17(水) 00:54:57ID:???
ref
06696662009/06/17(水) 01:08:36ID:???
>>667-668
ありがとうございます。
refの返り値がHASHかARRAYになってるんですね。。
リファレンスかどうかの真偽のみに使っていたので気がつきませんでした。
助かりました。
0670nobodyさん2009/06/17(水) 01:55:06ID:???
よくできてるなあ
0671nobodyさん2009/06/17(水) 18:23:12ID:???
質問です、よろしくお願いします。
読み込んだデータ($sample)が120行ほどあって、
各行の先頭全てに’1−1’という文字列を放り込みたいんですが
全くプログラムが書けません。
どうか、教えてください。

0672nobodyさん2009/06/17(水) 18:33:52ID:???
$sample=~ s/(.*\n)/1-1$1/g;
0673nobodyさん2009/06/17(水) 18:42:10ID:???
>>672
最終行に改行コードがないと最終行が痴漢されない
0674nobodyさん2009/06/17(水) 19:32:47ID:???
$sample =~ s/^/1-1/gm;
0675nobodyさん2009/06/17(水) 19:39:35ID:???
$sample=~ s/(.*\n)/1-1$1/g;
0676nobodyさん2009/06/17(水) 19:41:06ID:???
$sample =~ s{^}{1-1}xmsg;
06776712009/06/17(水) 19:54:39ID:???
>>672-676
みなさん、ありがとうございます。
ばっちりできました。
が、初心者なんで皆さんのプログラムで
なぜちゃんと走ったのかが理解できてないので
出直してきますorz
0678nobodyさん2009/06/18(木) 00:48:48ID:???
改行を含んだデータの取り扱いが弱いよな
0679nobodyさん2009/06/18(木) 15:26:50ID:???
@csv = (["am","a"],["au","a"]);
@list = map(split(//, $_[0]), @csv);

@csv のすべての要素の最初の要素(文字列"am","au")を文字に分解したいのですがうまくいきません。
解決方法を教えてください。お願いします。
0680nobodyさん2009/06/18(木) 15:52:03ID:???
>>679
$_[0]じゃ@_の0番目だよ。$_->[0]だろ。
0681nobodyさん2009/06/18(木) 18:06:39ID:???
こんにちわ。
データの中にある特定の文字を消したいんですが、うまくいかないです。
while(<IN1>){
chomp;
@data = split(/-/, $_); #これは無視して下さい
@data2 = join(' ', @data);
という手続きで読み込んだデータをタブでつないで格納しましたが
都合上、全ての行に
red apple
red fire
てな感じで、タブで区切られずひとくくりにされてしまう箇所があります。
この中の"red "だけを全ての行から取り除いて残りをそのまま出力したいんですが
可能ですか?
初心者ながら置換をしてみようと
$data2 =~ s/Level1 //g
print OUT1 "$data2\n";
というプログラムを書いてみましたが、printできねーと返されましたorz
よろしくお願いします。

06826812009/06/18(木) 18:12:27ID:???
すんません。
下から4行目は
Level1 とか意味わからんのじゃなくて'red 'ですorz
0683nobodyさん2009/06/18(木) 18:13:04ID:???
$data2 =~ s/Level1 //gに ; が無いからprintの行でエラーのお知らせなんじゃね?
06846812009/06/18(木) 18:29:39ID:???
>>683
ホンマや!
と思って、;付け足してやってみたところ
今度はこのマッチングの表現がおかしいみたいなこと言われました。。
どこが間違ってるんでしょうか??
0685nobodyさん2009/06/18(木) 18:32:38ID:???
>>683でないならもしや open してない or できてない or 書き込みモードでないのでは?
0686nobodyさん2009/06/18(木) 18:35:41ID:???
あーじゃあデリミタちゃんとエスケープしてないとか?
$str =~ s/ttp://www.*//;
みたいな感じに文字列に/使ってない?
0687nobodyさん2009/06/18(木) 18:36:25ID:???
ファイル名隠して、エラー内容晒せ。
該当行前後のソースも。
06886812009/06/18(木) 19:00:13ID:???
>>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";
です


0689nobodyさん2009/06/18(木) 19:05:09ID:???
joinは配列を返さないぞ
0690nobodyさん2009/06/18(木) 19:08:52ID:???
>>688
そのエラーは$data2が未定義だと言っている。

681に書いてある付け加える前の元の部分には
@data2しか登場してないぞ。
0691nobodyさん2009/06/18(木) 19:27:00ID:???
>>688
redならそうはならないっす><
このエラー見る限り違う


つーかどういうフォーマットのデータをどういうフォーマットにしたいか教えてくれ
06926812009/06/18(木) 19:27:49ID:???
>>689
そうだったんですか。。完全にわかってなかったです。

>>690
689さんが言うてるようにjoinが配列を返さないから
未定義だったんすね。。。

となると、、、
この"red "だけを消すにはどんな手が有効ですかね??
0693nobodyさん2009/06/18(木) 19:39:03ID:???
$data2の内容がないよう

どこかで設定したはず?→設定したはずの場所を正しく書き直す

設定し忘れ?→設定すべき場所を考える

わからない→とりあえず寝ちゃおう
0694nobodyさん2009/06/18(木) 20:02:08ID:???
結果

strict

しておけ
0695nobodyさん2009/06/18(木) 20:45:32ID:???
つ use Any::Mouse;

ごめん言ってみただけ
06966812009/06/18(木) 20:59:17ID:???
元のデータが
1 1 2 red fire 1232 0 [n]
みたいなのがざっと200行近くあって
この'red fire'がタブで区切れない、ひとくくりのデータになっちゃってます。
この中の'red'だけを一気にそぎ落とそうとしてる・・・って感じです
どうしたら良いですか??
0697nobodyさん2009/06/18(木) 21:21:41ID:???
while(@data){
my @tmp = $_ =~ /[^\t\n]+/g;
print join "\t", map{$tmp[$_] unless $_ == 3}(1..8);
}
こんな感じ?テストはしてない
0698nobodyさん2009/06/18(木) 21:22:37ID:???
X }(1..8);
O }(0..7);
0699nobodyさん2009/06/18(木) 21:30:15ID:???
>>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));

お好きなのをどうぞ。
07006812009/06/18(木) 22:01:42ID:???
>>697-699
ありがとうございました。
せっかく教えてくれたのに申し訳ないですが、
やはり>>688と同じようなエラーが出てしまいました。
見つけれる限りの間違いは直してみたつもりなんですが。。。

0701 ◆TWARamEjuA 2009/06/18(木) 22:32:31ID:????BRZ(10072)
while以前の行に変なのがあるんじゃないかな?

while行から上に向かって
exit;
を入れてみてデバグしてみるとか。

あと~の文字コードとかとか。
07026812009/06/18(木) 23:16:28ID:???
>>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";
です。
文字コードも大丈夫なはずなんですが、、、
0703nobodyさん2009/06/19(金) 00:34:12ID:???
$data2に中身がねえと言われてるのに分からん奴だな。
スクリプト全部晒せばいいのに。
0704nobodyさん2009/06/19(金) 00:36:23ID:???
IN1 なファイルの line 5788 が空行でした、とかいう話ではないの?
0705nobodyさん2009/06/19(金) 04:46:39ID:???
>>703
まあそんな威張るな
0706nobodyさん2009/06/19(金) 09:11:31ID:???
@data2に何を入れても$data2とは関係ないってわかってる?
0707nobodyさん2009/06/19(金) 11:07:46ID:???
というか、このままじゃ$data2が何処から来たのか誰にも分からん。
0708nobodyさん2009/06/19(金) 14:19:21ID:???
>>703
威張ってはいない。
しょせんは他人事だがそれでも、いつまでも問題が解決しないことに
焦りと苛立ちと好奇心を感じている。
0709nobodyさん2009/06/19(金) 14:48:13ID:???
== と 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 が一致する行を目視で確認しました。
0710nobodyさん2009/06/19(金) 15:03:10ID:???
$usertel = $userktai if !$usertel; の行で$userktaiを代入してるけどこの変数には
末尾に改行がある

きみは目視で改行が見えるか?
0711nobodyさん2009/06/19(金) 15:17:48ID:???
chomp $line;の位置が問題ってことだね
0712nobodyさん2009/06/19(金) 15:21:58ID:???
改行は見えるようにしとかないと。
0713nobodyさん2009/06/19(金) 15:44:33ID:???
あ〜、あまりにもくだらないミスでごめんなさい orz

ありがとうございました m(._.)m
0714nobodyさん2009/06/19(金) 16:29:20ID:???
今、データの正誤判定のための模範解答作成みたいなのやってます。
読み込むデータには
"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"
}
}
0715nobodyさん2009/06/19(金) 16:41:44ID:???
(´・ω・)つ ;
0716nobodyさん2009/06/19(金) 16:43:49ID:???
なんで$lineに読み込んでるのに$_を比較してんのよw
0717nobodyさん2009/06/19(金) 16:45:21ID:???
while (<IN1>) {
にしてみたらどう?
IN1 とか OUT1 を見て思うんだけど>>681>>702に心当たりはないか?
0718nobodyさん2009/06/19(金) 16:53:48ID:???
>>715
いっけね。これだから初心者わw

>>716
いろんなことやってたらごっちゃになっちゃって
直すの忘れてました。
$lineに直してもムリポでした、、、

>>717
うまくいきませんでした。
て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
心当たり?はわかんないす。

0719nobodyさん2009/06/19(金) 17:12:43ID:???
>>718
food なら m であってるんじゃないの?
それだけで終了するのはなぜかわからないけど。

修正後のスクリプトを見てみたい。
0720nobodyさん2009/06/19(金) 17:16:51ID:???
>>718

> $lineに直してもムリポでした、、、

おおかたchompを直し忘れたんじゃないか。
$lineで統一するんなら明示的に引数書かないと。

> て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
> 心当たり?はわかんないす。

animalのときn,他のときはmだからfoodでmがでて
終了なら正しい動作なんじゃねーの?
07217132009/06/19(金) 17:17:06ID:???
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
07227142009/06/19(金) 17:26:50ID:???
すんません、僕の説明がヘタくそすぎたし、
>>718での報告は完全に間違ってたので、もう一度チャンスをください。
望ましい出力が
animalからのn と
plant, foodからのmです。
>>721さんのやつでやってみると
5000行ほどあるうちの最初がanimalなのにnが出てきまして、
その1つで出力が終わってしまってます。
ご教授、よろしくお願いします。

>>719
>>721さんのをまんま使わせてもらったところ
上に書いたような出力になっちゃいました。

07237142009/06/19(金) 17:28:42ID:???
あーもう、また間違ってる!
foodlなのにnが出ちゃったんですw
ほんますいません。
07247132009/06/19(金) 17:35:12ID:???
__DATA__ は削除しないと・・・


while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
0725nobodyさん2009/06/19(金) 17:36:48ID:???
落ち着けよ
原因はきっとキミがパニクってるからだと思う
07267192009/06/19(金) 17:44:12ID:???
>>722
スクリプトを見せてくれよ。
07277142009/06/19(金) 17:46:28ID:???
>>724
あ、大丈夫です。そこは消したんですが
>>722みたいな感じになっちゃったんです・・

>>725
確かにw
今日中にこれを何とか片付けないとだめなんで若干の焦りがありますよねw
0728nobodyさん2009/06/19(金) 17:54:53ID:???
目茶目茶短いだろうに載せないのはネタだから?
07297142009/06/19(金) 17:56:40ID:???
>>726
while($line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
て感じです。
出力は、nが1つ出ているだけです。
しかも、データの1行目はfoodなのでmが出てほしいんですが。。
0730nobodyさん2009/06/19(金) 18:02:04ID:???
ホントにfoodでmが出てるか↓こう書いて確認したら?
print OUT1 "n: $line\n";
print OUT1 "m: $line\n";
0731nobodyさん2009/06/19(金) 18:03:50ID:???
>>729
とりあえず、chompを外して
条件を
$line =~ /animal/
に変えて試してみれば?

あと、chompの後でも前でもいいけど、$lineをダンプ
07327192009/06/19(金) 18:06:13ID:???
>>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
0733nobodyさん2009/06/19(金) 18:13:59ID:???
ほんとに
animal
なのか?
animal
とかじゃないよね?
0734nobodyさん2009/06/19(金) 18:16:17ID:???
>>721ので上手くいくんだから、もうデータが間違えてるだとか
その前後が間違えてるとしか思えない

スクリプトデータを頂戴
記述間違いから何から何まで直してやる
0735nobodyさん2009/06/19(金) 18:28:26ID:???
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 になってしまうなんてのは無かった。
キミの組み方の問題かと思われ。
07367142009/06/19(金) 18:30:29ID:???
>>733
はい、一番処理しないといけないデータはanimalとかじゃなくて別の言葉です。
このanimalとかは、練習用で使ってたデータです。
下に生のデータを掲載させてもらいます。

>>734
スクリプトデータって読み込んだデータのことですよね?
animalとかじゃなくて、実際に処理したいデータはこんなのです。
NonWord
NonWord
NonScriptWord
NonScriptWord
NonWord
NonWord
NonWord
NonWord
ScriptA
ScriptC

こんなのが5000ほどあります。
この中のNonWordについてのみ"n"と返してほしいんです。
書いたプログラムは>>729から進歩してません。
0737nobodyさん2009/06/19(金) 18:48:16ID:???
>>736
> 書いたプログラムは>>729から進歩してません。

だから、そのスクリプト(プログラム)を見せろって
07387142009/06/19(金) 18:56:47ID:???
>>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一文字しか出てない状態です

0739nobodyさん2009/06/19(金) 18:59:34ID:???
アスキーファイルじゃないのかよ
まずUTF-8のBOM付きファイルかどうか確認しろよ
07407142009/06/19(金) 19:08:30ID:???
みなさん、本当にありがとうございました。
今ツレに言われたんですが
「その作業、エクセルでできんじゃね?」て言われて、やってみたらできちゃいました。
たくさん協力してもらったのに、ほんと、すいません。


0741nobodyさん2009/06/19(金) 19:10:25ID:???
全部ASCIIだからBOMが無ければutf8かどうかは関係ないな。
隠された部分が無ければの話だが。
0742nobodyさん2009/06/20(土) 04:13:04ID:???
このスレだけでも3人の質問者が IN1 と書いていて
全員初心者を自称しているわけだが(初心者質問スレだから当たり前ではあるが)、
すると恐らく、参考にした入門書・入門サイトも一緒なのだろう。
いったいどこが出自なんだろうな?
0743nobodyさん2009/06/20(土) 08:57:48ID:???
同一人物じゃねーの?
0744nobodyさん2009/06/20(土) 09:08:58ID:???
はじめは IN1 と OUT1 を open するところも書かないし
IN1 は5000行ばかしのファイルらしいしコードを見せたがらない
という入門サイトを参考にしてるんだろう
0745nobodyさん2009/06/20(土) 22:26:45ID:???
おなじ宿題だろ
0746nobodyさん2009/06/23(火) 11:24:34ID:???
>>738
それをコピペして動かしたけど、ちゃんと動くよ
まだ隠してるトコあんじゃね?
それかデータファイルそのものを、どこかにアップしてみてよ
データファイルを見ないと、もう解決できんよ
0747nobodyさん2009/06/24(水) 05:36:20ID:???
727で今日中にって言ってるだろ
もう終わった話なんだよ
落第すりゃいいのにね
0748nobodyさん2009/06/24(水) 09:31:28ID:???
宿題を2chで質問しちゃうような奴は、どの道向いてない
0749nobodyさん2009/06/24(水) 17:47:13ID:???
新しく環境を構築したんですけど、
以下のコードを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);
0750nobodyさん2009/06/24(水) 17:59:03ID:???
OSが壊れてるね
0751nobodyさん2009/06/24(水) 18:01:30ID:???
>open(ADD,">>",'./txt.txt') or die;
open(ADD,">./txt.txt") or die;

これでもだめ?
0752nobodyさん2009/06/24(水) 18:07:19ID:???
>>751
そうすると何度実行しても一行だけになります。
普通ですねw

ブラウザのキャッシュ消したり、プロクシ見直したりしてもだめでした。
httpd.confにも異常なしです。
最近デュアルディスプレイにしたんですけど関係ないですよねぇ
0753nobodyさん2009/06/24(水) 18:22:10ID:???
まずログ見ろよ
2回リクエストされてればブラウザが悪さしてる
そうやって可能性を推測していけ、サルじゃなければできる
0754nobodyさん2009/06/24(水) 18:30:03ID:???
標準出力に何も吐いてないからブラウザには500が返るよね
0755nobodyさん2009/06/24(水) 18:48:09ID:???
>>753
Apacheのアクセスログも2重になってましたorz
3種類のブラウザで試しましたが同じでした。
どこら辺が悪いかわかるでしょうか?

>>754
そこら辺は省略してますが問題ない内容です。
ヘッダと少しのテキストをprintしてます。
0756nobodyさん2009/06/24(水) 18:49:50ID:???
じゃあabで1リクエストしたらどうよ
0757nobodyさん2009/06/24(水) 19:02:18ID:???
>>756
ab -n 1 -c 1 http...
'ab'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
o...rz

今更ですがerror.log見たら
utf8フラグをprintしてるとか書いてありました。
ダメなんですか
0758nobodyさん2009/06/24(水) 19:15:43ID:???
apache のディレクトリまで Path 通ってたっけ?

ab の Path をフルで指定しれ
0759nobodyさん2009/06/24(水) 19:16:47ID:???
とりあえず
use open ':encoding(utf8)';

lwp-requestはある?
バージョンが古いと別の名前だったような気がするけど。
lwp-request -USe http://localhost/
こんな感じで。
0760nobodyさん2009/06/24(水) 20:09:02ID:???
>>758
やってみたら理想通り動きました。

>>759
こちらも理想通り動きました。
それと、よくわかりませんが
200 ok
だそうです。

apacheとPerl,Ruby,PHP入ってたんですが一度全部消してみました。
で、同じバージョンで再インストールして
Perlの事だけ考えて設定してみましたが変化なしです。

何度もすいませんがどうすればいいんでしょうか?
0761nobodyさん2009/06/24(水) 20:37:38ID:???
>>760
レスポンスヘッダの時刻に注目して。オプション付けると出てくるから。
スクリプトに warn('hoehoe'); とか書いといて。実行される度にエラーログに載るから。
それと、apacheのアクセスログ。

どのリクエストが、どうスクリプトを動かして、どのレスポンス出してるのか、
タイムスタンプで照らし合わせて見て。
一致するならapacheに問題ないから。
0762nobodyさん2009/06/24(水) 20:39:58ID:???
解決しますた。
原因はその後のコードにありました。
全く関係ないと思ってたんですが
ヒアドキュメントで
print <<EOM;
ほにゃらら
<link rel="stylesheet" href="" type="text/css" />
ほげほげ
EOM

としてたんですが
上記のタグを削除したら直りました。
たぶんスタイルシートが読み込めなかったから
ブラウザが自動的にリロードしたんだとおもいます。
くだらないエラーですいません。ありがとうございました
0763nobodyさん2009/06/24(水) 21:01:10ID:???
後出しジャンケンうぜぇええええええええええええ
0764nobodyさん2009/06/24(水) 21:05:39ID:???
すこし慣れてくるとコツコツとデバッグしなくなるから困るw
0765nobodyさん2009/06/24(水) 21:21:36ID:???
www
0766nobodyさん2009/06/24(水) 22:00:29ID:???
ヘッダ情報は重要なんで、見られるツールを一つ用意しておくと便利だぁよ。

プロ仕様
IE,Firefox
Fiddler Web Debugger - A free web debugging tool
http://www.fiddler2.com/fiddler2/

Firefoxのみ簡単仕様
Live HTTP Headers :: Firefox Add-ons
https://addons.mozilla.org/ja/firefox/addon/3829

ニコニコなど趣味に(
Proxomitron-J
http://www.pluto.dti.ne.jp/~tengu/proxomitron/
0767nobodyさん2009/06/24(水) 23:00:29ID:???
>>766
サンクス!やっぱfirefoxはいいね
0768 ◆TWARamEjuA 2009/06/24(水) 23:31:37ID:????BRZ(10072)
Safariに入っているWeb インスペクタは重宝していますm(_ _)m
0769nobodyさん2009/06/25(木) 02:01:15ID:???
デバッグの時、HTTP::Proxyで、localhostに仮想プロ串立てて、
そこから全てのリクエスト(ヘッダやPOSTの中身、Javascript絡みの通信も)を
監視してるオレは、マイノリティなのかな・・・。
0770nobodyさん2009/06/25(木) 03:30:59ID:???
5.8の時はHTTP::Proxyを使うこともあった。
5.10以降、Windowsで使えるHTTP::Proxyが無いのが困り物。
CPANから拾ってもテストが通らないし。
0771nobodyさん2009/06/25(木) 09:04:35ID:???
wiresharkで通信全部見る。httpsには使えないが。
0772nobodyさん2009/06/25(木) 12:37:23ID:???
5.10って色々不便そうだな
6が出るまで5.8でいいわ
0773nobodyさん2009/06/25(木) 12:45:53ID:???
5.005のときも5.6のときもそんなことを思ったw
0774nobodyさん2009/06/25(木) 14:05:24ID:???
まぁライブラリ/モジュールの対応が遅れるのは仕方ないだろ。

ところで // ってどんなときに使うん?
0775nobodyさん2009/06/25(木) 14:38:37ID:???
my $d = $v; 但し$vの内容がundefなら$d = '' にしたい

my $d = $v || '';

$v = 0 でも$d = '' になっちゃうじゃん

my $d = $v // '';
0776nobodyさん2009/06/25(木) 15:32:19ID:???
質問です。
値をリファレンスにして、サブルーチンに渡す。
あるいはサブルーチンで処理したデータをリファレンスで受け取った後に、
そのリファレンスの値が参照できない・・・ということはありますか?
0777nobodyさん2009/06/25(木) 15:55:12ID:???
あったら大変じゃん
0778nobodyさん2009/06/25(木) 16:19:30ID:???
>>776
いまいち話が掴めないけど、
普通に使っていれば、無いんじゃないか。
0779nobodyさん2009/06/25(木) 20:28:45ID:???
内部コードをutf8で書きhtml出力をshiftjisで書いてるんですが、
フォームから「テストあいうえお日本語」等と送っても正常に処理出来るんですが
「テスト&」と送ると
Wide character in subroutine entry at C:/usr/lib/Encode.pm line 162
となりエラーになります。

「&」だけでは大丈夫なんですが「ト&」ではエラーになります。
デコード前に処理が必要なんでしょうか?
0780nobodyさん2009/06/25(木) 21:15:06ID:???
ソース無しにデバッグしろとな。
エスパーすると、decodeした文字列をもう一回decodeしてる。
0781nobodyさん2009/06/25(木) 21:59:58ID:???
>>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'};
}
0782nobodyさん2009/06/25(木) 22:01:15ID:???
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;
}
}
0783nobodyさん2009/06/25(木) 22:03:33ID:???
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;
}
0784nobodyさん2009/06/25(木) 22:29:49ID:???
そんな適当なデコードするくらいならモジュール使ったほうがいい
0785nobodyさん2009/06/25(木) 22:39:23ID:???
>>784
ふだんはuse CGIしてるんですけど、
URIデコードの途中でutf8フラグを落とさないと
上手くいかなかったんで試行錯誤してます
具体的にやり方教えてもらえるならお願いします
0786nobodyさん2009/06/26(金) 00:38:52ID:???
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');
0787nobodyさん2009/06/26(金) 02:19:39ID:???
>>775
あぁなるほどね。
"0"も0も、||オペランドでは数値の0として評価されるから必要になるのか。
0788nobodyさん2009/06/26(金) 02:22:48ID:???
このノリでrubyやると躓くんだよな
0789nobodyさん2009/06/26(金) 08:18:46ID:???
>>786
おお!ありがとうございます。
と思ってprintしてみたらデコードされてなかったorz
もうやだ文字コードめんどくさい。
もうutf-8駄目な環境は無視していいのかな?
0790nobodyさん2009/06/26(金) 14:05:30ID:???
なるべくshiftjisで粘るのが吉
0791nobodyさん2009/06/26(金) 15:26:54ID:???
>>789
STDINがutf8で、STDOUTがShift_JISで、コードがutf8なんだよね?
デコードされてなかったってのは、\x{0081}とかで表示される?
うーん、分からん。

でも、CGI.pmとencodingの相性が最悪なのは分かった。
0792nobodyさん2009/06/26(金) 16:44:17ID:???
use encodingせずにCGI.pmのparamを自前でdecodeしてから
使うのが今のところ確実かな。
0793nobodyさん2009/06/26(金) 17:55:34ID:???
>>791
>デコード
例えば「テスト&」と送ると
\x{fffd}e\x{fffd}X\x{fffd}g&
となりutf8::is_utf8はtrueになります。

まだ勉強しなきゃいけない部分が多く出て来たんで
対処のしようが無いorz

>>792
CGI.pmはインスタンス作った時点でデコードされてるんではないんですか?
てことは、paramを自前でデコードしても2重デコードになったりしないんですよね?
あれ?俺なんか変?
0794nobodyさん2009/06/26(金) 18:07:24ID:???
ttp://blog.livedoor.jp/dankogai/archives/51227060.html
0795nobodyさん2009/06/26(金) 18:21:09ID:???
>>794
お勉強してきますw

いちおう全文ぅpしときます。
少なくともなにがしたいのかは分かると思います
お願いします
http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=2167
0796nobodyさん2009/06/26(金) 19:11:15ID:???
入力が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');
07977962009/06/26(金) 19:27:16ID:???
一応動くと思うけど、paramの返り値のundefチェック忘れてるので適宜入れておいてね。
ソース見て気になったけど、サブルーチン内でサブルーチンの定義はPerlではやめた方がいいよ。
0798nobodyさん2009/06/26(金) 19:38:40ID:???
>>796-797
ぅわぁぁぁぁ完璧です。
いままで何度も挫折したんですが初めて解決しました。
まじで感謝してもしきれないですw

>サブルーチン内でサブルーチン サブルーチンからサブルーチン呼ぶ場合はいつもそうしてました(汗
0799nobodyさん2009/06/30(火) 17:03:31ID:???
ローカルに保存したニコニコ動画のmp4をiPod用にエンコする操作の
スクリプトを書こうと思ったんですが,mp4に格納されている
動画(コーデックはh.264)のサイズ(幅×高さ)を取得する方法って
ありますか?

MP4::Infoでイケルかと思ったら,これは動画サイズを取得できない
みたいなんですよ・・
ttp://search.cpan.org/~jhar/MP4-Info-1.12/Info.pm
0800nobodyさん2009/06/30(火) 23:13:29ID:???
mplayer だかなんだかわすれたけど、パッケージマネージャーを見てれば発見できるよ
08017992009/07/01(水) 02:27:40ID:???
>>800さん
>mplayer
なるほど.一度外部のアプリを使って画像を生成して
それの大きさを取得するってことですかね?
ちょっとやってみます.
アドバイスありがとうございます.
パッケージマネージャーのほうはよくわかりませんでした.
0802nobodyさん2009/07/01(水) 10:56:47ID:???
会社に行ったらPCから書きまする
0803nobodyさん2009/07/01(水) 14:19:30ID:???
今は使ってないので、使い方は試行錯誤してもらうとして。
ppm から Audio-Play-MPlayer っていうパッケージを入れて、

実行する CGI/pl と同じディレクトリに MPlayer を置いてください。

使い方は、、、がんばれw




書いてて思ったけど、自分は system() で起動して情報を取得してた気がするw
08047992009/07/02(木) 23:42:04ID:???
>>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さんや、見守って頂いたスレの皆様に感謝致します。
ありがとうございました。
0805nobodyさん2009/07/03(金) 13:19:59ID:???
ttp://search.cpan.org/search?query=ffmpeg
やっぱりあるのね。
0806nobodyさん2009/07/06(月) 17:16:31ID:???
Encode::Guessなんだけど、候補が複数あるときに
どれを採用すればいいのかって話は確立してる?

今のところ、すべての候補でdecodeして文字列長の短いものを採用しているんだけど
良い方法があるなら知りたい。
0807nobodyさん2009/07/06(月) 17:21:04ID:???
それが確立されてればとっくに文字コード誤判別問題は解決してる
0808nobodyさん2009/07/06(月) 17:41:03ID:???
それもそうか。
幸いにも>>806の方法でまだ文字化けには遭遇してないけど、もしバケたら諦めよう。
0809nobodyさん2009/07/06(月) 18:28:01ID:???
Guess で or って文字列が無ければ決め打ち
or って文字が入ってれば、最初に来たエンコードでやってみる

すごくあいまいだけど、それで済ましてる
0810nobodyさん2009/07/06(月) 18:49:46ID:???
それだけだとバケると思うけど。

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
0811nobodyさん2009/07/06(月) 19:50:17ID:???
形態素解析にかけてだな
0812nobodyさん2009/07/06(月) 20:21:17ID:???
それで?
0813nobodyさん2009/07/06(月) 21:26:40ID:???
形態素解析といえば、Yahoo! APIに丸投げする手があったか。

・・・コストたけえよ。
0814nobodyさん2009/07/11(土) 14:22:02ID:???
array、scalar両方をreturnすることのできる関数を使用するときに、
arrayを期待して関数を実行する一般的は方法はどのようなものでしょうか?

スカラーを期待するときは print scalar any_func();
とscalarを使えばいける用ですが、arrayを期待するやり方が分かりません。
0815nobodyさん2009/07/11(土) 14:27:11ID:???
例えば @{[ func()]}; とか?
要素だけ欲しいなら [ func()]->[0] とか使ってる
もうちょっといい方法があるかもしんないけど
0816nobodyさん2009/07/11(土) 14:43:15ID:???
印字ならprint any_func();でいける

代入なら($x)= any_func();でいける
0817nobodyさん2009/07/11(土) 14:57:08ID:???
>>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が表示されて困ってました。
0818nobodyさん2009/07/11(土) 14:58:10ID:???
× >>515-516
>>815-816
0819nobodyさん2009/07/11(土) 16:34:37ID:???
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が表示されるよ?
0820nobodyさん2009/07/11(土) 19:10:03ID:????PLT(54324)
print +(any_func());
0821nobodyさん2009/07/11(土) 19:46:53ID:???
>>819
すみません。勘違いでした。printのなかで使用した場合arrayがかえってきました。
>>820
こんな指定の仕方もあるんですね。知らなかった。。
0822nobodyさん2009/07/11(土) 22:23:13ID:???
マジレスすると、
リストを返す関数からリストを得る為には、関数を「リストコンテキストで評価してやる」だけでよろしいです。
wantarray() の名の通り、array を want してやるだけ(ここは Perl 用語としては array でなく list と呼ぶべきだけれど)。

リストコンテキストの例としては、リスト代入(配列、ハッシュ、あるいはスカラー変数のリストに対する代入)、リストを取る関数の引数部などがそれにあたります。

print() は引数にリストを取る関数なので print の引数はリストコンテキストで評価されます。ですからこの場合、特別な仕掛けは要りません。

Perl の組込関数は、単項演算子として振舞ういくつかを除き、ほとんどが引数をフラットなリストとして扱います。
そのため scalar() はあっても、対となるはずの list() 組込関数は存在しません。(和ラクダ第3版v2 P.925 参照)
# ちなみに scalar() 自身は単項演算子として振舞う関数のひとつです。
0823nobodyさん2009/07/16(木) 14:08:29ID: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.
というエラーが発生してしまいます。

これの回避方法をご教示ください。
よろしくお願いします。
0824nobodyさん2009/07/16(木) 15:54:53ID:???
>>823
該当ファイルの該当行の前後がどうなってるのか分からないとね。
0825nobodyさん2009/07/16(木) 16:17:48ID:???
>>823
s/_01//
0826nobodyさん2009/07/21(火) 03:06:34ID: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文字と考えています。
0827nobodyさん2009/07/21(火) 03:46:34ID:???
大体のブラウザではファイルが選択されていない場合、空文字が入りますのでdefinedでは常に真になります。
ベターなチェック方法は
if( defined( $cgi->upload( "cgi"))) {}
です。
この方法ならファイル選択をせずテキストボックスに適当な文字を入力されたケースにも対応できます(偽が返る)。
0828nobodyさん2009/07/21(火) 04:02:29ID:???
>>827
それだと2回も uplodad メソッドが呼ばれるからなんか無駄な気分

if( defined( my $file = $cgi->upload("cgi") ) ){
   print $file;
}

こんな感じのがよくね?
0829nobodyさん2009/07/22(水) 23:40:08ID:???
パスワード付きのzipファイルをPerlで解凍する方法を教えてください。
sample.zipのパスパードはtestです。ここまで書きました。

#!/usr/bin/perl

use strict;

my $zipfile = 'sample.zip';
my $pass = 'test';
0830nobodyさん2009/07/22(水) 23:52:11ID:???
>>829
my $unzip = "/usr/bin/unzip";
my $file = "$unzip -p -P $pass $zipfile |";
open my $fh, $file;
my @lines = <$fh>;
close $fh;

あとは@linesを書けばOK
0831nobodyさん2009/07/23(木) 00:27:53ID:???
それ、コマンド叩いてるだけじゃ...
0832nobodyさん2009/07/23(木) 01:02:41ID:???
自力でやる意味がどこにあるんだ
勉強の為だとしたら質問するんじゃない
0833nobodyさん2009/07/23(木) 08:23:53ID:???
コマンド叩くのが一番自然
0834nobodyさん2009/07/23(木) 10:26:53ID:???
Archive::Zip はencryptに対応してないってマニュアルに
明記されてるし、IO::Uncompress::Unzipははっきりとは
書いてないけどパスワード与えるインタフェースがなさげ
なのでこちらも多分対応してない。
0835nobodyさん2009/07/24(金) 22:10:31ID:???
> IO::Uncompress::Unzipははっきりとは
> 書いてないけどパスワード与えるインタフェースがなさげ
> なのでこちらも多分対応してない。

return $self->HeaderError("Encrypted content not supported")
if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK);

そうみたいだね。
0836nobodyさん2009/07/27(月) 11:10:44ID:???
my @bar = (scalar(@{$foo}) > $N) ? @{$foo}[0..($N-1)] : @{$foo};

というコードがあるんですが、何をやっているのかわからないので教えてください。
・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。
・scalar(@{$foo}) は結局何をしているんでしょうか?
0837nobodyさん2009/07/27(月) 11:30:52ID:???
> ・@{$foo} は何ですか?$fooでも@fooでもないのでわかりません。

$fooというリファレンスを、デリファレンスしてる

> ・scalar(@{$foo}) は結局何をしているんでしょうか?

配列の要素数を得てる
スカラーコンテキスト。

my $count = @array;
ってやると、コンテキストで要素数が得られるのと同じ。
0838nobodyさん2009/07/27(月) 11:42:52ID:???
ふと心配になったので、念のため

@{$foo}
と書くのも
@$foo
と書くのも一緒だから、覚えとくといいよ。むしろ後者で書く人の方が多い気がするから。
0839nobodyさん2009/07/27(月) 11:46:28ID:???
>>837-838
ありがとうございます。@{$foo}と@$fooは同じなんですね。
@{$foo}なんて書き方、初めてみたんですが、これどんなときにつかうんですか。@$fooだけでいいように思いました。
0840nobodyさん2009/07/27(月) 12:21:05ID:???
>>839
Perlはいろんな書き方出来る言語だから、そんなことでいちいち疑問に思ってたら前に進まないよ

というより、@{$foo}の方が丁寧な書き方っていう印象がある。
俺がそう思うということは、たぶん、オライリーのプログラミングPerlや初めてのPerlにはそう書いてあるはず。
0841nobodyさん2009/07/27(月) 12:35:35ID:???
>>839
あくまで @{...} が基本形。{} の中はリストリファレンスを返すものなら何でもいい。

@{ ['A'..'Z'] }
@{ $flag ? $bar : baz() }
@{ $foo[1] }
${ $quux }[1]
@{ $quux }[ 1..3 ]
@{"symbolic"} # 文字列ならシンボリックリファレンス
@{bareword} # トークンなら普通の変数

{} の中が単純なスカラー変数の場合は{}を*省略*できる (そして省略する人が多い)。

…と覚えた方が、後で悩まずに済むよ。
0842nobodyさん2009/07/27(月) 12:39:54ID:???
${foo}
0843nobodyさん2009/08/07(金) 10:07:16ID:???
バイナリに関してです。

my $head = 0x00000000; #空の4バイト確保
print (pack( "V", $head) . "\n"); #挙動がおかしいのでちょっと出力してみた

しっかり消滅してるしw
どうしればいいですか。

0844nobodyさん2009/08/07(金) 10:27:48ID:???
>>843
よくわからんがhoge.plにそのまま書き込んで実行してみた。

% perl hoge.pl |hex
0x00000000: 00 00 00 00 0a - @@@@J

ちゃんと4バイトの0が出てるので書いてるとおりの動作だな。

これで不満ならどうやって確かめて何がおかしいと思ったのか説明
してもらわないと。
0845nobodyさん2009/08/07(金) 10:42:44ID:???
すみません。
俺が勝手に使ってるテキストエディタ内の新タブに出力させてたら、エディタの問題だったみたいです。

プロンプト、ファイル出力、共に4バイトありました。
0846nobodyさん2009/08/12(水) 14:33:18ID:???
この↓ようなモジュールないですかね?

use CGI::Sendmail;

my %mail = (
To => 'you@2ch.net',
Cc => 'he@2ch.net',
Bcc => 'she@2ch.net',
From => 'me@2ch.net',
Name => "ひろゆき",
Subject => "こんにちは",
Body => <<EOL,
お元気ですか?
では、さようなら
EOL
"Sendmail-path" => "/usr/sbin/sendmail",
"Character-code" => "euc-jp",
);

if ( CGI::Sendmail->new(%mail)->send ) { print "送信完了" }
else { print "送信できませんでした" }
0847nobodyさん2009/08/12(水) 16:40:16ID:???
>>846
http://search.cpan.org/dist/MailTools/
http://search.cpan.org/~markov/MailTools-2.04/lib/Mail/Send.pod
http://search.cpan.org/search?m=module&q=Mail&s=1&n=100
0848nobodyさん2009/08/12(水) 18:05:46ID:XtZqM+tg
超低レベルな質問なんですが
フォームで受け取った$pass(値はhoge)と
同じくフォームで受け取った$idをファイル名に含んだファイルの二行目をfile()で読み込んで
$data[1](値はhoge)に代入して
if($pass==$data[1]){
print"値は同じです".$pass"==".$data[1];
}
else{
print"値は違います".$pass"==".$data[1];
}
を実行すると
「値は違います hoge==hoge」
と表示されるのですが「値は同じです」と表示させるにはどうしたらいいですか?
0849nobodyさん2009/08/12(水) 18:10:12ID:???
eq
0850nobodyさん2009/08/12(水) 18:11:08ID:???
それか改行入ってるとかありがち
0851nobodyさん2009/08/12(水) 18:14:13ID:XtZqM+tg
PHPスレと間違えましたすみませんでした
0852nobodyさん2009/08/12(水) 18:16:02ID:???
>>847
d
文字コード変換とMIME-base64?変換を自分でやれば使えそうです。
0853nobodyさん2009/08/13(木) 20:16:07ID:CNJ7rD2p
Perl勉強したときは
printfと書きましょうと習ったんだけど

printでも普通に使えるよね?
昔は使えなかったの?
0854nobodyさん2009/08/13(木) 20:43:12ID:???
>>853
>printfと書きましょうと習ったんだけど
まずそれがおかしい
0855nobodyさん2009/08/13(木) 21:09:54ID:???
誰からどう習ったんだよw
0856nobodyさん2009/08/13(木) 22:41:36ID:???
printfのfの意味わかってんの?
0857nobodyさん2009/08/13(木) 22:44:43ID:???
こういう場合は という限定的な意味で教えたが、
習った>>853は、全ての場合でと勝手に解釈したってことだろ

会話で生じる誤解としては良くある例
0858nobodyさん2009/08/14(金) 01:16:04ID:???
printf が使えるなんて知らなかった
print と sprintf だけ使ってた

びっくらこいた
0859nobodyさん2009/08/14(金) 01:26:28ID:???
人のソースみるとびっくりすること多いよね
こんな書き方できたのか!?って
0860nobodyさん2009/08/14(金) 02:07:28ID:???
糞質問失礼します

html表示するときのフォントをverdanaにしてるんですが
そうすると半角¥がバックスラッシュで表示されてうざいので

$hoge=~ s/\\/¥/ig;

としようと考えたのですが、すると今度は特定の日本語文字が
化けてしまいます

$hogeの中の英数記号だけを変換するにはどう書いたらよいでしょうか
08618602009/08/14(金) 02:12:28ID:???
あっ

$hoge=~ s/\\/&yen/ig;

です
0862nobodyさん2009/08/14(金) 02:53:12ID:???
use utf8
0863nobodyさん2009/08/14(金) 13:14:16ID:???
>>859

$hash{$1} = $2 while $str =~ /(.+):(.+)/g;

とかな
0864nobodyさん2009/08/14(金) 14:02:57ID:dh+Y7m4l
>>860
バイトコードで書く
\5Cの次にS-JISの2バイト目が来なかった場合のみ置換
0865nobodyさん2009/08/15(土) 03:34:02ID:???
>>864
正規表現で書くことはできますか?
すみません初心者で
0866nobodyさん2009/08/15(土) 03:55:15ID:???
>>865
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0867nobodyさん2009/08/15(土) 11:58:25ID:???
>>865
肯定の戻り読みを使って、単語の後と行の先頭のときのみを置換するようにしたらどうだろう?

$hoge =~ s/((?<=^)|(?<=[\x00-\x7F\xA1-\xDF])|(?<=[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]))\\/¥/g;
0868nobodyさん2009/08/15(土) 12:52:11ID:???
>>867
おおおおおおお成功しました。感謝です
?<=なんて初めて知りました

>>866
勉強します
0869nobodyさん2009/08/16(日) 14:53:02ID:???
それだと例えば「や・ら・わ行」の次に「能」の字とかが来ると化けるけどな
0870nobodyさん2009/08/16(日) 15:29:10ID:???
以下のようなコードで、

use Data::Dumper;
print @Data::Dumper::EXPORT; #=>Dumper

パスを文字列にしてアクセスする場合は、シンボリックリファレンスにするしかないですかね?

my $path = "Data::Dumper";
print @{$path."::EXPORT"}; #=>Dumper
0871nobodyさん2009/08/16(日) 21:22:55ID:???
use strict でエラーにならない?
0872nobodyさん2009/08/16(日) 23:58:30ID:???
>>870
print eval "\@${path}::EXPORT";
0873nobodyさん2009/08/17(月) 00:52:26ID:PDEfAFzM
linuxのperlモジュールについての質問はここで良いのでしょうか?
0874nobodyさん2009/08/17(月) 01:29:56ID:???
いいんじゃないのー
0875nobodyさん2009/08/17(月) 02:14:21ID:???
>>870

{package Data::Dumper;
print EXPORT}


とかは?
試してないけど
0876nobodyさん2009/08/17(月) 02:18:26ID:???
あー意味不明でした

{ package $path; print @EXPORT}

package で変数使えるならいけそうだけど使えなかった記憶が…
0877nobodyさん2009/08/17(月) 07:59:43ID:???
それ eval "package $path" ってしないとダメだよ。
前に一度そういうコード書いたことあるからわかる
0878nobodyさん2009/08/17(月) 09:09:05ID:QR35H0tn
あげ
0879nobodyさん2009/08/18(火) 00:44:13ID:jmGn/Iui
LWPモジュールのHTTP::Response::is_success() を使用するとエラーは出ないのですが
中身が空で返ってきます。URLは間違ってないのですが、考えられる原因は何かないでしょうか?
0880nobodyさん2009/08/18(火) 01:01:54ID:???
>>879
UserAgentがLWPだから
はじかれてるとか?
0881nobodyさん2009/08/18(火) 01:17:01ID:???
HTTP::Response::as_string
取りあえずこの中身見てみては?
0882nobodyさん2009/08/18(火) 02:57:59ID:B/cB/Ta1
本当にからなの?
0883nobodyさん2009/08/18(火) 05:23:06ID:???
>>879
お父さんが設定した、未成年向け有害情報フィルタでフィルタリングされた。
0884nobodyさん2009/08/18(火) 12:26:05ID:???
>>879
ありがちなのはUserAgentとかRefererとかCookieとかトークンで弾かれてるってパターンだな。
0885nobodyさん2009/08/18(火) 12:34:15ID:???
全部偽装してみりゃいい
08868792009/08/18(火) 13:44:36ID:9U61OqMG
>>881
これで良いのしょうか?
my $request = HTTP::Request->new('GET',$url);
my $http = $request -> as_string();
print "$http";
GET http://headlines.yahoo.co.jp/rss/indonews_c_int.xml User-Agent: libwww-perl/5.830

>>880
よく分からないのですがどういうことでしょうか
また、はじかれるのを回避するにはどうすれば良いのでしょうか?
0887nobodyさん2009/08/18(火) 14:25:27ID:???
>>886
http://headlines.yahoo.co.jp/rss/indonews_c_int.xmlが取得したいなら、
LWP附属のGETコマンドで一発で取れるからどっかスクリプトに不具合があるんじゃ
ないかと思われ。
0888nobodyさん2009/08/18(火) 16:40:28ID:???
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のパッケージのバージョン上げてみて、
それでもダメなら別の角度からどうぞ。

それ以前に、ブラウザでアクセスできてるんかいな。
08898792009/08/18(火) 18:56:58ID:2nsUhaJf
>>888
最後の行でサーバエラーが出ました…
またブラウザでアクセスは出来ます。

あとアップデートはrootでrpm -Uvh perl-libwww-perlを行って出来ませんでした。
間違いを指摘して貰えると助かります。
0890nobodyさん2009/08/18(火) 20:17:49ID:???
パッケージマネージャからではなくて、cpanを使ってバージョン上げるとどうなる?
依存関係でcpan使いたくないのなら、別に/usr/localにソースからPerl突っ込んでみるとか。

ここまで来るとlynxかwget使って取得した方が早そうだけど。
08918792009/08/18(火) 22:21:49ID:2nsUhaJf
>>890
cpanでinstall LWPとした所、LWP is up to date(5.830)となりました。
0892nobodyさん2009/08/19(水) 01:47:46ID:1hmn0Zu+
てす
0893nobodyさん2009/08/19(水) 09:37:51ID:???
>>889
rpmで削除できないか?できないなら@INCから自力でLPW探して
LPWを手動で削除してもっかいcpanから入れてみろ。
0894nobodyさん2009/08/19(水) 09:42:45ID:???
>>889
つーか、ブラウザではプロキシ経由とかそういうオチじゃないだろうな・・・。
0895nobodyさん2009/08/19(水) 18:15:22ID:???
プログラム板から誘導されてきました

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エンコード/デコードのせいかと思ったのですが、受け取り時点でこんな化け方をされるとどうすれば良いのやら……
何か解決法は無いでしょうか。
よろしくお願いいたします。
0896nobodyさん2009/08/19(水) 21:20:51ID:???
Encode Guess
0897nobodyさん2009/08/19(水) 22:50:25ID:???
EUC-JPの文字コードはShift_JISとどっかぶりだから、判定できないことがしばしばある。
携帯向けコンテンツはShift_JIS/UTF8のどっちかで作っとくことをお勧めしとく。
0898nobodyさん2009/08/19(水) 23:39:59ID:1hmn0Zu+
>>895
全部、UTF-8で作ったら?
0899nobodyさん2009/08/19(水) 23:48:54ID:???
>>895
$in{comment}の中身は、shift_jisコードで「あいうえお」なのだから、この中身をeucに変換する必要があるでしょ。
変換するとき自動にすると誤作動するから、my $str = Jcode->new($str, "sjis")->euc; などと元のコードを指定するべし。
あと、ページを出力するときにcontent-typeヘッダにcharsetを指定するべし。
0900nobodyさん2009/08/20(木) 00:51:47ID:???
DBIでcreate databaseとdrop databaseは出来ますか?
0901nobodyさん2009/08/20(木) 01:05:38ID:???
>>980
できるだろ
適切に設定してあれば

もし外部に操作させようってんなら愚行だと思うが
0902nobodyさん2009/08/20(木) 05:47:30ID:???
こちらでいいか分かりませんが、質問させてください

今PATH_INFOの汚染チェックでヌルバイト(%00等)があれば消去という処理を
したいんですが、なぜかマッチしてくれません
$PATH = shift;
$PATH =~ s/(\0|\x00|%00)//g;

POSTやGETでは上記の処理で消すことが出来たんですが
PATH_INFOの場合はやり方が違うのでしょうか?
ちなみにタグのサニタイジングは出来ました
0903nobodyさん2009/08/20(木) 08:42:44ID:???
>>902
サニタイズ脳乙。

つーかapacheだとNULLは受け付けてくれないんだが(Not Foundになる)。
PATH_INFOを16進ダンプとかしてみた?
0904nobodyさん2009/08/20(木) 09:14:03ID:???
>>903
あー
だからPCからだと404に飛んだんだ

test.cgi/test/%00/aaa/
でPATH_INFOを表示させた場合
PC→404エラー
携帯(au)→/test/
となりました

16進ダンプ…調べてきます
0905nobodyさん2009/08/20(木) 10:52:18ID:???
あとクライアントが蹴ってるのかサーバーが蹴ってるのか分かんないから、
見れるならサーバーのログもみとくといい。
クライアントが蹴って単にサーバーまで届いてない可能性もある。
09068952009/08/20(木) 11:42:27ID:???
>>896-899ご回答ありがとうございました、いくつか試してみました。

1.EUC-JPとShift_JISの判定問題が疑われるので、両方sjisに揃えてみる
 →揃えても$in{comment}の中身は「??????????」で変わらず。この判定問題ではない?
  Jcode変換しても全く変わらないので、そもそも「??????????」はshift_jisコードですらなさそう。

2.Encode Guessの使用
 →両方sjisに揃えたうえで実行してみましたが、「??????????」はasciiコードとのこと。(「??????????」そのものになっている?)

 UTF-8での作成も試してみようと思います。
 これで出来なかったら素直にPHPに行ってくる……
0907nobodyさん2009/08/20(木) 15:40:09ID:???
携帯電話なら、Shift_JISが今でも定番だったりするしな。
0908nobodyさん2009/08/20(木) 23:15:50ID:???
>>895
Encode関連と見た。SJISだと「あいうえお」は全部MSBが立ってるから、
UTF-8ではマップできない。で、?に置換される。
MSBの立ってないのが混じってる「01234」で試してみ?
「?」以外の文字が混ざるようならビンゴだ。
>>897
今のUAでcharset=を解釈しないものとかHTMLの文字コードと送られてくる
文字コードが食い違うものって残ってる?
>>899
Encode使えよ
0909nobodyさん2009/08/20(木) 23:57:41ID:???
>>908
auはページがUTF8でもフォーム内容はShift_JISで送られてくるんじゃなかったっけ?
0910nobodyさん2009/08/21(金) 00:09:36ID:???
てか、
> ■bbs.cgi(EUC_JP)
を見て反応して、
> ■html側(shift_jis)
を見逃してた。

なるほどEncode.pm絡みか。
0911nobodyさん2009/08/21(金) 00:15:52ID:???
これってEncodeの問題?

CGI.pmって
URLデコードが失敗すると?になったような

use CGI;
use URI::Escape;
print CGI::unescape( uri_escape( 'あいうえお' ) );

とかで試してダメならCGI.pmのバージョン上げてみるとか
0912Name_Not_Found2009/08/21(金) 00:52:35ID:nWh8czvG
Wep製作板から乗り移ってきました。以後よろしくお願いします。
肝心な質問ですが、

検索ボタンと一緒に付随しているコンボボックス?の事についてですが、何か1つコンボボックスの中の項目を選択して検索ボタンを押した後、その選択したコンボボックスを残した状態で検索結果を表示させたいです。
ただ検索ボタンとコンボボックスの領域は別のhtmlになっていて、検索結果を表示するCGI側で、その検索ボタンとコンボボックスがあるhtmlを読む込みようになっています。
前の検索項目を残すようにすることは可能でしょうか?

よろしくお願いします。
0913nobodyさん2009/08/21(金) 01:17:05ID:???
可能
0914nobodyさん2009/08/21(金) 03:36:54ID:kHQe2rHZ
てす
0915Name_Not_Found2009/08/21(金) 09:53:12ID:nWh8czvG
>>913-914
宜しければ、やり方を教えてください。
0916nobodyさん2009/08/21(金) 10:34:03ID:???
LWP 使った書き方が沢山ありすぎて迷う
LWP の使い方はここを見ておけば、大概は困ることないよ
っていうサイトはありますか?
0917nobodyさん2009/08/21(金) 10:43:59ID:???
質問です。
どこで聞いていいのかわからないので適切なスレがあれば誘導お願いいたします。

たとえば下記のようなディレクトリ環境をサーバに上げた場合、
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などがサポートされていないサーバなのですが、再帰処理ができるソフトやコマンドはありますでしょうか。
0918nobodyさん2009/08/21(金) 12:04:28ID:???
>>916
http://search.cpan.org/dist/libwww-perl/lwptut.pod
http://search.cpan.org/dist/libwww-perl/lwpcook.pod

>>917
△▲ WebProg 初心者の質問 Part19 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1244038749/
0919nobodyさん2009/08/21(金) 14:15:44ID:???
>>915
html読み込まず、
cgiから吐き出せば?
0920nobodyさん2009/08/21(金) 21:30:54ID:???
>>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使うとか
0921nobodyさん2009/08/21(金) 21:32:25ID:???
X <input name="nanka_no_flag" value="1"{checked} />
O <input type="radio" name="nanka_no_flag" value="1"{checked} />

orz
0922nobodyさん2009/08/21(金) 22:04:09ID:???
セレクト値も送っといて、その値に合わせてselectedをつけるか、
javascriptでセレクト値のクッキー食わせといて、javascriptで選択済みにするかぐらいか。
コンボボックスなら入力値を手入力できるだろうから、その辺もきちんと処理しないとね。
0923nobodyさん2009/08/22(土) 01:27:58ID:R3OZ89h5
SSI使用ページ(shml)があって、その中でcgiを複数呼び出している。
そのshtmlページをサーバのロックでなくて、パスワードでアクセス制限したい。

なら素直に全部をトータルでcgi使えという声もあろうが、全部がスクリプトだと
レイアウト変更や更新が面倒。それに、一部iFrameなんかは楽だしね。

で、shtmlページを完全にアクセス制限する手はなんか内でスカイ?
0924nobodyさん2009/08/22(土) 02:25:22ID:???
いや、それperl関係無いし
0925Name_Not_Found2009/08/22(土) 10:13:30ID:egsrQGCy
>>919-922の皆さんご回答ありがとうございます。
早速それらの方法を真似て修正したいと思います。
またつまづいてしまったらきます。
ありがとうございました。
09268792009/08/22(土) 20:07:07ID:???
cpanで「install libwww::perl」と行っらインストールできなかったのですが、
何が原因でしょうか?今はもう無くなってしまったのでしょうか?
他のモジュールは通常通りインストールできます。
0927nobodyさん2009/08/22(土) 21:42:34ID:???
>>926
> cpan LWP
09288792009/08/23(日) 18:08:57ID:???
通常プロキシ経由で外部と通信しているのですが、私のPCは外部との直接通信を許可してあります。
他の許可してあるPCではis_successで成功するのですが、私のでは出来ません。
firefoxでプロキシなしでネットに繋ごうとすると繋がりません。

いろいろ試したのですがよく分からないので、考えられる原因を教えてください。
0929nobodyさん2009/08/23(日) 18:14:27ID:???
>>928
それってつまり、プロクシなしで正常に外部と通信出来てないってことじゃん。
それじゃあLWP云々の前に、そのPCで正常にアクセス出来るよう
設定見直すなり、会社(組織?)の管理者あたりに相談だな。
0930nobodyさん2009/08/23(日) 18:16:42ID:???
>>929
あぶねえ、同じようなこと投稿するところだったw
perlの問題じゃなさそうだし、直接そのPCを見ることのできる人に相談だろうな。
0931nobodyさん2009/08/23(日) 19:12:32ID:dufUiF83
>>928
コマンドプロンプトから
pingとtracerouteで接続状況を確認したら?
perlの問題じゃないと思ふ
0932nobodyさん2009/08/24(月) 15:05:19ID:+a5IC9tF
こんなの初めてだよ

$aには1002が入ってて、$bには002001が入ってるはずだから、print "$a$b" ってすると1002002001となるはずが
1002
002001
と表示される、勝手に改行されている
chomp $aやchop $aしてみたけど、chompをやった結果は最初と変わらんし、chopをやると
100
002001
という結果になる
原因も対処法もわからない
ちなみに$a<>$bってやると
1002<>
002001
<>が上に来る不思議
0933nobodyさん2009/08/24(月) 15:16:07ID:???
>>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
0934nobodyさん2009/08/24(月) 15:16:12ID:???
$aと$bは使うなと何度言ったら・・・って突っ込みは置いといて

変数にs/[\r\n\s]//g;を通してからprintしたら治ったり?

URI::Escape;してprint uri_escape($a,"\0-\377");とかして
変なコードはいってないか見てみたら?
0935nobodyさん2009/08/24(月) 15:19:02ID:???
>>932
なんで$bはスルーなんだ?
0936nobodyさん2009/08/24(月) 15:22:00ID:???
>>935
「改行」は行の後につく、という固定観念なんだろう。

文字列というデータ列がターミナル上で「改行」として表示されている、
という概念に辿り着けていないんだろうな。
09379342009/08/24(月) 15:24:07ID:???
>>933
あぁそういう文章問題だったのか!
真剣に答えちゃったよorz

0938nobodyさん2009/08/24(月) 15:33:51ID:+a5IC9tF
ちょい待てぃ
$bも先頭も最後もいじってみたが解決しなかったぞ、俺を甘く見るな
934ためしてくるぞ、ためしてきてからレスしたほうがいいな
0939nobodyさん2009/08/24(月) 15:36:12ID:???
>>938
まあ、自分で検証してみなって。
>>933 の入力で、>>932の文章による結果は満たしている。
十分合理的で簡潔な解だと思う。

他の条件で異なる結果が得られるのなら、
それも示さなければ、他人には絶対理解できない。
0940nobodyさん2009/08/24(月) 15:39:03ID:+a5IC9tF
無理ですたorz
俺は何も悪いことしてない
俺も933は思いついたんだが、やはり無理でした
0941nobodyさん2009/08/24(月) 15:42:03ID:???
「入ってるはずだから」って何だよ
0942nobodyさん2009/08/24(月) 15:48:02ID:+a5IC9tF
入ってるはずなのに結果がああなったという日本語
まぁ、もうちょっと一人でなんとかしてみるわノシ
0943nobodyさん2009/08/24(月) 15:53:13ID:???
>>942
本当に「入っている」のならば、そのデータと eq で比較すればいいだろうに。
print "a is ok. " if $a eq '1002';
print "b is ok. " if $b eq '002001';
0944nobodyさん2009/08/24(月) 16:00:52ID:???
>>934をしてみてよ。

use URI::Escape;

print '$a = ', uri_escape($a,"\0-\377"), "\n";
print '$b = ', uri_escape($b,"\0-\377"), "\n";

0945nobodyさん2009/08/24(月) 16:04:33ID:???
>>932
print "$a$b";
print "$a$b";
print "-$a-$b-";

これで少しは問題の切り分けができるだろ。
俺は他の部分のケアレスミスと踏んでるがな。
0946nobodyさん2009/08/24(月) 16:09:28ID:+a5IC9tF
みんなありがとう、本当にありがとうb
uri_escapeしたら$bの先頭に%0Aがでてきた
しかし対処の仕方は $b =~ s/%0A//; しか思いつかなかった
0947nobodyさん2009/08/24(月) 16:36:10ID:???
>>946
\nでダメだったんなら多分\rだろ。このメタ文字は環境依存するからな。
0948nobodyさん2009/08/24(月) 16:51:37ID:???
>>946
これ↓でもいいんじゃないかな?

$a =~ tr/\r\n//d;
$b =~ tr/\r\n//d;
0949nobodyさん2009/08/24(月) 17:03:32ID:???
得体の知れない文字列データの0x0d, 0x0a を削除する、なら、そんな感じでしょうね。

しかし、元の問題をそんな対症療法で逃げていいのか?という気がしますけど。
>>932 は unpack('H*', $a) での確認を覚えておくと手軽でいいかな。
0950nobodyさん2009/08/24(月) 17:14:36ID:???
まあ改行削りたくて環境依存したくないなら
tr/\r\n//dにしとけってこった。
Macだったり、Windowsのファイルで\nだけ取れて\rだけ
残っちゃったとかそういうオチだろ。

でだな、何であるはずのない改行が混じってんだよ?ってことなら、>>949の言うように
原因追求が次の課題だな。そういうのはほっとくとろくなことにならん。
0951nobodyさん2009/08/24(月) 17:28:15ID:???
>>950
Mac上で、WindowsのCRLFなファイルをCR区切りで分割した、という線が濃厚ですね。
Mac perlのそのへんの仕様までは詳しく知らないので、予想ですけど。

UNIXベースの最近のMacは、もうCRな改行コードじゃないらしい、とも聞いてますが、どうなんでしょうか?
0952nobodyさん2009/08/24(月) 18:04:53ID:???
>>951
実家にiMac OS Xが健在だから見てみるよ。
0953nobodyさん2009/08/24(月) 18:08:07ID:???
質問者も回答者も>>1-3ぐらいはチェックしてほしいもんだ
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

>>951
>UNIXベースの最近のMacは、もうCRな改行コードじゃないらしい
YES
他のUNIX系OS同様となっている
0954nobodyさん2009/08/25(火) 08:52:45ID:???
テンプレ変更提案。次スレ立てる人はよろしく。

[本]
Effective Perl: ttp://ascii.asciimw.jp/books/books/detail/4-7561-3057-7.shtml

[オンラインマニュアル]
最新のドキュメント: ttp://perldoc.perl.org/
perl5.005_03 のドキュメント: ... ← そろそろ不要?
日本語ドキュメント検索: ... ← 消滅につき削除。
Perldoc.perl.org: ... ← 「最新のドキュメント」と統合。

「ム板Perlスレより x of 2」の一行も要らないかな。少しずつ違ってきてるし。
0955nobodyさん2009/08/25(火) 14:04:21ID:???
>>952だが、どれがメモ帳に相当するものか分からんかった。すまん。
TeachTextとかないのかよ。
0956nobodyさん2009/08/25(火) 16:14:13ID:fNKwG09N
スレたてれんかった
0957nobodyさん2009/08/25(火) 23:02:54ID:???
>>955
MacOS Xなら、テキストエディットっていうアプリがある筈ですよ。
デフォルトだと文字コードは、Mac Japaneseていうshiftjis互換で
改行は、CRのみです。
しかし、コマンドラインツールなどが吐きだす改行はLFのみです。
目的に応じて変換しないと、分け判らん状態にww
0958nobodyさん2009/08/25(火) 23:56:21ID:fNKwG09N
mac os xってLFだとおもってた
0959nobodyさん2009/08/26(水) 00:28:05ID:???
ここまでくると、単なる罠だな
0960nobodyさん2009/08/26(水) 08:05:04ID:???
>>957
thx。俺は漢字
で、Mac OS Xの\nはCRなのかLFなのか。
0961nobodyさん2009/08/26(水) 08:05:35ID:???
俺は漢字Talk時代しか知らんので、今のMacは全然使い方が分からない。
0962nobodyさん2009/08/26(水) 14:12:54ID:???
>>960
それは、アプリの設定次第。
perlでコーディングするなら、文字コードはUTF8改行は、LFに
アプリ側で設定しましょうって事です。>MacOS X
0963nobodyさん2009/08/26(水) 14:18:24ID:???
補足
perlが、吐き出す改行の事を言ってるならデフォルトで
¥n は、LF ですよ。
0964nobodyさん2009/08/26(水) 19:55:07ID:uFgoj7x+
エラーコード 500 が表示されたんですが、内部の処理(画像を変換する処理)はされてるようなんです。
エラーコード 500の表示がみっともないので、「print "Content-Type: text/html\n\n";」を追加したらエラーコードは表示されなくなりました。
なぜこの「print "Content-Type: text/html\n\n";」だけで、解消されたんでしょうか?
文字はブラウザに表示させてないのに。なぞです。
よろしくお願いします。
0965nobodyさん2009/08/26(水) 20:36:23ID:???
>>964
http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2
> レスポンスは、message-header と message-body で構成され、空行によって分けられる。
> message-header は一つ以上のヘッダフィールドを含む。 message-body は NULL でもよい。

> スクリプトは、文書レスポンス、ローカルリダイレクトレスポンス、あるいはクライアントリダイレクト
> (文書を伴っても良い) レスポンスのいずれかを返さなければならない。

仕様を満たさないままスクリプトが終了すれば 500 Internal Server Error になる。

CGI: Common Gateway Interface part 13
http://pc11.2ch.net/test/read.cgi/php/1126436361/
0966nobodyさん2009/08/27(木) 00:12:50ID:???
クエリパラメータの付いたurlからパラメータ抜きのurlを取り出したいんですが、どんな方法がありますか?
0967nobodyさん2009/08/27(木) 00:35:39ID:???
m/^(.*?)\?/
でいいんじゃないの?
0968nobodyさん2009/08/27(木) 01:51:21ID:???
$ENV{SCRIPT_NAME}とか。
えっ!?そうゆうことじゃない?
0969nobodyさん2009/08/27(木) 05:16:47ID:???
use URI::Split qw(uri_split uri_join);

my $str = "...";
my $uri = uri_join((uri_split($str))[0..2], undef, undef);
0970nobodyさん2009/08/27(木) 09:06:05ID:???
面倒なことしなくても>>967で正解だろ。
>>968
マジレスしてみる。

それだとhttp://.../が抜ける上に、PATH_INFOが乗らんぞ。そーゆー時はREQUEST_URIが普通。
そんなのHTTP_HOSTとかで組み合わせられると思うだろ?shttpやhttpsスキームはCGIからは判別不能だったと思うぞ。
そもそも自URLしか拾えないし、ftp://..../とかmailto://....とかはCGI噛まないからダメポ。
0971nobodyさん2009/08/27(木) 09:21:52ID:???
>>967
どちらかと言うと ? 以降を削った方が、
クエリの付かないURLを渡されても意図通り働くのでロバスト。
0972nobodyさん2009/08/27(木) 09:38:57ID:???
/^([^?]*)/
で良いんじゃね
0973nobodyさん2009/08/27(木) 19:11:36ID:lnXiS6J7
なんか昔のソース見てたら
push(@hoge,$&);
てあったんだけど、$&て何?
0974nobodyさん2009/08/27(木) 19:46:22ID:???
>>973
http://perldoc.perl.org/perlvar.html#$MATCH
0975nobodyさん2009/08/27(木) 20:04:55ID:???
>>974
ありがとう。
英文なのでわかったような判らないような。
正規表現にマッチする箇所”だけ”拾ってくれるって事でいいのかな?
とりあえず理解する糸口を教えてもらって感謝です
0976nobodyさん2009/08/28(金) 04:55:41ID:???
>>975
趣味ならいいけど仕事にするなら英語の勉強もしっかり
しといた方がいい。マニュアル読む程度ならTOEIC550点程度でいい。
読んでるうちになれる。
ただし海外のブログやニュースで情報収集したいなら750程度は欲しいかも。
0977nobodyさん2009/08/28(金) 14:38:06ID:???
役に立たない正論来ましたね。
0978nobodyさん2009/08/29(土) 10:09:36ID:???
TOEIC の話は板違いだろ
0979nobodyさん2009/08/29(土) 10:33:17ID:???
ム板で、英語知識の話になるのはよくあること

もちろんウザイという意味で
0980nobodyさん2009/08/31(月) 10:47:47ID:???
>>976
趣味なんで、>>974の中の$&の意味を日本語で教えてください。
0981nobodyさん2009/08/31(月) 15:48:05ID:???
>>980
趣味なら自分で調べるとか、らくだ本くらい投資しましょう。
趣味とはそういうものです。
0982nobodyさん2009/08/31(月) 17:11:21ID:???
>>980
最新のパターンマッチで成功した文字列(ただし当該ブロック中で、ブロックやeval()文
で隠れた部分のマッチは勘定に入れない)。


(覚え方:いくつかのエディターでの&のようなもの)この変数は呼び出し専用で当該ブ
ロックに対して動的なスコープを持ちます。


プログラムのどこかでこの変数を使用すると、全ての正規表現マッチにおいてかなりの
性能低下をもたらします。"BUGS"を参照してください。

これの代替として"@-"を参照してください。
0983nobodyさん2009/08/31(月) 20:40:55ID:???
>>982

横からすまないが、今まで知らなかったので勉強になった。
perldoc perlvar によると
$& is the same as "substr($var, $-[0], $+[0] - $-[0])"
らしいけど、$& と比較すると使いにくいね..
0984nobodyさん2009/09/01(火) 06:56:19ID:???
覚えにくくて可読性の低い特殊変数なんか使わずに普通に括弧で全体囲めよ。
0985nobodyさん2009/09/01(火) 20:00:21ID:???
保守
0986nobodyさん2009/09/01(火) 21:03:00ID:jzXz2QoA
yahooニュースからrssでタイトル(title)やリンク(link)は取得できるのですが、
本文(description)だけが取得できません。考えられる原因があれば教えてください。

何度も確認したのでケアレスミスはない(はず)です。
0987nobodyさん2009/09/01(火) 21:26:07ID:???
>>986
>>1を読まないという重大なミスを犯しているがな
0988nobodyさん2009/09/01(火) 23:11:45ID:???
<< < 1 2 3 4 5 ... 100 > >>
みたいなリンクってなんか名前ついてたと思うんだけど、なんて名前だか分かります?
CPANにモジュールがあった記憶があるのに、探そうにも名前が浮かんでこない。。。
0989nobodyさん2009/09/01(火) 23:16:15ID:???
ttp://dailynews.yahoo.co.jp/fc/rss.xml
ニュース毎のdescriptionは無いように見えるけど
09909882009/09/01(火) 23:18:52ID:???
自己解決。navigation linkでした。
0991nobodyさん2009/09/02(水) 00:08:39ID:???
このスレにはエスパーが何人居ても足りないな
0992nobodyさん2009/09/02(水) 11:27:48ID:???
>>989
ありがとうございます。その様でした。
スレチなのですが、ニュース記事のRSSでdescriptionも配信されているサイトがあれば
教えてくれませんか。
ブログ記事でのdescriptionはありますが、ニュース記事だと見つからないので・・・
0993nobodyさん2009/09/03(木) 11:25:23ID:???
ほしゅ
0994nobodyさん2009/09/03(木) 12:05:47ID:???
>>993
保守してる暇があるなら次スレ立てろ!
0995nobodyさん2009/09/03(木) 12:40:28ID:???
断る
0996nobodyさん2009/09/03(木) 21:34:21ID:???
保守もなにも980超えたら即死するがな。
webprogは2日か3日だっけ?
0997nobodyさん2009/09/03(木) 22:36:50ID:???
せめて次スレが立つまでは保守しようってことさ
0998nobodyさん2009/09/03(木) 23:53:24ID:???
立ててきた。もう少し早めにスレたてようぜー
http://pc11.2ch.net/test/read.cgi/php/1251989472/
0999nobodyさん2009/09/04(金) 05:04:19ID:???
999
1000nobodyさん2009/09/04(金) 05:05:00ID:???
このスレは1000の風になりました
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。