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

【Perl】初心者コーナーPart10

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。02/02/24 22:18ID:zOj6Yq/3
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
077877402/03/21 04:15ID:???
>>777
あう?
0779nobodyおっさん02/03/21 04:23ID:???
[メールユーザID] についてはほとんどのメールサーバがUnix系ということ
を考えると、だいたい文字数は4〜10が妥当な線ダロウ。
文字の種類としてはなんといっても[@.]の2種類は含まないということで
[^@.]が考えられる訳だが、普通は[a-zA-Z0-9_-]あたりが使われる場合がほとんど
ということからエスケープシーケンスを使って表すと[\w-]と考えられる。
0780nobodyおっさん02/03/21 04:33ID:???
[メールユーザID] の文字数の点で補足ダガ、以前に3文字(3バイト)というの
を見たことあるから余裕をもって3〜15と考えるのもいいネー。
つまり前段から /^[\w-]{3,15}@ の部分までは正規表現は決まったことになる。
0781nobodyおっさん02/03/21 05:12ID:???
っと、チョットごたくを並べ過ぎたようなので今日はここで終わりとしよう。
762さんが言うようにいきなり最後まで書いてしまうのはチョットですぎた
行為というものです。考える余地を与えることも勉強になるものです。

それはそうとして、「正規表現道場」っていつのまにかなくなったのかナ?
あればそっちにメアドの正規表現ぐらいのってるだろうに。閑古鳥が鳴いてた
ようだから無理もないかー。
0782nobodyさん02/03/21 05:26ID:???
>781
まだいきてるみたい。
http://pc.2ch.net/test/read.cgi/php/996105815/l50
0783nobodyおっさん02/03/21 05:38ID:???
>782
電球
0784nobodyさん02/03/21 07:03ID:???
WindowsでPerlを使う方法を、猿でも厨房でも
わかりやすく記載しているサイトってありますか?
ActivePerl入れてもなんか上手くいかなくて...
0785親切紳02/03/21 07:18ID:???
>>784
インストールはできたんだね。
じゃあ、コマンドプロンプト開いて
perl test.pl
とか入力すればtest.plが実行されるよ。
0786nobodyさん02/03/21 07:29ID:???
>nobodyオッサン
大口叩いてもその解答じゃ結局>>754より役に立たんな。(藁
>>763の言うとおりそれならモジュール使ってついでに送信テストまでするほうが速い。
まともに解答する気ないんなら解答者につっかかるなや。迷惑。

>>784
http://www5a.biglobe.ne.jp/~n_rieko/
0787nobodyさん02/03/21 07:46ID:p3ZJIC7X
Perlメモ メールアドレスの正規表現
http://www.din.or.jp/~ohzaki/perl.htm#Mail
0788nobodyさん02/03/21 09:40ID:???
>770
>この助言を書いた途端にどなたかがいきなりつっかかってきた上に非難されるのはこちらも困ります。

>生半可な知識だったら書かないほうがいいということを言いたかっただけ。
>できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?

がホンネなんだろ?(藁
0789nobodyさん02/03/21 09:42ID:???
>779
[\w-]は[\w\-]じゃなくていいの?
0790nobodyさん02/03/21 10:14ID:???
>>779
>生半可な知識だったら書かないほうがいいということを言いたかっただけ。
>できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?
んな事書くんだったら、http://www.puni.net/~mimori/rfc/rfc2822.txt
でも見てからスペック決めろよ。
0791nobodyさん02/03/21 11:40ID:???
あっ ohzaki氏の「Perlメモ メールアドレスの正規表現」にバグ発見。
local-part = dot-atom / quoted-string / obs-local-part
だから
$word = qq<(?:$atom|$quoted_str)>;
$local_part = qq<$word$X(?:$Period$X$word$X)*>;
では駄目。
0792nobodyさん02/03/21 12:03ID:???
すごい初心者で悪いんですけど、
PerlってCGI以外で何かに使います?
0793nobodyさん02/03/21 12:07ID:???
ハッシュアクセスでさ、
$_{manco}
と、するべきか、
$_{'manco'}
どっちだ?
0794nobodyさん02/03/21 12:14ID:???
>>792
MakeFile とか、シェルスクリプト書くの面倒なときとか、
テキスト処理とか。
0795nobodyさん02/03/21 12:14ID:???
>>792
元々レポート作成言語。
そのため文字列操作が異様に発展。
CGI使いからはマイナーだがレポートのテンプレートを指定する機能も。

と、言うか、

Perlってレポート作成以外で何に使います?
CGIとかです。

が正しい。
0796nobodyさん02/03/21 12:15ID:???
>>793
アフォか。囲め。
0797nobodyさん02/03/21 12:15ID:???
>792
自分がよく作るのはなんちゃらコンバータとかかなぁ。
HTMLから,ある規則に従ってリンク抜き出したりとか。

>793
どっちも変わらないみたいなので,私は短い前者を使う。
0798nobodyさん02/03/21 12:19ID:???
>792
レポート処理とか。
おれはチャットログの整理とかもしてる。
複数のログから特定のキーワードを探したりするときも手軽で便利。
0799nobodyさん02/03/21 12:23ID:???
>793
2バイト文字列指定してる場合は囲んだほうがいいよ。多分ね。
0800nobodyさん02/03/21 12:29ID:???
>799
自己レス。
推測だが変数名に使えない文字の場合は囲まないとエラーが出る。
ただし変数名に使える文字なら不要。

例。$ENV{HTTP_HOST} と$Rom{"坂田@アホ"}。
0801nobodyさん02/03/21 13:51ID:???
>>793
>>800見たいなエラーがでる場合ってのが存在するから囲め。
統一性が無いとウザイから。
0802nobodyさん02/03/21 14:09ID:???
こういう事したい。

sub manco
{
 print "sage\n" ;
}

$a = manco ;
$a() ;

なんか解決ないすかね?
0803nobodyさん02/03/21 14:15ID:???
>802
意味ねー(w
おとなしく&manco;しろ。
0804nobodyさん02/03/21 14:33ID:???
テーブルジャンプしたいの、

$a[ i ]() ;

こんな感じで
0805nobodyさん02/03/21 14:34ID:???
>802
リファレンス使ってこんな感じかな
$a = \&manco ;
&$a() ;
0806nobodyさん02/03/21 14:36ID:???
>802
$a = "print";
&{$a};
sub print {
print qq(<hr>ok!<hr>);
}
とりあえずこれで動いた。

>803
if elsif文を並べてサブルーチンに飛ばすような時とかに便利かも。
0807nobodyさん02/03/21 14:53ID:???
>>806
if elsifを並べるのはあんまり良くないでしょ。
ハッシュに入れたサブルーチン名(もしくはリファレンス)
をコールするってことでどうかね>適用例
080879202/03/21 14:53ID:???
>>794>>795>>797>>798
回答ありがとうございました。
レポート処理のソース書いて、実行はMS-DOSからやるんですか?
CGIしか作ったことないんで、少し気になります。
0809nobodyさん02/03/21 15:00ID:???
>>808
昔は、MS-DOSからやってた。
最近はUNIXからが便利なので、そっちでやってる。
0810nobodyさん02/03/21 15:01ID:???
$a[ 0 ] = \&manco ;
$b = $a[ 0 ] ;
&$b() ;

これ、いいね、
でも、

$a[ 0 ] = \&manco ;
&$a[ 0 ]() ;

これだと駄目ね
0811nobodyさん02/03/21 15:03ID:???
>>803
&manco;
なんて、レスキューやKENTみたいなことやってんじゃねーよ。
それじゃ、プロトタイプのチェックしねーだろ。

>>806
man perlref
man perldub
組み込み関数とユーザサブルーチンの区別つけれ。

ユーザ定義ハンドラを許すようなオブジェクトなら必須。
0812nobodyさん02/03/21 15:03ID:???
>807
そうだろね。LUTみたいな考え方だね。

>808
CGI以外の用途に使うなら「Perlを始めよう」というソフトがおすすめ。
ソースを書いて直接実行したりできる。
081380302/03/21 15:05ID:???
>811
詳しく解説きぼん。
081479202/03/21 15:07ID:???
>>809>>812
ありがとうございました。
参考になりました。

このへんの住人かなりスキルが高いですね。
0815nobodyさん02/03/21 15:10ID:???
>814
皮肉にしか聞こえん・・・
0816nobodyさん02/03/21 15:51ID:???
>>808
元々はUNIXさんの言語。
0817nobodyさん02/03/21 15:59ID:???
>>803
どこでエラーになるか確かめれ。
固いコードを書きたいんだったらプロトタイプ使え。
sub manco($)
{
print "$_[0]\n";
}

&manco();
manco();
0818nobodyさん02/03/21 16:35ID:7Dyo1H3n
htmlについての質問なのですが、
フレームで上と下に分割して下のフレーム内にdocファイルへのリンクを張ったのですが、
docファイルへのリンクをクリックするとフリーズして強制終了してしまうのですが
どうすれば正しく表示できるのでしょうか。
ちなみにOSはxp proです。
0819nobodyさん02/03/21 16:37ID:???
>818
Web製作板かWin板で聞くべし。
Perlと関係ないじゃない。
0820123402/03/21 16:41ID:???
正規表現についてききたいんですがここじゃだめですか?
「>>1」と「>>1-100」を両方かけるやりかたがしりたいんですが
082181802/03/21 16:43ID:7Dyo1H3n
すいませんはやとちりました。
0822nobodyさん02/03/21 16:50ID:???
>>(\d\-)*(\d+)
0823やっぱり02/03/21 16:51ID:???
>>(\d\+-)?(\d+)
0824間違えた02/03/21 16:51ID:???
>>(\d+\-)?(\d+)
0825123402/03/21 16:54ID:???
できますた>>824さんありがとうごだいます
0826nobodyさん02/03/21 18:10ID:TYcdRNHS
質問っす。
cgiで、同じディレクトリにある他のファイルのパーミッションを変更したいんだけど、
chmodを使ってもなぜか変更できないです。
 chmod 0777,"./abc.dat";
こんな風にしてるんですが、何かやり方がいけないの?
0827nobodyさん02/03/21 18:25ID:???
>826
>>24-37とかは関係ないかな?
0828nobodyさん02/03/21 20:00ID:???
>>826
っていうかcgiの実行ユーザが問題。
0829nobodyさん02/03/21 21:22ID:???
>>810
今更ですまんが。
$a[ 0 ] = \&manco ;
$a[ 0 ]->() ;
で行くでしょ。
0830nobodyさん02/03/21 21:58ID:???
あのさ、
$manco->{'kuri'}=1;
$manco->{'torisu'}=1;
print Dumper($manco);
ってすると、

$VAR1 = {
  'kuri' => 1,
  'torisu' => 1
};

こんな感じで表示されんだけど、
$VAR1ってなるんだけど、
これに、名前付けられないの?
0831nobodyおっさん02/03/21 22:06ID:???
>824
こう書いたほうが尚よいダロウ!

$_= '>>1-100';
print />>(\d+)(-\d+)?/ ? $2 ? "$1$2" : $1 : "unmatched";
0832nobodyさん02/03/21 22:09ID:???
>>830
何が不満?第一引数がそうだって親切に・・・。
0833nobodyさん02/03/21 22:24ID:???
>>830
use Data::Dumper;

%hash = ('A' => 'apple', 'B' => 'buffalo');

$d = Data::Dumper->new([\%hash], ['hash']);

print $d->Dump;
083483002/03/21 22:27ID:???
>>832
あんな、

use XML::Simple;
$manco->{'kuri'}=1;
$manco->{'torisu'}=1;
print XMLout( $manco ) ;

これ動かすと

<opt kuri="1" torisu="1" />

って表示されんだけど、ノード名前が、optになっちゃうのね、
でな、無名のハッシュだっけ?に名前付けたら、変えられんじゃね
っと思ったンヨ
はずしとりすかね?
083583002/03/21 22:33ID:???
>>833

ども、参考なたよ、
でも、834で書いたのは、おもっきり外してたぁ〜
083683002/03/21 22:43ID:???
わがったわがった。
こうだった。

my $xs = new XML::Simple( rootname => 'mesu' ) ;
$manco->{'kuri'}=1;
$manco->{'torisu'}=1;
print Dumper($manco);
print $xs->XMLout($manco);

$VAR1 = {
'kuri' => 1,
'torisu' => 1
};

<mesu kuri="1" torisu="1" />
083783002/03/21 22:48ID:???
また、質問なんだけど、
漏れさ、PerlのCGIって、
WEB FORUMっていう掲示板をいじる事から
始まったんだけどね、
なんか、記述スタイルが古いつ〜かさ、
もっといま風な、オブジェクト指向っぽくやりたいな、
なんて思ってるんだけど、
これは参考になるぞ!、っていうソースどっかに
転がってないすかね、よろすく
0838nobodyさん02/03/21 23:01ID:???
このスレの上のほうで$| = 1;をメシ食いながらウンコと表現したものだが
いっておくが,おれは >830とは別人だぞ・・・
0839nobodyさん02/03/21 23:08ID:???
リンク集を作ってるんですが、サイト名やURLに加えて、
(TOPページの)最新更新日を表示させたいと思っています。
リンク先のページの最新更新日を取得するような方法はあるのでしょうか。
ご指南の程、よろしくお願いします。

なにぶんPerlは始めたばかりなので、ムズかしい処理は理解できないかも
しれないので、なにをどこらへんを勉強すれば理解できるようになるのか
教えていただけるとありがたいです。
0840nobodyさん02/03/21 23:10ID:???
ここで、ソースを記述するときは、変数とか、関数に
sub mancoとか、
$unco
もしくは、それに類似する単語で
書かないと、誰も答えてくれねぇ〜ぞ、ゴウラァ!!!
0841nobodyさん02/03/21 23:11ID:???
>>840
取りあえず寝ろ、な。
0842nobodyさん02/03/21 23:11ID:???
>>839
おまえさ、北海道しゅっしんだろ、な、図星だろ、
わかんだ、おれ。
0843nobodyさん02/03/21 23:12ID:???
>839
LWPモジュールを使うと簡単に更新時刻を取得できる。
使い方は>>4あたり。
084483902/03/21 23:15ID:???
>>842
生まれも育ちも兵庫です。北海道・・・・はて・・・

>>843
ありがとうございます。
さっそく見てみます。
084583902/03/21 23:25ID:???
>>843
「河馬屋二千年堂's Page」さんを見てみましたが、すみません。
まったく理解できませんでした(涙
「モジュールとはなにか、どうやって使うのか」から勉強し直します。
せっかく教えていただいたのに、すみませんでした。
0846nobodyさん02/03/21 23:33ID:???
>>839
アンテナ系のスクリプトを改造してみたら?
基本的な対象は日記だけど、別に普通のリンク集に使ってもいいだろ。
「アンテナ なつみかん」とかで検索してみ。

>「モジュールとはなにか、どうやって使うのか」から勉強し直します。
とか言うレベルだと改造は厳しいと思うが。
0847nobodyさん02/03/21 23:35ID:???
>>846
べつにモジュール万能主義でもないだろうよ。
084883902/03/21 23:38ID:???
>>846
やっぱりレベル低いのに、高望みしすぎなんですかね・・・。
とりあえずダウンロードしてソースをじっくり見てみます。
ありがとうございました。
0849nobodyさん?02/03/21 23:44ID:???
>>847
>べつにモジュール万能主義でもないだろうよ。
846さんはモジュールを勧めているわけではなく、モジュールというものを
知らないレベルの人には、改造は難しいかもしれない、
という懸念をの述べただけじゃないかな。煽りネタだったらスマソ。
0850nobodyさん02/03/21 23:50ID:???
>>839
perlは、本読まないと理解は難しいよ。
他の言語と違って、他人のperlのソース読むのは、
時間の無駄のような気がする。(解説がついてるソース
とかならいいけど)
0851123402/03/21 23:52ID:di2RpoJq
>>831
ありがとうございます。
ところでこれではだめだということに気づきました。
>>1
>>1-
>>1-20
これ全部にヒットしないといけなかったんです。
書いてて気づきました。
すみませんもう一度おしえてもらえませんか?
0852nobodyさん02/03/21 23:54ID:???
>>851
>>831を元に応用できないってことは、perlの正規表現を勉強してないって
ことだと思うんだけど、どうなの?
0853123402/03/21 23:54ID:di2RpoJq
ってここも
>>2-
でヒットしてないのかな?
0854123402/03/21 23:56ID:di2RpoJq
(\d+)(-)?(\d+)?
こうっすね
0855nobodyさん02/03/21 23:56ID:???
>>854
それだ!
0856nobodyさん02/03/21 23:57ID:???
>>851
こんなんじゃダメ?
>>(\d+)(-\d*)?
0857nobodyさん02/03/21 23:58ID:CC60PDt4
Perlで、C++の"ifstream f()"のようにファイルを読みこむ方法を教えてください。
0858nobodyおっさん02/03/22 00:00ID:???
>851
ヒットするんじゃないの?
>>1- は >>1 と同じとみなすんじゃダメかい?
0859nobodyさん02/03/22 00:01ID:???
>>857
ファイルをオープンしたあと、ファイルハンドル使いなさい。
0860nobodyさん02/03/22 00:27ID:???
ありがと。
ファイルハンドルで索引を見たら書いてあった。
0861123402/03/22 01:33ID:PNDxe/pL
>>858
>>1-は>>1以降のもの全部という意味になるらしいですここ
086283902/03/22 02:05ID:???
いろいろ調べてみました。
テストではうまく動いてる気もするんですが、これでよろしいのでしょうか。


use LWP::Simple;
($content_type, $document_length, $modified_time, $expires, $server) = head "http://www.aaa.ne.jp/test.html";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon ++;
print "$year/$mon/$day/$hour";
0863nobodyさん02/03/22 02:49ID:???
>>839
それでおけ。
問題はHEADでちゃんと更新時刻を取得できないサイトが多いこと。
086483902/03/22 03:18ID:???
>>863
はい、その通りでした・・・・。
更新時刻が取得できないサイトがいくつかありました。
私のLWPの使い方が間違ってるのでしょうか。
それとももっと良い方法があるのでしょうか。今一度、探してみます。
またヒントを与えてもらえれば幸いです。
0865nobodyさん02/03/22 03:32ID:???
>>864
(貴方のマシンがWinなら)WWCとかWWDとかのメジャーな更新チェッカ落として
みると参考になると思うよ。ヘッダも表示されるし。
0866nobodyおっさん02/03/22 08:23ID:???
>861
こんな感じかい?

$_= '>>1-100';
if ( />>(\d+)((-)(\d*))?/ ){
 if    ( $4 ){ print "$1$2"; }  # >>n-n
 elsif ( $3 ){ print "$1$3"; }  # >>n-
 else        { print "$1"  ; }  # >>n
}
0867nobodyさん02/03/22 08:35ID:???
.htaccessや.htpasswdファイルって直接url指定されても
見られないようにする方法ってどうするんですか?

0868nobodyさん02/03/22 08:38ID:???
>>869
相手サーバの問題。
更新時刻がとれなかったら長さや内容を前回チェックのと比べるとか。
いくつかのサーバは更新時刻いいかげんに返すので
そのあたりは試行錯誤で。

>867
それらのファイルにアクセス制限をかける。
近ごろの apacheは標準でそういう設定になってる。
086986702/03/22 08:46ID:???
>>868
そーなんですか!
ちなみに私はan httpd使用してるんですけど
これでの方法はないですかね?
0870出来の悪い子02/03/22 08:54ID:???
なんだか、質問の仕方が悪くて皆さんに迷惑をかけてしまったようです
申し訳ありません m(_ _)m

とりあえず実験してみて
>>774さんのやり方で大丈夫でした

= じゃなくて! ってことですね
もっと頭を解して考えるようにします。

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

 

0871nobodyさん02/03/22 09:49ID:???
>>866
なぜprintするのかわからないのだけれど,それは効率悪いんじゃないか?

↓こうできるよ.
/>>(\d+(?:-\d*)?)/ and print $1;
0872nobodyおっさん02/03/22 10:28ID:???
>871
print してるのは、だた結果が正しいかを確認するため。
確かに、後読みだとコンパクトにまとめて書けるのでよりいいと思います。
ただし、やりたいコーディングが
>>n
>>n-
>>n-n
の3パターンへのリンクを張るだけならいいのですが、もしかしたら
>n- の場合など、nが1なら100までとかに制御する余地を残す意味で敢えて
わけているだけです。
0873nobodyおっさん02/03/22 10:48ID:???
補足:
1つにまとめるなら以下のようによりコンパクトにも書けます。
/>>(\d+(-\d*)?)/
0874縞栗鼠(シマリス)の親方02/03/22 10:54ID:pJ6rZ2it
吉祥寺にある大検・大学受験予備校の中央高等学院
ここは、完全に狂ってる。
授業料は一年分一括前払いなので、
金が入れば、生徒は要らない
金を振り込んだら、何とかその生徒を辞めさせようと
講師どもが、あの手、この手でイヤガラセをしてきますね。
セクハラはもちろん、脈絡の無い罵倒は日常茶飯だね。
酒臭い講師もいるし・・・ 人生の最果て中央高等学院
学歴詐称、経歴詐称、合格実績詐称、デタラメ授業、
http://www.chuo-school.ac/
http://chs-f.com/index.html 中央高等学院福岡校
司法浪人の田中校長は ↑ また司法試験に落ちましたが
HP上では下らない見栄を張っています
087583902/03/22 12:08ID:???
>>869
長さっていうのはファイルサイズのことでしょうか。
そんなこともできるんですか・・・。
LWPモジュールについてもう少し勉強してみます。
0876nobodyさん02/03/22 12:22ID:???
>873
おっさんおっさん、いくらコンパクトでも効率的には>871のほうが上だぞ。
つーか(?:regexp)はNon-capturing groupingsだろ。何でここで後読みなんだよ(w

学生はperldocでも読んで勉強しとけ。
0877nobodyさん02/03/22 12:26ID:???
>>875
長さってのは、
use LWP::Simple;
$content = get ("http://www.2ch.net/");
$length = length($content);
と言うことだと思う。868じゃないから知らんけど。
■ このスレッドは過去ログ倉庫に格納されています