Perlについての質問箱 38箱目at TECH
Perlについての質問箱 38箱目 - 暇つぶし2ch500:デフォルトの名無しさん
08/11/16 10:31:38
perlのマッチ演算子で変数が使えますけど
$pat = "foo"; $str =~ /$pat/; # この場合 /foo/ と同じ
変数に含まれる文字を全て普通の文字としてマッチさせるにはどうしたらいいでしょうか。

たとえば $pat = "foo[0]"; だと、/$pat/では[0]の部分を文字クラスとして処理するよう
ですが、単純に "foo[0]" という文字にマッチしてほしいのです。

501:デフォルトの名無しさん
08/11/16 10:36:15
/\Q$unko\E/

502:デフォルトの名無しさん
08/11/16 13:14:45
dmain.cpp
Note: including file: d:/projects/game/include\common.h
Note: including file: d:/projects/game/include\product.h
Note: including file: d:/projects/etc/psdk/include\WindowsX.h
Note: including file: d:/projects/etc/psdk/include\windows.h

こういうファイルを

dmain.obj: \
/cygdrive/d/projects/game/include/common.h \
/cygdrive/d/projects/game/include/product.h \
/cygdrive/d/projects/etc/psdk/include/WindowsX.h \
/cygdrive/d/projects/etc/psdk/include/windows.h \
dmain.cpp

こんな風にするスクリプトってどうやるの?


503:デフォルトの名無しさん
08/11/16 13:57:44
perl -ple 's/$/\\/; s/cpp/obj/; s/Note: including file: d:/\/cygdrive\/d/; END{ print "dmain.cpp";} '

504:デフォルトの名無しさん
08/11/17 20:02:29
質問です。掲示板のプログラムなのですが、データファイル(1行1投稿内容のテキストファイル)
を掲示板のCGIのサーバーとは異なるサーバーに置きたいのですが、その場合どのように
すればよいでしょうか? できればmySQLサーバーはインジェクションの関係で使いたくあり
ません。

サーバー1 掲示板cgiや画像データなどを担当
サーバー2 掲示板テキストデータ(掲示板cgiから読み書きされる)

なにかアドバイスをお願いします。

505:デフォルトの名無しさん
08/11/17 20:11:26
>>504
NFSマウント。とネタレス。
WebProg行け。とマジレス。
その質問だとperl無関係だから、いきなりperlのスレに行くなよ…。

506:デフォルトの名無しさん
08/11/18 19:27:48
URLリンク(www.drk7.jp)
に記載されている通りにやったのですが、
C:\strawberry\cpan\build\DB_File-1.817-XRfyBQ>perl Makefile.pl
Parsing config.in...
Looks Good.
Note (probably harmless): No library found for -llibdb
Writing Makefile for DB_File

C:\strawberry\cpan\build\DB_File-1.817-XRfyBQ>dmake
cp DB_File.pm blib\lib\DB_File.pm
AutoSplitting blib\lib\DB_File.pm (blib\lib\auto\DB_File)
gcc -c -I/usr/local/BerkeleyDB/include -s -O2 -DWIN32 -DHAVE_DES_FCRYPT
-DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_
READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry
\perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t versi
on.c
version.c:30:16: db.h: No such file or directory
dmake: Error code 129, while making 'version.o'

と出てしまい、DB_Fileが結局インストールされません。
INCLUDEもLIBも自分の環境に沿って変えているのですが出来ません。

どなたかよろしくお願いします。

507:デフォルトの名無しさん
08/11/18 20:14:56
長文すみません
以下のjavaを

// 平均パケット到着レートの算出&ヒストグラム構成
if (preTimeList.size() >= pktNumForCalcRateAverage) {
sampleAveRate = pktNumForCalcRateAverage / (nowTime - preTimeList.remove(0));
int point = (int)(sampleAveRate / gap);
histgram[point] += 1;
total += sampleAveRate;
lineNum += 1;
}

をperlに書き変えたいのですが

# 平均パケット到着レートの算出&ヒストグラム構成
if ($preTimeList.size() >= $pktNumForCalcRateAverage) {
$sampleAveRate = $pktNumForCalcRateAverage / ($nowTime - $preTimeList.remove(0));
    $point = ($sampleAveRate / $gap);
    $histgram[$point] += 1;
    $total += $sampleAveRate;
    $lineNum += 1;
  } 

ではエラーが出てしまいうまくいきません。
nowTimeが間違っているのでしょうか?
どなたかアドバイスお願いします。

508:デフォルトの名無しさん
08/11/18 21:14:27
エラーメッセージは?

509:デフォルトの名無しさん
08/11/18 21:56:41
それ以前の問題だろ…

javaの文章に適当に$つけりゃperlになるとでも思ってんのかねえ?

510:デフォルトの名無しさん
08/11/18 21:58:07
Perl 6で動かしてるとか

511:デフォルトの名無しさん
08/11/18 22:36:19
  エラーメッセージを読む。

そういうクセをつけてあげないと、本人のために良くないだろ。

512:デフォルトの名無しさん
08/11/18 22:57:13
すげえ正論っぽいし、事実>>507に対するレスじゃなきゃ
完全同意なんだけどねえ。
車を運転しようとしてる9歳児に「交通規則は守れるか?」
って問うくらいには見当違いだと思う。


513:デフォルトの名無しさん
08/11/18 23:17:55
まあまあ、推測に推測を重ねていないで、ここは本人のレスポンスを
待とうじゃないか。

514:デフォルトの名無しさん
08/11/19 00:13:09
>>505
ありがとうございます。別にきいてみようとおもいます。

515:デフォルトの名無しさん
08/11/19 00:44:16
>>507
- java の . と perl の . の違い
- int の意味
- java の size メソッドと perl の scalar @arr で何が得られるか
- java の remove メソッドと perl の shift ( or splice )
- 更には各変数と配列に何が入っててどういう状態なのか
- 前後にどういう処理が行なわれているか
これが直に答えられないなら移植なんか考えない方が良いよ。


516:506
08/11/19 03:43:41
No library found for -llibdb じゃなくて
No library found for -ldb でした…。
どなたかよろしくお願いします…。

517:デフォルトの名無しさん
08/11/19 07:47:34
>>516
dbは正常にインストールされているのか

518:デフォルトの名無しさん
08/11/19 19:35:21
>>512
じゃあ何と言うべきなの?
キミにはまだ早い、オトナになるまで待ちなさい、とでも?

519:デフォルトの名無しさん
08/11/19 19:45:50
ゆとり乙

でおk

520:506
08/11/20 00:21:04
>>517さん
dbというとちょっと分からないのですが、
Berkeley DB 4.6.21 をインストールして、
URLリンク(www.drk7.jp)
に書いてある通りに全ての手順を踏んだのですが、
No library found for -ldb
となって出来ないんです…。


521:デフォルトの名無しさん
08/11/20 04:46:40
ぜんぜん詳しくないけど、あてずっぽうで・・・

gcc -c -I/usr/local/BerkeleyDB/include -s -O2 -DWIN32 -DHAVE_DES_FCRYPT
-DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fno-strict-aliasing -DPERL_MSVCRT_
READFIX -s -O2 -DVERSION=\"1.817\" -DXS_VERSION=\"1.817\" "-IC:\strawberry
\perl\lib\CORE" -D_NOT_CORE -DmDB_Prefix_t=size_t -DmDB_Hash_t=u_int32_t versi
on.c

-L オプションが見当たらないけど、なんで?
-IC:\strawberry\perl\lib\CORE" って正しいのかな?lib のディレクトリを -I で指定してるけど。
  lib ディレクトリにヘッダファイルが入ってるの??
-ldb が無い、って言ってるんだから、ほんとうに無いのか、あるのか、自分の目で確かめたかな?
-ldb と省略せずに、\hoge\hage\libdb.l みたいにフルパスで指定してみてはどうか?


522:デフォルトの名無しさん
08/11/20 20:16:22
require 'ファイル名';
とするときに、1つ前のディレクトリにあるファイルを指定したいのですが、どうすればいいでしょうか?
require '../ファイル名';
だとエラーがでてしまい、できません。

523:デフォルトの名無しさん
08/11/20 21:40:27
>>522
1つ前の前に現在地がどこかを考えるんだ
../ や ~/ はシェルの機能なんだ


524:デフォルトの名無しさん
08/11/21 02:09:21
>>522
スクリプト保存場所と実行場所が同じならそれで動く。
(多分このケースだろうけど)違って場所固定ならスクリプトに
use FindBin;
require "$FindBin::Bin/../hoge.pl" ;
但し、FindBin はケースによってスクリプト保存場所を
示さない場合があるので、そんな場合には FindBin::Real
だか CPAN から引っ張って来て使う。

(蛇足)スクリプト内でカレントディレクトリに動的変化があり、
require する対象も連動変化があるなら、
use Cwd ;
しといて
require getcwd . q{/../hoge.pl}しなきゃならん。

525:デフォルトの名無しさん
08/11/21 02:16:40
あ。説明一行目正確じゃねえな。
「保存場所に関係無く、実行場所の ../ にあるならそれで動く。」
に訂正。

526:デフォルトの名無しさん
08/11/21 03:33:20
まぁたいてい、マウスでクリックして動作させるだろうから
カレントディレクトリをスクリプトのあるディレクトリに移動させておく、とか
そういう処理が必要だろうな。

527:デフォルトの名無しさん
08/11/21 06:37:05
>>522 エラーメッセージは?




528:506
08/11/21 13:19:05
>>521さん
返信ありがとうございます。
libdb.a
というのは前述したURLに書いてある通りに作成しました。
-Lオプションに関してはわかりません…。
確認したところ
\strawberry\perl\lib\CORE
にヘッダファイルがたくさん入ってました。
-ldbに関しては検索しているのですが、どうしてもわからないんですよね。
やはりWindowsでperl環境は無茶があるのでしょうか。

529:デフォルトの名無しさん
08/11/21 17:18:30
>>528
なんか>>506のエラーは
エラー情報(version.cないよ、コンパイルエラーみたいな)っていうのは、
そのページの「CPAN で DB_File をインストール → 必ず失敗する。」のところだから
そのまま次の「config.in を修正して DB_File を手動で dmake してインストール」
にいけばいいんじゃないの? そこでLIBパス設定してるし

530:506
08/11/22 01:11:58
>>529さん
返信ありがとうございます。
修正して、dmakeしたところ
C:C:\strawberry\cpan\build\DB_File-1.817-aAwZC0>dmake
dlltool --def DB_File.def --output-exp dll.exp
g++ -o blib\arch\auto\DB_File\DB_File.dll -Wl,--base-file -Wl,dll.base -mdll -s
-L"C:\strawberry\perl\lib\CORE" -L"C:\strawberry\c\lib" version.o DB_File.o -Wl,
--image-base,0x2d2e0000 C:\strawberry\perl\lib\CORE\libperl510.a \strawberry\c\
lib\libmsvcrt.a \strawberry\c\lib\libmoldname.a \strawberry\c\lib\libkernel32.a
\strawberry\c\lib\libuser32.a \strawberry\c\lib\libgdi32.a \strawberry\c\lib\lib
winspool.a \strawberry\c\lib\libcomdlg32.a \strawberry\c\lib\libadvapi32.a \stra
wberry\c\lib\libshell32.a \strawberry\c\lib\libole32.a \strawberry\c\lib\libolea
ut32.a \strawberry\c\lib\libnetapi32.a \strawberry\c\lib\libuuid.a \strawberry\c
\lib\libws2_32.a \strawberry\c\lib\libmpr.a \strawberry\c\lib\libwinmm.a \strawb
erry\c\lib\libversion.a \strawberry\c\lib\libodbc32.a \strawberry\c\lib\libodbcc
p32.a dll.exp
version.o:version.c:(.text+0x7a): undefined reference to `db_version'
DB_File.o:DB_File.c:(.text+0x10d5): undefined reference to `db_create'
collect2: ld returned 1 exit status
dmake: Error code 129, while making 'blib\arch\auto\DB_File\DB_File.dll'
となりました…。
blib\arch\auto\DB_File\
には.existsファイルしかありませんでした。

531:デフォルトの名無しさん
08/11/22 21:00:21
>>530
libdb.a はちゃんと C:\strawberry\c\lib\ にあるのかい?ってのと
↑には libdb.a という文字が登場しないなってのがあやしいかと。

532:デフォルトの名無しさん
08/11/22 22:41:13
さくらインターネットの環境のせいかどうかわからないのですが、LWP::UserAgent mirrprの挙動がおかしいってことはありますか?
mirror呼ぶと$tmpfile作るみたいなのだけど、そのstatのrdeb, size, blocksが0になって以下のエラーがでます。
Transfer truncated: only 0 out of 9446 bytes received

何かわかれば教えてもらえますか?

LWP::UserAgent 5.819
FreeBSD 6.1-RELEASE-p23
This is perl, v5.8.8 built for i386-freebsd-64int

533:デフォルトの名無しさん
08/11/22 23:43:51
x64のppmリポジトリってまだないのね。
リポジトリ追加してもパッケージ数が0で何かと思ったらそういうことか…。

534:506
08/11/23 01:56:00
>>531さん
解決しました!
531さんに指摘されて、libdb.aという文字が出ないのかを考えたところ、
ファイル名だけ変えていて、拡張子が変わっていませんでした。
要はlibdb.a.libというファイルでした。
なので拡張子変換ソフトを使ったところ上手くいきました!
本当ありがとうございます!

535:デフォルトの名無しさん
08/11/24 01:41:41
ちょっと前に、WWW::Mechanizeを1.34から1.50にupしたんですが、この1.50の挙動についての質問です。

1.50になってから、$mech->get('URLリンク(example.com)')なんかでgetsしてきたページの内容を
$mech->content()で書き出すと、utf8フラグ付の文字列に自動でdecodeされたものが出力されます。
($mech->response->contentでは、そのまま変換なしで返ってきます。)
さらにこの状態で、$mech->find_linksやfind_images,$mech->form->inputsなどの戻り値オブジェクトから
$_->textや$_->valueなども、utf8_decodeされたものが返ってくるようになりました。

これはこれで、戻り値を正規表現等で検知するのに便利になった部分もあるのですが、
今少しばかり困ったことになっております。

実は、とあるサイトをクロールしていて、そのページ自体はsjisで書いてあるのですが、
ページのheaderに、<meta http-equiv="content-type" content="EUC-JP">とかの記述があって、
どうもこの記述を鵜呑みにして、元の文字列をEUC-JPとしてdecodeをしてしまって、化けバケになりました。

536:535
08/11/24 01:42:13
そこで、$mech->get()した時に、自動でutf8デコードさせないようなオプションやメソッドを
探したんですが、それが見当たりません。

ドキュメントやソースファイルを読んでみて、Mechanize.pm内部で、$content = $res->decoded_content()
が呼ばれているようで、それではとHTTP::MessageやHTTP::Headerにある、Encodingヘッダーやcontent_encoding
あたりで制御するのかなと色々やって見ましたが、やっぱりutf8デコードされてしまいます。
(と言うか、イマイチこれらの使い方が合ってるのかよくわかりません。)

どなたかこれらの制御方法をご存知の方はおりませんか?

現在のところ、WWW::Mechanizeを1.34以下に戻すか、実行スクリプトの中で
*HTTP::Message::decoded_content = sub { shift->content };
と書く、などで回避しておりますが、もっとスマートな方法がないのかなと思っております。

537:デフォルトの名無しさん
08/11/24 17:23:57
Perl 5.8.6なんですが
sysopen(TPL, $file, O_RDONLY)
のとこで
Argument "O_RDONLY" isn't numeric in sysopen
というerrorを毎回吐きます。

動作は見たところ正常ですが、Apacheのerror_logにたまるのが気持ち悪くて…。
どこのサンプルにもマニュアルにも上の通りにかいてありますが、
O_RDONLYじゃいかんのですか?

538:デフォルトの名無しさん
08/11/24 17:33:00
O_RDONLY が定義されてないからじゃないの?
>どこのサンプルにもマニュアルにも上の通りにかいてありますが、
いったい、どこのサンプルやマニュアルを見たんだい?

おぢさんがひとつ、いいことを教えよう。
google 「perl O_RDONLY」
パソコンを買ったら、まず最初に google を覚えよう。

539:537
08/11/24 19:46:17
レスありがたふ
そのキーワードで何度もぐぐったんですが
URLリンク(perldoc.jp)
URLリンク(perldoc.jp)
こんなんや、他の個人ブログやチュートリアルサイトでも
sysopen(HANDLE, path, O_RDONLY); の例が出てくるんですよね

540:537
08/11/24 19:49:25
自己解決しました
改めてよく読んだらperldoc.jpに「標準モジュール Fcntl 経由で」って書いてありましたね
use Fcntlで解決しました
>>537 ありがとうございました

541:デフォルトの名無しさん
08/11/24 21:43:42
3×3のクロスワードを作ろうと思います。
3文字の辞書ファイルは既にあって
3×3の真ん中には「か」という文字列が入っています。
このとき、3×3のクロスワードを作成するにはどうすればよいでしょうか。



542:デフォルトの名無しさん
08/11/24 21:55:33
ここって宿題の依頼もありだっけ?


543:デフォルトの名無しさん
08/11/24 21:57:31
Perlにカスってもいねえし

544:デフォルトの名無しさん
08/11/24 22:06:30
ゆとりは宿題はやってもらうものと考えてるからな。

545:デフォルトの名無しさん
08/11/24 23:26:48
学業も仕事も他人に任せてゆとりの時間を楽しむのがゆとりの正しい姿
宿題をやる仕事を貧しい人達から奪うほど情が無いわけではありません

546:デフォルトの名無しさん
08/11/25 00:33:23
やってくれって言ってないじゃん!

547:デフォルトの名無しさん
08/11/25 01:34:49
メール鯖からパイプで渡された標準入力を
上手い事いじらせてくれるモジュールってあったっけ?
Net::POP3~MIME::Parserなら分かるんだが
標準入力しか触れないの扱わんとならんorz
テキストをチマチマと拾ってくしかないのか・・・?

548:デフォルトの名無しさん
08/11/25 02:15:47
日本語でおk

549:デフォルトの名無しさん
08/11/25 05:36:06
>>535
WWW::Mechanizeはよく知らないんだけど
$res->decoded_content(charset => 'none');
この辺りヒントになるかも

550:532
08/11/25 13:39:13
mirrorじゃなくてそもそもrequest($url, $file)で$fileに取得できてないってことに気づいた。
おかげでCPANコマンドでも
Transfer truncated: only 0 out of 149396 bytes received
が出て死んでしまう。
ググっても他に同じような人出てこないし何いじってこうなったんだろう。。

551:535
08/11/25 13:39:41
>>549
レスありがとうございます。
確かに、LWP::UserAgentからは、$res->decoded_content(charset=>'none')で
decodeされないcontentsが返って来るのを確認しました。

しかしながら、Mechanize.pm内では、このdecoded_contentに引数を渡す方法がなく、
またソース内のコメントに、
"Do we need to expose the options there?"
みたいなことが書いてありますので、現状では必ずdecoded_content()が呼ばれてしまうみたいです。

そのため、リクエストのレスポンスヘッダやページ内の<meta>タグに、charset指定がある場合は、
それに従った Encode::decode($charset,$html) が返って来ます。
(このdecodeがコケた場合は、変換なしの元々のbyte文字列が返ってきます)

URLリンク(code.google.com) に要望でも出したら対応してくるのかな。

552:デフォルトの名無しさん
08/11/25 14:22:15
ヘッダの情報に合わせて自分で変換してしまう

553:デフォルトの名無しさん
08/11/25 17:05:16
>>551
ああ、なるほど。
deflate対応と文字コード変換がセットになってるのがややこしいんですよね。
decoded_content自体に罪は無いけど世の中のページはstrictじゃないページも沢山あるので
デフォルトオフか最低でも設定でオフに(WWW::Mechanizeから)出来るように考慮されてるべきだと思います。
>"Do we need to expose the options there?"
もちろん! というか主要な部分の挙動変えるなよって感じですが。
こういうPHP的なハマり方は耐えられません。

554:デフォルトの名無しさん
08/11/27 02:04:29
>>535
WWW::Mechanizeなんてサブクラス化して使うのが当たり前だから
サブクラスで好きなように自分好みのcontentメソッド再実装したらいいよ
最近Perl使ってないので的外れなこといってるかもしれないけど
少し前まではMechanizeはそういう使い方が当たり前だった

生のWWW::Mechanizeを使うという考えを発想転換したら?

555:535
08/11/27 18:19:54
>>552
その発想は..(ry
でも確かに、元ページのcharsetが既知ならば、それもありかもです。

>>553
そうなんです。decompress絡みとcharset変換が同じメソッド内で
同時に処理されてるのがなんだかなあと言う気もします。

まあ同意も得られたことですので、>>551のレポートフォームに
要望でも出そうかと思ってるんですが、ascii文字主体の言語圏の人々に
いかにしてこの思いを伝えようかと苦慮しているところです。
(その前に、英語も全然得意でないので、結構ビビッているんですが)

556:535
08/11/27 18:22:05
>>554
>WWW::Mechanizeなんてサブクラス化して使うのが当たり前だから
うーん、そんなもんなのですか?

自分はあんまり継承とかサブクラス化を使わないので、こちらこそ的外れな
意見かもしれませんが、私の個人的な認識(印象?)では、クラスを継承したり
サブクラス化するってことは、そのベースクラスの機能を最大限利用しつつ、
それプラス自分なりのメンバ(?)やメソッドを追加したり加工したり
するために使うものかと思うのです。
(もしくは、イベント駆動型のmoduleにハンドラを追加する時など)

ひょっとして>>536,551での書き方か悪かったのかもしれませんが、
今私が不便だと感じているのは、$mech->contentの動作自体ではなく、
$mech->get()した時点で、そこから連鎖的に内部のメソッドが実行され、
linkやformなどの$mech絡みのオブジェクトが、自動でutf8フラグ付に
decodeされてしまったものがセットされる、とういうもです。
で、これを抑制したい、回避できないか、と。

557:535
08/11/27 18:22:37
つづきです。

確かに仰るとおり、気に入らない動作や挙動の関数なら、自前の関数でも
書いて上書きでもしてしまえっ、という考えは自分にもありますので、
どれを上書きすべきかと探索し、decoded_content()に行き着きました。
そこで>>536の一行を追加し、とりあえずその場しのぎをしたんですが、
他の制御方法(mechの外からメソッドや、オプションを渡すなどで)
をご存知の方がおられないかと思い、書き込みさせて頂きました。

ちなみに今回の例を、クラスメソッドを再定義して対処するとなると、
_update_page()と言う事になりますが、このメソッド全体をコピペして、
対象の一行だけ削除なりコメントアウトなりすれば目的は達成できますが、
ベースとなるクラスメソッドを再利用しないで一から再定義するような
やり方が、mech使いの方には一般的なのでしょうか。

(自分的には、この_update_pageに伴って生成されるlinkやformオブジェクト
は大変重宝しており、出来ればそのまま利用したいです。ですが今回の場合、
元の動作の一部をスキップするのが目的のため、$self->SUPER::(base_method)
が利用できないので、あまり継承する意味が無いような気がするのですが)

長文、連投になってしまい、どうもすいません。

558:デフォルトの名無しさん
08/11/27 19:13:28
今入ってるレンタルサーバでmod_perlが使えると知り、
バージョンを調べたら1.9916となっていました。
この番号はどう読めばいいんでしょうか。
バージョン1にパッチ9916があてられている・・・のかな?

自宅の制作環境(Win)にも近いバージョンのものを入れたいのですが
そのものズバリは見つかってなくて、どう選んだものか迷っています。
アドバイスよろしくお願いします。

559:デフォルトの名無しさん
08/11/28 01:21:41
>>556
失礼
content()はアクセサーだからget()で内部メソッドを辿る必要があったわ
で、問題はもう自分でも解決してるみたいだけど、
_update_page()内のdecoded_content()の呼び出し
ここの引数リストが空なので、メンバ変数なりクラス変数なりで渡すように
サブクラスで再定義するといい

>ベースとなるクラスメソッドを再利用しないで一から再定義するような
>やり方が、mech使いの方には一般的なのでしょうか。
別にサブクラスじゃなくてもいいけど、サブクラスに定義した方が再利用性が高い
コンパイル時に確定するので、順番とか気にしなくていい
などのメリットがあると思われる

ていうかオブジェクトクラスはサブクラス化することに意義があるし、そのように使われる
ことを意識して書かれてることが多い
例えば、サブクラスで実装されることを意識して空のサブルーチンを置いたりする

560:デフォルトの名無しさん
08/11/28 23:28:35
画像編集だとImageMagickあたりが定番かなと思いますが、
動画だったらffmpegあたりでしょうか?

561:デフォルトの名無しさん
08/11/29 06:54:09
質問です。PerlでリモートのIISにWEBDAVの基本認証で接続し、
ファイルをアップロードしたいのですがうまくいきません。

#!/usr/bin/perl
use HTTP::DAV;
$d = new HTTP::DAV;
$url = "URLリンク(192.168.0.100)";

$d->DebugLevel(3);

$d->credentials( -user=>"user_name",-pass =>"pass",
-url =>$url);

$d->open( -url=>"$url")
or die("Couldn't open $url: " .$d->message . "\n");
#処理

というソースなのですがオープンで失敗します。
>Couldn't open URLリンク(192.168.0.100) Unauthorized.

長いので一旦切ります。

562:561
08/11/29 06:55:28

/tmp/perldav_debug.txtを見ると
<?xml version="1.0" encoding="utf-8"?><D:propfind xmlns:D="DAV:"><D:allprop/></D:propfind>
PROPFIND RESPONSE>>
HTTP/1.1 401 Access Denied
Connection: close
Date: Fri, 28 Nov 2008 21:18:18 GMT
Server: Microsoft-IIS/5.1
WWW-Authenticate: Basic realm="192.168.0.100"
Content-Length: 4395
Content-Type: text/html
Content-Type: text-html; charset=shift_jis
Client-Date: Fri, 28 Nov 2008 21:18:29 GMT
Client-Peer: 192.168.0.3:80
Client-Response-Num: 1
Client-Warning: Redirect loop detected (max_redirect = 7)
Title: このページを表示する権限がありません
X-Meta-ROBOTS: NOINDEX

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html dir=ltr>

以下HTML

と返ってきてるようです。
IIS側の認証方法の設定としては基本認証のみチェック、既定のドメインと領域は空、
匿名アクセス、統合Windows認証のチェックは共に外してあります。


563:561
08/11/29 06:56:08
同じ設定でWindowsのDAVクライアントCarotDAVから接続した場合はうまくいきます。
そのときのログは

Request To 192.168.0.100
> PROPFIND /dav/ HTTP/1.1
> User-Agent: Rei.WebDAV/1.5.3
> Depth: 1
AuthorizationMethod = Basic
<HTTP/1.1 207 Multi-Status
< Transfer-Encoding: chunked
< Content-Type: text/xml
< Date: Fri, 28 Nov 2008 21:19:18 GMT
< Server: Microsoft-IIS/5.1
< [MESSAGEBODY LENGTH:9957]

こうなってます。ブラウザFirefoxから接続した場合もdavフォルダを閲覧することができます。

また、IIS側の設定を変え、匿名アクセスにチェックを入れた場合はPerlからも普通に接続できます。
ログから見るに
いろいろ調べたところHTTP::DAVからの接続が
AuthorizationMethod = Basic
になればいいような気がするのですがその書き方がわからない、という状況です。

HTTP::DAVモジュールでの基本認証(?)の設定の仕方がわからないので
LWP::UserAgentで基本認証で接続するとうまくいくのですが、
今度はPUT(アップロード)の仕方がわかりません。
最終的にはPerlでアップロードできればいいのですが、なにかいい方法ご存知でしたら
ご教授いただきたく思います。

引き続きこちらでも調べて見ます。

564:デフォルトの名無しさん
08/11/29 13:46:35
Perlプログラミング初心者です。
困っていますので、助けてください。
以下のようなデータを持っています。
-----------------------------------
xおだ
56 80 90

xとよとみ
90 85 45

xとくがわ
90 90 100
-----------------------------------
1行目は名前のまえにxという印がついている
2行目に各教科の点数(0から100)がスペースで区切られている。
たとえば、左から国語、算数、理科
3行目は殻行
-----------------------------------
このデータから、それぞれの教科の点数による分布表をつくりたいのですが、どのように書いたらいいのか教えてください。
具体的には、
国語の100点は何人で、99点は何人で、、、、0点は何人。
同じように、算数と理科です。

どうぞよろしくお願いします。

565:デフォルトの名無しさん
08/11/29 14:03:52
「初心者です」って免罪符つけないほうが良いぞ
嫌う奴も居るから

566:デフォルトの名無しさん
08/11/29 15:22:14
>565
この場合は微妙だが、短絡的すぎないかw
そりゃ「初心者なので教えてください」は死ねって思うけど、例えば

  1ヶ月くらい前にPerlの勉強を始めた初心者です。
  Perl/CGIの入門書に載っている、簡単なBBSくらいは作れるようになりました。

とかなら、教える側にしても重要な情報だべ?


567:デフォルトの名無しさん
08/11/29 15:53:12
「困ってます。助けてください」
も誰にもメリットのない無意味な免罪符。

568:567
08/11/29 16:08:50
まぁいっか。ただし、記述では書いてやらん。
以下の説明を元に自分で作れないならもう諦めてくれ。

その前に--------
ファイル保存形式は変更可能なら変更したほうが読みやすい。(プログラムがな)。
perlの場合、順番に~、とか他のプログラムで扱ってるのと同じでもいいけど、
いちいち名前つきデータにしたほうが便利になる。
無意味な空行もなくしていいならなくしたほうがいい。
----------------

1:ファイルを開いて変数に移す。
どうゆう構造で格納すればいいのかは使う人が考えてくれ。
リファレンスを使うと望みどおりに格納できる。

2:sortを使ってデータを意図したとおりに揃える。

3:出力して終了


ただし、$name{'おだ'}->[0];
みたいな形式で格納してしまった場合に特定の点数の者が何人いるかを調べるとき、
たぶんデータをループにかけて全チェックせねばならない。

そんだけの用途なら、
$marks[0]->[90] = ('name_1', 'name2'); #つまり国語90点の人全員の名前
と格納したほうが良い

569:567
08/11/29 16:11:52


まちがた。
$marks[0]->[90] = ['name_1', 'name2']; #つまり国語90点の人全員の名前
こうか
どうでもいいか

570:デフォルトの名無しさん
08/11/29 16:21:14
gmplayerに配信元を渡す為に、
ブラウザでasxファイルをクリックしたら起動するように関連付けた
以下のようなものを作ってみました。

#!/usr/bin/perl

use strict;
use warnings;

my $mplayer = 'gmplayer';
my @media ;

while (<>) {
/=\s?\"((?:http|mms):\/\/.*(?:wmv|wsx|wma|asf|mp3|mp4))\"/;
push @media, $1 if ($1 ne '');
}

@media ? exec $mplayer, pop @media
: die "There is no streaming lines in this asx file!\n";

チェックの為にシェルからasxファイルを引数にして起動したところ、
わざとマッチする行が無いasxファイルでチェックした時には

Use of uninitialized value in string ne at ./mp_wp line 11, <> line 1.
Use of uninitialized value in string ne at ./mp_wp line 11, <> line 2.
(以下略)
There is no streaming lines in this asx file!

という風に警告を表示されてしまいました。
この警告を出さなくするにはどうしたらいいのでしょうか?


571:デフォルトの名無しさん
08/11/29 16:42:37
>>570
use warnings;の一行を取っ払えば解決

572:570
08/11/29 16:51:02
>>571
いえ、use warningsのままどうにかならないものかと…。

573:デフォルトの名無しさん
08/11/29 17:02:05
<>を使うのをやめる

574:デフォルトの名無しさん
08/11/29 17:02:50
>>570
defined $1

575:デフォルトの名無しさん
08/11/29 17:03:18
パターンマッチしたならその結果を見てやれよw

576:デフォルトの名無しさん
08/11/29 17:08:33
>>570
>Use of uninitialized value in string ne at ./mp_wp line 11, <> line 1.
ちゅうのはあれだ、$1 を ne で扱って評価しとるからで、
($1 ne '') は ($1) じゃいかんのかね。
パターンマッチからして undef 以外の 0 や '0' が来る筈ない場所だしなあ。


577:デフォルトの名無しさん
08/11/29 18:55:57
>>564
勉強中なんで、腕試し。こんなもんかな?(未検証)

open (IN, "Seiseki.txt");
while(<IN>){
if (/(\d+) (\d+) (\d+)/) {
$Kokugo[$1]++;
$Sansuu[$2]++;
$Rika[$3]++;
}
}
close(IN);

print "点数 国語 算数 理科\r\n";
for(0..100){
printf("%4d %4d %4d %4d\r\n", $_, $Kokugo[$_], $Sansuu[$_], $Rika[$_]);
}

578:570
08/11/29 19:06:42
>>573-576
ご教示ありがとうございます。
色々やり方があるんですね。if文の()内を(defined($1))にしたら警告が消えました。

579:デフォルトの名無しさん
08/11/29 20:53:53
>>564
勉強中の自分も作ってみた。

my @subjects = qw(国語 算数 理科);
my %names_of;

open my $in, "seiseki.txt" or die "can't open : $!";
while (<$in>) {
if ( /^x(.+)/ ) {
chomp(my @marks = split / /, <$in>);
for (0..$#subjects) {
push @{$names_of{$subjects[$_]}{$marks[$_]}}, $1;
}
}
}
close $in;

for my $subject (@subjects) {
print "≪$subject≫\n";
for my $mark ( sort {$a<=>$b} keys %{$names_of{$subject}} ) {
printf "%3d : %3d人\n", $mark, scalar @{$names_of{$subject}{$mark}};
}
}

580:デフォルトの名無しさん
08/11/30 00:12:06
ここ宿題スレじゃないんだけど

581:デフォルトの名無しさん
08/11/30 13:03:38
1ファイルの変換なら
perl henkan.pl page1.html > mypage1.html

じゃなかったら

open ( IN , "page1.html" ) or die;
open ( OUT , ">mypage1.html" );
while( <IN> ){

s/こぬにちは/こんにちは/;
print OUT;
}
close(OUT);
close(IN);

で出来るんですけど、フォルダにhtmlファイルが60個もあるので
まとめてやりたいのですが、
My_folder---page1.html,page2.html ………page60.html
の全部に一括して処理するにはどう書けばよいでしようか


582:デフォルトの名無しさん
08/11/30 13:07:12
for ( @ARGV ){
 open IN, $_ ;
 # 略
 close IN ;
}

583:デフォルトの名無しさん
08/11/30 13:12:18
for ( @ARGV ){
 open IN, $_ ;

while( <IN> ){
s/こぬにちは/こんにちは/;
print $
}

close(IN);
こうでしょうか?
済みません 馬鹿なんで 略無しで書いてくれると嬉しいです

584:デフォルトの名無しさん
08/11/30 13:24:41
>>581
system("perl henkan.pl page$_.html > mypage$_.html") for(1..60);

585:582
08/11/30 13:28:24
甘えんなよ、自分で考えろよ…。
後、「初心者スレ」てーのが WebProg にあるからそっち逝ってくんね?
「誘導してください」なんて言ったら切れるぞ?

586:デフォルトの名無しさん
08/11/30 13:32:23
henkan.plは変わりないままで
コマンドプロンプトのところで
henkan.pl page1.html > mypage1.html
のかわりに
system("perl henkan.pl page$_.html > mypage$_.html") for(1..60);
と書いてリターンでしょうか?

すみません バカで。


587:デフォルトの名無しさん
08/11/30 14:26:34
わからない七大理由
1. 読まない ・・・説明書などを読まない。読む気などさらさらない。
2. 調べない ・・・過去スレ、ググるなど最低限の内容も自分で調べようとしない。
3. 試さない ・・・めんどくさいなどの理由で実行しない。する気もない。
4. 理解力が足りない ・・・理解力以前の問題で理解しようとしない。
5. 人を利用することしか頭にない ・・・甘え根性でその場を乗り切ろうとする。
6.感謝しない・・・教えてもらって当たり前。事がすんだらさようなら。
7.逆切れする・・・自分の思うようにならないと逆切れする。

588:デフォルトの名無しさん
08/11/30 14:45:12
>>586
henkan60.plとかの名前で上の1行を保存
perl henkan60,pl
で、実行。
試してないんで、うまくいかなくてもかんべんな。

589:デフォルトの名無しさん
08/11/30 14:57:09
過去ログにもうあったらごめんなさい。
HTTP::Requestで画像ファイル(gif)を取得して、サーバに保存したいのですが、
$response->content()をそのまま保存しても画像になりません。

コード
my $req = new HTTP::Request("GET",$url);
local $response = $ua->request($req);

print "Content-type: text/html\n\n";
print $response->code();
print $response->message();
print $response->content();

open OUT,">> ./maptest.gif";
print OUT $response->content();
close OUT;

環境はwindowsXP perl v5.10.0 Apache2.2です
誘導でもかまいませんので、ヒントをください。

590:588
08/11/30 15:02:02
ひとつにまとめるななら、

for(1..60){
my $n = $_;
open ( IN , "page$n.html" ) or die;
open ( OUT , ">mypage$n.html" );
while( <IN> ){

s/こぬにちは/こんにちは/;
print OUT;
}
close(OUT);
close(IN);
}

591:デフォルトの名無しさん
08/11/30 15:10:35
>>589
Windows なら
binmode OUT;
で成功するかも

592:デフォルトの名無しさん
08/11/30 15:13:33
591さん
早速の回答ありがとうございました。

書き込みの部分を
open OUT,"> ./maptest.gif";
binmode OUT,":raw";
print OUT $response->content();
close OUT;

として、教えていただいた、binmode を付けることで解決しました。

ありがとうございました。

593:581
08/11/30 16:10:29
本当に助かりました。ありがとうです!

594:デフォルトの名無しさん
08/12/02 18:40:44
my $q = new CGI;



my $q = CGI->new();

ではどっちがカッコイイ書き方なんでしょうか?


595:デフォルトの名無しさん
08/12/02 21:12:20
new CGI は後方互換な「間接オブジェクト記法」
間接オブジェクト記法にはトラップがあるのが明記されてる
が故に CGI->new() の方が良いとされる。
が、現実では頻繁にコンストラクタを呼ぶ時にだけ
間接オブジェクト記法は使われている。

つーことで、new の時はどっちでもいいじゃね?method 呼ぶ時に
間接オブジェクト記法したら「変態さんがいる!」って言われるかも
しれんけどさ。

596:594
08/12/02 21:18:55
>>595
なんと!ありがとうございます。
Perlのオブジェクト関係はもっとキチンと勉強せねば…。

597:デフォルトの名無しさん
08/12/02 21:20:58
感嘆詞のニュアンスが微妙な気がしなくもないこともなくはないんだが。


598:デフォルトの名無しさん
08/12/02 21:34:11
変態さんにびっくりしたのでは

599:デフォルトの名無しさん
08/12/02 22:21:54
{ package Foo ; sub new { bless {}, shift } sub get { "hoge\n" } }
print Foo->new->get ; # 直接ならあっさり
# 間接が一個でも混ると
#print get new Foo ; # ダメ
#print get { new Foo } ; # ダメ
print STDOUT get { new Foo } ;
print STDOUT get { Foo->new } ;
print do{ new Foo }->get ;


600:デフォルトの名無しさん
08/12/02 22:24:05
確かにこれならMな変態さんと呼ばれても仕方ないな

601:デフォルトの名無しさん
08/12/02 23:34:03
なんと!スープです

602:デフォルトの名無しさん
08/12/03 07:46:58
>>595
「後方互換」てーのは語弊がある書き方だな、、と自己レス
perlobj の "Indirect Object Syntax" の項に説明がある。

603:デフォルトの名無しさん
08/12/03 12:49:12
関数呼び出しの時に & つけたりつけなかったり
なんなんですか?

604:デフォルトの名無しさん
08/12/03 13:26:44
>>603
URLリンク(www.kt.rim.or.jp)
URLリンク(perldoc.jp)

605:デフォルトの名無しさん
08/12/03 13:54:41
>>604
ありがとうございました。

よくわかりませんでしたが・・・。付けるに超したことはないのかな。

606:デフォルトの名無しさん
08/12/03 15:36:25
>>605
組込み関数を全て覚えてて関数名ダブらない自信があるんなら付けてなくてもいいけど、
それまでは付けた方が良いってリャマの人が言ってた!
アンパーサンドなしじゃ関数名がダブったら組込み関数の方を呼びに行っちゃうからね。

607:デフォルトの名無しさん
08/12/03 17:05:47
PBPでは付けるなって言ってるな。
(サブルーチンのリファレンスが欲しい時以外)


608:デフォルトの名無しさん
08/12/03 17:33:41
CPANあたりみても"&"つけてない方が圧倒的に多いし、使えるからといって
組み込み関数とだぶった名前つけたら読みにくくなるだけじゃないか。

あと、サブルーチン呼び出しの&の有無は完全に等価ではなくて、プロトタイプ
まわりや引数を省略したときの振る舞いなんかが違うので注意な。


sub f(\@) {
my($x) = @_;
print join(",", @$x), "\n";
}

@array = (1, 2, 3);
f(@array);   # 1,2,3
&f(@array); # 空文字列

sub g {
my(@x) = @_;
print join(",", @x), "\n";
}

sub g1 {g;}
sub g2 {&g;}

g1(1,2,3); # 空文字列
g2(1,2,3); # 1,2,3

609:デフォルトの名無しさん
08/12/03 17:43:06
いや普通は付けないが
Perl初心者は慣れるまでは付けるようにしておけ、
という事だよリャマ本

610:デフォルトの名無しさん
08/12/03 18:52:12
バッドノウハウ論議って楽しいよな

611:デフォルトの名無しさん
08/12/03 21:10:02
初心者っぽく見えるから俺はつけない

612:デフォルトの名無しさん
08/12/03 22:10:49
シンタックスハイライトのついたエディタ使えば組み込みとダブるなんて
意識して書かない限りやらないだろ・・・

613:デフォルトの名無しさん
08/12/04 12:16:49
>>608

> sub f(\@) {
> my($x) = @_;
> print join(",", @$x), "\n";
> }
>
> @array = (1, 2, 3);
> &f(@array); # 空文字列

この結果、ひどいな。。。
いや、昔の perl だと普通か。。。


614:デフォルトの名無しさん
08/12/04 12:40:56
>>613
プロトタイプ指定は「組込関数のように振る舞える」のが肝なので、
わざわざ & を付けて区別するのは何を意図してるの?って感じだ。
ヘンな言葉遣いをすればヘンに解釈されるってだけじゃん。

615:デフォルトの名無しさん
08/12/04 14:10:34
>>614
初心者が
「慣れないうちは&をつけとこっと」
って思って勉強が進む。そのうち関数プロトタイプのことを知り、試す。
「あれ?」
っていうストーリー。

616:デフォルトの名無しさん
08/12/04 16:17:28
&も()も必ず付ける。それが俺のジャスティス。

617:デフォルトの名無しさん
08/12/04 16:19:21
必ずつける人はPythonにでも行った方が幸せになれる

618:デフォルトの名無しさん
08/12/04 17:02:44
ppm install DBD-mysql
するとないって言われるんだが・・俺だけ??
情報求むm(_ _)m

619:デフォルトの名無しさん
08/12/04 18:12:16
―なにが幸せかわからないのです。本当にどんな辛いことでもそれが正しい道を
進む中での出来事なら、峠の上り下りもみんな本当の幸いに近づく一歩ずつですから。


620:デフォルトの名無しさん
08/12/04 18:33:06
>>618
「DBD-mysql PPM リポジトリ」でググッて好きなページを参照して。

621:デフォルトの名無しさん
08/12/04 21:58:48
1から99までに含まれる奇数を出力するプログラムを書いてみたんですけど
これ以上短くすることは可能ですか?

print$_%2?"$_ ":()for 1..99

622:デフォルトの名無しさん
08/12/04 22:08:38
$_%2&& print for 1..99

623:デフォルトの名無しさん
08/12/04 22:22:24
print $_*2+1,' 'for 0..49

624:621
08/12/04 22:46:56
>>622
即レスありがとうございます
なるほど!!
でもそれだと半角スペースがないですよね?
できれば半角スペースは入れたかったんですけど…

>>623
ありがとうございます
普通に足していく方法ですか
確かに短くなりますねw
うまく説明できないんですけど演算を上手くつかって短くしたいんですよね
説明不足ですみませんでした

625:デフォルトの名無しさん
08/12/04 23:03:57
print$_%2?$_:' 'for 1..99

626:デフォルトの名無しさん
08/12/04 23:59:40
>>620
ありがとうございますm(_ _)m

627:621
08/12/05 00:59:21
>>625
ありがとうございます
偽の場合の式をうまく使ってますね
何か書かないといけないから空のリストを置いてたんですけど
これだと無駄がない感じになりますね

628:デフォルトの名無しさん
08/12/05 02:11:14
$,=" ";print 1..99

629:デフォルトの名無しさん
08/12/05 02:14:04
痛たたた……

630:デフォルトの名無しさん
08/12/05 02:16:48
あ、奇数か。スマソ

$,=" ";print grep{$_&1}0..99

短くないな…


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch