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

Perlコーディング初心者質問スレ Part 54

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
05115102007/03/28(水) 22:51:27ID:???
あ
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);
は
my @img = map {"$_\n"} (/<a href="(http:\/\/.*?)"/gis);
に訂正
偉そうに書いておいてエスケープ忘れた…
0512nobodyさん2007/03/29(木) 00:42:31ID:???
>>509
今後の参考にさせていただきます^^;

>>510
>最初の一個しか抽出できない
あ〜・・・だから抽出したリンク数が合わなかったんですね^^;
ありがとうございます。

これからmap関数?を調べて(初めて見るんで;)それから試してみようと思います
0513nobodyさん2007/03/29(木) 12:49:04ID:???
スレッドごとに違うIDを表示したいという件で質問した者ですが、自己解決しました。
回答はもう結構です。お騒がせしました。
0514nobodyさん2007/03/30(金) 04:04:21ID:???
WinXP 上の ActivePerl で、再帰的にファイル名を収集しています。

「表」というディレクトリに chdir して、
その中で opendir, readdir とかしたいのですが、うまくいきません。

うまくいく方法があればお願いします。
0515nobodyさん2007/03/30(金) 06:41:02ID:???
なんかその質問ム板で見た記憶がある
答えは忘れたけどw
0516nobodyさん2007/03/30(金) 07:44:15ID:???
File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか
0517nobodyさん2007/03/30(金) 07:44:58ID:???
File::Finder忘れてた
0518nobodyさん2007/03/30(金) 11:12:45ID:Ov/YkxL/
sub loadFormdate
{
my($query,$pair);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else{
$query = $ENV{'QUERY_STRING'};
}
foreach $pair(split(/&/,$query)){
my ($key,$value) = split(/=/,$pair);

$value =~ tr/+/ ;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
}
}


というプログラムでhttp://www.e777.co.jp/perlcw/perlcw.htmlのサイトを使って文法チェックしたところ

Bareword found where operator expected at tmp.pl line 75, near "9a"
(Might be a runaway multi-line // string starting on line 74)
(Missing operator before a?)
Unquoted string "a" may clash with future reserved word at tmp.pl line 75.
syntax error at tmp.pl line 75, near "9a"
Unrecognized file test: -F at tmp.pl line 75.

が出てきました
正しいプログラムをコピペしても出てきたんですが
どこが違うか教えていただけないでしょうか??
0519nobodyさん2007/03/30(金) 11:53:25ID:???
$value =~ tr/+/ /;
スラッシュがぬけてる。
0520nobodyさん2007/03/30(金) 12:14:19ID:???
> File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか

File::Find と Path::Class はうまく扱えませんね。
0521nobodyさん2007/03/30(金) 12:17:30ID:???
> なんかその質問ム板で見た記憶がある
> 答えは忘れたけどw

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

これもうまく動かない。
0522nobodyさん2007/03/30(金) 20:49:19ID:???
>518みてて思ったんだけど、

s/%([\da-f]{2})/chr hex $1/ieg;

s/%([\da-f]{2})/pack 'H2', $1/ieg;

どっちがはやいんだろ。
0523nobodyさん2007/03/30(金) 21:28:36ID:???
use strict;
use Benchmark qw( timethese cmpthese ) ;
use CGI::Util qw(escape);
my $str = escape("Perlコーディング初心者質問スレ");
my $r = timethese( 100000, {
chrhexi => sub {
local $_ = $str;
s/%([\da-f]{2})/chr(hex($1))/ieg;
},
chrhex => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg;
},
packh2i => sub {
local $_ = $str;
s/%([\da-f]{2})/pack('H2', $1)/ieg;
},
packh2 => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
},
} );
cmpthese($r);
0524nobodyさん2007/03/30(金) 21:29:20ID:???
Benchmark: timing 100000 iterations of chrhex, chrhexi, packh2, packh2i...
chrhex: 8 wallclock secs ( 5.21 usr + 2.13 sys = 7.34 CPU) @ 13623.98/s (n=100000)
chrhexi: 7 wallclock secs ( 6.72 usr + 0.71 sys = 7.43 CPU) @ 13458.95/s (n=100000)
packh2: 8 wallclock secs ( 7.25 usr + 0.57 sys = 7.82 CPU) @ 12787.72/s (n=100000)
packh2i: 8 wallclock secs ( 7.54 usr + 0.61 sys = 8.15 CPU) @ 12269.94/s (n=100000)
Rate packh2i packh2 chrhexi chrhex
packh2i 12270/s -- -4% -9% -10%
packh2 12788/s 4% -- -5% -6%
chrhexi 13459/s 10% 5% -- -1%
chrhex 13624/s 11% 7% 1% --

perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
uname -a
Linux colinux.localdomain 2.6.11-co-0.6.4 #1 Mon Jun 19 05:36:13 UTC 2006 i686 i686 i386 GNU/Linux
05255182007/03/31(土) 06:34:34ID:x8D9Mjhz
>>519さん
あっ本当ですね
でも文法でひっかかるのはその下の
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;という部分なんです
05265182007/03/31(土) 07:58:19ID:x8D9Mjhz
>>519さんの言うとおりにしたら出来ました
エラーってでるとこが悪いとは限らないんですね
ありがとうございました
0527nobodyさん2007/03/31(土) 11:00:31ID:???
だから、/を補えば出なくなるが?
/がないから、s/の/までがtrだと思われてるわけだろ?
0528nobodyさん2007/03/31(土) 11:01:12ID:???
スマン、526が目に入ってなかった。
0529nobodyさん2007/04/01(日) 07:53:31ID:uYKSgLT/

�T if(not exists $FORM{'adminpass'}) {
printGatePage();
  }
�U  elsif($FORM{'adminpass'} eq $ADMINPASS) {
loadUserfile();

   }
   else {
printErrorPage("管理パスワードが違います。");
   }
   exit;
というプログラムでif文とelsif文について教えてください
�Tが真 つまり$FORM{'adminpass'}がなかった場合
�Tのプログラムが実行されて�Uのelsifのプログラムは実行されないはずなんですが
本によれば�Uのプログラムも実行されるんです
どういうことかと言いますと
�Tで真
→$FORM{'adminpass'}がないのでprintGatePage();で$FORM{'adminpass'}を存在させるようにする
→�Uのプログラムが実行
となっています
これは本当は�Tが真であれば�Uのプログラムは実行されず終わるんではないでしょうか?
よろしくおねがいします


0530nobodyさん2007/04/01(日) 08:34:15ID:???
自分で確かめてみればいいじゃん
0531nobodyさん2007/04/01(日) 08:43:42ID:???
>>529
# ローマ数字(I、II、III、…)は機種依存なので使うのをやめましょう
# 本によれば、というからには、本のタイトルや出版社など原典がわかるようにしましょう

%FORMについてなにも説明がありませんが、はフォームデータを解析・デコードして入って
いるのだと思います。で、Iが真ならばIIは評価されないというのはその通りです。

なお、「$FORM{'adminpass'}がなかった場合」というのは、%FORMに adminpassという
キーが存在しなかった場合、という意味です。普通パスワードの入力欄は、inputタグを
使うのであり、空欄のままsubmitを押しても、"adminpass="という文字列が送られて
きますので、それを%FORMに格納した場合、 adminpassというキーは存在しているので、
Iは常に偽となります。パスワードが空欄かどうかを判定するには、existsではなく
空文字列との比較($FORM{adminpass} eq "")をする必要があります。
05325292007/04/01(日) 09:36:29ID:uYKSgLT/
>>530さん
自分で確かめたらelsifが実行されていたのでここで聞いています
>>531さん
詳しい説明ありがとうございます
ではなぜelsifのプログラムが実行されたのでしょうか??
プログラム全部を載せたいのですが改行で無理みたいなので…

sub printGatePage
{
print <<END;
Content-type: text/html; charset=$CHARSET

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>ゆーざーかんり</title></head>
<body>
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定">
</form>
</body>
</html>
END
}

本の名前は『10日でおぼえる Perl/CGI』著:高橋大吾です
この本の6章で認証プログラムを作っているのですが
0533nobodyさん2007/04/01(日) 10:44:05ID:????PLT(12980)
そんな本捨ててしまいなさい
0534nobodyさん2007/04/01(日) 13:23:47ID:???
>>532
・I → printGatePage() → II → loadUserfile()
という流れだと思い込んでるから、自分で確かめても if と elsif を両方通ってると思うだけで。

・何かのフォームからPOST → Iが真 → printGatePage() → exit  # >>532のHTMLを吐いて一旦終了
・続いて「ゆーざーかんり」ページからPOST → 同じスクリプトが叩かれる → Iが偽 → II
…こう動いてるような気はしませんか。
05355292007/04/01(日) 15:33:33ID:uYKSgLT/
>>533さん
本当に捨ててやりたいです
でも独学なのでこの本が一番分かりやすかったんで…

>>534さん
つまり
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
でもう一度同じとこに戻っていることですよね??
ありがとうございました 大変助かりました
0536nobodyさん2007/04/03(火) 16:20:52ID:7w7pj3iq
普通に動くが・・・

use CGI;
foreach (&CGI::param) {
$FORM{$_} = &CGI::param($_) || undef; }

print &CGI::header(-charset=>'Shift_JIS'),
&CGI::start_html(-encoding => 'Shift_JIS');

if(not exists $FORM{'adminpass'}) {
&printGatePage; }
elsif($FORM{'adminpass'} eq 'aaaa') {
&loadUserfile; }
else {
&printErrorPage; }

sub printGatePage {
print <<END;
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定"></form></body></html>
END
exit(0); }
sub loadUserfile {
print 'loadUserfile</body></html>'; exit(0); }
sub printErrorPage {
print 'printErrorPage</body></html>'; exit(0); }
0537nobodyさん2007/04/03(火) 20:04:01ID:Ex+wZs3r
【リダイレクトについて】
LocationヘッダをContent-type:text/htmlを出力した後に
使いたいのですが何か方法はないでしょうか。
0538nobodyさん2007/04/03(火) 20:51:15ID:???
>>537
<q cite="http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2.2";>
スクリプトはいかなる他のヘッダフィールドも message-body も
返してはならない
</q>
0539nobodyさん2007/04/03(火) 20:52:16ID:???
http://homepage2.nifty.com/~~~/utf8_decode.pll

これなんですが、標準入力をリダイレクションでファイルに変更すると
標準出力されません、なぜでしょうか?
05405392007/04/03(火) 20:53:22ID:???
環境はXPproSP2,ActivePerl-5.8.8.820です。
05415392007/04/03(火) 20:54:01ID:???
失礼しました。下記が正しいです。

http://homepage2.nifty.com/~~~/utf8_decode.pl
0542nobodyさん2007/04/03(火) 21:07:53ID:???
どこでヘッダ吐いてんのさ
05435392007/04/03(火) 21:12:28ID:???
>>542
私への質問でしょうか?
すみません、意味がわかりません。
申し訳ありません。
0544nobodyさん2007/04/03(火) 21:22:35ID:???
CLIだしム板に振ろうかと思ったら、向こうからこっちに来たのか。

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/163-178
05455372007/04/03(火) 21:22:59ID:???
>>538
つまりはできないということなのでしょうか?
もしできないのであればCGIにてhtmlを出力した後に
別ページを表示することはMETAタグを使わずには打
開策すらないのでしょうか…。
05465392007/04/03(火) 21:27:10ID:???
>>544
そうです。お願いします
0547nobodyさん2007/04/03(火) 21:49:45ID:???
>>547
はいできません。CGIやHTTPのしくみをよく勉強しましょう。
05485372007/04/03(火) 22:09:15ID:???
>>547
勉強になりました。ありがとうございます。
0549nobodyさん2007/04/04(水) 09:32:06ID:???
もしかしたらどっかのブラウザのバグでできるかもよ、うまくやればドメインを偽って…
0550nobodyさん2007/04/04(水) 14:01:56ID:???
Content-Typeの前にLocationを置くなら>538のすぐ後にある
6.2.4. Client Redirect Response with Document
にできるのかな。
05515392007/04/04(水) 20:34:07ID:???
自己解決しましたよ。

D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではダメで、
perl D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではOKです。
先頭のperlを書きたくなければ、下記らしいです。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
\Policies\Explorer
にInheritConsoleHandlesというDWord値を作り1をセット
0552nobodyさん2007/04/04(水) 21:42:58ID:???
とりあえずだ、Perlと関係ないことに気がつこうな
0553nobodyさん2007/04/04(水) 23:16:32ID:???
Perlに関係あるじゃん
とりあえず、正常動作おめ
0554nobodyさん2007/04/05(木) 00:54:13ID:???
OSおよびコマンドラインの話題だなどう考えても
0555nobodyさん2007/04/05(木) 05:46:52ID:???
>>553 = >>539 だなどう考えても
0556nobodyさん2007/04/05(木) 11:31:17ID:???
posfix(v2.2)のperlでの使い方について質問させてください。
配送エラーのとき、$from_mailに返信させたいのですができません。

$from_mail="[email protected]"; # $from_mailは存在します。
$to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)

open (MAIL,"| $mail_pass -t") || &error("posfixエラー");
# print MAIL "Error-To: $from_mail\n"; # Error-To:ヘッダがあっても無くても返ってきません
print MAIL "From: $from_mail\n";
print MAIL "To: $to_mail \n";


これを実行したところ、エラーの連絡が$from_mailに送信されません。

上記と同じメールの内容で、outlookを使用して、手作業で送信すると
件名:failure notice のエラーのメールが、返ってきました。

・posfixの設定で、足りないものあるのでしょうか?
・perlのプログラミングで、足らないことがあるのでしょうか?

よろしくお願いします。
0557nobodyさん2007/04/05(木) 11:42:22ID:???
本当にこうソースに書いているのなら、

> $from_mail="[email protected]"; # $from_mailは存在します。
> $to_mail="[email protected]"; # $to_mailは存在しません。(hoge2.jpは存在しないものとします。)

メール送信以前の問題なので$from_mail,$to_mailの値をチェックすることを
お勧めします。

ヒント: 文字列リテラルへの(配列)変数の埋め込み
0558nobodyさん2007/04/05(木) 11:43:28ID:???
$from_mailも$to_mailも@hogeが変数展開されてる。

シングルクォートで

$from_mail = '[email protected]';
$to_mail = '[email protected]';

としてやればおk

# hoge.jpは実在するドメインだから、こういうときの例にはexample.comを使おうな
0559nobodyさん2007/04/05(木) 12:29:53ID:???
>>557
>>558
お返事ありがとうございます。
シングルクォートに変更し、存在するメールには、
送信できること確認できました。

[cgi]
$from_mail = '[email protected]';
にしてみましたが、配信エラーの通知がされませんでした。
また、ドメイン検索で存在しないことを確認したドメインを
指定してもだめでした。

[outlook]
手作業で送信したとき、配信エラーが返って来るか確認してみました。
存在しないことを確認したドメインで、outlookでyahooや他のメールサーバから
送信すると戻ってきましたが、'[email protected]'は、戻ってきませんでした。

[考察]
ドメイン検索で存在しないことを確認したドメインで
outlookから送信すると、普通にエラーが帰ってきました。
cgiだと帰ってきません。cgiでなにかおかしいんじゃないかと思ってます。

open (MAIL,"| $mail_pass -t")の-tオプションが無いと
メール送信できなかったので付けてます。

思い当たることなどありますでしょうか。
よろしくお願いします。
0560nobodyさん2007/04/05(木) 13:09:03ID:???
エラーメールのあて先はenvelope fromで決まるが、それはヘッダのfromとは
まったく無関係で、送信プログラムにsendmail(postfixのsendmail互換コマンド)
を使っているならばプログラムを実行したユーザのアドレスになるのがデフォルトで、
変更したい場合は-fオプションで指定する必要がある。

open (MAIL,"| $mail_pass -t -f $from_mail")

0561nobodyさん2007/04/05(木) 16:00:15ID:???
>>560
丁寧な解説ありがとうございます。
open (MAIL,"| $mail_pass -t -f $from_mail")
にしてみましたが、配送エラーのメール送信されませんでした。

Envelope-From:ヘッダー、を試しましたがエラーは返信されませんでした。

cgiじゃなくて、postfixの設定ファイル/etc/postfix/main.cf
の設定がおかしい可能性高いでしょうか?

/etc/aliasesの設定がおかしいのかと思いまして、
FROM:ヘッダーを除いて、存在するメールを指定すると、
送信者はApache表示で$from_mailは、きちんと指定されていました。

$from_mailは、レンタルサーバのメールアドレスですが、
postfixサーバから普通に送信できるので、大丈夫だと思うのですが。

ん〜。難しいです。
0562nobodyさん2007/04/05(木) 16:40:06ID:???
>>561
postfixのログを見られるなら見るのが一番だが、レン鯖などで
見られないなら、まず自分に送ってみて届いたメールが思い通りに
なっているか確認するのが基本だな。

envelope fromはたいていreturn-pathというヘッダに保存されるので
それが自分が設定したつもりのものか確認するといい。
0563nobodyさん2007/04/05(木) 16:56:54ID:???
>>562
自宅サーバで、勉強してます。
違うcgiの過去の受信メール見てみるとReturn-Path:があるときと、
無いときがありました。ということは、cgiがおかしいのかもです。

どうもありがとうございました。
原因がわかりましたら、報告いたします。
0564nobodyさん2007/04/05(木) 18:06:22ID:2CVq1dn3
質問です。当方の掲示板にて半角を使いたいとの要望がありました。

で、ググった結果jcodeg.plを知り、これをアップロードして、半角文字のみで
書き込みのテストをしたらちゃんと半角で表示されました。

とここまでは良かったのですが、文章に全角と半角文字を混ぜた状態で
投稿すると、投稿後の記事内の文章が全て全角で表示されてしまいます。

入力した通りに投稿するには、jcodeg.plのドコを変更したらよいのでしょうか?
0565nobodyさん2007/04/05(木) 18:58:00ID:???
Encode.pmにしてutf8で書く
0566nobodyさん2007/04/05(木) 18:59:13ID:???
改造スレ行った方がいいんじゃね
0567nobodyさん2007/04/05(木) 19:04:47ID:???
>>563
今までのレスを斜め読みしただけで見当ハズレかも試練が
OP25ってオチかな?
0568nobodyさん2007/04/06(金) 07:42:58ID:???
>>567
port25は開けていました。

試しにコマンドラインで、[email protected]に送信してみました。
--------------------------
# /usr/sbin/sendmail -t
Envelope-From:"普段のメール"
To:[email protected]
.
--------------------------
で送信しましたが、配送エラーのメール返って来ませんでした。
・コマンドのオプション
・Envelope-From:"普段のメール"で、何かあるのか。
 いろんなメール指定してみましたがダメでした。
・ヘッダーオプションで他に何か必要か
ぐらいと思うのですが、どのあたりがおかしいでしょうか。

これが解決したら、perlにそのまま反映すれば
配送エラー返ってくる気がするんですが。。。
よろしくお願いします。
0569nobodyさん2007/04/06(金) 09:53:13ID:???
>>567
Envelope-From: などというヘッダはない。

# /usr/sbin/sendmail -t [email protected]
To: [email protected]

本文…
.
#

のように指定します。-fの直後に指定するのがenvelopeアドレスです。
上記の場合、envelopeアドレスに何かメールを戻したいなら、Toヘッダのアドレスを
実際に存在しないアドレスとか、ドメインにしてみないと、Toのアドレスに普通にメールが
届いて終わるので注意。

さもなくば、telnet localhost 25 でMTAと直接交信してみるとか。
0570nobodyさん2007/04/06(金) 12:41:32ID:???
>>569
お返事ありがとうございます。
#/usr/sbin/sendmail -t -f<存在するメール>
To:[email protected]
エラーメール戻ってきませんでした。
メールが送信できたのか、送信できていないのかも区別が付きません。orz
DNSの設定かと思い検索してます。
スレ違いになってきてしまいまい、申し訳ないです。

maillogは、下記の通りです。
Apr 6 12:26:04 localhost postfix/pickup[20462]: 4CCACC04193: uid=48 from=<存在するメール>
Apr 6 12:26:04 localhost postfix/cleanup[20527]: 4CCACC04193: message-id=<・・・@mail.example.com>
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: from=<存在するメール>, size=301, nrcpt=1 (queue active)
Apr 6 12:26:04 localhost postfix/qmgr[17310]: 4CCACC04193: to=<[email protected]>, relay=none, delay=0,
status=deferred (delivery temporarily suspended: Host or domain name not found. Name service error for name=example.jp type=MX:
Host not found, try again)
05715702007/04/06(金) 19:26:09ID:???
あまりにもスレ違いなので、linuxスレに行かせていただきたいと思います。
経過ですが、存在しないメールアドレスに送信した場合、
delivery temporarily suspended: Host or domain name not found.
Name service error for name=example.jp type=MX: Host not found, try again)
このパターンになるようです。
やっぱり、エラーのメールが自分に帰ってこないと不便ですよね。

tailf maillogで、眺めていたら突然、上記のパターンでログが大量に流れました。
昔送信したでたらめなメールで、しかも、try againっていうぐらいなので、
送信されずに、再送待ちになってるみたいです。
ttp://www.postfix-jp.info/trans-2.0/jhtml/faq.html

あとは、再送待ちじゃなくて、配送エラーが送信すればいいんですね。
再送のメールはどこにあるのとか、いろいろ、つまずいてます。
あとちょっとのような気がしてきました。

丁寧にレスありがとうございました。
05725702007/04/07(土) 04:16:46ID:???
maximal_queue_lifetime=0
で解決しました。

ログを見ることと、検索能力が少しアップしました。
ありがとうございました。
0573nobodyさん2007/04/07(土) 18:44:41ID:MSfJ44Rv
Perlプログラム内でグローバルIPを取得するにはどんなコマンドを使用すれば
よいですか?
Linuxです。
0574nobodyさん2007/04/07(土) 18:50:58ID:???
外部の鯖にIPだけを表示するSSI
とか置いてそこからlwpなりで適当に
取ってくればいいんじゃないすか
05755732007/04/07(土) 19:10:45ID:MSfJ44Rv
>>574
PerlでグローバルIPを取得する関数がないとすると、
シェルで組んだ方がよさそうですね。。

ありがとうございました
0576nobodyさん2007/04/07(土) 19:31:41ID:???
診断君を利用するんだ
とか勝手なこと言ってみる
0577nobodyさん2007/04/07(土) 19:56:03ID:???
「持っている全部のIPアドレスからプライベート領域に該当するものや
127.0.0.1みたいなのを取り除いて残ったもの」とすればよさそうだが、
これを複数もつホストもあるだろうなぁ。

0578nobodyさん2007/04/08(日) 03:05:36ID:???
コンピューターに直接グローバルIPが振られているのか、
ルータやファイアウォールがあってNATされているのかで話が違ってくる。

後者の環境の方が多いんじゃないか。
だとすると、外部のサーバにアクセスしてそのサーバ側から教えてもらうとか。
あるいは、ルータの管理画面を自力で取得してパースするとかね。
0579nobodyさん2007/04/08(日) 04:54:35ID:???
>>573
場合によってはこんな方法も

use Socket;
print inet_ntoa(scalar gethostbyname($ENV{HTTP_HOST}));
0580nobodyさん2007/04/08(日) 06:44:51ID:???
> ルータやファイアウォールがあってNATされている
俺はDDNSの更新する時ルータに教えてもらってる
0581nobodyさん2007/04/08(日) 09:30:52ID:???
シェルスクリプト相談室
http://pc11.2ch.net/test/read.cgi/tech/1112553783/

本人か?
0582nobodyさん2007/04/08(日) 09:31:57ID:???
番号抜けた。その板の552
0583nobodyさん2007/04/08(日) 10:08:34ID:???
1〜500の数字が数字ごとに1列ずつ並んでいるファイルがあるのですが、
そこから「10」という数字の列だけを参照するには
どうすればいいのでしょうか?
index関数だと100や210など10が含まれていたら
抜き出してしまうので悩んでいます。

検索で調べる場合の検索用語でもかまいませんので、アドバイスお願いしますorz
0584nobodyさん2007/04/08(日) 10:54:12ID:???
ファイルの内容を
詳しく日本語で
0585エスパー2007/04/08(日) 11:35:44ID:???
>>583
をエスパー日本語訳してみる。
こんな内容のファイルがあります。
--------
210 hoge
10 foo
100 guge
10 zoo
123 boo
--------
この場合 "10 foo" と "10 zoo" の行だけを抜き出したいのですが、index関数だと
210、100 といった行も含まれてしまいます。
どしたらいいの? お前らとっとと教えろ。
05865832007/04/08(日) 12:42:51ID:???
index関数にこだわりすぎてました。
$xx =~ /^$yy$/ でいけました。お手数かけました、ごめんなさい。
0587nobodyさん2007/04/08(日) 12:58:04ID:???
fooとかzooとかも付かず、本当に数だけが並んだファイルだったらしい。
だがな、それなら eq で比較するだけでもよさそうだな。
0588nobodyさん2007/04/10(火) 04:15:40ID:???
使ってる人がいるんだかどーだかわかんないけど、>>1の
> 過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
これ見ようとするとリダイレクトされて過去ログ閲覧不可なのね。

> 現在、mirrorhenkan/perl/ はFREESPACE利用規約の禁止事項に
> 抵触しているためアクセスを制限しております。
0589nobodyさん2007/04/11(水) 01:18:30ID:???
#�@配列に代入
open(IN, $file);  
@list = <IN>;
------------------------------------
#�Awhileで一行ずつ読み込んで処理
open(IN, $dfile);
while ( $line = <IN >) {
    #$lineを区切り文字を分割して、何か処理
}

何十Mというサイズの大きいCSVファイルを扱うときが前提です。
�@だと配列に格納するみたいですが、メモリの消費は大変でしょうか?
�Aのほうがよいでしょうか?
0590nobodyさん2007/04/11(水) 01:35:16ID:???
>>589
(1)の方はCSVが1GBならメモリも1GB以上使うわけだが、(2)は
CSVのサイズが1MBでも10GBでも変わらない。
ってことはわかってるわけだな。

答えわかってんじゃん。
しかし、割り切って(1)の方法を使う場合もあるよ。
書き捨て的なスクリプトとかだと。
っちゅうか、丸数字やめね?
0591nobodyさん2007/04/11(水) 03:38:11ID:???
>>590
パソコンの仕組みとperlの勉強を、はじめたばかりで、
メモリの動きとか、あまり考えたこと無かったので、
ちょっと自信がありませんでした。^^;
どうもありがとうございました。
0592nobodyさん2007/04/11(水) 04:20:00ID:???
> (1)の方はCSVが1GBならメモリも1GB以上使うわけだが、

そんなコンパクトに収まるかよw
0593nobodyさん2007/04/11(水) 10:31:55ID:???
今更ながらどうもコマンドラインがよく飲み込めてないかもしれないので、
少しお尋ねします。
例えば
perl -pi.bak -e "tr/A-Z/a-z/"*.html
とか便利ですよね?
これを.plとして使いたいのですが無理なのでしょうか?
コマンドラインから打ち込むしか手がないのでしょうか?
0594nobodyさん2007/04/11(水) 10:41:24ID:???
http://pc11.2ch.net/test/read.cgi/php/1171102883/593
http://pc11.2ch.net/test/read.cgi/tech/1173880452/235
0595nobodyさん2007/04/11(水) 10:41:25ID:???
マルチポストやめれ
0596nobodyさん2007/04/11(水) 10:45:21ID:???
すみません。最初にかきこんだとこはふさわしくないかもと思って
こちらに変えました。
申し訳ない。
0597nobodyさん2007/04/13(金) 14:21:28ID:ZxZihQHU
%ENV のように、どのpackage内からでも呼び出せる変数を作るのはどのようにしたらよいのでしょうか?
0598nobodyさん2007/04/13(金) 14:45:10ID:???
%{^_HOGE}のように名前を^_ではじめる。

詳しくはperlvar(1)の

Technical Note on the Syntax of Variable Names

を読め。
0599nobodyさん2007/04/13(金) 16:11:59ID:???
>>598
美しくないので却下します
もう少しマトモな回答しなさい
0600nobodyさん2007/04/13(金) 17:45:43ID:???
ちょ、教えてもらってるのに却下って・・・

$::HOGE = 1;とかもだめ?
後はこんなの書いといてプログラムの頭でuseするとか
package Global;
use strict;
use warnings;
use base qw(Exporter);
our @EXPORT = qw($BAKA $AHO $SHINE);
our $BAKA = 1;
our $AHO = 'a';
our $SHINE = 'A';

push(@UNIVARSAL::ISA,__PACKAGE__);

package TEST1;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;

package TEST2;
use strict;
use warnings;
printf "%s::BAKA=%s\n",__PACKAGE__,$BAKA++;
printf "%s::AHO=%s\n",__PACKAGE__,$AHO++;
printf "%s::SHINE=%s\n",__PACKAGE__,$SHINE++;
0601nobodyさん2007/04/13(金) 18:12:42ID:???
何をやりたいのか知らないけど、モジュール使って名前空間わけて必要に応じて
importするのが普通の方法なので、あまり変なことをせず従っておいたほうが
なにかといいと思われ。
06025972007/04/13(金) 20:19:19ID:ZxZihQHU
>>598, >>600, >> 601
ありがとうございます。試してみます。

何に使うってわけじゃなくて、そういうことが出来るのなら知りたいなと思いまして。有難う御座いました。

>>599
顔が見えないからってそういう言い方はしないほうがいいでしょうね。
0603nobodyさん2007/04/14(土) 04:03:04ID:???
掲示板やデータベースなどのスクリプトを作成しているんですが、
検索機能をつけて、検索語句を$wordとし、
$dataに一致するものがあれば、って形でやってます。

if($data =~ /\Q$word\E/){

すると、「[」で「ー」もヒットしてしまったりします。
これは「ー」に「[」のコードが含まれているからだと思うのですが、それを除外する方法はどうしたらよいでしょうか?
0604nobodyさん2007/04/14(土) 04:08:26ID:???
つ【utf8】
0605nobodyさん2007/04/14(土) 04:17:21ID:???
>>604
なるほどutf8という方式だとコードの重複がないんですね
検索語句と、検索対象をutf8に一旦エンコしてから、ってやり方にしてみます。
有難う御座いました。
0606nobodyさん2007/04/14(土) 05:37:58ID:???
jcode::convert(*data, 'euc');
みたいな感じに簡単にできると思ってましたが、複雑ですね。
一時的に対象の$変数をutfに変換して戻す簡単な方法は御座いませんでしょうか?
調べた限り、utfでスクリプトを書くことが前提の記事ばかり出てきてしまいます。
0607nobodyさん2007/04/14(土) 10:35:22ID:???
encode guess
0608nobodyさん2007/04/14(土) 11:07:17ID:???
ハッシュで自動的に補完されるのを防ぐにはどのようにするのでしょうか?

my %hash = ();
$hash{a}{b}{c}{d} = 'test';

↑の場合だと自動的に {b}{c}{d}の部分が無いのに自動的に作られてしまいます。こういうのを防ぎたいのですが・・
0609nobodyさん2007/04/14(土) 11:22:25ID:???
期待する動作をするものを作ってtieするとか。
既にありそうだけど。
0610nobodyさん2007/04/14(土) 12:46:48ID:???
>>606

http://pc11.2ch.net/test/read.cgi/tech/1173880452/10
■ このスレッドは過去ログ倉庫に格納されています