トップページ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
0525nobodyさん03/06/17 18:28ID:???
>>523
それはフォントの問題。どうしても心配ならキャラコード調べてみれば?
0526nobodyさん03/06/17 18:28ID:???
>>524
その同じブロックにある中から以外から呼ぶことはありません。
それならどうでしょうか?
052750603/06/17 18:31ID:???
>>507-508
ありがとうございます。

ところで、

$srt = 'document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;

print $str;
とやったのですが、
なんにもprintされません。確かに正規表現はあってるかと思うのですが・・・・・
わかるかたいらっしゃいますか?
0528everybody03/06/17 18:44ID:???
>>510
my %temp;
@a = grep !($temp{ $_ }++), @a;
0529nobodyさん03/06/17 18:56ID:???
>>526
local *hogehoge = sub {
return shift ** shift;
};
053052303/06/17 18:59ID:SJassQej
チルダでよかったんですね。
動きました。
別のところでエラってました。スマソ
0531nobodyさん03/06/17 19:00ID:???
ttp://ritsumei.s20.xrea.com/x/

ここの掲示板のソースみてみれ・・・ワラタ
0532nobodyさん03/06/17 19:24ID:???
チルダではなくティルデ
0533nobodyさん03/06/17 19:48ID:???
よくBEGIN not safe after errors--compilation aborted at index.cgi line 48
っていうエラーを見るんですが。

BEGIN not safe after errorsってどういう意味ですか?
0534nobodyさん03/06/17 19:58ID:???
>>529
その手があったか!?ありがとうございます。
それを、ブロック内で呼び出せば、その中の変数使えますよね。
0535670=67603/06/17 20:31ID:???
>>527
自分の書いたコードをよーく見てごらん。
ちなみに、「"」はメタ文字じゃないから、「\」はあってもなくてもいいよ。
0536nobodyさん03/06/17 20:39ID:???
535です。↑HNは前に別スレに書いたものが残っていただけです。

053752503/06/17 21:58ID:???
>>527

10回*30秒くらいみたのですが、わかりませんでした・・・
どうみても正しいようにしか見えないのですが、
どうしてこんな結果になるのでしょう・・・

どうか教えてください。。。
0538nobodyさん03/06/17 22:13ID:???
>>537
--- test.p ---
$srt = 'document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';
$str =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
print $str;
---
> perl -wc test.p
Name "main::srt" used only once: possible typo at test.p line 1.
test.p syntax OK
>
0539nobodyさん03/06/17 22:24ID:???
>>533
http://www.kt.rim.or.jp/~kbk/perl5.doc/perldiag.html
054045803/06/17 23:41ID:???
ほんとしつこいけどお願いします。
おっしゃられたとおり、私の環境がおかしいにしても、mt-load.cgiのは正常に表示されるんです。。
だれか、教えてくださいまし・・・・
0541nobodyさん03/06/17 23:48ID:???
>540
そのしつこさを別の方向に向ければいいのに。
正常に動くスクリプトがあるなら、いらない部分をガンガン削って、どの部分でそれを表現してるか調べてみるとかあるだろ。

レス遡るのもマンドクセ。
0542nobodyさん03/06/17 23:48ID:???
>>537
ソースを1文字ずつ声に出して読んでみれば分かる。

>>540
しつこいよ。
そのソースを解析すりゃいいだろう。
0543座敷荒氏03/06/17 23:50ID:NkO+IDyD
Perlでファイルの存在確認をして
Shellに結果を渡すようにしたいのです。

Perlでtestコマンドを実行してから結果を
どうやってShellに引き渡せばいいのでしょうか?

最終的には1ではなく100や255エラーを返すようにしたいのですが。
054452503/06/18 00:00ID:???
>>538
それは、たぶんですが、
文法は間違いないということですよね?


なぜ、$strが空になってしまうのか、教えていただけませんか?
(それともデバッガになれてないので勘違いしてるのかしら)
0545nobodyさん03/06/18 00:05ID:???
この板ってカスばっかだな
あってもない自分の脳内知識をお互いに自慢してる。
横から見てるとハライテーヨ
0546nobodyさん03/06/18 00:14ID:???
>>543
exit $error_number;
0547nobodyさん03/06/18 00:24ID:???
>>544
Name "main::srt" used only once: possible typo at test.p line 1.
(main パッケージの srt という名前の変数は一度しか使われていません。
誤字の可能性があります。(test.p の 1 行目))
054854703/06/18 00:29ID:???
>>544
s/の変数//;
0549nobodyさん03/06/18 00:39ID:???
>>544
なぜって……さっきからみんな指摘してるよ。
0550nobodyさん03/06/18 00:41ID:???
(≧∇≦)ぶぁっはっはっ!!まだ気がついてなかったのか

(・∀・)ノ" またあとで見に来るよん
055150603/06/18 01:07ID:???
ああああ、情けない。。。。
しかし、デバッガって便利なんですね。使ってみよう。
いままでKCatchしか使ってなかった。
0552nobodyさん03/06/18 01:15ID:???
|_・ ) ワカッタノカナ?
055350603/06/18 02:39ID:???
すいません、もう1ついいですか?
実は、「document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';」
というのは外部jsなんです。(SSIが使えないので、SSI Includeみたいに使おうとしている))

なので、↓の1行目で、jSファイルを読み込んでその文字列まるまるを返してます。
    $topics = &responce_filesubstance($PathTopicsJS);
    jcode::convert(\$topics, sjis);
    $topics =~ s/^\w+\.\w+\(\"(.*)\"\)$/$1/;
ところが、そうすると、
$topicsが「document.write("<font color=#FF9900>◆</font>ホームページがリニューアルオープンいたしました!")';」
のままで置換してくれなくなってしまいました。どうすればいいのでしょう?

一応、responce_filesubstanceも書いておきます。
sub responce_filesubstance{
    my($PathFile) = $_[0];
    my($filesubstance);
    #ファイルを開いて読み込む
    open (IN,$PathFile) or die "cannot open $PathFile:$!";
         flock(IN, 1);
            while($LineTmp = <IN>){
                $filesubstance = $filesubstance . $LineTmp;
            }
        close IN;
        &jcode::convert(\$filesubstance, "euc");
    #結果
    return $filesubstance;
}
0554nobodyさん03/06/18 02:45ID:???
>553
なんで外部JSをそのまま使わないの?
SSIなくても普通に使えるでしょ。
055550603/06/18 02:52ID:???
>>554
JSの中身を更新できるスキル?があれば十分なのですが、
HTML知らないお客さんに納品するものなので、
外部JSの中身をコンパネで動作できればなと、。
0556nobodyさん03/06/18 03:37ID:???
よくわかんないけど
置換する直前に$topicsを一度はき出して中身を確認したら?

eucに変換したモノをまたShift_jisに変換するのって意味あるのん?
0557nobodyさん03/06/18 03:42ID:???
>>555
>お客さんに納品
プロですか!?それで。
厨房かと思ってた。
055849203/06/18 06:06ID:???
>>497
半角スペースで入れたら字下げ消えた(´Д`)

>>497
ありがとう、確かに処理の順番逆だったね(´∀`)
で、やってみたころ
相変わらずエラー表示が出ます
変数を表示させたところ
パスワードはマッチするようになりましたが
0559nobodyさん03/06/18 09:34ID:???
半角スペースやタブが消えちゃうのはなぜ ?
消えないようにするには、どうすればいいの ?
0560nobodyさん03/06/18 10:18ID:???
   TEST
0561nobodyさん03/06/18 10:19ID:???
nbsp;で入るようだ。
全角でもいいけど、えらっちゃうしね。
スペースを 変換してくれれば楽なのに…。
056255503/06/18 10:44ID:???
>>557
すまそ。で、最近そんなもんじゃない?前任者はもっとだめだめだった。
0563nobodyさん03/06/18 10:54ID:???
ふと思ったのですが、JacaScriptで、SSI INCLUDEみたいに、
ファイルを読み込んでくれる関数はないですか?
0564nobodyさん03/06/18 11:42ID:???
>563
JavaScriptスレで聞いてこい。
0565nobodyさん03/06/18 15:43ID:???
>>563 JacaScript ?

>>563 JacaScript ?

>>563 JacaScript ?
0566nobodyさん03/06/18 15:57ID:yTFW11Gl
掲示板などのTDタグでWIDTH=”80”と指定して、そこに半角英数字を80
ピクセル以上書くと折り返し表示してくれなく、80ピクセル以上に
テーブルが伸びてしまいます。
全角文字や半角カナ文字は80ピクセル以上だと自動改行してくれるのに
半角英数字だと改行してくれないのはなぜなのでしょうか?
また、改行できる方法を知ってる方がいましたら教えてください。
0567nobodyさん03/06/18 16:01ID:???
>>566
あのさあ、何でこのスレで質問したのかをまず教えてくれない?
0568nobodyさん03/06/18 16:02ID:???
>>566
板違い
056956603/06/18 16:03ID:???
>>567
掲示板などのスクリプトの中にperlで
半角英数字が連続したときに自動改行してくれる
構文など有るんでしょうか、と書きたかったのです。すみません。
0570DBMのBSD DB(Berkeley DB)はMySQLより早いのか?03/06/18 16:04ID:kZ9NfMGd
http://www.ecopig.jp/comucale/index.htm
上記ダウンロードより
DBMのフィールドを自分で作る(分割する)と、
Berkeley DBは、MySQLより早いのか?
この件についてどなたか、教えて下頂けませんか?
0571nobodyさん03/06/18 16:05ID:???
>>566
板違いも甚だしくてワロタ
<td style="width: 80px;table-layout:fixed;">
とか。
ブラウザ依存だから期待せぬように。
0572 03/06/18 16:09ID:???
$_="TooLongLongLongString";
s/([a-zA-Z0-9\-_\?\.]{5})/$1\n/g;

かな。この場合5文字で改行。
0573nobodyさん03/06/18 16:34ID:???
違うと思うが
0574nobodyさん03/06/18 16:46ID:???
>>569
2バイト文字が混在した文字列を途中で分割するのはわりと面倒なので、
そういうのは普通ブラウザの表示に依存させてしまうことが多い。
んで、>>566の質問については板違いにつき、ここでは答えない。
0575nobodyさん03/06/18 17:45ID:???
system("ls");
で、得られたファイル名前、ディレクトリ名前を配列に代入したいんですが
どうすればいいでしょうか?
0576nobodyさん03/06/18 18:21ID:???
>>575
split(/\n/,`ls`);
0577nobodyさん03/06/18 19:49ID:fCn6DpDd
Cookieについてなんだけど、次の簡単なコードなんだけど、
IEだけが機能してくれない、Opera、Mozilaは問題ないんだけど、
誰かわかりません?、オナガイします、マジでひとつ。


#!/usr/bin/perl -w

print <<"END";
Content-type: text/html
Set-Cookie: DATA=0123456789; expires=Mon, 30-Dec-2020 23:59:59 GMT


END

foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"<br>\n";
}
0578nobodyさん03/06/18 19:57ID:???
while(1) {
print "ぬるぽ\n";
}
こんな感じに半角でインデントして、
>>578
自分へのアンカーをつけてポップアップで読む
0579nobodyさん03/06/18 20:10ID:???
>>577
>>1に書いてある3つの手順をちゃんと踏んでおくようにね。
あなたの場合、1番目と3番目が書いてない。
0580nobodyさん03/06/18 20:22ID:???
>>577
> Content-type: text/html
不要。
よってPerlとは関係なし。
逝って良し。
058144303/06/18 20:24ID:???
えっと、>>443です。
みなさん色々ありがとうございます。
2日間調べてやっと原因が解りました。
>>463さんが言ったようにサーバー側の設定の問題でした。
$ip = $ENV{'X_FORWARDED_FOR};に変えたら
ちゃんと違ったIPが取得できるようにました。
$useragent = $ENV{'HTTP_USER_AGENT'};でユーザーエージェントも
取得したんですが、私はWindows xpなのにWindows NTになっていました。
こういうもんなんでしょうか?
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
だから「ファイルテスト演算子」という言葉が出てきたのだが。
入門本ばかり眺めているんだろうな鬱。
■ このスレッドは過去ログ倉庫に格納されています