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

Perl 初心者コーナー Part22

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん03/04/15 10:15ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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


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

過去ログやお勧めサイトは >>2-10
0951nobodyさん03/05/14 18:49ID:???
<ある変数(複数行)に、カンマと改行しか含まれていない場合>
という条件は、以下であってると思ったのですが、どうも違うようです。。。
どうしてだめなのでしょうか?

m/^[,\n\r]*$/gm){
0952nobodyさん03/05/14 19:18ID:???
while (<DATA>) {
  if ($_ =~ /^,+$/) {
    print $.. "行目マッチ!\n";
    next;
  }
  print $.. "行目クリア\n";
}

exit;
__END__
,,,,
,1,1,1
,,,,,,
aaa,aaa,aa,

・・・と、作ってみる。
改行は普通ではマッチしない。

で、例の如くタブは全角ス(ry
0953nobodyさん03/05/14 21:45ID:???
>>951
/m … ^ が「全ての行頭」、$ が「全ての行末」にマッチ
/s … ^ が「文字列の先頭」、$ が「文字列の末尾」にマッチ
0954nobodyさん03/05/14 22:05ID:???
>>951
正規表現道場@2ch Part2
http://pc2.2ch.net/test/read.cgi/php/1038146241/l50
0955nobodyさん03/05/15 00:00ID:???
980くらい行ったら新スレ立てる?
0956nobodyさん03/05/15 00:06ID:???
そのぐらいでいいんじゃないかな
0957nobodyさん03/05/15 16:12ID:???
XMLをperlで処理する質問はこの板でいいですか?
perl5.6でXMLにチャレンジしてみようと思って、

#!/usr/bin/perl

use strict;
use Jcode;
use XML::Parser;

my $topic;
while($line = <STDIN>)
{
   $topic .= $line;
}
my $xml = new XML::Parser(Style => 'Debug',ProtocolEncoding=>'x-euc-jp-unicode');
my $result =$xml->parse($topic);

こんな感じでXML文書を読み込ませてみたら、途中で、
Substitution loop at /usr/lib/perl5/site_perl/5.6.1/i386-linux-thread-multi/XML/
Parser.pm line 346, <STDIN> line 75.
こんなエラーが出ます。エラーの出る行には日本語が入っています。

日本語非対応かなと思っていろいろ試してみると、たとえば「◇」のような文字が
含まれているとだめだったりするようです。(だめなのはこれだけではなさそう)

やりたいのは、perlで日本語のXML文書を読み込むことです。
その読み込みの時点ではまってしまうので困っています。

別に文字コードがeucである必要はないし、モジュールもXML::Parserを使うことにこだわりないです。
この辺のことを処理するにはどうすればいいでしょうか?
0958 ◆hMJAPH9PWA 03/05/15 17:23ID:???
>>957
UTF-8にしてみたら?

# 読み込みアルゴリズムが違うのははただの趣味
undef $/;
my $topic = <STDIN>;
Jcode::convert(\$topic, 'utf8', 'euc'); # これ
my $xml = new XML::Parser(Style => 'Debug',ProtocolEncoding=>'utf-8');
# ...

095995703/05/15 18:20ID:???
>>958
UTF-8でやってみました。
以降Jcodeにてeucをutf8に変換したものとして話をさせていただきます。

utf-8にしても、同じエラーが出るには変わりなかったので、
エラーの出る部分を特定しようとして、ひとつ気がつきました。

*文字の種類によってエラーがでるのではなく、文字数によってエラーが出る。*

日本語だけで記述された文の場合、文字が10個続くと必ずエラーが出ます。
9文字までならエラーになりません。

アルファベット(半角文字)で始まる文の場合、
アルファベットが1つ,2つの時は同じように日本語10文字で同じエラーになります。
アルファベットが3つあると、日本語16文字で同じエラーになります。
アルファベットが4つあると、日本語18文字で同じエラーになります。
アルファベットが5つあると、日本語20文字で同じエラーになります。
なんなんでしょう、これ。

ちなみにエラーの出るXML::Parser.pmの346行のコードは、
$text =~ s/([\x80-\xff])/sprintf "#x%X;", ord $1/eg;
だそうです。
0960あすか03/05/15 21:05ID:???
あの。・・たまにみかけるんですが、、、
掲示板で、URLを張ると、そのURLの「HTMLソース」が見れる様になるものがあるんですが
あれって、どういう仕組みなんでしょうか。。
例えば
http://www.yahoo.co.jp/ (Text)←yahooにアクセスしなくともhtmlソースが見れる
の様なものです★

0961動画直リン03/05/15 21:10ID:fs87NLJj
http://homepage.mac.com/hitomi18/
0962nobodyさん03/05/15 21:23ID:???
>>960
view-source:http://www.yahoo.co.jp/
0963nobodyさん03/05/15 21:39ID:bacZc7Vd
フルパスからファイル名のみを得る正規表現教えてください。



d:/aaa/bbb/ccc/ddd/file.txt -> file.txt
d:/aaa/bbb/aaa.dat -> aaa.dat
d:aaa.dat -> aaa.dat
d:/aaa/bbb/aaaa -> aaaa
d:/aaa/bbb/ccc/ddd/eee/.fff -> .fff
d:.abcde -> .abcde


perlで、自分自身のファイル名を得たいので
$0 っていう特殊変数を使うと、フルパスで出てしまうので、
ファイル名のみを、、
096496303/05/15 22:03ID:bacZc7Vd
すいません。自己解決しました。

$ENV{SCRIPT_NAME} =~ s|.*/||;

で、できました。
ただ、これを変数に入れるのはどうすればいいでしょう?

my $filename = $ENV{SCRIPT_NAME} =~ s|.*/||;

ってやっても、$filename には 1 としか入らんもんで、、
0965nobodyさん03/05/15 22:46ID:mip2uT4/
Bというサーバが稼動、重い、ダウンを得るために、AのサーバでCGI動かして
それをSSIで出力したいのですが、思いつくのは、Bサーバの1個のファイルに対して、

if(-e $file){
print "稼動中";
}else{
print "ダウン中";
}
という、つながるか、つながらないか、というのしかできそうにありません。
pingでパケット送ったり、みたいなのはないですか?
096696503/05/15 23:01ID:???
オレの名は翻訳野郎
翻訳の天才だ。日本語だって訳してみせらぁ。でも脳内単語だけは勘弁な。
--
あるサーバ(A)から別のWebサーバ(B)の状況を確認したい。
確認したい内容は、1.健在 2.レスポンスが悪い 3.沈黙。

自分で考えた方法は、Bサーバで if(-e $file)を実行する方法。
できることならpingの確認もしたい。
0967nobodyさん03/05/15 23:07ID:mip2uT4/
>>966
ありがとう。
pingの確認というのは、-eでは健在or沈黙しか得られないので、
pingなど、レスポンスの良し悪しも分かるコマンドはないですかってことです。
わざわざスマソ
0968nobodyさん03/05/15 23:09ID:???
( ̄0 ̄;)な、何かあったのか!?連続してこんな質問ばかり・・・
0969bloom03/05/15 23:10ID:fs87NLJj
http://homepage.mac.com/ayaya16/
0970 ◆hMJAPH9PWA 03/05/15 23:26ID:???
>>959
う〜む。分からない。
エラーが起きる最小のコードXML文書を抜き出せる?
あとXML::Parserのバージョンも教えて。
0971965=96703/05/15 23:26ID:mip2uT4/
>>966
>自分で考えた方法は、Bサーバで if(-e $file)を実行する方法。
やっとこの意味がわかった。Bサーバでif(-e $file)を実行して、Aサーバに
SSIでフルパスで呼び出すってことですか。。

書き忘れましたが、AサーバはSSI,CGI可で、BサーバはSSI,CGI共に不可なんです。
if(-e $file)ってのをURLいれてやったら失敗したから、この場合どうしようもないのかな・・・・
0972nobodyさん03/05/15 23:33ID:???
>>964
my $filename = $ENV{SCRIPT_NAME};
$filename =~ s|.*/||;

ちったぁ、頭使おうぜ。
0973nobodyさん03/05/15 23:35ID:???
>>971
基本的に他の鯖のことがわかる簡単な方法はないと心得よ。

A鯖からLWPモジュールなどを使って確認せよ。
0974965=96703/05/15 23:52ID:mip2uT4/
>>973
ありがとう。
is_success使ってできた。。。でも、レスポンスが悪いとかは無理かな?
これは、生存or死亡だけっぽい
0975nobodyさん03/05/16 00:16ID:???
時間計りゃあいいじゃん・・・
0976965=96703/05/16 01:39ID:HXybd+Xv
時間って、msってやつ?
時間はあんまり詳しくないんです、、ハイ
0977nobodyさん03/05/16 11:03ID:+7wsfVA8
小数点第2位以下を切り捨てするにはどのような方法がありますか?
sprintf("%0.2f",$num)
これだと四捨五入になるので、お願いします。
0978bloom03/05/16 11:10ID:n/FznajZ
http://homepage.mac.com/ayaya16/
0979nobodyさん03/05/16 11:12ID:???
>>977
$number = 1.234567;
$number = int ( $number * 100);
$number /= 100;
0980nobodyさん03/05/16 11:22ID:???
 
■ 新スレ用意いたしますた ■

Perl 初心者コーナー Part23
http://pc2.2ch.net/test/read.cgi/php/1053051519/
0981nobodyさん03/05/16 11:26ID:???
>>970

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://example.com/index.xsl"?>
<Subject>ああああああああああ</Subject>

これでエラーになります。
XML::Parserのバージョンはたぶん2.31、
昨日CPANからインストールしたので最新バージョンだと思います。

あと、調べたらStyle=>'Debug'の時だけエラーになるようです。
Style=>'Tree'の時にはエラーになりませんでした。

たぶん実際に使うときにはDebugでは使わないから別にいいのかな……。
0982 ◆hMJAPH9PWA 03/05/16 14:28ID:???
>>981
ごめん、分からなかった。
perl5.8+XML::Parser2.31では再現せず…。"Wide character in print"なんて警告は出たけど、謎。
多分、XML::Parser::Expatを経由するに立てられたUTF8フラグが悪さをしているんだと思うけど…。

とりあえず置換えはどうせデバッグの為だけだし、こんな感じでメソッドを再定義すればとりあえずは動くはず。
sub XML::Parser::Debug::Char{
my $expat = shift;
my $text = shift;
print STDERR "@{$expat->{Context}} || $text\n";
}
my $parser = new XML::Parser(...);
0983nobodyさん03/05/16 17:38ID:Jkp+t2ia
%mode2name = (
  'sql_arrange' => "顧客絞込み条件の入力",
  'select' => "該当顧客の閲覧",
  'writemail' => "メールの記入"
);

foreach $value (keys %mode2name){
  $HtmlTmp .= qq|$mode2name → |;
}

print $HtmlTmp;

とやると、
「該当顧客の閲覧 → メールの記入 → 顧客絞込み条件の入力 → 」
と表示されます。

これを、%mode2name = で設定した順番、つまり、
「顧客絞込み条件の入力 → 該当顧客の閲覧 → メールの記入」
と表示させるには、

foreachの部分はどう書けばいいのでしょうか?
0984nobodyさん03/05/16 17:39ID:???
>>983
ごめんなさい、新すれがあったのですね。そちらに書き込みます。
0985nobodyさん03/05/16 18:04ID:???
>>982
おつきあいどうもありがとうございました。なんとかこれでやってみます。

スレ埋め立ても兼ねてちょっとみなさんに聞きたいのですが、
なんかどこもかしこもXMLになってきているなかで、なんかgoogleっても
perl+XMLな話題が少ないような気がするのですけど、
スクリプトでXMLいじる人ってのは
perl以外(rubyとかpythonとか)の方が最近は多かったりするんでしょうか?

周り見てみて、いかがですか?
0986nobodyさん03/05/16 21:42ID:4ZXWJHXL
winxpで使えるperlを配布しているサイトってあります???
探しているんですが見つからないんです。
0987nobodyさん03/05/16 21:53ID:???
>>986
http://www.google.com/search?q=perl+WindowsXP&num=100&hl=ja&lr=lang_ja&ie=UTF-8&inlang=ja&c2coff=1&safe=off&filter=0
0988nobodyさん03/05/17 00:14ID:GaxUmwFm
掲示板のCGIで、$ENV{'REMOTE_HOST'}が取得出来ません。
サーバーによって何か設定変えないければならないのでしょうか?
perl5、apache、freeBSDのサーバーなんですが。。
0989nobodyさん03/05/17 00:25ID:???
>>988
どこかのレンタル?
$ENV{'REMOTE_HOST'}を取得できない鯖はよくあるよ。
$ENV{'REMOTE_ADDR'}から必要に応じてホストに変換で。
099098803/05/17 00:43ID:GaxUmwFm
はいレンタルサーバーです。
$ENV{'REMOTE_ADDR'}は取得出来ましたので必要に応じてホストを調べればいいという事ですね。
ちょっとスレ違いですが、例えば掲示板で変な書き込みがあったときに、プロバイダに連絡して注意してもらう為には$ENV{'REMOTE_ADDR'}と書き込み時間を取得しておけば大方はOKでしょうかね?
0991nobodyさん03/05/17 00:46ID:???
>>990
その二つがあれば大丈夫
当然、書き込み内容も必要だが
099298803/05/17 00:52ID:GaxUmwFm
ありがとうございます。使う事は無いとは思うんですが安心しました。
0993nobodyさん03/05/17 17:47ID:???
埋め立て
PERL、Perl、perl、PERL、Perl、perl
Perl、perl、PERL、Perl、perl
perl、PERL、Perl、perl
PERL、Perl、perl
Perl、perl
perl
erl
rl
l
rl
erl
perl
perl、 Perl
perl、 Perl、 PERL
perl、 Perl、 PERL、 perl
perl、 Perl、 PERL、 perl、Perl
perl、 Perl、 PERL、 perl、Perl、PERL

0994nobodyさん03/05/17 18:06ID:???
ガンバレ>>993
0995nobodyさん03/05/17 18:32ID:???
よろしく>>993
0996nobodyさん03/05/17 18:39ID:???
>>993
標準出力に表示するようにperlで描画汁。
0997nobodyさん03/05/17 18:41ID:???
うん、ちょっと待って、今、993をPerlで書いてる。
0998nobodyさん03/05/17 18:55ID:???
もう90%できたが食事に呼ばれた。後で。
0999nobodyさん03/05/17 19:01ID:???
じゃ、オイラが。
1000nobodyさん03/05/17 19:02ID:???
1000。と。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。