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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

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


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0582nobodyさん03/06/18 20:25ID:???
>>570
どっちが速いとかの問題じゃない訳で、設計しだいな訳で、Perlと関係ない訳で。
0583nobodyさん03/06/18 20:29ID:???
>>581
Operaだと2000とXPがちゃんと認識されます。
IEだと、2000はNT5.0、XPがNT5.1と識別されます。

って言う話だ。
確かめたわけじゃないが。
0584 03/06/18 20:39ID:???
http://dream.lib.net/room/
ここで配布してあるチャットの個人会話を覗き見する方法わかる?
ファイル名はわかってるんだけど、拡張子がCGIにされてるから見えない…
0585_03/06/18 20:45ID:???
http://homepage.mac.com/hiroyuki44/
0586nobodyさん03/06/18 20:48ID:???
>>584
無理。
0587nobodyさん03/06/18 20:56ID:???
>584
FTPでログを見る。
管理人にしかできないがな。
0588nobodyさん03/06/18 21:21ID:???
>>584
クラックする方法があったぞ、確か
0589nobodyさん03/06/18 21:50ID:???
てきすとの中にURLがある場合、URLに自動でリンクを張るにはどうすればいいのでしょうか?
(2chみたいに)

なお、テキストの中には、2つ以上URLがある可能性もあります。
0590nobodyさん03/06/18 21:59ID:???
>>589
置き換えろ、以上。
0591nobodyさん03/06/18 22:01ID:???
>>589
置き換えろや。
最後にgつけろ
0592nobodyさん03/06/18 22:07ID:???
>>589
Perlメモ嫁
0593nobodyさん03/06/18 22:22ID:8AjElXD0
コーディングのお供に
http://mypage.odn.ne.jp/home/dongrico
059454303/06/18 22:45ID:???
一日じっくり調べてみました。

system("/usr/bin/test -f /path/file"); #ファイル存在確認コマンド

これでfileという名前のファイルの有無を確認できますよね?
0595nobodyさん03/06/18 23:01ID:???
>>594
実際に試せ。自分の目で確かめろ。
ついでに「ファイルテスト演算子」でググれ。
0596nobodyさん03/06/18 23:02ID:???
@aray = qw[12\tあ 5\tい 3\tう 4\tえ 1\tお];
↑のような配列があった時これを "12 5 3 4 1" の部分を見て
下のような数の大きい順にソートするようなスマートな方法は無いでしょうか?
@array = qw[1\tお 3\tう 4\tえ 5\tい 12\tお];


059754303/06/18 23:06ID:???
>>595
そうしたいんですけど家に環境ないんです。
・゚゚・o(iДi)o・゚゚・。

検索はしてみますね〜♪
ありがと〜

他にも助言お願いします。
0598nobodyさん03/06/18 23:15ID:???
>>597
`/usr/bin/test -f /path/file`

backtick
0599nobodyさん03/06/18 23:42ID:???
ローカルでは問題無いのですが、サーバにアップしてテストすると、
余計な改行コードが加えられてしまいます。
お願いします。

$match = 0;
open(votelog,"+<vote.log");
@votelog = <votelog>;
$last = @votelog + 0;
for($num=0;($num<=$last)and($match==0);$num++){
($name) = split(/\,/,$votelog[$num]);
if($namekey eq $name){
$votelog[$num] =~ s/\n//;
$votelog[$num] =~ s/\r//;
($name,$comment,$votenum) = split(/\,/,$votelog[$num]);
$votenum = $votenum+1;
$votelog[$num] = "$name,$comment,$votenum\n";
$match = 1;
}
}
seek(votelog,0,0);
print votelog @votelog;
close votelog;
060059603/06/18 23:53ID:???
>>596
文字が含まれてても普通に
@array = sort {$a <=> $b} @array;
でやってくれるんですね。。
では↓な場合にスマートに数字の大きい順で
ソートする方法あればお願いします。
@aray = qw[a\t12\tあ b\t5\tい c\t3\tう d\t4\tえ e\t1\tお];
0601nobodyさん03/06/19 00:03ID:???
>>599
何も言わず氏ね
060254303/06/19 00:25ID:n1s+2eOn
家のRedhatでやってみました。
以下のどちらの場合もだめでした。

system("/usr/bin/test -f /path/file"); #ファイル存在確認コマンド
system(`/usr/bin/test -f /path/file`); #ファイル存在確認コマンド

どうしてでしょう?
ご助言くださいませ。
syntax error near unexpected token `system(上記)'
と表示されてしまいます。
0603nobodyさん03/06/19 00:29ID:???
>>602
確かに test コマンドもシェルではファイルテストに使うが、
Perlerなら

-e "/path/to/file" and print "存在したポ\n";
0604nobodyさん03/06/19 00:29ID:???
>>600
正規表現使いなさいよ。
0605nobodyさん03/06/19 00:30ID:???
>>602
>>598
0606nobodyさん03/06/19 00:31ID:???
>>602
なあ、なんでsystemなんか使うわけ?
しかもそのリスト・・・
0607nobodyさん03/06/19 00:41ID:???
>>602
うちのActivPerlでも駄目でありました
060849203/06/19 00:44ID:???
謎が解けました。
ループ中にエラー処理はさむと
比較しなくていいものまで反応してエラー出してました。
パスワード間違いの場合はリロードさせる(何もしない)事で回避しましたが
エラー表示やっぱ出したいな……。
0609nobodyさん03/06/19 00:51ID:???
>>608
それは比較のやり方が間違ってるだけだろう
0610nobodyさん03/06/19 00:53ID:???
>>597
用意しろ。最低限の義務だ。

>>599
「chomp」や「binmode」で調べろ。あとこれ読め。
ttp://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

>>600
print join '/',
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [ $_, /\\t(\d+)\\t/ ],
@aray;
061154303/06/19 00:55ID:???
OSのコマンドを使うにはsystemコマンドと本に書いてあったものですから・・・
いま603さんにいわれたとおりに

#! /usr/bin/perl
-e "/path/path/ファイル名" and print "ok\n";

でokが表示されました。
ありがとうございました。
Perlerっていうのもカッコイイ(゚∀゚)~

やっと次に進めます。
まだとっかかりにすぎないけど
がんばります!
061254303/06/19 00:57ID:???
>>610
Linuxですが用意しました。
本番機はHP-UXなのですが
PerlのVerが同じ5なら問題ないですよね?
061354303/06/19 01:20ID:n1s+2eOn
>>603
あれ?
「-e」というのは「test -e」とはまったく別なんでしょうか?
ファイルが1つの場合は611で成功したのですが、複数のファイルの存在確認をする必要があるため、
if文で一つでもファイルが確認できなかった場合にはエラーを表示するようにしたいのですが。

ファイル存在確認フロ−(下手でごめんなさい)

ファイルA −−
  y|    n |
  ↓ |
ファイルB −−
  y|    n |
  ↓ |
ファイルC −−
  y|    n |
  ↓ ↓
正常終了 異常終了
exit(0)    exit(100)
061460303/06/19 01:26ID:???
for (@files){
        -e $_ or die;
}
061559603/06/19 01:32ID:???
>>610
どうもありがとうございます。

が、思った結果とはちょっと違うです。。
しかしなんとなくスマートに書く方法がわかったような気がします。
061654303/06/19 01:44ID:???
>>614
ありがとうございます。

さらに@filesで指定したファイルがすべてあった場合には
exit(0)で抜けて、足りなかった場合にはexit(100)で抜けるような
if文を加えることはできませんか?
061760303/06/19 01:47ID:???
こう?

for (@files){
        -e $_ or exit(100);
}
exit(0);
061854303/06/19 02:04ID:???
>>617
あ、できてます!
どうもありがとうございます\(^▽^)/
ただ上記だと「-e $_ or exit(100);」の方が
@filesが存在した場合に返す終了ステータスですよね?
exit(100)はファイルがない場合の異常終了ステータスにしたいので
ご教授頂いたexit(100)とexit(0)を入れ替えればよろしいですかね?

@filesの部分は本でわかっていたのですが
「-e」や「$_」というのはまったくどういうものか
わからなかったので…
061960303/06/19 02:07ID:???
入れ替えなくていいと思うが・・・
まア、実際に試せばわかるけど
0620nobodyさん03/06/19 02:17ID:???
>>618
自分で調べようとかいう気はないようだな。
>>595でも「ついでに「ファイルテスト演算子」でググれ。」とレス
もらってるのに。
062154303/06/19 02:20ID:???
>>619
あ、本当だぁ。
ごめんなさい。完璧でした。
本当にありがとうございましす。

これでファイルの存在確認の方は
終了コードをシェルに渡すことができると思うので
完璧みたいです。

今度はファイル削除…
同じ要領でいいのだろうけど
そのまえに「-e」や「$_」を理解しなくては…
062254303/06/19 02:24ID:???
>>620
いえ、調べました。
すぐにひっかかったページをみると
一見してtestコマンドのようにみえたので
「-e」はtest -eかと思って、できるだけ略さずに書こうと思ったら
×でした。

それでtestコマンドではないのだろうと考えてお願いした次第です。
0623nobodyさん03/06/19 03:14ID:???
-e が他の予約語と対等だとは、普通思わん罠
0624nobodyさん03/06/19 03:30ID:???
>>623
だから「ファイルテスト演算子」という言葉が出てきたのだが。
入門本ばかり眺めているんだろうな鬱。
0625nobodyさん03/06/19 03:31ID:???
スペースだけに一致する正規表現はスペースそのものだけしかありませんか?
0626nobodyさん03/06/19 03:40ID:???
\s
0627nobodyさん03/06/19 04:10ID:???
>>625
/^ +$/ でも /^\x20+$/ でも /^\040+$/ でも /\Qスペース\E/ でも
ご自由に。

>>626
\s == [ \t\n\r\f]
0628nobodyさん03/06/19 04:33ID:???
>>612
5 と言っても色々あるし、Linux でも Win でも何でもいいけど、
少なくとも手元のテスト環境で問題なく動くようになってから
本番機にもっていく事が大事。
0629nobodyさん03/06/19 11:39ID:???
すみませんが、どなたか、Perlで2つのファイルの差分を抽出する
方法をお教え下さいませ。

はてなアンテナ(ttp://a.hatena.ne.jp/)でやっているような、
htmlファイルの中の更新(追加or変更)された部分だけを抜き出して
来る方法です。定番的な一番効率の良いやり方はないでしょうか?
0630nobodyさん03/06/19 11:43ID:???
>>629
ttp://search.cpan.org/search?query=diff&mode=all
0631nobodyさん03/06/19 15:15ID:???
すみませんが、perlでアクセス解析作っているのですが、
ブックマークと、URL直打ちを見分ける方法ってありませんか?
JSの力を借りなければなりませんか?
0632nobodyさん03/06/19 15:26ID:???
>>631
IEならfavicon.icoを読みにいっているかも。
って事で板違い。ヴァー。
0633nobodyさん03/06/19 15:33ID:???
>>632
板違いですか。
スマセン
ありがとうございました
063454303/06/19 20:19ID:???
こんばんは。
昨夜はありがとうございました。
家のLinuxで試して成功したので
本番機でテストしたのですが見事に失敗…
以下のように表示されていました。

syntax error near unexpected token `$_ or'

慌てて本番機のPerlのVersionをみてみたらVersion 4でした。
家のテスト環境はVersion 5だったのですが、これが原因でしょうか?

手持ちの本はVersion 5を前提に書かれていますが
エラーを返してきた部分については
特別Versionについては触れられていませんでした。
0635nobodyさん03/06/19 20:29ID:???
>>634
いまだに、4のサーバなんてやめちまえ!
0636nobodyさん03/06/19 20:48ID:???
Perl4なんてまだあるのかよ。
ある意味驚きだな。
063754303/06/19 20:48ID:???
>>635
さ、さすがにそれは…
やっぱりVersion 4は「$_」に対応していないんですか?
0638nobodyさん03/06/19 21:04ID:???
>635-636
俺のプロバスペースもPerl4だぞ。

>637
$_は使える。
0639nobodyさん03/06/19 21:04ID:???
>>638
やめちまえ!
ていうか、myもつかえないんだよね?
0640nobodyさん03/06/19 21:07ID:???
>639
うん、myは使えない。
かなり不便。
$a ||= 1;もできない。
省略形はかなりピンチかもしれないから、「-e $_ or exit(100);」は
「unless(-e $_){exit(100);}」とかにした方がいいかもしれない。
0641nobodyさん03/06/19 21:13ID:???
>>640
and/or/not 演算子は Perl4 には無かったような記憶が。
if/unless 修飾子は使えた筈。
あと組み込み関数も split とか括弧を省略出来ないものが多い。

一番いいのは赤ラクダ本を手に入れる事だが、
とりあえずコレ読んどけ。>543
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_124.html
0642nobodyさん03/06/19 21:34ID:???
4から5への改良点は、痒いところに手が届く感じのが多いから、
5に慣れてから4コンパチで書くのは辛いな
0643nobodyさん03/06/19 22:58ID:7O2enBqm
質問。
Perlで
SDBM_Fileを使ってるんですけど、
MDBM_Fileにそのまま変えられますか?
SDBMになくてMDBMにある制限みたいなものってあるでしょうか?
0644nobodyさん03/06/19 23:06ID:QrRxrm0K
sub aaa{
my $abc = 255;
&bbb(\$aaa);
}

なんか変になるんですけど、これって有効にならないんですか?
0645nobodyさん03/06/19 23:06ID:QrRxrm0K
間違えた。

sub aaa{
my $abc = 255;
&bbb(\$abc);
}

これ。
0646nobodyさん03/06/19 23:13ID:7O2enBqm
>>645
何が変になるのかわからん限りはなんとも・・・。

きたれ!
http://ex.2ch.net/test/read.cgi/entrance/1055942024/
ファイアーエンブレム風のネトゲツクローヨ
0647nobodyさん03/06/19 23:14ID:???
>>646
なんでここでそのアドレスが・・・
0648nobodyさん03/06/19 23:17ID:???
>>655
myしてある変数のリファレンスは無理だよ
0649nobodyさん03/06/19 23:25ID:7O2enBqm
>>647
なにか心当たりが?
0650 ◆hMJAPH9PWA 03/06/19 23:26ID:???
>>645
何の問題もないように見えるけど?
それが間違っていると思うのなら、間違いなく何かを勘違いしているよ。

>>648
それは問題ない。
というか、出来なきゃ困る。
065160303/06/19 23:28ID:???
>>645
sub bbb{ } が定義されてないから当然
0652nobodyさん03/06/19 23:33ID:???
>>649 ROMってるよ。がんがれ、某コテくん(?)
0653nobodyさん03/06/19 23:34ID:???
sub bbb{ } の中身がわからんとなぁ
0654恐らく03/06/19 23:37ID:???
sub bbb
{
print "なんか変\n";
}
065564503/06/19 23:43ID:???
すみません。
どっか他の所で重大な間違いをしてたっぽいので、しっかりデバック取ってきます。
065654303/06/20 00:38ID:???
>>640
できました。
下の記述でfileが無い場合は100で
fileがある場合は0で終了するようになりました。

------------------------------
#! /usr/bin/perl
@files = ("/home/path/file",);
for (@files){
unless(-e $_){exit(100);
}}
exit(0);
------------------------------

今度はファイル削除用のを作ります。

これまで相談して気になるのは、
なぜ皆さんがsystemコマンドを使わなかったのか
ということです。

お話していなかったのですが、実際のオペレーションでは
ファイル存在確認の後、ファイル削除をおこなうので
systemコマンドであればcommandを書き換えるだけで済むのかなぁと。

なにか理由があるのでしょうか?
0657nobodyさん03/06/20 00:45ID:???
>>656
簡単に言えば、systemを使わないのは特に必要ないから

それとちょっと気になるんだけど

>>621に書いてあった
>これでファイルの存在確認の方は
>終了コードをシェルに渡すことができると思うので

シェルという語が出てきてるけど、どんなことやってるの?
シェルからperlプログラムを実行して戻り値を受け取るわけ?
0658nobodyさん03/06/20 01:20ID:???
お前ら>>1読んでんのか?

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

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


これから質問する奴は

1:○○
2:△△
3:××

と書け。それ以外は皆放置しろ。
どうせ>>1も読まない奴はスレ違い・板違いがほとんどだしな。
0659nobodyさん03/06/20 01:24ID:2h2vJ76G
すいません。質問させてください。

1:○○
2:△△
3:××
0660nobodyさん03/06/20 01:45ID:???
あ、ぼくもいいですか?

1:○○
2:△△
3:××
066154303/06/20 02:40ID:???
>>657
>シェルという語が出てきてるけど、どんなことやってるの?
>シェルからperlプログラムを実行して戻り値を受け取るわけ?

まさしくそのとおりです。
657さんのいうとおりの動作をさせたいのです。

それを前提にしても
汎用性という意味(?)でsystemコマンドよりも
656記載のもののほうがよろしいでしょうか?
0662nobodyさん03/06/20 03:31ID:???
 なあ、いいだろ
1:○○ だめよ、こんなところで
2:△△
3:××
0663nobodyさん03/06/20 04:00ID:PsiyBD1J
すいません。
$bst .= 'W' unless($bst =~ /W/);
の意味が分から無くて困っています。
CGIゲームで、このプログラムにより、
攻撃力が1だけ上がるのですが、
10位上げたいので。
ポイントは戦闘中だけ上がると言う事なので、
難しいんだと思いますが。
0664nobodyさん03/06/20 04:04ID:???
ゲームは分からないけど、

$bstがWにマッチしなければ、$bstにWを追加
$bst .= 'W' unless($bst =~ /W/);
0665nobodyさん03/06/20 05:04ID:???
1:自分はエロエロ画像が見たい。
2:それでグーグルとか使って検索をやってみたが・・・
3:それだとなぜかグロ画像ばかりが出て上手くイかなかった。
0666nobodyさん03/06/20 06:09ID:???
>>665
解決:一つエロエロサイトを見つけて、そこのリンク辿ってがんばれ。
マジレス:くだらんネタはよせ。
0667nobodyさん03/06/20 07:53ID:???
>>665
> 1:自分はエロエロ画像が見たい。
> 2:それでグーグルとか使って検索をやってみたが・・・
> 3:それだとなぜかグロ画像ばかりが出て上手くイかなかった。
print (1:!~ /○○/ || 2:!~ /△△/ || 3:!~ /××/) ? 'スルー\n' : '回答してみる\n';

# 結果表示
スルー

↓次の質問ドゾー
0668nobodyさん03/06/20 08:28ID:???
※ 俺脳内処理 ※
if (0) {
  > 1:自分はエロエロ画像が見たい。
  > 2:それでグーグルとか使って検索をやってみたが・・・
  > 3:それだとなぜかグロ画像ばかりが出て上手くイかなかった。
}
0669nobodyさん03/06/20 14:41ID:CDccIPBD
以下の、 HTML::Templateで、ループ部分がまったく表示されてないのですが、
どこが悪いのかわかりませんでしょうか?

for ($i=0;$i<=$num;$i++){
  $ORG{$i} = {
    "orgname" => $values[$orgmaster_name2seq{orgname}],
    "number_per_class_max" => $values[$orgmaster_name2seq{number_per_class_max}],
    "langlist" => $HTMLlanglist,
  };
}

my $template = HTML::Template->new(filename => './tmpl/search_result.html');
$template->param(
  ORGLIST => \@ORG
);
print $template->output;
---------------------------------------------
以下、テンプレファイル。
<!-- TMPL_LOOP NAME="ORGLIST" -->
  <!-- TMPL_VAR NAME="ORGNAME" --></a></td>
  <!-- TMPL_VAR NAME="LANGLIST" --></td>
  <!-- TMPL_VAR NAME="NUMBER_PER_CLASS_MAX" --></td>
<!-- /TMPL_LOOP -->
0670nobodyさん03/06/20 15:00ID:59oEJQW+
下のようにしてクッキーを書いたのですが、
cookies フォルダの中に格納されません。

クッキーの有効期限を指定していないからでしょうか?
とするとどこにクッキーの情報は格納されているのでしょうか?

print "Set-Cookie: name=$id; \n";
0671nobodyさん03/06/20 16:34ID:Me43kE/L
http://www3.biwako.ne.jp/~nobuaki/webcal/

で、時間を1分単位にしようとしてるのですが、まったく分かりません。
いくらCGI内を探しても見つからず・・・・・
教えて頂けませんでしょうか?
0672nobodyさん03/06/20 19:00ID:???
>>670

printしてるのがヘッダ部分ではない、に1票
0673nobodyさん03/06/20 19:12ID:???
>>671
http://pc2.2ch.net/test/read.cgi/php/1047806915/
のほうがいいんじゃん?
067466903/06/20 19:14ID:???
>>669なんですが、
$iが増えてるのに、$#ORGが、最終的に-1になってしまってます・・・
なぜなんでしょう?
0675nobodyさん03/06/20 19:31ID:???
>>673
既にそっちに書いているもよう
マルチだから相手にすんな
0676nobodyさん03/06/20 19:35ID:???
>674
[]と{}の違いわかる?
0677nobodyさん03/06/20 20:58ID:kJiV021K
webprogじゃないんだけど、perl2exeでfile::copy使った
人います?。コンパイルはできるんだけど実行の時にあれやら
コレやらが足りないっていわれるんだよね。
つーか、いまいちよくわかんないなぁperl2exeって。
0678nobodyさん03/06/20 21:01ID:1Z33Vqhm
一日たった110円であなたのお店やホームページの宣伝をします!

貴方のお店&サイトを効果的に宣伝できます!
お店の足取りが悪い・・・。私のサイトにはあまり人が来ない・・・。などお悩みの方は、
ぜひおすすめです。手軽&簡単しかも日本中に宣伝できますので、
大幅なアクセスアップが期待できます。

[料金について]
1日110円で宣伝&クーポン券の発行が出来ます。
年間契約で申込された場合、40,000円になります。
6ヶ月契約で申込された場合、25,200円になります。
3ヶ月契約で申込された場合、12,600円になります。

http://www.c-gmf.com/h17103.htm
ぜひ一度お試しになってみてはいかがでしょうか?
0679nobodyさん03/06/20 22:06ID:Vg4M86DU
カスみたいな質問ですが・・・


#おはよう
#こんにちわ
お元気ですか?
#こんばんわ
おやすみなさい


と中に書かれているテキストの中の文字を、改行を<br>に変換して、
#で区切って配列に入れたいのですが・・・。
どうすればできるのでしょうか・・・( ・ω・)
0680nobodyさん03/06/20 22:14ID:???
>>679
内容もさることながら、質問の仕方もカスのような気がしますが。
1. \nを<br>に変換する。
2. splitにて、#区切りの配列を生成する。
3. shiftする。
のような手順でしょうかね。
0681nobodyさん03/06/20 22:18ID:jiB8qm8t
>>679

$text = <<'_END_';
#おはよう
#こんにちわ
お元気ですか?
#こんばんわ
おやすみなさい
_END_
$text =~ s/\n/<BR>/g;
@text = split(/#/, $text);
■ このスレッドは過去ログ倉庫に格納されています