Perl 初心者コーナー Part22

このエントリーをはてなブックマークに追加
952nobodyさん:03/05/14 19:18 ID:???
while (<DATA>) {
  if ($_ =~ /^,+$/) {
    print $.. "行目マッチ!\n";
    next;
  }
  print $.. "行目クリア\n";
}

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

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

で、例の如くタブは全角ス(ry
953nobodyさん:03/05/14 21:45 ID:???
>>951
/m … ^ が「全ての行頭」、$ が「全ての行末」にマッチ
/s … ^ が「文字列の先頭」、$ が「文字列の末尾」にマッチ
954nobodyさん:03/05/14 22:05 ID:???
955nobodyさん:03/05/15 00:00 ID:???
980くらい行ったら新スレ立てる?
956nobodyさん:03/05/15 00:06 ID:???
そのぐらいでいいんじゃないかな
957nobodyさん:03/05/15 16:12 ID:???
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を使うことにこだわりないです。
この辺のことを処理するにはどうすればいいでしょうか?
958 ◆hMJAPH9PWA :03/05/15 17:23 ID:???
>>957
UTF-8にしてみたら?

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

959957:03/05/15 18:20 ID:???
>>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;
だそうです。
960あすか:03/05/15 21:05 ID:???
あの。・・たまにみかけるんですが、、、
掲示板で、URLを張ると、そのURLの「HTMLソース」が見れる様になるものがあるんですが
あれって、どういう仕組みなんでしょうか。。
例えば
http://www.yahoo.co.jp/ (Text)←yahooにアクセスしなくともhtmlソースが見れる
の様なものです★

961動画直リン:03/05/15 21:10 ID:fs87NLJj
962nobodyさん:03/05/15 21:23 ID:???
963nobodyさん:03/05/15 21:39 ID: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 っていう特殊変数を使うと、フルパスで出てしまうので、
ファイル名のみを、、
964963:03/05/15 22:03 ID:bacZc7Vd
すいません。自己解決しました。

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

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

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

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

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

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

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

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

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

Perl 初心者コーナー Part23
http://pc2.2ch.net/test/read.cgi/php/1053051519/
981nobodyさん:03/05/16 11:26 ID:???
>>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では使わないから別にいいのかな……。
982 ◆hMJAPH9PWA :03/05/16 14:28 ID:???
>>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(...);
983nobodyさん:03/05/16 17:38 ID:Jkp+t2ia
%mode2name = (
  'sql_arrange' => "顧客絞込み条件の入力",
  'select' => "該当顧客の閲覧",
  'writemail' => "メールの記入"
);

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

print $HtmlTmp;

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

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

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

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

周り見てみて、いかがですか?
986nobodyさん:03/05/16 21:42 ID:4ZXWJHXL
winxpで使えるperlを配布しているサイトってあります???
探しているんですが見つからないんです。
987nobodyさん:03/05/16 21:53 ID:???
988nobodyさん:03/05/17 00:14 ID:GaxUmwFm
掲示板のCGIで、$ENV{'REMOTE_HOST'}が取得出来ません。
サーバーによって何か設定変えないければならないのでしょうか?
perl5、apache、freeBSDのサーバーなんですが。。
989nobodyさん:03/05/17 00:25 ID:???
>>988
どこかのレンタル?
$ENV{'REMOTE_HOST'}を取得できない鯖はよくあるよ。
$ENV{'REMOTE_ADDR'}から必要に応じてホストに変換で。
990988:03/05/17 00:43 ID:GaxUmwFm
はいレンタルサーバーです。
$ENV{'REMOTE_ADDR'}は取得出来ましたので必要に応じてホストを調べればいいという事ですね。
ちょっとスレ違いですが、例えば掲示板で変な書き込みがあったときに、プロバイダに連絡して注意してもらう為には$ENV{'REMOTE_ADDR'}と書き込み時間を取得しておけば大方はOKでしょうかね?
991nobodyさん:03/05/17 00:46 ID:???
>>990
その二つがあれば大丈夫
当然、書き込み内容も必要だが
992988:03/05/17 00:52 ID:GaxUmwFm
ありがとうございます。使う事は無いとは思うんですが安心しました。
993nobodyさん:03/05/17 17:47 ID:???
埋め立て
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

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