Perlコーディング初心者質問スレ Part 63at PHP
Perlコーディング初心者質問スレ Part 63 - 暇つぶし2ch2:nobodyさん
11/09/09 18:12:10.08
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(ascii.asciimw.jp)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル]
最新のドキュメント: URLリンク(perldoc.perl.org)
perldoc きまぐれ訳: URLリンク(fleur.hio.jp)
perldoc.jp: URLリンク(perldoc.jp)

[モジュール]
CPAN: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)

[Perl5.8Unicodeメモ]
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)

3:nobodyさん
11/09/09 19:26:14.96
>>1

4:nobodyさん
11/09/12 12:01:09.82
[
{
key1 => 123,
key2 => 456,
},
{
key1 => 324,
key2 => 135,
},
{
key1 => 123,
key2 => 135,
},
続く...
]
こんな感じの配列をソートするにはどういう方法が最適でしょうか?
key1で昇順にソートして、key1が同じ場合はkey2で降順にソートします。
key2も同じ場合はどちらが先になってもかまいません。

5:nobodyさん
11/09/12 12:40:13.04
sort { $a->{key1} <=> $b->{key1} || $b->{key2} <=> $a->{key2} } @$aref

6:nobodyさん
11/09/12 12:51:03.86
ありがとうございます。||こんなのつかえたんですね。

7:Perl忍者
11/09/12 18:53:28.33
>>5
こいつは上忍級

8:nobodyさん
11/09/12 19:06:55.08
どあほ、perldoc -f sort に書いてある程度の
基礎の基礎じゃねーか。


9:nobodyさん
11/09/12 21:12:13.88 sQBBrYdo
全スレでファイルのロックの質問があったけど
読み込んで表示のみ=ロックの必要はない

読み込んだデータを加工して書き込む場合=

ファイルロック1
ファイル読み込み
データ加工
ファイル書き込み
ファイルロック1の解除

というようにするが正解だろ

読み込んで表示のみにロックする必要あったら
普通のHTMLファイルだってロックしなきゃならんだろ

10:nobodyさん
11/09/12 21:20:12.75
読み込んでる途中にファイルが書き換えられても困らないんならする必要はないよ





flockとはなんだったのか

11:nobodyさん
11/09/12 21:28:34.15
>>9-10
>>1
【総合】 Webprog板質問雑談スレッド 1
スレリンク(php板)

12:nobodyさん
11/09/12 21:37:37.12
余りに遅レスって批判は出来るにせよ、質問に答えてるじゃん

13:nobodyさん
11/09/15 00:40:46.86
データベースやってれば
書き込みロックと読み込みロックが
あることぐらい知ってるだろ。

14:nobodyさん
11/09/15 12:48:03.24
フォームのPOST情報を送ったあとのページを取得し、HTML::TreeBuilderあたりで
情報を取得しようとしています。
下記だと①はヘッダ?の情報が出てきますが、②は何も出てきません。
どこか間違えているのでしょうか?

my $url = 'URLリンク(example.com)';

my $formdata = ['id' => '***', 'pass' => '***'];
my $request = POST($url, $formdata);
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);

print $res->as_string; #①
print $res->content; #②

#my $tree = HTML::TreeBuilder->new;
#$tree->parse($res->content);
#$tree->eof();

15:nobodyさん
11/09/15 13:12:03.71
as_string()はHTTP::Responseの全文、つまりheader+body
content()はbodyを返す

example.comを見るならば、Content-Length: 0なんで当然content()は空になる

16:14
11/09/15 13:39:08.06
>>15
example.comは仮で書いただけなんですが、そのことを書いていませんでした。
失礼しました。

コード的には間違っていないようなので、別の要因を探ってみます。
ありがとうございました。

17:nobodyさん
11/09/18 03:39:18.09 bhwW9jAX
すいません、質問です

foreach $data (@isbn){
if(length($data) != 13){
$error_message = "length error";
break;
}
if($data =~ /[^0-9]/){
$error_message = "charactor error";
break;
}
}

$dataに入っている数字が13文字以外の時と、0-9の数字以外の時に
#error_messageにエラーを書き込んでforeachループを抜けるようにしたいのですが、なぜか13文字&数字だけの時にも両ifともtrueになってしまいます。

先に述べている動作をさせたい時の条件の書き方を教えていただけないでしょうか?

18:nobodyさん
11/09/18 03:40:47.27 bhwW9jAX
foreach $data (@isbn){
    if(length($data) != 13){
        $error_message = "length error";
        break;
    }
    if($data =~ /[^0-9]/){
        $error_message = "charactor error";
        break;
    }
}

見づらいだろうので修正

19:nobodyさん
11/09/18 04:16:55.44
例えばどんな@isbn?

20:nobodyさん
11/09/18 04:18:05.84 bhwW9jAX
ほんとにすいません、フォームから送ったデータに改行コードが入ってたせいでおかしくなってたようです
失礼しました・・・。

21:nobodyさん
11/09/18 04:20:28.78
my $error_message;
for my $data (@isbn){
if (length $data != 13){
$error_message = "length error";
last;
}
if ($data !~ /^\d+$/){
$error_message = "charactor error";
last;
}
}



次から >>1 には「use strict; use warnings; を必ず使う事」とでも書いとけ。

22:nobodyさん
11/09/18 06:57:46.48
break は last の誤用だと思われるのだが・・・

ってことで break が自作の関数だったりしなくて、ループから抜けることを意図としてるなら
last としませう。

23:nobodyさん
11/09/18 07:08:32.40
% perldoc -f break

break Break out of a "given()" block.

This keyword is enabled by the "switch" feature: see feature
for more information. Alternately, include a "use v5.10" or
later to the current scope.


24:nobodyさん
11/09/18 08:49:12.63
>>22
Perl以外のほとんどの言語はcontinueやbreakだから
他の言語を先に知っててPerlにあまり馴染みがないと
最初のうちは間違っちゃったりするよね

Perl / C,JavaScript,PHP,Ruby,Python,etc.
next / continue
last / break

25:デフォルトの名無しさん
11/09/18 09:43:41.96
単語の意味を考えると、Perl で採用した next, last の
よさがじわじわと分かる。continue, break だとあいまい
な感じがして、(単語からは)何をしてくれるのか想像しに
くい。


26:nobodyさん
11/09/18 10:47:25.20
printlnとか書いてて発狂しないのかな、あっちの言語圏は。

27:nobodyさん
11/09/18 12:27:04.36
printlnってperlでいえばsayだよな。

28:nobodyさん
11/09/18 12:29:59.21
あっちの言語圏は変数名と被ると駄目なんだっけ?

29:nobodyさん
11/09/18 12:36:42.87
>>28
関数名は動詞、変数名は名詞にしましょうねw

30:nobodyさん
11/09/18 12:47:06.08
形容詞は?

31:nobodyさん
11/09/18 15:24:44.69
引数

32:nobodyさん
11/09/18 18:47:48.04
はじめまして
現在SQLを勉強するためにPERLを使いMYSQLにつなぐ練習をしています

DBIを使用してデータベースへの接続およびテーブルを作成することはできました。
このデータを更新する為にユーザーから ユーザーIDおよびパスワード データを新規ユーザー登録フォームなどから受け取るにはどうしたらいいのか、
またデータベースから受け取ったデータから全体のソートをかけたい全表示したい場合 どうしたらいいのかわからず困っています

かってですがURLのところに?userid=foo&password=fooのようにはできるだけ表示しない方向でよろしくお願いします

33:nobodyさん
11/09/18 20:09:22.61
>>32
>>1
URLリンク(www.ifdefdebug.com)
URLリンク(perldoc.jp)

依頼されたツールを誰かが作るスレ
スレリンク(php板)
金出すからスクリプト作ってよvol.1
スレリンク(php板)
DBの絡んだWEB制作の相場
スレリンク(php板)
手伝ってくれるかた募集
スレリンク(php板)
【総合】 Webprog板質問雑談スレッド 1
スレリンク(php板)

34:nobodyさん
11/09/18 20:29:52.84
>>33
すみません・・・リンクの中を見るとフォームのデータはこれでできそうですね
テンプレを読まず・・・申し訳ない

35:nobodyさん
11/09/19 03:55:08.18 tSer8QMI
すみません、質問です

XML::Simpleを使ってXMLを解析しているのですが、 <Creator Role="イラスト">名前</Creator> 
のような属性(エレメント?)付きの値を取り出すにはどうすればいいのでしょうか?

普通に~~~->{Creator}->{Role}とすると属性の中身?の"イラスト"は取り出せるのですがその先が分かりません・・・。
もしかして::Simpleでは取り出せないのでしょうか?

36:nobodyさん
11/09/19 05:24:45.14 tSer8QMI
失礼、解決しました

~~~{creator}->{content}で中身を取り出すことが出来ました


37:nobodyさん
11/09/19 07:45:02.88 tSer8QMI
再度失礼します

現在Padreで開発しているのですが、なぜかPadre上ではうまく動いているのですが、
サーバーにUPすると500エラーを吐いてしまいます。

確認してみた所、my $ua = LWP::UserAgent->new();が原因でエラーを吐いているようで、
ライブラリ自体はちゃんと所定の場所にあり、パーミッションも他のライブラリと同じ設(705)で問題は無いはず。
そもそも頭のuse LWP::UserAgent;ではエラー吐いてないのでライブラリ自体は読み込めてるようです。

エラーの無い状態で上記のmy $ua = LWP::UserAgent->new();を追記した時点でエラーになるのですが、
これってただnewしただけでも他の物に影響を与える物なのでしょうか?


38:nobodyさん
11/09/19 09:21:31.99
>>37
URLリンク(perldoc.jp)

39:nobodyさん
11/09/19 13:08:32.75 tSer8QMI
>>38
すいません、そこは既にチェックした後だったのですが一向に解決していません
LWP::UserAgentは止めて、LWP::Simpleを使おうとするも今度はuseした時点でエラー・・・。

use LWP::Simple (); にして、後でgetすればエラーでないというのも見かけましたが関係なくエラーが。

40:nobodyさん
11/09/19 13:24:50.46
エラーの内容を画面に表示すればわかるよ。

41:nobodyさん
11/09/19 14:01:11.27 tSer8QMI
すいません、use worningsだけじゃエラーが出なかったんですね・・・

Can't locate HTTP/Config.pm in @INC
エラー先を見たらUserAgent.pm内の require HTTP::Config;  これがエラーの原因のようです

42:nobodyさん
11/09/19 16:11:08.06 tSer8QMI
まさかと思ってHTTP::ConfigをDLしてきてユーザー固有のフォルダに入れてみたら動きました
LWP:;UserAgent自体が使うファイルも色々CPANから拾ってきておかなきゃだめだったようです・・・というか外部ソース依存多すぎる

そして私の場合、レンタルスペースを利用している為、XML::Parserのコンパイルとか出来ないんですがこの場合どうしたらいいんでしょうか・・・?

43:nobodyさん
11/09/19 16:24:36.58
>>42
> この場合どうしたらいいんでしょうか・・・?
・管理者にインストールしてもらう
・設置先と同じ環境を手元にも構築してコンパイルしたものを持っていく
・設置先で利用できる形にまとめてくれている人を探して一式もらう
・Pure Perl なモジュールのみを使うよう書き換える
・サーバを替える

いずれにしてもスレ違い。

44:nobodyさん
11/09/19 16:30:26.87
pure perlな実装で代用すれば良いんじゃね。

45:nobodyさん
11/09/19 18:25:25.97
コンパイルもできるレンサバに替えるのがいいとおもふ。

#そして次は「すいません、できないと思ってたけどコンパイルできました」とか書き込まれそうな予感

46:nobodyさん
11/09/19 20:13:19.63 tSer8QMI
すいません、できないと思ったけどコンパイル・・・という冗談は置いといて、
結局 XML::UserAgent も XML::Simple も使わずに済むPurePerlな XML::TreePP を使う事にしました。

こういう放置は本当はあまりよくないんでしょうけど、とりあえず完成させたいもので、とりあえず後で再考する事に。
失礼しました。

47:nobodyさん
11/09/19 20:32:26.25
>>46
> こういう放置は本当はあまりよくないんでしょうけど、とりあえず完成させたいもので、とりあえず後で再考する事に。

いえいえ、良い選択だと思います。ご健闘を。

48:nobodyさん
11/09/19 23:13:46.60
コンパイルができないと諦めるもんじゃない。
たとえshellが使えなくともtelnet.cgiみたいなのを使って
コンパイルすればいいのだ。

サーバーの環境を特定し、それに近い環境で
自宅コンパイルしたものをアップする方法もある。
諦める必要はないぞ!

49:nobodyさん
11/09/20 00:23:18.16 VRYqCB7t
初心者です。2ちゃんの統計を出力するスクリプトを作りたくて、色んな場所からつぎはぎして作っていたのですが、問題がでて進めなくなりました。
板の中のスレの内容を表示しようというところまできたんですが、カウンターの i が動いていないような感じで、同じスレ(dat)が何回も表示されてしまいます。
ほかにもツッコミどころがあったら教えてください。
ソースは次のレスです。

50:nobodyさん
11/09/20 00:24:28.62 VRYqCB7t
全部は入らないので関わってると思うところだけ抜きました。

use LWP::UserAgent;
use HTTP::Request::Common;

$url = "URLリンク(hidar.2ch.net)";
$durl = "URLリンク(hidari.2ch.net)";

&getData($url);

$threadlist = $response->content;

while($threadlist =~ m|\n(.*?)\.dat<>|g){
        push(@dat, $1);
        }

for ($i=0; $i<=$#dat; $i++){
        $url = $durl . $dat[i] . ".dat";
        &getData($url);
        $content .= $response->content . "\n";
}

print $content;

sub getData
{
        $ua = LWP::UserAgent->new;
        $ua->agent('');
        $request = GET($_[0]);
        $response = $ua->request($request);
}

51:nobodyさん
11/09/20 00:41:47.24 VRYqCB7t
ごめんなさい、>>50です。
$url = "URLリンク(hidar.2ch.net)";
$durl = "URLリンク(hidari.2ch.net)";

はそれぞれ

$url = "URLリンク(hibari.2ch.net)";
$durl = "URLリンク(hibari.2ch.net)";

でした。別なURLでテストしてたのをごまかしたので、URLが間違っていたせいじゃないです。
ていうかdatディレクトリがそのまま見られるみたいだからそっちから抽出したほうがよかったかな・・・

52:nobodyさん
11/09/20 00:41:59.51
>>50
コードはともかく、とりあえずiはミスタイプで正しくは$iだね

53:nobodyさん
11/09/20 00:54:00.21 VRYqCB7t
>>52
できました!
ありがとうございます!!!


54:nobodyさん
11/09/20 02:27:48.40
use strict;
use warnings;
この2つは必須!

55:nobodyさん
11/09/20 21:27:29.45 P4zYemZJ
他のスレからこちらに誘導していただきましたのでここでも質問させていただきます。

初心者なのですが、どなたか教えてください。
サーバーに最新のapache(onWindowsXP)をインストールし、Activeperl(最新版)
によるcgiで、Win32::OLEをつかって、
サーバー側でAccess起動→マクロを走らせる→Access閉じる
を行いたいのですが、上手くいきません。
同じPERLソースで、AN HTTPD だと上手くいくので、apacheの設定の問題だと思うのですが、
どこをどう設定するのかが分かりません。



56:nobodyさん
11/09/20 21:29:54.54 P4zYemZJ
つづきです。すみません。

ちなみにソースは
# Accesオブジェクトを生成、起動
my $access = CreateObject Win32::OLE 'Access.Application' || die "Cannot create Access object\n$!\n";
my $mdb = 'C:/hoge.mdb';
$access -> {'Visible'} = 1;
$access -> OpenCurrentDatabase($mdb);
$access -> DoCmd -> RunMacro('hoge');
$access-> quit();
undef $access;

です。



57:nobodyさん
11/09/20 21:30:56.13
>>55-56
>>1
URLリンク(perldoc.jp)
Apache~嗜みとして~ Part3
スレリンク(php板)

58:55
11/09/20 21:33:07.43 P4zYemZJ
つづきです。最後です。すみません。

現象としては、ログにもエラーはなく、サーバー側でタスクマネージャで確認すると
Accessが起動していることまでは確認できるのですが、そのまま止まってしまいます。
タスクマネージャーからAccessを強制終了すると、それ以後のperlスクリプトが処理されるようです。
どなたか同じようなご経験をお持ちの方はおられませんでしょうか。

宜しくお願い致します。

59:nobodyさん
11/09/20 21:57:09.80
>>56
my $access = CreateObject Win32::OLE 'Access.Application' || die "Cannot create Access object\n$!\n";

my $access = Win32::OLE->CreateObject('Access.Application' || die "Cannot create Access object\n$!\n");
と等価なので CreateObject() が偽を返しても die しない。

URLリンク(perldoc.jp)

>>58
「それ以後」がどのステップを指していて処理自体は期待通りに終わっているのかどうか不明なので
同じ症状かは分からんが、「perl Win32::OLE access」でググれば

URLリンク(www.kaimei.org)
> 私が Win32::OLE から Excel へアクセスするプログラムを書いてみたところ、
> Perl スクリプトからだと問題ないのに CGI からこれを呼び出すと失敗するケースがあった。
> きちんとした原因まで把握できていないのだが、少なくともオープンする Excel ファイルのパスは
> / ではなく \ で区切らないとアプリケーション・オブジェクトの取得に失敗するようである。

という話が出てくる。

60:nobodyさん
11/09/21 12:11:47.99
PSGI に対応した WAF では何が使い易いのでしょうか?
それぞれの WAF の特色とか違いとかが分かるサイトとかあるのでしょうか?
ご教示いただければと思います。


61:nobodyさん
11/09/21 15:19:36.21
スレッドごとにファイルがあって
それをまとめるスレッドリストファイルがある場合のロックについて

ファイルロック1
スレッドNファイルへの書き込み
スレッドリストファイルへの書き込み
ファイルロック1の解除

というようにしなければならないので
例えばスレッド1にだれかが書き込んでいる最中は他スレッドでも書き込みができない
ということになる。
ということで間違いないんですか?

それとスレッドを誰かが見るだけの場合でも

ファイルロック1
スレッドNファイルの読み込み
スレッドリストファイルの読み込み
ファイルロック1の解除
としなければならないので

誰かが任意のスレッドを見ている間はどこのスレッドにも書き込めない

ということでいいんでしょうか?
そうするとロックかかりまくりじゃないんですか?

62:nobodyさん
11/09/21 15:57:23.72
それぞれのファイルに対してロックすればいいだろ

63:nobodyさん
11/09/21 16:36:39.63
>>62
それぞれのファイルにロックすると
スレッドNファイルには書き込まれて
スレッドリストファイルにロックがかかるという場合も考えられる
そうするとデータの連動がずれる


64:nobodyさん
11/09/21 16:43:12.02
>>61
マルチスレッドプログラミング相談室 その8
スレリンク(tech板)

65:nobodyさん
11/09/21 19:47:38.85
>>64
スレッドってそのスレッドじゃないと思うんだw

66:nobodyさん
11/09/21 20:45:57.38
>>61
ロックかかりまくりとはいうけど
実際は各リクエストがケンカしないように順番に処理されていくわけだから特に問題はないだろ。

67:nobodyさん
11/09/21 21:52:54.67
DBMSみたいに、まとめ役のプロセスが1つだけ起動して、もちろん複数起動しないようにして、
そいつが全部取り仕切るように動かせばいいんだ。疑似マルチタスクみたいに。

68:nobodyさん
11/09/22 00:58:45.67
ロックには排他ロックと共有ロックがあってだな
・・という話ではない、これ?

69:nobodyさん
11/09/22 01:17:49.95
シェケナベイベー

70:nobodyさん
11/09/22 01:23:50.84
>>68
この件は全部排他
横からだけど>>61の解答は気になる

71:nobodyさん
11/09/22 12:59:33.86 nJD1QeKS
教えてください
Perlで2chの特定のキーワードのスレを自動取得するCGIを改造したいのですが、

#板名「@BoadName」にある、スレッド名に「$KeyWord」を含む板の一覧を表示する。
$BoardName[0] = "大規模MMO";
$BoardName[1] = "ネトゲサロン";
$BoardName[2] = "ネットwatch";
$Keyword = "●○";

この条件のところで、大規模MMO板だけでなく、例えば
ニュー速等複数の板を指定するにはどういう風にコードを書き換えれば良いでしょうか?
なるべく簡単な方法を教えてください。

スクリプト
URLリンク(aceof.s57.xrea.com)







72:nobodyさん
11/09/22 13:11:19.13
>>71
正規表現を使えるようにすればいいんじゃないの。

73:71
11/09/22 13:39:16.30 nJD1QeKS
>>72
…?どうやるのでしょうか?
COBOLは昔習いましたが…
条件のところの
$BoardName[0] = "大規模MMO"; を
A(大規模MMO) AND B(ニュー速) のような条件にしたいのですが、
parlでの表記が分かりません。
コードを教えてください。





74:71
11/09/22 13:54:59.74 nJD1QeKS
例えば

$BoardName[0] = "大規模MMO" AND "涙目ニュース";

ではエラーになりますよね??



75:nobodyさん
11/09/22 14:45:57.55
$BoardName[0] = "大規模MMO";
$BoardName[1] = "ネトゲサロン";
$BoardName[2] = "ネットwatch";

$BoardName[3] = "ニュース速報";
$BoardName[4] = "WebProg";

でいいんじゃないかな?
Socket って使ったことないからわかんないけど BoardName で追ってみると
URLリンク(www.ff.iij4u.or.jp)
↑ここから $BoardName[n] でURL取ってるみたいだし
確認してないけど

76:71
11/09/22 15:29:52.18 nJD1QeKS
>>75
すみません、基本的に大きな勘違いをしていました

$BoardName[0] = "大規模MMO";  板名
$BoardName[1] = "ネトゲサロン"; スレット名
$BoardName[2] = "ネットwatch"; ?

かと思っていましたが、全部板名で、番号を増やしていけばいいだけですよね^^:

で、
$Keyword = "●○"; の所を2~3個指定したいんですが、
複数指定したい場合はどう書けば良いのでしょうか?

$Keyword = "●○" "●▲" "××";

$Keyword = "●○" AND "●▲";
  でしょうか?
ANDの代替がぐぐっても分かりません・・・
ちなみにスレ一覧のURLは移動してましたので書き換えます。


77:nobodyさん
11/09/22 15:44:33.61
>>71-76
【 スクリプト改造依頼スレ 】(丸投げ) part8
スレリンク(php板)
★三 【 スクリプト改造工房 PART 9 】 ★三
スレリンク(php板)
金出すから改造してよvol.3
スレリンク(php板)

78:71
11/09/22 16:01:22.71 nJD1QeKS
>>77
ありがとうございます。
あと、条件を複数指定する場合にどう記述すれば良いかだけ教えていただければ
十分なのですが…。
$Keyword = "●○" "●▲" "××";

$Keyword = "●○" AND "●▲";
  でしょうか?

それとも $Keyword = "●○","●▲";





79:nobodyさん
11/09/22 16:13:15.01
うーん
COBOLをやってたというのがよく伝わってくる思考だw

$Keyword は GetData で

if (/$Keyword/){

というふうに正規表現で使われてるから論理演算子は使えないと思われ
$Keyword を @Keyword にしていっぱい入れられるようにして正規表現で | を使うか
if じゃない関数を使うかじゃないかな~

80:nobodyさん
11/09/22 18:12:10.54 5FtK50r8
読み込んで表示だけのページ=ロックの必要はない

読み込んだデータを更新して書き込むページ=
ファイルロック1
ファイル読み込みモードでオープン
ファイルを配列に読み込み
ファイルを閉じる

データ更新

ファイル書き込みモードでオープン
更新したデータをファイルに書き込む
ファイルを閉じる
ファイルロック1の解除

これでいいはず
仮に読み込んで表示だけのページを
ファイルロック1
ファイルを読み込みモードでオープン
データを配列に入れる
ファイルを閉じる
ファイルロック1の解除とすると
表示するだけのページを開く間は書き込みができなくなるから
そうすると書き込める隙がなかなかない

81:nobodyさん
11/09/22 19:43:11.98 7t8BkGQU
use strict;
use warnings;

my @city = ("東京", "大阪", "名古屋");
delete($city[0]);
print "@city";

こんな簡単なので Use of unitialized value in join or string at *** line 6. っていう警告が出たんですが、どうしてですか?
それに Use of unitialized ... というエラーしょっちゅう見かけますが、調べてみてもよくわかりませんでした。
教えてくださいm(_ _)m

82:nobodyさん
11/09/22 19:52:11.16
delete $city[0]; で undef になった $city[0] を print するのに使ったから

とりあえずexcite翻訳から初めてみたらどうでしょうか

83:nobodyさん
11/09/22 20:01:45.61
>>81-82
URLリンク(perldoc.jp)

84:nobodyさん
11/09/22 20:15:05.37 7t8BkGQU
>>82-83
ありがとうごさいます。
@city = grep($_ ne "", @city);
で $city[0] を消しても残ってたので不便な関数だなと思いました。
undef の値を消すような操作をすればいいんですね。

85:nobodyさん
11/09/22 20:16:16.72
つshift

86:nobodyさん
11/09/22 21:48:02.28
$city[0] = "東京" を削除して詰めちゃってもいい ($city[0] = "大阪" とずれていい) なら
shift @city;
要素をずらさずに $city[0] だけ消したいなら
$city[0] = "";

87:nobodyさん
11/09/22 21:53:14.20
あれ、$city[0] = undef;とdelete($city[0]);って同じ?

88:nobodyさん
11/09/22 22:07:16.08
>>87
URLリンク(perldoc.jp)
URLリンク(perldoc.jp)

89:nobodyさん
11/09/22 23:43:44.90
delete が非推奨とか・・・splice で削除しろとか書いてあるけどさ、
巨大な配列に対して splice すると、すごく遅そう・・・

90:nobodyさん
11/09/22 23:56:59.38
>>89
Perl処理系のソースを見ずに言うが、
そのへんはパフォーマンスがガタ落ちにならん程度にはうまいこと処理してるだろうと思う。

91:nobodyさん
11/09/23 00:35:13.51
ん?配列の要素に対する delete が非推奨なのは別に問題ないっしょ?
delete $array[$n] は要素を削除するのではなくて、むしろ undef $array[$n] に近いんだから。

92:nobodyさん
11/09/23 00:37:24.81
spliceは引数多くて邪魔くさい

93:nobodyさん
11/09/23 00:38:06.92
>>89
誤読すんなよ。

(特殊挙動の切り詰めの事を想定してるなら別だが)
splice で対処しろってのは、要素を本当に削除するケースに関してだ。
@arr = 1 .. 5 ; => @arr = qw( 1 2 5 );

delete の代りなら、
splice @arr, 2, 2, (undef) x 2 なんてしなくても
@arr[2,3] = (undef)x2 ;なりの方法があろう。

94:nobodyさん
11/09/23 01:21:24.31
8万の配列に長さ1の文字列を入れて、delete、undef、spliceでベンチマーク取ったけど、
spliceが一番遅かったけど大きな速度差は出なかった

95:nobodyさん
11/09/23 01:24:44.39
>>94
あと1つか2つ桁増やしてよろしく。

96:nobodyさん
11/09/23 07:44:14.40
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
delete => sub{ my @arr = ARRAY ; delete @arr[ 99999 .. 999999] },
splice => sub{ my @arr = ARRAY ; splice @arr, 99999, 900000, (undef) x 900000 },
slice => sub{ my @arr = ARRAY ; @arr[99999 .. 999999] = (undef) x 900000 }
});
__DATA__
ARRAY => (q{x}) x 1000000
Benchmark: running delete, slice, splice for at least 3 CPU seconds...
delete: 3 wallclock secs ( 2.91 usr + 0.15 sys = 3.06 CPU) @ 2.94/s (n=9)
slice: 4 wallclock secs ( 3.17 usr + 0.14 sys = 3.31 CPU) @ 2.72/s (n=9)
splice: 3 wallclock secs ( 3.06 usr + 0.19 sys = 3.25 CPU) @ 3.08/s (n=10)
Rate slice delete splice
slice 2.72/s -- -8% -12%
delete 2.94/s 8% -- -4%
splice 3.08/s 13% 5% --

ARRAY => 1 .. 1000000
Benchmark: running delete, slice, splice for at least 3 CPU seconds...
delete: 3 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 12.82/s (n=40)
slice: 3 wallclock secs ( 3.02 usr + 0.01 sys = 3.03 CPU) @ 6.93/s (n=21)
splice: 3 wallclock secs ( 3.03 usr + 0.07 sys = 3.10 CPU) @ 9.35/s (n=29)
Rate slice splice delete
slice 6.93/s -- -26% -46%
splice 9.35/s 35% -- -27%
delete 12.8/s 85% 37% --


97:nobodyさん
11/09/24 11:44:49.89
文字コードで分からないことがあるのでご教授お願いいたします。
(utf-8 でソースを書いています)


utf-8 の半角ア -> EFBDB1
utf-16 の半角ア -> FF71

utf-8 でソースを書いているのだから、print "0xEFBDB1" で半角アが出力されるだろうと思ったら、
print "0xFF71" でないと半角アが表示されませんでした。


98:nobodyさん
11/09/24 16:12:39.72
cryptって絶対に復号化できないんですか?
パスワードをこの関数を使って暗号しようと思っていますが
この関数を使う上で欠点や注意点がありましたら教えてもらえませんか?

99:nobodyさん
11/09/24 16:30:15.23
>>98
>>1
URLリンク(perldoc.jp)

100:nobodyさん
11/09/24 16:48:02.74
>>97
半角のイなら、0xFF72です。

101:nobodyさん
11/09/24 18:00:52.20
>>97
0xは数値に対してなので、\xだと思いますが、\xは2桁までしか拾わないので、
3桁以上の場合は、{ }を使って\x{123}とする必要があります。

2桁の場合は(\x{00B1}としても2桁と解釈されます)、その値そのもののバイナリ
文字列となります。

print "\xEF\xBD\xB1";

これ↑は、UTF-8として解釈すれば「ア」を意味するバイナリ文字列です。
ただし、Perlがこれを文字列処理するときはISO 8859-1という文字コードの3文字
として扱います。

3桁以上の場合は、その値のUnicodeコードポイント(U+FF71)のテキスト文字列となります。
( Perlは、"\x{FF71}"を「ア」という1文字として扱う)

バイナリ文字列(=バイト文字列)とは、バイト単位で処理される文字列のことです。
テキスト文字列とは、文字単位で処理される文字列のことです。

102:nobodyさん
11/09/24 18:01:21.98
>>99
リンクありがとう~ とりあえずこれ使ってみることにします


103:nobodyさん
11/09/24 19:43:27.75
>>101
ありがとうございます!

104:nobodyさん
11/09/26 12:35:58.38
トリップを生成する仕組みなんですが、

if (length $handle_pass >= 12)
{
my $mark = substr($handle_pass, 0, 1);
if ($mark eq '#' || $mark eq '$')
{
if ($handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|)
{
$GB->{TRIPSTRING} = substr(crypt(pack('H*', $1), "$2.."), -10);
}

文字列12バイト以上で、先頭が#または$の場合、
$handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|を行なって
cryptによって生成していると思います。

しかし、$GB->{TRIPSTRING}や$1や$2をprintすると何も表示されません。
$handle_pass =~ m|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|では何を行なっているのですか?
教えてください。

105:nobodyさん
11/09/26 12:55:07.21
>>104
関係ないけど、これ $ から始まる場合何もしてないよね

106: ◆???
11/09/26 13:01:10.88
>>104
##0123456789abcdefxx 形式のトリップキーかどうかのチェックだろ

>>105
>>104は書いてないけど実際はelseがある
2chでは今のところ単に予約としてとってあるだけらしいから???になるだけだけど

107:104
11/09/26 14:03:37.14
>>105-106
ご回答ありがとうございます。
もう一度正規表現を調べますので、
その後、質問させてください。


108:104
11/09/26 17:00:08.24
先頭が#で始まり16進数文字が16個連続し、
末尾は./0-9A-Za-zのいずれかが0個以上2個以下連続する。

ですよね?

#0123456789abcdefxxは真
#0123456789abcdefxxxは偽
#0123456789abcdefは真

#0123456789abcdefあ が偽なのは、なぜでしょうか?

また、[[:xdigit:]]の[]が二重でくくられている意味を教えてください。

109:104
11/09/26 17:01:58.51
すみません、書きこんで気づきましたが、

#0123456789abcdefも偽ではないのか?と思います。

110:nobodyさん
11/09/26 18:06:25.07
あ は [a-zA-Z0-9] かどうか
f の後ろに続く判断が ? なのか + なのかで意味合いが変わってくるかと。

トリップキーの規格をもっかい調べてみればよいかと。

111:nobodyさん
11/09/27 00:54:20.16
ファイルのロックはmkdirなどでロック用ディレクトリ
を作る方法は良く見かけますがディレクトリではなく
openでロック用ファイルを作るというのは問題があるんでしょうか?

112:nobodyさん
11/09/27 01:02:44.10
rename とか mkdir はシステムコールを使ってるから、open より割り込まれる余地が少ない。

とかじゃなかったっけ?


113:nobodyさん
11/09/27 01:31:29.84
>>111
URLリンク(www.din.or.jp)

今時 flock を使えない環境に出くわす事も稀だがな。
URLリンク(perldoc.perl.org)

114:nobodyさん
11/09/27 02:07:22.29
モジュールを作ってて、そのモジュールの中では use utf8 とか、open(my $in, '<:utf8', '~') とかしてます。

しかし use utf8 してないスクリプトから呼ばれた時には、これだと文字化けが起きてしまいます。
そのため use utf8 されていない場合にはフラグを落として返したいのですが、
モジュールを呼んだスクリプトで use utf8 されてるかどうか調べる方法はあるのでしょうか?


モジュールが特定の文字コードに依存すること自体が駄目だとは分かっては居るのですが・・・


115:nobodyさん
11/09/27 04:57:52.69
>>112
余地が少ないんじゃなくて余地が無い、
つまり処理がアトミックでないとだめなんだよ。
「余地が少ない」んじゃ意味ないの。

116:nobodyさん
11/09/27 11:02:16.14
flock(XX, 2)
でデッドロックが発生した場合はどうなるんでしょうか?
あと、待ってる間は自動でsleepしてくれるんでしょうか?

flock(XX, 6)
で自分で実装するのとどちらが良いのか迷ってます。

117:nobodyさん
11/09/27 19:02:14.19
すいません。プログラムを定刻になると自動で実行するようにしたいんですが、できますか?
レンタルサーバに置きます。
全体を無限ループをしてsleep()で休むというのを考えたのですが、無限ループは一番やってはいけないらしいですね。

あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、
この方法だと時限以外にもCGIにアクセスされたときに実行してしまうと思います。
JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?

118:nobodyさん
11/09/27 19:46:39.67
>>116
>明白ではないものの、伝統的な flock の動作としては、ロックが得られるまで 無限に待ち続けるものと、単に勧告的に ロックするものの二つがあります。

>>117
cronのことを聞いてる?

119:nobodyさん
11/09/27 21:07:32.00
>>118
その説明を読んで具体的にどうなるのかが分からなかった
伝統的とか無限とか

・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は?
・デッドロックかかったらプロセスはどうなるのか
・待ってる間の負荷は

この辺りが気になる。

120:nobodyさん
11/09/27 22:48:37.67
・複数のプロセスが待ち状態になった場合に、次にロックを得られる順番は?
システムにしか分かりません

・デッドロックかかったらプロセスはどうなるのか
flock を待つオプションで呼び、他のプロセスが死ねばロックは外れるので先に進めますが、
mod_perlなどではプロセスは死なないのでflockは掛かったままになります。
なので、flockを呼ぶときは待たないようにしましょう

121:nobodyさん
11/09/27 23:25:00.27
flock呼んだ順番になるのか、ランダムになるのかの2択くらいかと思ったんですが、後者って認識でいいです?

無限に待ち続けるとあるんですが、待たないようにする方法もあるんでしょうか?

あと、大量のプロセスが待ち状態になった場合の負荷も気になります。
大人しく待ってるんでしょうか?

122:nobodyさん
11/09/27 23:54:57.99
unlock時に起き上がったプロセスがロックを取れる
LOCK_NBだ、ドキュメントぐらい読め
sleep以外に何をするのか、それ以前にロック待ちが大量にある時点でどうか

123:nobodyさん
11/09/28 01:15:39.74
>>117
>>118 の書いているとおり通常はcronを使う。と思う。

> あと検索するとすぐJavaScriptで自動更新する方法が出てきますが、

「プログラムを定刻になると自動で実行」させるのにJavaScriptをどうやって使うの? 意味がわからん。

> JavaScriptだけに実行させたいときはパーミッションをどう設定すればいいですか?

さらに意味がわからん。

124:nobodyさん
11/09/28 01:29:17.95
>>123
俺は最初、サーバサイドでjavascriptを動かすnode.jsのこと言ってるのかと思った。
cronを扱うためのapiもあるみたいだし。
perl関係ないけど。

125:nobodyさん
11/09/28 02:00:23.29
>>122
ありがとうございました。
LOCK_NB使わずに待たない方法があると勘違いしてました。
素直に自分で実装します。

126:nobodyさん
11/09/28 13:39:10.69
ファイルの読み書きでトランザクションを実現するモジュールを apache が標準で持ってくれるとありがたい

127:nobodyさん
11/09/28 17:26:59.68
ファイルの読み込みは@lines = <IN>で一括して配列に入れていますが
while<IN>で1行ずつ読み込む方がいいんですか?
配列を引数にしたり戻り値にしたりする場合が多いから
どうしても一括読み込みが多くなってしまいますが
一括読み込みだとそんなにメモリの負担になりますか?

ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?

128:nobodyさん
11/09/28 18:31:25.70
GB単位でファイルを処理する人間だと、while で回すなりの工夫は必要だけど、
今のご時世だったら、殆どの人は気にする事は無いでしょ。

>ていうか<IN>自体にもファイル全部のデータが格納されているんですよね?
そんなスーパーな挙動を取られたら、5GBファイルを 2GB メモリの PC で解析
出来ないじゃないですかっ


129:nobodyさん
11/09/28 21:17:17.61
一行づつ読み込んだら遅くなる。

130:nobodyさん
11/09/28 22:32:03.45
% perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt
% cat hoge.pl
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; @arr },
whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } close $fh ; @arr },
aho => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; for (<$fh>){ push @arr, $_ } close $fh ; @arr },
});
% perl hoge.pl
Benchmark: running aho, arr, whi for at least 3 CPU seconds...
aho: 3 wallclock secs ( 2.76 usr + 0.35 sys = 3.11 CPU) @ 48.87/s (n=152)
arr: 3 wallclock secs ( 2.72 usr + 0.41 sys = 3.13 CPU) @ 56.55/s (n=177)
whi: 3 wallclock secs ( 2.85 usr + 0.30 sys = 3.15 CPU) @ 70.79/s (n=223)
Rate aho arr whi
aho 48.9/s -- -14% -31%
arr 56.5/s 16% -- -20%
whi 70.8/s 45% 25% --


131:nobodyさん
11/09/28 22:55:36.32
>>130
コメントは大事だよー
whileが一番速いのか 理由は何なんだろうな

132:nobodyさん
11/09/28 23:04:50.68
whileでファイルの2行目から読み込むのってどうやるんですか?

133:nobodyさん
11/09/29 00:01:53.09
<FH>;
while (<FH>) {
}

134:nobodyさん
11/09/29 00:44:49.60
>>131
ファイルがメモリにキャッシュされたから。
最後に書いたほうが早くなる。

135:nobodyさん
11/09/29 00:45:39.00
訂正
最後に処理されたもののほうが早くなる。

136:nobodyさん
11/09/29 00:54:10.24
最後も何も2回目以降同じじゃね
仮にキャッシュされてるんなら

137:nobodyさん
11/09/29 01:02:01.08
>>135
適当に順番入れ替えてやってみ。
結果はほとんど変わらないから。

ていうかよく見たら一番最後に処理したahoが一番遅いじゃねーか。

138:nobodyさん
11/09/29 01:09:34.61
やっぱり一度に全部読んだほうが2倍以上速かったな。

all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},


139:nobodyさん
11/09/29 01:35:54.32
一度に全部読んだほうが処理がしやすい場合が多い

ファイルの下に行くほど新しい書き込みの場合
最新のn件を表示する場合はwhileで1行ずつは難しいな
@linesに全部読み込んで@linesの配列の後ろからn番までを切り取って表示すれば簡単だな

140:nobodyさん
11/09/29 01:40:46.41
結局のところ「用途による」だろ

141:nobodyさん
11/09/29 01:53:22.20
>>139
ファイルの最後の方から読んでいって
改行の数を数えたほうが早いよ。

142:nobodyさん
11/09/29 02:22:14.02
ファイルの最後の行から上の行に向かって1行ずつ取り出せるの?
ファイル読み込み位置操作できるのseekしか見つからなかったが
これ行単位じゃなく後ろからのバイト数なんだよな

143:nobodyさん
11/09/29 02:39:16.38
ゆとりか。作れよ。

144:nobodyさん
11/09/29 04:40:11.37
>>142
URLリンク(www.din.or.jp)

145:nobodyさん
11/09/29 06:43:00.87
>>137
一応書いとくが、Benchmarkのサブルーチン実行は記載順じゃないぞ。
勝手にソートされる。
もちろん、135の意見に同意するわけでは無いが。

ahoが遅いのは、明白に(<$fh>)の時点でメモリに確保(無名配列への代入と同等)
されてて、その後に@arrにpushしてるから、遅いの当たり前。
サブルーチンの名前が「アホ」な時点でネタだと分る。


146:nobodyさん
11/09/29 07:40:54.50
AWKのAの人ディスってんの……

147:nobodyさん
11/09/29 08:22:35.67
>>130
以下は自分の推測。
正しいかはわからない。

@arr = <$fh>;は、まずreadline関数内で、全行のリストが作られ、それが@arrにコピー
されるので「@arr+全行リスト」のメモリを使う。

while (<$fh>){ push @arr, $_ }は、1行だけが$_に入るので、「@arr+1行分」のメモリ
しか使っていない。

メモリ使用量の差が速度差に出たと。

148:nobodyさん
11/09/29 11:31:16.87
>>130
7.8MB のテキストファイルでぶん回してみた

Benchmark: timing 10000 iterations of aho, arr, whi...
aho: 1337 wallclock secs (1157.39 usr + 103.11 sys = 1260.50 CPU) @ 7.93/s (n=10000)
arr: 1284 wallclock secs (1118.88 usr + 102.05 sys = 1220.92 CPU) @ 8.19/s (n=10000)
whi: 921 wallclock secs (768.06 usr + 104.30 sys = 872.36 CPU) @ 11.46/s (n=10000)
Rate aho arr whi
aho 7.93/s -- -3% -31%
arr 8.19/s 3% -- -29%
whi 11.5/s 44% 40% --


149:nobodyさん
11/09/29 16:22:24.12 zOJkGfGB
sendmailとperlで質問です。
メールからプログラムを起動したくて色々設定を行っているのですが
どうにも行き詰ってしまいました。

CentOSにwebminを入れて管理しています。
sendmailにエイリアスを利用してプログラムを起動しようとしているのですがうまくいきません。

とりあえず外部からのメールは受信出来ている状態です。
登録用のエイリアスにプログラムに送ると合わせてユーザーにもメール配信していますが
そちらには届いている事を確認済みです。
smrshについてはリンクを設定済みでエラーは返ってこなくなりました。

この状態で簡単なプログラムを作成して動作確認を行おうとしたのですが
プログラムが動きません。

#!/usr/bin/perl --

open(OUT, ">> datafile.txt");
print(OUT "動作確認\n");
close(OUT);

試しでこのようなコードを置いてるのですが動きません。
プロンプトから動作させた場合は正しくファイルに書き込まれています。

エイリアスの指定の仕方がまずいとかでしょうか?

エイリアス名: "|/usr/bin/perl /var/www/html/プログラム名"
のような感じで指定しています。
直接
エイリアス名: "|/var/www/html/プログラム名"
としてもダメでした。
もしわかるかたがいらっしゃいましたらよろしくお願いします。

150:149
11/09/29 16:24:24.50 zOJkGfGB
追記
パーミッションは
プログラム755
書き込み用ファイル666
としています。

151:nobodyさん
11/09/29 16:36:26.36
まずすべきことは、エラーログを見てみる。

152:nobodyさん
11/09/29 16:41:31.46
>>149
メールがサーバに届いているなら、/var/log/maillogかなんかに出ているログを確認するというのが基本です。
気になったのは、ファイルパス。シェル上ではログイン時にそのユーザー派のホームディレクトリにカレントパスがセット
されますが、sendmailで受けた場合はそのパスにならないのだから、絶対パスで指定する必要があります。

153:nobodyさん
11/09/29 16:41:44.87
> open(OUT, ">> datafile.txt");
この datafile.txt はどのディレクトリに書き込まれるの?
パーミッションエラーで書き出せないとかじゃないの?

154:149
11/09/29 16:59:53.15
>>152,153
盲点でした絶対パスで書いたら問題無く書き込めてました。
ありがとうございました!

155:nobodyさん
11/09/29 17:44:48.07
結局Perlは関係なかったね。

156:nobodyさん
11/09/29 17:51:14.58
せやろか?

157:nobodyさん
11/09/29 21:10:32.23
せのつくあれをやるなんていやらしい

158:nobodyさん
11/09/29 21:45:52.72
最近じゃ、小学生どうしでもするんですってね、






せいくらべ。

159:nobodyさん
11/09/30 03:01:50.06
投稿の表示の上にページ数を載せたい場合
最大ページ数=投稿数/1ページあたりの表示数の少数切り上げだから
投稿数がわからないと最大ページ数がわからないわけだから
whileだと最初にwile(<IN>){$toukousuu++;}で投稿数出してそのあとwile(<IN>){表示}の
2回ループしなきゃならないけど@lines一括読み込みなら$toukousuu=@linesのforeach(@lines){表示}の1回ループですむ

160:nobodyさん
11/09/30 03:40:56.53

   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |       >>159
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /


161:nobodyさん
11/09/30 09:23:13.25
スレリンク(affiliate板)
akiyan降臨中w

162:nobodyさん
11/09/30 12:34:30.65
>>160
何で釣り扱いされているのかわからんw
じゃあ例えばファイルの下から10番目までの行であるならばフラグを立てるという場合
while(<IN>){

$aaa = $toukousuu-10;

if($count>=$aaa){
$flg = 1;
}
else{
$flg = 0;
}
$count++;
}
としなければならないが$toukousuuを求めるのはこれよりまえにwhile(<IN>){$toukousuu++;}とする必要が
あるのはわかるだろ。
つまりwhileだとループを2回しなければならんのだよ

163:nobodyさん
11/09/30 13:19:30.58
             |
~~~~~~~~|~~~~~~~~~~
   >( c´_ゝ`)  |
            |
>( c´_ゝ`)     J
     >( c´_ゝ`)



             |
~~~~~~~~|~~~~~~~~~~
             |     >( c´,_ゝ`)
             |
             J   >( c´,_ゝ`)
                    >( c´,_ゝ`)

164:nobodyさん
11/09/30 18:04:53.60
>>162
うん。そうだね。それで?それがどうかしたの?

って感じ。

165:nobodyさん
11/09/30 18:27:33.76
>>164
だって2回ループするとその分重くなるじゃん

166:nobodyさん
11/09/30 18:55:57.64
>>165
どのみち全数読み込まなきゃいけないんだったらもちろん一括読み込みすればいいんだけどさ。
しかし重くなるのが嫌だったら投稿数などのインデックス情報の類は別途保存して、
独立して管理するという方法もあるぞ。
そうすれば $count = @array; みたいにいちいち配列の要素数を数えなくても済む。

167:nobodyさん
11/09/30 19:33:37.65
>>165
slurp の方が早いよって主張ならまだしも、、、
>>130の結果が理解出来てないだろお前さん。
% perl -le '$s = q{x} x 1000000 ; $s =~ s/(.{1,50})/$1\n/g; print $s ' > test.txt
% cat hoge.pl
use Benchmark qw( timethese cmpthese ) ;
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; my @arr = <$fh> ; close $fh ; printf STDERR "%d\n", scalar @arr ; for ( @arr ){ print STDERR; } },
whi => sub { open my $fh, q{<}, q{test.txt} ; my @arr ; while (<$fh>){ push @arr, $_ } ; close $fh ; printf STDERR "%d\n", $. ; for ( @arr ){ print STDERR; } },
});
% perl hoge.pl 2> /dev/null
Benchmark: running arr, whi for at least 3 CPU seconds...
arr: 4 wallclock secs ( 2.00 usr + 1.23 sys = 3.23 CPU) @ 242.11/s (n=782)
whi: 4 wallclock secs ( 1.95 usr + 1.29 sys = 3.24 CPU) @ 254.94/s (n=826)
Rate arr whi
arr 242/s -- -5%
whi 255/s 5% --


168:nobodyさん
11/09/30 20:14:25.09
>>166
全部読み込むにしても一括読み込みだとメモリ食うよ
一行ずつ回す方がいい

>>167
読んだけど意味が分からない

169:nobodyさん
11/09/30 20:49:46.04
165の「重い」ってメモリの重さの話か?
速度の話だと誤読したわ。

速度だと既に結論が出てて、>>130理解してれば、
while(<$fh>){ push @arr, $_ ; } が、@arr=<$fh>;
より早いんだから、後の処理が同じなら何回ループ回そうが、
無関係。カウンタを自分で付けようが、 $. 利用しようが同じ。

メモリ?
んなもん、同じファイルなら、
@arr =<$fh> ;だろうが、一行づつ回そうが誤差範囲だろ。
それを何回回そうが無関係。
@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ;
なんかするんだったら多くかかるのは当然だけど。

sub myps { print `ps ux $$`};
myps;
# お好きなコード
myps;
でもして差分取れば?

170:nobodyさん
11/09/30 20:50:40.41
×@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ;
◯@arr = do{ local $/ ; $buf = <$fh> ; split /^/ms, $buf ; } ;


171:nobodyさん
11/09/30 21:29:34.48
釣りにマジレス
>>159
open my $fh, '<', 'hoge.pl' ;
while ( <$fh> ){ }
print "$.\n" ;
while ( <$fh> ){ print }
close $fh ;
このコードを hoge.pl として保存して実行してみろ。

と言うことで、
>>167
165 の言う「2回ループ」は上のコード、好意的に判断しても
「ファイルハンドル開き直してのファイル読み込み2回」って意味だ。
あなたの突っ込みは通じない。

172:nobodyさん
11/09/30 23:04:33.02
あれ?まだやってるの?

ほんとうの意味でファイルを一括で読むこっちが
一番速いって答えは出たと思うんだけど。
all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')); close $fh ; return split("\n", $buf);},



173:nobodyさん
11/09/30 23:07:07.88
foreach ( split/\n/, $buf ) {}
はい

174:nobodyさん
11/09/30 23:11:26.42
もうその話しじゃなくなってんだが、まあ突っ込んでやる。
同等の条件にすると話しにならんくらいarrの方が早い。
cmpthese timethese ( undef, {
arr => sub { open my $fh, q{<}, q{test.txt} ; <$fh> },
all => sub { open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf);},
});
結果↓
Benchmark: running all, arr for at least 3 CPU seconds...
all: 3 wallclock secs ( 2.72 usr + 0.36 sys = 3.08 CPU) @ 1366.56/s (n=4209)
arr: 4 wallclock secs ( 1.51 usr + 1.66 sys = 3.17 CPU) @ 30816.72/s (n=97689)
Rate all arr
all 1367/s -- -96%
arr 30817/s 2155% --



175:nobodyさん
11/09/30 23:13:06.26
174はまちがい
スカラーコンテキストで評価されるわw


176:nobodyさん
11/09/30 23:21:35.32
まちがい。arrは遅かったw

177:nobodyさん
11/09/30 23:22:41.29
@arr =<$fh>がファイル一括読み込みよりも
遅いのは当たり前の話で、内部的に一行づつ読み込んでいるから。

178:nobodyさん
11/09/30 23:23:54.55
同等の条件
arr => sub { my @arr = sub{ open my $fh, q{<}, q{test.txt} ; <$fh> }->() },
all => sub { my @arr = sub{ open my $fh, '<', 'test.txt'; my $buf; read($fh, $buf, (-s 'test.txt')) ; split(/^/ms, $buf); }->() },
まあ、 all の方が早いわな。

179:nobodyさん
11/09/30 23:56:34.45
                    亠ァ厂|        `':,;..:..:.';.     ;'..:..:.,:'
                       ‐个 兀          `:;:.::.':.,   ,':.::.:,:'
`.:`.:''''..:.‐ :.:-:.:...,,,, __   、‐-、        __   ,.‐z_,-、   '':;;:::':, ,...;'::..:,;'  ,,.:':
..:..:...:..:..:...:...:...:.:..:...:...:..:.`_,,ノ └¬、'''.:.:‐:..,,ヾ、__)∠,ィク /,、   ';:''..:.:..:..:.:..:.'':;'':.:.,;.
.:..:...:..:..:...:...:...:.:..:...:...:..:.ヾ、_   <^'".:..:..:.:..: <`ヾ´~_  _~´ 〉'''':.::.;':.::...:.:..:..:..:...:.:.';' ,,
..:..:...:..:..:...:...: ,,;,;,;,,;:..:..:.:.:..: / /\ `ヽ、..:..:.:..:..:_ブ∧ ‐ ‐ /.:.:..:,;,::';..:..:..:.:..:..:..:...:.:.:''´:.:
:..:.:..:..,.:-~' , 、m_)°.:.:.'ー-'..:..:..:`ー--',,;,;::.:.:ヽ、_i (_,/しヘヘ_) ´  '::;.:.::.:..:..:..:..:.:..,;'` ''
,;,,;,;/  <て_;:、。.:° ‐ '''' " ´ ´               ,;:''.:.:,:'' :;,._.:,;.,、:.'':.,,_
  / r'7ァッーヘ、_) ゚                      ,,:''.:.:,:'' , -~''ヽ‐-‐、.:.:.''
-く  レ'/〈 °   。     ,ヘVフヽ、          ,,:''.:.:.:,:''  (_,ヘ、     ⌒
  V巛〈 ヽ  , ~''ヽ    / e ヽノ\ヘ.      ,,:.''..::.:,:'' 。     と_刀Tゥー
_/ ヾ ヽ、 Y ァ个~'。゚  ,少ー- 代ヽ、 ヾゝ   ,,.: '':.:/ヽ、' 。 ゚ (⌒⌒ー-く ノノ,!j
 {.   \ Y巛〈       ) l㌶㍑レ゙く  \''.:.::.:.:.:/ / 入 ゚ 。 `~<ヾヾ、,`⌒ ~
_, ヘ、  ヾ{ ヾト、      'ヾゝャ㍑メ㌫㌔   ヾヨ /〃/ _,,>    〉〉ノ `厂丁`
   \  \  ヽ、    `ゞへ㍊㌶㌍㍉  ゞ㌧f‐ '' ´      ////  ノ
─~ ⌒ヽ、  \   ヽ、    ´`'‐ニ世三r<㌣´       _,,ノ,〆   /
    __,, へ、 \   ` ー- 、__      _,, --‐‐ ''´     _ - ´  /
 ̄ ̄      \  ` ー- 、 _     ̄ ̄ ̄       _, -~< -一 ブ
          ヽ、、       ̄` ー─----─ ´ ̄    _ -一 ´

180:nobodyさん
11/10/01 01:21:20.72
>>179
話の流れを追う気はまったくないが
このAAはおめでたさ満点でよかった

181:nobodyさん
11/10/01 20:11:38.10
画像を送信するときなんかはフォームと画像のデータが1つになった
変数で送られるからwileで1行ずつ回すというのは無理だな
こういう場合は画像が大きければ大きいほど、どうしてもメモリは食う

182:nobodyさん
11/10/04 02:02:20.47
>>182
まあそうだろうなmalti-partの場合も
read(STDIN,$buff,$ENV{'CONTENT_LENGTH'});
で$buffに全部の送信データが格納されるから
画像が大きいほどメモリは食う

183:nobodyさん
11/10/04 04:12:16.99
>>182
再帰アンカー/ひとり循環リスト乙

184:nobodyさん
11/10/06 12:31:19.56
すいません
read(STDIN, $data, $ENV{'CONTENT_LENGTH'});
print $data;
だけのスクリプトを書いたんですが
Use of uninitialized value in read at ~と出ます
これなんでですかね?

185:nobodyさん
11/10/06 12:50:34.41
>>184
URLリンク(perldoc.jp)

本当にその2行だけなのなら、
-w オプションが効いている下で $ENV{'CONTENT_LENGTH'} を未定義のまま実行したからだろう。

186:nobodyさん
11/10/06 13:13:47.41
>>185
ありがとうございます。他のところがおかしいんじゃなくてよかったです。
これは入力がなければ出るものなんですね。

187:nobodyさん
11/10/06 14:16:31.01
>>186
> これは入力がなければ出るものなんですね。
違う。$ENV{'CONTENT_LENGTH'} が未定義 (undef) だから出ている。
STDIN からの入力が無くとも $ENV{'CONTENT_LENGTH'} に 0 が入っていれば出ない。

> Use of uninitialized value%s
> (W uninitialized) 未定義値を、あたかも既に定義されているかのように使用しました。
> これは、"" か 0 と解釈されますが、間違いの可能性があります。
> この警告を止めるには、変数に定義された値を代入してください。

188:nobodyさん
11/10/06 15:00:33.35
>>184
この「だけのスクリプト」ってのは嘘だな。
CGIとしてだったらこの2行だけでは動かない。

189:nobodyさん
11/10/07 00:00:35.18
SSI使わずにHTML上にCGI呼び出す方法って<script>タグ以外にありますか?

190:nobodyさん
11/10/07 01:23:00.44
>>189
<script>タグ勘違いしてる。それはクライアント側での処理だから。
ttかHTML::Templateなどのテンプレートエンジンを考えてみたら。

191:nobodyさん
11/10/07 03:51:57.20
>>189
img、iframe、cssのimport

192:nobodyさん
11/10/08 14:37:18.51
URLリンク(github.com)
の make test は Result: PASS になり、
SYNOPSIS にあるコードを動かしてみたところ、

Can't call method "add_handler" on an undefined value at /usr/lib/perl5/site_perl/5.10/WWW/BBS/2ch.pm line 39.

と出ました。なので 2ch.pm:39 を見ると、

URLリンク(github.com)
my $class = shift;
my $self = bless {
ua => LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION"),
encoding => 'shift_jis',
@_,
}, $class;

$self->ua->add_handler(

という感じです。

Dumper $self->ua; すると undef です。

エディタを開いて試しに自分で
$ua = LWP::UserAgent->new(agent => "Monazilla/1.00 WWW::BBS::2ch/$VERSION");
$ua->add_handler(
とか書くと $ua は取得できて add_handler も動くので CPAN モジュールは問題なく入っているようです。

my $self = bless {} が怪しいのですが、どうすれば WWW::BBS::2ch の SYNOPSIS を動かせるでしょうか。


193:nobodyさん
11/10/08 17:51:50.13
>>192
$self->{ua} で許して

194:nobodyさん
11/10/08 18:24:39.39
$self->ua;

sub ua{ }


は定義されてるの?

195:nobodyさん
11/10/08 23:56:07.90
>>192
どうも URLリンク(github.com) の例が間違っているみたい。
| my $bbs = WWW::BBS::2ch->new(cache => $cache, ua => $ua);
ここで $cache, $ua なんて存在しないから。
その通りに入力したら $self->ua は undef になるだろう。ためしに引数無しで
| my $bbs = WWW::BBS::2ch->new;
としたらどうだ。

196:nobodyさん
11/10/09 16:35:15.15
いまどきCGI.pmって見かけたけど、フレームワーク使えって意味だろうか。
わざわざフレームワーク通すまでもないときはどうするのがモダンなの?


197:nobodyさん
11/10/09 17:53:18.28
URLリンク(cgi-lib.berkeley.edu) ん?いや、何でもない…

198:192
11/10/09 18:49:28.44
>>195
うわああ、ありがとうございます!
動きましたぁばばばば。

199:nobodyさん
11/10/11 23:38:30.50 Xx0lESYm
間違えて「プログラム技術板」に質問を書いてしまいましたが
此方で改めて質問させて下さい。

その1------------
DBIからのSqlサーバへの接続方法をご教示下さい。
質問場所がここじゃなかったら誘導お願いします。

以下の環境を作成し、
コマンドプロンプトからtest.plをCALLしたのですが
SQLサーバがないとのエラーが表示され、接続出来ませんでした。
値を色々変えてみたりしたのですがどうやっても接続できず…
何が悪いのかお手上げ状態です。

接続文字列が悪いのでしょうか…?

ODBCでの接続は行えており、CSEからのDB参照や
コマンドプロンプトからのsqlcmdコマンドでなら正常にアクセスできます。
[sqlcmd /E /S PC-Name\SQLEXPRESS]

環境
・Windows7
・Microsoft SQL Server 2008
・Perl5.0


Server:PC-Name\SQLEXPRESS
DB:sampleDB
User:user
Password:pass



200:nobodyさん
11/10/11 23:39:50.63 Xx0lESYm
-----------------------
test.pl
-----------------------
$dataSource = "dbi:ODBC:".
"driver={SQL Server};".
"Server=(local);database=sampleDB;".
"Trusted_Connection=yes;".
"AutoTranslate=No;";
#データベースに接続
$user="user"; #ユーザ名
$pwd="pass"; #パスワード
$dbh = DBI->connect($dataSource,$user,$pwd)
or die $DBI::errstr;
# データアクセス(今は処理無し)
$dbh->disconnect;
-----------------------
エラー内容
-----------------------
DBI connect('driver={SQL Server};Server=(local);database=sampleDB;Trusted_Connec
tion=yes;AutoTranslate=No;','user',...) failed: [Microsoft][ODBC SQL Server Driver
][Shared Memory]SQL Server が存在しないか、アクセスが拒否されました。 (SQL-08001
) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28
[Microsoft][ODBC SQL Server Driver][Shared Memory]SQL Server が存在しないか、ア
クセスが拒否されました。 (SQL-08001) [state was 08001 now 01000]
[Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Connect()). (S
QL-01000) at dbtst.pl line 28.
-----------------------


201:nobodyさん
11/10/11 23:40:28.76
馬鹿には見えないtest.plが張ってあるらしいな

202:nobodyさん
11/10/11 23:48:58.55 Xx0lESYm
その3------------
「その2」を付け忘れてしまいましたが
199-200でワンセットです。

Linux + MySql5.0 + DBIで動作しているシステムを
改造する為のローカルサーバを作成したいので、
どうしてもDBIを使用したいと考えています。

よろしくお願いいたします。


203:nobodyさん
11/10/12 01:55:18.70
> Server=(local);
この表記はアリなのか?


204:nobodyさん
11/10/12 04:13:51.23
>>201
そうみたいだね。

205:nobodyさん
11/10/12 08:22:59.76
よくわからないから外れてるかもしれないけど
sampleDBが文字列じゃなくて変数になってないか?

206:nobodyさん
11/10/12 12:30:39.86
'' で囲ってみ

207:199
11/10/12 18:44:51.34 QKPkC9MD
アドバイス有難うございます。

>>203
Server=(local);
の表記は、ネット上で拾ったやり方をそのまま使っているので
使える…とは思うのですが…。ちなみに、
Server='PC-Name\SQLEXPRESS';
にしても状況変化なしです。

205 206>>
"database='sampleDB';"
に変更してみましたが、変化なしです。


エラーメッセージで
「SQL Server が存在しないか、アクセスが拒否されました」
とあるので、DBではなくServerへの接続が
失敗しているのではないかと思うのですが

Windows7の場合カーネルの違いから挙動が異なる
といった事はありませんでしょうか?


208:nobodyさん
11/10/12 19:15:26.58
>>207
いっそのこと、ODBC データソース アドミニストレータ で定義してしまいば?

209:199
11/10/12 20:45:40.79 QKPkC9MD
>>208
有難うございます!

ODBC経由でDBに接続する事でアクセする事が出来ました(>_<。
ユーザDSNに「dbgSQLServer」の名前でDBを登録し、
$dataSource= "dbi:ODBC:dbgSQLServer";
としたら無事SQLの実行まで確認できました。

直接接続する事にこだわる必要は無かったんですね。
何日も悩んでいた事だったので本当に助かりました。

有難うございました。

210:nobodyさん
11/10/12 22:01:53.09
>>209
よかったよかった!
Windows+PostgreSQLでDBD::Pgが使えなくて困ったときにそうしたんだ。
その時PgPPどころかCPANもわからなかったあのころ。
車輪何個も作っちゃったけど、キニシナイ

211:199
11/10/13 18:35:59.97
>>210
本当有難うございました。

PostgreSQLは使ってみようとインストールする時点で
挫折した記憶が…(^^;

プログラムををゴリゴリ書くのは楽しいんですが
何時も環境構築が一番のネックになります。

これでやっとコーディングに入れます♪

212:nobodyさん
11/10/17 23:46:25.75
ファイルロックについて質問です。

自分は今は rename とか mkdir とか使ってロック機構を実装してますが、
お仕事とかで perl を使ってる人はファイルロックする際には rename とか
mkdir とかでロックかけてるのでしょうか?
それとも flock を使用しているねでしょうか?

「DB 使えや」 ってゆう回答は求めておらず、ファイル読み書き時に於けるロックは、
仕事などではどう対応されているのか気になったもので、質問させていただきました。


213:nobodyさん
11/10/18 01:32:44.53
確かに「DB使えや」ではあるなw

以前、自分が入社する前に書かれたソースを見たことがあるんだけど、その時はflockを使ってたっぽい。
ただflockすれば良いというものでもなく、きちんとした方法で使わないと全くの無意味だけど。

あと、今ならその辺を上手くやってくれるモジュールがるような気がする。

214:nobodyさん
11/10/18 06:58:20.05
flockは使えない場合があるので(具体的には自分で調べてくれ)
その場合はmkdirなり使うとかの、別の方法で対処すると思う。
プロとかアマとかはあんまし関係ないんじゃないだろうか。

215:nobodyさん
11/10/18 12:47:22.63
今のご時世でもflockが使えないとかあるの?

216:nobodyさん
11/10/18 16:58:19.77
ご時世関係ない

217: 忍法帖【Lv=16,xxxPT】
11/10/18 17:43:19.26
>>212
イントラでperl使ってるけど…
ごめん、DB(PostgreSQL)つかってる。
月並みだけど、
DB>flock>その他の手段
だよね。

218:nobodyさん
11/10/18 17:48:49.73
横槍失礼。
デッドロックに対する対応だけど、
プロセスがkillされるような事態に備えて $SIG でトラップすべきか、
次実行されたときにデッドロックされたファイル情報から指定時間経過してればデッドロックと判断。
どっちがいいんでしょうね。
トラップした方がスムーズにいけるっぽいけど、他の部分で別のトラップがされると実行されない可能性もあったりするんだよね。
迷うわぁ・・・

219:nobodyさん
11/10/18 22:08:36.70
デッドロックはバグだ。
デッドロックしないようにつくれや

220:nobodyさん
11/10/18 22:33:11.15
DB使う。

221:nobodyさん
11/10/18 22:58:12.17
>>219さんは$SIGを適切に設定してる感じですか?

222:nobodyさん
11/10/18 23:25:30.92
$SIGなの? %SIGじゃないの?

223:nobodyさん
11/10/19 00:20:24.38
$SIG{} って書いてから {} だけ消したので修正ミスです ^-^;

224:nobodyさん
11/10/19 00:46:29.74 LOxxA4S5
GDで文字列を画像に変換するとき
widthを入力しないといけませんよね
全角文字だけなら計算できるのですが、半角英数カナなどが含まれるので余白が発生してしまいます。
あらかじめ文字列の長さをpixelで計算する方法はありませんか?

225:nobodyさん
11/10/19 09:54:29.71
何も調べずに書くが
cp932に変換してバイト数を調べるのはどうか

226:nobodyさん
11/10/19 10:42:15.21
>>224
@bounds = GD::Image->stringFT($fgcolor,$fontname,$ptsize,$angle,$x,$y,$string)

227:nobodyさん
11/10/19 14:19:45.05
>>226
完璧です。ありがとうございました。

228:nobodyさん
11/10/21 17:01:48.08
GD で機種依存文字を使えるようにするための方法はありますでしょうか

229:nobodyさん
11/10/22 05:11:26.88
time_%2F_1319178123_%2F_name_%2F_%82r%82%81%81%99%82k%82%85%82%85_%2F_title_%2F_%82%BD%82%A2%82%C6%82%E9.txt

現在ファイルがopenできなくなると言う罠に陥りました。
windows7でこうゆうファイル名なんですが、コレ問題ありますか?
運用はunix系で考えているんでそっちでも問題あれば教えてください。

230:nobodyさん
11/10/22 05:13:47.30
すみませんなんでもないですopenでしました。

231:nobodyさん
11/10/22 09:48:47.25
>>230
「き」と「し」を打ち間違えるとは珍しい。

232:nobodyさん
11/10/22 20:17:03.51
>>229をデコードしたヤシは挙手ノ

233:nobodyさん
11/10/22 21:14:46.30
Sa☆Lee って何だ?

234:nobodyさん
11/10/22 21:57:21.39
Sa☆Leeでぐぐったヤシは挙手ノ

235:nobodyさん
11/10/22 22:19:39.38
なんかの罠かと思ってスルーしてた

236:nobodyさん
11/10/24 13:03:32.39
ハッシュの中の配列に、値を追加したいときはどうすればできますか?

こうすると
push($h{$i}->[0], "aaa"));

このようなエラーになります。
Type of arg 1 to push must be array (not array element)

237:nobodyさん
11/10/24 13:36:02.75
push @{$h{$i}}, "aaa";

238:nobodyさん
11/10/24 13:50:46.81
>>237
上手くいきました。ありがとうございます。
こんな書き方理解できない。もうPerlやりたくない。

239:nobodyさん
11/10/24 13:58:00.35
同じプログラムをRubyとPHPとPythonでは書き直せるんですけど、
Perlだけ作法が全然違うからわかわからないんですけど、どうすればいいですか?????????

240:nobodyさん
11/10/24 15:33:37.66
Perl5.14でその配列が既に存在していれば、

use v5.14;
push $h{$i}, "aaa";

でいけるかな?

241:nobodyさん
11/10/24 17:29:05.68
>>239
全然違うってほどのもんじゃないとは思うけど。
例えばどんなところが書き直せないの?

242:nobodyさん
11/10/24 19:39:40.90
むしろその中だと、PHP←→Perlが一番簡単な気がするんだw

243:nobodyさん
11/10/24 23:41:27.27
>>241
ハッシュとか配列とかの操作でカッコとか記号とかが覚えられない。
代入するときも表示するときもアクセスの仕方が違ったりして覚えられない。ダンプするのも一苦労。
クラスのnewのblessとか未だに何なのかわからない。祝福とは???
リファレンスとかスカラーとかレキシカルとか聞き慣れない用語ばかり出てくる。
スコープとかクロージャとかJavaScriptの悪夢がよみがえる。
とにかく記号ばっかりで暗号いじってるみたいな意味不明さが怖い。

$hoge; $hoge{0}; $hoge->{0}; @hoge; @hoge{0}; @hoge->{0}; %hoge; %hoge{0}; %hoge->{0};
${$hoge}; @{hoge}; @{$hoge}; {@{$hoge{0}}} @{$hoge->[0]}; %{$hoge->[0]}; %{$hoge->{0}}

どれだよ!!!!!!!!111111111

244:nobodyさん
11/10/24 23:51:16.92
独特の表記とか用語に拒否反応ってのはわからんでもないけど、
スコープとかクロージャ駄目ってんじゃ他の言語もまともに使えてないだろ……

245:nobodyさん
11/10/24 23:54:49.09
>>243
意味不明って、単にPerlを知らないだけでは。
慣れればおいしいよ。

246:nobodyさん
11/10/25 00:14:38.50
$hoge; スカラ
$hoge{0}; ハッシュ
$hoge->{0}; ハッシュへのリファレンス
@hoge; 配列
@hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス
@hoge->{0}; エラー 配列へのリファレンスは $hoge->[0] でアクセス
%hoge; 連想配列
%hoge{0}; 記述エラー 連想配列内の要素は $hoge{0} でアクセス
%hoge->{0}; 記述エラ 連想配列へのリファレンスは $hoge->{0} でアクセス

${$hoge}; スカラのデリファレンス
@{hoge}; エラー
@{$hoge}; 配列のデリファレンス
{@{$hoge{0}}} 連想配列内の配列をデリファレンス ($hoge{0} の中に配列が入っている) ただし外の {} は括る必要なし。 この場合 {} はブロックになる。
@{$hoge->[0]}; 配列へのリファレンスの中の配列
%{$hoge->[0]}; 配列へのリファレンスの中の連想配列
%{$hoge->{0}} 連想配列へのリファレンスの中の連想配列

こんな感じのも良く使うので覚えた方がいいかも。
$hoge = {
  'array' => [], 連想配列へのリファレンスの中に配列を作る
  'hash' => { 連想配列へのリファレンスの中に連想配列へのリファレンスを作る
    'key1' => 'val',
    'key2' => 'val',
  }
};
それぞれへのアクセスは
$hoge->{'array'}->[1];
$hoge->{'hash'}->{'key1'};
となる。

247:nobodyさん
11/10/25 00:41:32.32
> @hoge{0}; エラー 配列へのアクセスは $hoge[0] でアクセス

エラーではない
が、スライスを理解して使っているわけではなく、たまたま動いているだけ、の初心者が多いと思う

248:247
11/10/25 00:42:17.13
{} と [] を見まちがえた。ごめん。

249:nobodyさん
11/10/25 01:04:32.90
@hoge{0} なら %hoge に対するハッシュスライスでしょ
warnings 有効なら @hoge{0} は警告出るだろうが、
@hoge{0..2} とか、 my @keys = (0); @hoge{@keys} なら問題ないはず

250:nobodyさん
11/10/25 01:31:51.65
指摘のある通り、%hoge; と宣言されてるなら @hoge{0} は動作する。

けどね。
質問者がくじけてる部分を考えたらスライスは考えないほうがいいのでは?
という意味からエラーっていうことにした。

まぁ、言葉が足りなかったってのもあるけど ^-^;

251:nobodyさん
11/10/25 01:51:36.00
>>246
> @{hoge}; エラー
エラーではない。

全ての変数や関数へのアクセス方法で一番冗長な書き方は sigil { (何か) } ([添え字]|{キー})
の形で、何かが裸の語なら変数名、リファレンスならデリファレンス、
それ以外なら何かの値を名前としたシンボリックリファレンスと解釈される。
通常の変数へのアクセスは、裸の語をデリファレンスすると捉えてもいい。

${ foo } … 通常の変数。{} は*省略可能*。 ${foo} = "foo${foo}foo$foo"; # ok
${ "foo" } … シンボリックリファレンス
${ $foo } … スカラーリファレンス $foo をデリファレンス
${ 'f' . 'oo' } … 式の値を名前としたシンボリックリファレンス
${ \ foo('bar') } … foo('bar') の戻り値のリファレンスのデリファレンス

URLリンク(perldoc.jp)
> (引用注: 添え字/キーの) かっこの種類(大かっこか中かっこか)は、見ているものが配列か
> ハッシュかをつかさどっています。一方、配列やハッシュの先頭の記号 ('$' か '@') は、
> 返ってくるものが単一の値(スカラ)か、複数の値(リスト)かを示しています。

use warnings; my @{foo} = ('a'..'f'); my %{bar} = ('g'..'j');
print ${foo}[3]; # 'd' へのアクセスで "d" を表示
print @{foo}[3]; # 警告有り。('d') へのアクセスで "d" を表示
print @{foo}[3,4]; # ('d','e') へのアクセスで "de" を表示
print ${foo}[3,4]; # 警告有り。リストをスカラーとして評価すると最後の値が返されるので "e" を表示
print ${bar}{'g'}; # 'h' へのアクセスで "h" を表示
print @{bar}{'g'}; # 警告有り。('h') へのアクセスで "h" を表示
print @{bar}{'g','i'}; # ('h','j') へのアクセスで "hj" を表示
print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef

252:nobodyさん
11/10/25 03:20:14.95
> print ${bar}{'g','i'}; # キー "g$;i" へのアクセスになるので undef
これだけ知らなかったわ。awk 由来なのかな。
まあ積極的に使う意義は無さそうだし、
人のコードで見かけることもないから覚えなくてもいいよね。

253:nobodyさん
11/10/25 22:21:51.58
>>243
> クラスのnewのblessとか未だに何なのかわからない。祝福とは???
blessは意味わからないよね。
あれ、祝福とか変な言葉で説明するからわからんのさw
オレ流に説明してあげよう。

まず、これを実行してみよう。Dumperは変数の中身を表示する関数だ。use Data::Dumperが必要。
my $a = {key=>1};
print Dumper($a)

以下のように表示される。(改行インデントは折りたたむ)
そう、ようするにただのハッシュだ。
$VAR1 = {'key' => 1};


次に次の命令を実行してみよう。
my $a = {key=>1};
bless($a, "CLASS");
print Dumper($a)

以下のように表示される。さっきのハッシュの周りにCLASSが追加されている。
VAR1 = bless(  {'key' => 1},  'CLASS' );

つまりだ、これはCLASSという名前のクラス名(モジュール名)付きのハッシュということだ。
このモジュール名付きのハッシュにたいして、以下のように->を使って呼び出しをすると、
$a->foo()

$aにはCLASSというモジュール名が結びついているため、CLASS::foo()を呼び出すんだなとPerl実行環境は理解できる。
その時CLASS::foo()の第一引数に$aを渡すことで、foo()の中で$aの値の操作することが可能にある。

これでCLASSクラスのfoo()メソッド呼び出しの仕組みと、$aをCLASSクラスのインスタンスに変換することができた。

254:nobodyさん
11/10/25 22:33:18.24
もう一つ、$a->foo() という書き方。

$a に bless使ってCLASSと結びつけたハッシュが入っていれば、
CLASS::foo()が呼び出されるわけだが、

$aは文字列でもよい。つまり、
$a = 'CLASS';
$a->foo();
この方式でもCLASS::foo()が呼び出せる。
通常は、CLASSを$aに入れずにそのまま書いて、CLASS->foo() となる。

でこれが foo()じゃなくて new() だと、CLASS->new() となる。
呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。

これを利用してCLASS::newされた時に、CLASSに結びつけたハッシュ、
つまりCLASSのインスタンスを返すことで、Perlにおけるnewの仕組みとなる。

あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、
別にただの値にCLASSを結びつけるのも一応可能。

255:nobodyさん
11/10/25 22:34:03.01
訂正
×呼び出されるのは、当然CLASS::foo(); そして foo() の第一引数にはCLASSという文字列が入っている。
○呼び出されるのは、当然CLASS::new(); そして new() の第一引数にはCLASSという文字列が入っている。


256:nobodyさん
11/10/25 22:36:14.83
> あと余談。殆どの場合ハッシュにCLASSを結びつけるのだが、
> 別にただの値にCLASSを結びつけるのも一応可能。


ただの値にblessはできんか。
何かしらの値のリファレンスにblessできる。

257:nobodyさん
11/10/25 23:11:45.61
system("wget $url");
を使ってファイルをダウンロードしたいのですがうまくいきません。
perl というかwget の使い方の問題なのかもしれませんが、
適切な書き方をご存知のかたがいらっしゃったらおしえていただけませんか?

ダウンロードしたいファイルは以下のURLです。
URLリンク(ncode.syosetu.com)

エラーとしては、こう言われます。
index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF: Invalid argument
Cannot write to `index.html?no=2&hankaku=0&code=utf-8&kaigyo=CRLF' (Invalid argument).

258:nobodyさん
11/10/25 23:53:11.13
自分は、たまーにハッシュに名前が欲しくて bless する事もあるw

use LWP::Simple;
my $data = get('URL');

特に認証がなければ、これで取得できるかと。

自分は

use LWP::UserAgent;
use HTTP::Request::Common;
use utf8;
my $ua = LWP::UserAgent->new;
 ~agent とか timeout とか max_redirect とか cookie の設定~
my $req = GET('URL');
my $res = $ua->request($req);
my $content = $res->code() eq '200' ? decode('utf-8', $res->content()) : '';

ってやってる。
手順が多いけど、自分の頭ではこの方が使いやすい。

$res->code() eq '200' の部分は $res->is_success とかで置き換えられるけど、回線がパンパンのときに失敗すると
is_success は 1 を返すので信用出来ない。
HTML の取得なら、$res->content() に </html> が含まれるかどうかで判断した方が良い。
つっても、殆どの場合は is_success や is_error は正しく動作する。

259:nobodyさん
11/10/26 01:13:19.12
>>257
wget は特に指定がなければサーバのパスに対応するファイル名でローカルに保存しようとするから、
? はファイル名に使えねえよと言われてるのでは。Windows ないから試せないけど。

>>258
sub is_info ($) { $_[0] >= 100 && $_[0] < 200; }
sub is_success ($) { $_[0] >= 200 && $_[0] < 300; }
sub is_redirect ($) { $_[0] >= 300 && $_[0] < 400; }
sub is_error ($) { $_[0] >= 400 && $_[0] < 600; }
sub is_client_error ($) { $_[0] >= 400 && $_[0] < 500; }
sub is_server_error ($) { $_[0] >= 500 && $_[0] < 600; }
# HTTP::Status より。

失敗したにもかかわらず is_success が真を返すというなら、
まず疑うべきは LWP でなくサーバ側のレスポンスでは?
原因がクライアント/サーバ/回線/他のいずれにせよ、
負荷等が原因で200以外の2xxが返ってくる状況なんてちょっと想像つかんが。

decode('utf-8', $res->content()) はよっっっぽど古いバージョンの LWP じゃない限り
$res->decoded_content(charset => 'utf-8') のほうがよかろ。

260:nobodyさん
11/10/26 01:38:17.35
>>259
失敗なのに is_success が成功を返すのは少々特殊な状況なのは分かってる。

自宅でサーバー動かしてて家のルータは BA8000Pro なんだけど、BitTorrent で Linux ISO を放流してる。
バージョンアップがくるとコネクションがすごい数やって来て、NAT のテーブルが溢れて (上限は 2600)
名前解決すら頻繁に失敗するほど不安定になる。

この状況下で LWP で GET とかすると is_success が成功を返しても、->content() が全てを受け取ってないという事が起こる。

そのほかの環境は弄らずに BitTorrent だけ止めると LWP は正常に送受信できる。
これは何度も再現するのはテスト済。

ちなみに BitTorrent を動かしてるのは WEB サーバーとは別の PC です。
最近は BitTorrent 動かしてないからこういった症状ともおさらばで快適人生♪



>> decoded_content
おぉ~、こんなメソッドあったんですね。ありがとう!
常々 Encode 呼び出すのめんどくせーって思ってたんで助かる。


261:nobodyさん
11/10/26 02:43:24.74
>>259
>>257です。
アクセスが出来ないじゃなくて、書き込みができないっていう意味だったんですね。
もっと自分でよく考えてみるべきでした。

-Oオプションを付けて書き込むファイル名を指定したところ上手くいきました。

知恵を貸していただきありがとうございます。

262:nobodyさん
11/10/27 00:59:33.75
>>244-256
あんなふざけたレスにマジレス返してくれてどうもありがとうございます。
まだ全部は試せてないですが、>>246とか物凄く参考になっています。
perldoc.jpなども読んで、もう少し勉強してみますね。

263:nobodyさん
11/10/27 01:39:37.97

変数名の前の @、$、% の意味 (* ってのもあるけど、難しいので放置で OK)
変数に代入するときの { }、[ ]、( ) の意味を覚えるだけで、理解度はかなり違うと思います。

あとは perl の自由な書き方に慣れていただくしかw

264:nobodyさん
11/10/27 16:41:18.27
たまに間違う… そういえばあんまり代入の時に [ ] って使わないなあ。
使ったことがないわけじゃないんだけど。

265:nobodyさん
11/10/27 18:34:30.14
最近は面倒くさいので $data = [] とか $data = {} とかで済ますこと多いな。


266:nobodyさん
11/10/28 20:00:02.80
Perlでw3mのようなコンソールアプリケーションを作る方法はあるのでしょうか?
環境はLinuxです。

よろしくお願いいたします。

267:nobodyさん
11/10/28 20:16:08.47
curses を扱うモジュールはあるみたいだし、できるんじゃね
Python とかのほうが向いてる気はするけど

268:nobodyさん
11/10/30 22:07:34.60
みなさんモデリングツールでUMLは使ってますか?
もし使ってる方はどのソフト使ってますか?

スレリンク(tech板)
↑ここでperlの話題がなく、「perl uml」で検索してもそれらしいものが見つからなかったので質問しました。
UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。

269:268
11/10/31 00:15:05.76
>UMLを勉強しようと思うのですがどのツールがいいのかもわかりません。。

これはココだとスレ違いですね。
この一文は無視して下さい。

270:nobodyさん
11/11/01 11:30:50.31
バイナリデータについて質問です。
docomo携帯の太陽のSJIS絵文字コード(F89F)を表示しようとしたのですが、
(1)は表示されて、(2)は単なる文字列になっているようでした。
\x{}といった表記ではバイナリにならないのでしょうか?
また、バイナリにする場合、""での設定やpack()など色々あると思うのですが、
処理が速いのはどの方法になるのでしょうか?

(1)my $sun = "\xF8\x9F"

(2)my $sun = "\x{F89F}"


271:nobodyさん
11/11/01 13:02:20.96
>>270
URLリンク(perldoc.perl.org)
> If the number is 256 (0x100, 0400) or above, Perl interprets it as a Unicode code point
> and the result is the corresponding Unicode character.

URLリンク(www.nttdocomo.co.jp)

よって iモードの Shift_JIS で "\xF8\x9F" に割り当てられている絵文字を
iモードの UTF-8 のページで出したければ "\xEE\x98\xBE" 。
(Perl用語で言うところの) Unicode 文字列なら "\x{E63E}" 。

参考ページ:
>>2
URLリンク(perldoc.jp)
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)

272:270
11/11/01 15:15:58.07
>>271
解決しました。
詳しい説明ありがとうございました。

273:nobodyさん
11/11/01 15:20:02.29
my $a = {
x => [ 'a', '1' ],
y => [ 'b', '2' ],
z => [ 'c', '3' ],
};

my $b = map{}???

上記で$bに下記のようにセットするにはmapのところをどのように書けばよいでしょうか。

$b = {
x => 'a-1',
y => 'b-2',
z => 'c-3',
};

274:nobodyさん
11/11/01 15:36:36.16
>>273
$b = { map { $_ => "$a->{$_}[0]-$a->{$_}[1]" } keys %$a };
# or
$b = { map { $_ => join '-', @{ $a->{$_} }[0,1] } keys %$a };

275:nobodyさん
11/11/01 15:59:53.49
>>273
my $b = { map ref $_ ? join('-', @$_) : $_, %$a };
my $b; %$b = map ref $_ ? "$_->[0]-$_->[1]" : $_, %$a;

276:273
11/11/01 16:40:41.18
>>274,275

解決しました。
回答が早くて助かりました。
ありがとうございます。

277:nobodyさん
11/11/01 17:31:41.93
サンプルとはいえ$aと$bは安易に使わないほうがいいぞ

278:273
11/11/01 17:56:13.77
use HTML::Template について質問です。
テンプレートファイル内で、「html出力させないコメント」というのは書けないのでしょうか?
例えば下記の#の行はoutputで出力させないといった動作をさせたいです。
もしできないのであれば、使用されている皆さんはコメントを書きたい時、<!-- -->で対応しているのでしょうか?

<html>
<head>
<title>hoge</title>
</head>
<body>
fuga<br>
#コメントを書きたい
</body>
</html>

279:nobodyさん
11/11/02 04:52:21.99
>>278
無かったはず。

ただし、new()の際にfilterを設定することで、前処理を行うことが出来る。
これを利用して、特定の文字列を置き換える(削除する)ことは可能。
詳細はドキュメントを参照されたい。

HTML::Templateは痒いところに届かないというか、痒み?何それ? って作り方だからなあ。
非PGのデザイナーにテンプレートファイル作りを任せるなら、これくらいじゃないと使ってくれなかったりするがw


280:nobodyさん
11/11/02 07:58:44.36
>>276
案の定Wikipediaの丸暗記か

281:nobodyさん
11/11/02 10:15:20.86
>>280
君はまた見えない敵を作って、勝手に戦うのかい?

282:デフォルトの名無しさん
11/11/03 03:59:56.91
>>280

おみそれいたしました。
丸暗記だと応用が効かなくて行き詰ってしまうことが多いです。

283:nobodyさん
11/11/03 20:45:59.15
↓こちらのスレで誘導されてこの板に来ました。

Perlについての質問箱 49箱目
スレリンク(tech板:100-102番)n

Windows 2000、Activeperl 5.8 の環境で、
use Socket;
socket(・・・);
connect(・・・);
な感じでインターネット上のwebサイトからページを取得してるんだけど、
サイトの応答が遅いとき、応答が帰ってくるまでCPU負荷が100%近くになる。

これってどういった原因が考えられますか?
あるいは仕様でしょうか。
PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが、それにしても負荷高すぎかな、と。

Activeperlのバージョン上げれば直るのかな…

284:nobodyさん
11/11/03 22:20:35.11
パソコンを変えることができないなら、LANカードを取り替えるか
あるいは追加して、それを使うようにして対処。
今使っているLANカード+ドライバが割込みに対応した作りではない
のでCPU負荷が100%近くになっている。

285:nobodyさん
11/11/03 22:28:37.56
>>PCのスペックはWin2000を使っているというあたりで想像いただける通りかなりしょぼいですが
端折るな


ちなみに Pentium3 1GHz、ActivePerl 5.12 のうちの環境は sleep 使うと CPU 占有率が 80-90% とかになる。


286:nobodyさん
11/11/03 22:52:53.96
>>284
LANカードの問題ですか。
ノートだから交換や追加は難しいですね…
>>285
すみません。
Pen4M1.8G(但し1.2G動作)です。

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

287:285
11/11/03 23:57:43.11
NetBurst か。
デスクトップの Pentium4 ですら同じくロックまで落とすと Pentium3 に負けるからなぁ・・・
ただそれ以外の部分 (チップセットとかね) は Pentium3 世代よりも上だから、CPU はボトルネックとは考えられないか。

古いノートだったら 10Base-T とかの可能性も否定できないよね。

あとアンチウイルスとかスパイウェア関連は外すのも手。
TCP/IP の入出力を監視してたりするので負荷が掛かるのは当たり前だから。

定期的にスクレイピングのために Perl スクリプト走らせてるんだけど、
今見たら 60-80% の CPU 占有率だった。


これ以上はハードとか OS の問題になってきそうなのでスレ違いどころか板違いすらにもなってくるかな?w
その前に色々書いておく。

特に大事なデータが無ければ OS 再セットアップして、アンチウイルスとかスパイウェア関連は入れない。

もし直らなければ、ノートの製造が AOpen や Acer などの安かろう悪かろう的なメーカーでないか確認。
なおかつ使用チップセットが Intel 以外だった場合は遅いのはハードウェアが原因と見て良いかと。

上記以外のメーカーで Intel チップセットの場合は >>284 が書いたとおり LAN カードが怪しいかも?
USB の LAN もあるけど、そもそも負荷が高いので使っちゃだめ。 32bit CardBus が付いてるならその LAN カードを。

これでも駄目なら投げ捨てる。

288:nobodyさん
11/11/04 00:21:01.33
CD起動のLinuxで同じスクリプトを実行してハードの問題かどうかを切り分けてみる。

289:283
11/11/04 08:21:22.37
>>287
ハードやOSの問題だと板違いですね。
ただ、ブラウザでアクセスしている場合にはそういった問題は発生しないのでperl側の問題という線も捨てきれないのかな、と。

ちなみに、常駐系のソフトは全て停止しても状態は同じでした。
とりあえず、まずはLANカードの線で、何か試す方法がないか検討してみます。

>>288
ちょっとハードルが高いですね。
Linixの知識は全くないので、そこにたどり着くまでの時間が取れそうにないです。

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

290:278
11/11/04 11:25:15.47
>>279
最初に任意のルーチンの割り込みができるんですね。
いまバタバタしてるので時間が空いたらじっくり調べてみます。
ありがとうございました。

291:nobodyさん
11/11/05 11:43:23.98
>>289
BIOSのIRQの設定も板違いですね。
そうだとするとLANカードを変えても同じことになりそうなので。

292:nobodyさん
11/11/06 08:06:31.58
$test . '_aiueo'

こうゆう文字列でマッチさせようとしたときに、何も考えずに書けば

/$test_aiueo/

だけど、これじゃ $test_aiueo っていう変数は無いからエラーになるわけで、
$test という変数の直後に半角英数でマッチさせるにはどうすれば良いのでしょうか?


293:nobodyさん
11/11/06 08:12:06.72
すんません解決しました。

/${test}_aiueo/

こうゆう書き方できるんですね。
$hash={} を %{$hash} とか普段から使ってるクセに、なんですぐに書けなかったんだろう。。。


294:nobodyさん
11/11/06 10:03:01.99
こういう

295:nobodyさん
11/11/06 12:03:43.66
作ったスクリプトのどこの部分が処理に時間が掛かってるのか知りたいです。

処理ごとにデバッグプリントすれば可能ですが、非現実的だし、
後々デバッグプリントを消すのも手間なので、Perlでどこの部分で
時間が掛かってるとかのデバッグというか、トレースというか、
そういう事は出来るモジュールなどはあるのでしょうか?




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