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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/03/10 00:47:16ID:sT66OcmD
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0653nobodyさん2005/04/27(水) 13:05:03ID:???
>>652
10を越えた時点でフラグを立てればいいんじゃないの
if ($aaa >= 10) $flag = 1;
if ($flag && $aaa < 10) $aaa = 10;
0654nobodyさん2005/04/27(水) 13:09:00ID:???
>>646 >>653
一応突っ込んでおくが Perl にぶら下がり if は無い。
Perl のスレなんだから Perl で答えてやれよ。
0655nobodyさん2005/04/27(水) 13:14:08ID:???
>>654
「ぶら下がり if」って一般的な用語なの?
「dangling else」なら聞くけど。
0656nobodyさん2005/04/27(水) 14:20:48ID:???
日本語ではぶら下がりifと言うんだよ。
06576542005/04/27(水) 14:39:18ID:???
>>655
うーん、あまり一般的な表現ではないようだね。
Perl には if (EXPR) EXPR という構文は無くて、
必ず if (EXPR) BLOCK ないし EXPR if EXPR と
書かなければいけない、って言いたかったんだ。
http://www.nurs.or.jp/~sug/soft/super/macro.htm
での用法のように、if (EXPR) EXPR という構文の
事を「ぶら下がり if」と呼ぶと解釈してたよ。

本題と関係無い話でスレ汚しごめん。>ALL
06586522005/04/27(水) 15:01:10ID:FBojevS6
こういうことでしょうか?
$flag=0;
if ($aaa >= 10) {$flag = 1;}
#$aaaが10以上の場合、$flagが立つ
if ($flag= 0 && $aaa < 10) { $aaa = 10; }
#$flagが立っておらず、$aaaが10より小さい場合・・・$aaaは10

?????orz
10より下に行かないようにするって処理を
どう書いてやればいいのかわかりません・・・
0659nobodyさん2005/04/27(水) 15:06:58ID:4gECGjaS
質問です。
phpの正規表現で
ereg(.*[EGG|EVA].*, $str);
とした場合、マッチするのは*****EGG****か*******EVA*******と言う
$strで良いのでしょうか?
0660nobodyさん2005/04/27(水) 15:09:21ID:I4dBvpe7
Perlではif にぶら下がり文({}の省略)は許されないということですね。
でelseをぶら下がり文に使った時に起きる問題がdangling else
>>658
おまえにプログラミングは無理だ
0661nobodyさん2005/04/27(水) 15:11:46ID:4gECGjaS
ごめんなさい。phpスレと間違えました。orz
0662nobodyさん2005/04/27(水) 15:47:03ID:???
ActivePerl 5.8.6で、
binmode(STDOUT,":encoding(charset)");
を使うと、必ず $! に Bad file descriptor と入ってしまうのですが、
どうにかならないのでしょうか。

調べてみても
「binmodeを使えばすでに開いているファイルハンドルにPerlIOレイヤを設定できる」
としか説明されておらず、このことには触れていないようなので、発生するのはActivePerlだけなのでしょうか…。

binmode(STDOUT,":utf8");
binmode(STDOUT,":bytes");

などの":encoding(charset)"が無いの場合は、エラーは起こりません。
shift_jisで出力したいので困ってしまって…。
0663nobodyさん2005/04/27(水) 16:00:17ID:???
>>658
基本的に「10より下にいかないようにする」ことはできないと思ってくれ

代わりに「10より下にいくたびに無理矢理10に戻す」処理を行なう
それも、スクリプト中の下にいきそうな可能性のある箇所全てで、ということになる

if ($flag= 0 && $aaa < 10) { $aaa = 10; } というのは
「もしフラグが立っていて、つまり $a が10以上になったことが過去あって、
しかも現在 $a が10を下回っていたら、$aを無理矢理10に戻す」
という意味だ
0664nobodyさん2005/04/27(水) 16:17:40ID:???
>663
ああー、わかりました・・・!!!!

まずできる事とできない事の切り分けができていなかったんですねorz
今回のやり取り、ホント勉強になりました。皆さんありがとうございます。
0665nobodyさん2005/04/27(水) 16:27:56ID:???
>>662
つか $! にそのメッセージがセットされても -w 下で警告が出るわけで無し、

#!/usr/local/bin/perl -w
use strict; use Encode qw(from_to);
from_to(my $str = "いーゆーしーじぇーぴー\n", 'euc-jp' => 'utf8');
utf8::decode($str);
binmode STDOUT, ':encoding(shiftjis)';
print $str;

…でちゃんと Shift_JIS で出力されるし、何か困る?

#!/usr/local/bin/perl -w
use strict; use encoding 'euc-jp', STDOUT => 'shiftjis';
print "いーゆーしーじぇーぴー\n";

だと $! はセットされないね。

何にしても
<q cite="http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlvar.pod#$!">
If used numerically, yields the current value of the C errno variable, or in
other words, if a system or library call fails, it sets this variable. This
means that the value of $! is meaningful only immediately after a failure:
</q>
だから、システムコール系の関数でエラーした時にそのエラー内容を
調べる以外の用途で $! の値を見ても意味無いよ。
0666nobodyさん2005/04/27(水) 16:53:30ID:???
>665
なるほど、システムコールに失敗したとき以外の $! は何の意味も持たないんですね。

binmode(STDOUT,":shift_jis");

みたいな間違いをしたとき、期待した文字エンコーディングにならないだけで、
-wで警告もでなければ、エラーも起きず、$!を見てみると No such file or directory になっていたので、
これもまた表にでないエラーが起きているのかと思ってしまいました。

use encodingは、グローバルなんでちょっと使えませんでした。
他で何カ所かファイルを読み込むときに、それぞれのファイルの文字エンコーディングが統一されていない為です。

スッキリしました。
お返事、どうもありがとうございます。
0667nobodyさん2005/04/27(水) 16:58:33ID:???
> binmode(STDOUT,":shift_jis");

すいません、警告でてました…。
warningsToBrowserでは表示されないみたいですね。

コマンドラインから実行したらきっちり、Unknown PerlIO layerってでてました。
0668nobodyさん2005/04/27(水) 19:09:04ID:???
#$bbbに100をセット
$bbb = 100;
#最初の入力プロンプトを出力
print "> ";
while(<STDIN>){
#入力が数値の場合、$aaaから入力分を減算
if(/^\d+$/){$aaa -= $_;$flag = 1}
#入力が空の場合、$aaaに1加算
elsif(/^$/){$aaa++;$flag = 0}
#入力が数値または空以外の場合、終了
else{last}
#入力が減算かつ$cccの値が10以上かつ$aaaが9以下の場合、$aaaに10をセット
if(flag && $ccc>=10 && $aaa<=9){$aaa = 10}
#$aaaが負の場合、$aaaに0をセット
elsif($aaa<0){$aaa = 0}
#$cccの値が$bbbより小さい場合、$cccに$aaaをセット
if($ccc<$bbb){$ccc = $aaa}
#現在の$cccを出力
print "$ccc\n";
#次の入力プロンプトを出力
print "> ";
}
0669nobodyさん2005/04/27(水) 19:11:01ID:???
>>668は>>664へ
0670nobodyさん2005/04/27(水) 19:24:42ID:???
>>668は if(flag && の記述が間違っているし
$flagの処理は無くてもいいから下のように書ける。

$bbb = 100;
print "> ";
while(<STDIN>){
if(/^\d+$/){$aaa -= $_}
elsif(/^$/){$aaa++}
else{last}
if($ccc>=10 && $aaa<=9){$aaa = 10}
elsif($aaa<0){$aaa = 0}
if($ccc<$bbb){$ccc = $aaa}
print "$ccc\n";
print "> ";
}
0671nobodyさん2005/04/27(水) 20:24:16ID:???
# '+' で +1 、'-' で -1 、それ以外で終了
my($m,$n,$i)=(10,100,0); # min, max, start
do{print$i=$2?$i==$n?$n:$i+1:$i==$m?$m:$i==0?0:$i-1,' > '}
while<STDIN>=~/^((\+)|-)$/;
06726382005/04/27(水) 21:21:37ID:???
>654
>Perl にぶら下がり if は無い
最近Perl書いてないから忘れてたorz
0673nobodyさん2005/04/27(水) 22:56:09ID:D9rBVnk5
質問させてください。

ファイルの内容を print してから、
新しい値をそのファイルに追記したいのですが、
以下のようにやっても +>> のモードなのに
ファイルの中身が取れません。

open( DATA, "+>> count" );
print <DATA>;
print DATA qq(test\n);
close( DATA );

追記は出来ているんですが、
このモードでは読み込みができないのでしょうか?
06741032005/04/27(水) 22:57:19ID:???
他スレから移動しました(誤爆してしまった。。。恥)

つかぬことをお伺いします。

掲示板への投稿内容を利用者に送信するというスクリプトを
作っている途中で思ったのですが、

sendmailを使って5通同報メールを送信する場合、
1)5回、メール送信動作を繰り返す
2)BCCに5通分のアドレスを記述してメールを送信する
どちらがサーバー負担軽いのでしょうか。
#メールを5通出すということには変わりはないですが。

それ以前にどうやってBCCに複数アドレスを書くかという
問題にぶつかっていたりしますが(爆死
0675nobodyさん2005/04/27(水) 22:58:40ID:NwHD2MSR
元のスクリプトはMW-manager ver1.24。
DES方式のパスワード認証をMD5に変えようとしました。
はじめのパスワード設定はしっかりできました。
しかしいざ認証になると”パスワードが違う”となってしまいます。
CGIレスキューチャレンジ/www.rescue.ne.jp/cgi/md5/を読むと、
認証の部分はDESとMD5は同じとあったので、同じにしたのですが
考え方まずいんでしょうか(汗)
06766752005/04/27(水) 22:59:05ID:NwHD2MSR
$salt = "M1";
#マスターパスワードのセット:動作する
sub pass_set
{
 if($in{'setpass'} != $in{'setpass2'}){ &error("パスワード不適合"); }
 open PASS, ">$passfile" or &error("$passfileが開けませんでした。");
 #ここを変えた↓
$pass = crypt("$in{'setpass'}", "\$1\$$salt");
 print PASS "$pass";
 close PASS;
}
#パスワードのチェック
sub password_check
{
   open(PASS, "$passfile") or &error("$passfileが開けませんでした。");
   $pass = <PASS>;
   close PASS;

 if($in{'mode'} eq "login"){
  #↓ここを変えた
  $in{'pass'} = crypt("$in{'setpass'}", "\$1\$$salt");
  if($in{'pass'} eq $pass){
      print qq(Set-Cookie: USER=1\n);
  }else{&error("パスワードが違います。");}#このエラーが出てる
(以下略)
0677nobodyさん2005/04/27(水) 23:08:56ID:???
>>673
俺も初心者なんで良くわかんないけど
+>>ってあるの?
06786732005/04/27(水) 23:11:04ID:???
>>677

オライリーのラクダ本に書いてあったので使ってみました。
>> との違いは、読み出しがOKなだけみたいです。

そもそも +>> 自体が無い!?
0679nobodyさん2005/04/27(水) 23:14:05ID:???
>>673
たぶんファイルポインタがopen直後は末尾をさしてるとか
そんなとこじゃない? 読み出す前にseek DATA, 0, 0;してみ。
0680nobodyさん2005/04/28(木) 00:48:30ID:???
なにこのスレ('A`)
0681nobodyさん2005/04/28(木) 01:39:04ID:A2bYvrGq
>>673
printではなくpushはだめなの。
0682nobodyさん2005/04/28(木) 03:05:17ID:???
おまいら最近シリメツレツすぎ(´д`)
0683nobodyさん2005/04/28(木) 05:39:07ID:???
>>673
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlopentut.pod#Mixing_Reads_and_Writes
読み書き両用で open した直後のファイルポインタは '+' 無しで
open した際と概ね一致するが、プラットフォームやヴァージョンに
よってそうならない場合もあるので常に seek を入れるが吉。

>>674
2)

>>675-676
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc8.2ch.net/test/read.cgi/php/1077525387/
0684nobodyさん2005/04/28(木) 06:39:34ID:???
>>673
oepn直後に
print "tell:", tell(DATA), "\n";
でも入れてポインタの位置を確認。

# '+<'で読んだ後、seek(DATA, 0, 2)して追記でもいい気がする。

>>674
ルークよ、カンマを使え。
0685nobodyさん2005/04/28(木) 07:34:02ID:???
>>676
$1$salt$
06866732005/04/28(木) 09:25:16ID:???
>>679,683,684

回答ありがとうございました。
ご指摘の通り、ファイルポインタの位置が原因で
読み込みができていなかったようです。
seek( DATA, 0, 0 );
を追加したところ、正常に読み込めました!

また、追記のときはファイルポインタの位置に
関係なく必ず末尾に挿入されるようです。

seek( DATA, 0, 0 );
の後だったので
seek( DATA, 0, 2 );
が必要かと思いましたが、
無しでも正常に追記できてました。
06876752005/04/28(木) 10:20:23ID:???
>>683
ぬ、そっちのスレでよかったんですね(汗
>>685
Σ(@@;;;
あぁ・・・そうか(汗
ありがとうございます。
0688nobodyさん2005/04/28(木) 11:06:32ID:???
>>686
">>"でopenするとO_APPENDが指定されるので
writeは必ずファイルの末尾に行われる。

逆にいうと末尾以外のところにseekして書きたい
のに ">>"や"+>>"で開くとあれ?とかいうことに
なるので注意。昔やってしばらく悩んだ(笑)

ファイルを読み書き両方で開きたい & なければ
つくって欲しい & 存在すれば中身はそのまま
という条件で開こうとするとつい '+>>' 使い
たくなるんだよね...
06896732005/04/28(木) 11:44:40ID:???
>>688

>> だと必ず追記なんですね。なるほど。
色々と勉強になります。

今回も +>> 使ったの初めてだったので…
0690nobodyさん2005/04/28(木) 16:03:43ID:???
>664です
遅レスですが、>668さん、>670さん、
わざわざ書いて下さって感涙です・・・助かりました。
まだ知識も経験も少ないので、例があると理解しやすいです・・・
お礼もできましたので、これでホントに名無しに戻ります。
ありがとうございました。
0691nobodyさん2005/04/28(木) 17:26:10ID:tmfF6IZw
#SSL初期化
use Net::SSLeay
qw(get_https post_https sslcat make_headers make_form);

の部分で


Can't locate Net/SSLeay.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.6/i686-linux /usr/local/lib/perl5/5.8.6 /usr/local/lib/perl5/site_perl/5.8.6/i686-linux /usr/local/lib/perl5/site_perl/5.8.6 /usr/local/lib/perl5/site_perl .) at test.cgi line 7.
BEGIN failed--compilation aborted at test.cgi line 7.

とエラーが出るのですが、なんだかわかりませんでしょうか。
0692nobodyさん2005/04/28(木) 17:44:55ID:???
パスが通ったところにライブラリがありません
0693nobodyさん2005/04/28(木) 18:33:54ID:???
わからないエラーメッセージがでたらperldiagひけよ。
日本語訳もあるんだしさー。

ttp://www.att.or.jp/perl/man/perldiag.1.html
0694nobodyさん2005/04/28(木) 23:31:11ID:xLVfIYcW
突然ですが、質問させて下さい。

テキストファイルを複数のCGIで書き込んだり呼び出したりしている
のですが、最近急にデータがレコード単位で消えたりし始めました。
100レコードあったとすると、20〜30行だけが消えていたりして、
レイアウトがずれてる場合もあります。
ファイルロックは、書き込みをするCGIのみ記述しているのですが、
呼び出しのみのCGIも記述する必要があるのでしょうか?それとも
プログラムミスの可能性の方が大きいでしょうか?

言葉のみの記述でうまく説明できていないかもしれませんが、なにか
ヒントでもいいので教えて下さい。
0695nobodyさん2005/04/28(木) 23:52:07ID:???
読み込みにもロックしないと、別のプロセスが書き込んでる途中のを読み込んで、
くずれる可能性はあると思う。
0696nobodyさん2005/04/29(金) 03:28:27ID:???
惜しい。書き込んでる最中のものはロックされているので読み出せない。
読み込んでいる最中のファイルを書き換えられる、が正解。

同じく読み込み側でロックすることを薦める。
0697nobodyさん2005/04/29(金) 11:46:38ID:???
>>696
だうと。
プロセス A がロックしているファイルをプロセス B が読む場合、
・共有ロックか排他ロックか
・mandatory lock か advisory lock か
・advisory lock なら、B でロック状態をチェックするか否か
で話が変わる。

例えば A が advisory lock で排他ロックをかけていても、B が
自発的にロック状態をチェックし、ロックされていれば読み書きを
"控える" という事をしない限り、ロックとして正しく機能しない。

【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
0698nobodyさん2005/04/29(金) 15:51:27ID:???
まあ、ロックしてるって具体的には何を使ってるの?とかOSは何よ?
とかわからないと議論できんな
0699nobodyさん2005/04/29(金) 21:44:09ID:s7r+/5xE
amezo2000のsock.cgiで
unicodeで書かれたサイトの抜き取りができません
どうすればいいですか
0700nobodyさん2005/04/29(金) 23:10:47ID:???
作者にメール送れば
0701nobodyさん2005/04/30(土) 00:33:02ID:???
多分ここに来てる人のほとんどがパソコンでコードを書いて、それをサーバーにアップして
何らかの日本語処理をしていると思うので、ちょっと質問です。

漢字はEUCを使っていますか?
日本語を扱う場合、当然EUCの方がはるかに問題が少ないので、EUCを使うべきでしょうが
パソコンでEUCを使うのって、非常に面倒くさくないですか?
ファイルをイチイチEUCで書き出さなければいけないし、簡単なデバッグするのに
DOS窓で > Perl aaa.cgi としても、printで出力した漢字は化けるし....。
何か、簡単にEUC環境を作る方法ってあるのですか?

0702nobodyさん2005/04/30(土) 00:45:19ID:???
>>701
サーバにアップってのは、開発をローカルでやるわけ?
サーバがあるのなら、サーバで開発すればいいじゃん。
日本語処理を別個にしたりはしないんじゃない?エディタ使うだけだし、敢えて
別文字コード変換とかあってもエディタに変換機能ぐらいあるだろうし。
0703nobodyさん2005/04/30(土) 00:56:09ID:???
凄いこという香具師が居るな。
0704nobodyさん2005/04/30(土) 01:15:44ID:???
Shift-JISかUTF-8でソース書いてるよ。
文字コードを知った上で使う分には特に問題は起きないよ。

問題が少ないからとりあえずEUC使っとけ。って考えは間違っていると思うのだが。EUCにはあまりメリットを感じないし。
0705nobodyさん2005/04/30(土) 02:10:32ID:???
おもしろい釣りスレですね
0706nobodyさん2005/04/30(土) 04:29:56ID:???
GW?
0707nobodyさん2005/04/30(土) 04:40:04ID:???
>701
perl aaa.cgi > out.txt

俺はCGIとしての形をとっとと整えて、ローカルで鯖立ててテストするけど。
文字コードは何も考えずEUC。間違ってても動けばいいや。
0708nobodyさん2005/04/30(土) 07:18:59ID:???
テストはShift_JIS。
EUCやUTF-8などでリリースするときは
文字コードに依存する部分を変更してる。

文字コードの変換、
依存部分の変更はスクリプトで自動化。
0709nobodyさん2005/04/30(土) 08:55:13ID:???
>>701
Winではsjisを使う事が多い。

探せばeuc-jpで動くコマンドシェルはあるだろうけど、printの出力だけなら、
open(STDERR,"|nkf -uEs");
open(STDOUT,"|nkf -uEs");
system(join(' ',@ARGV));
とか
use IPC::Open3;
use threads;
use Encode;
$pid=open3(*I,*O,*E,@ARGV) || die "Can't exec @ARGV";
my $o = threads->create(sub {while(<O>) { Encode::from_to($_,'euc-jp','shiftjis');print STDOUT $_}});
my $e = threads->create(sub {while(<E>) { Encode::from_to($_,'euc-jp','shiftjis');print STDERR $_}});
$o->join;$e->join;
程度の手抜きで間に合わせたらどうかな。
0710nobodyさん2005/04/30(土) 11:47:38ID:???
TeraPadとかXYZZYや秀丸とかの高機能エディタをインスコして拡張子関連づけを設定
0711nobodyさん2005/04/30(土) 11:59:18ID:???
>>704
シフトJIS使ってたら、例えば、マッチングで検索の対象となる文字列、
検索する文字列に何がくるか分からない時などは、文字コードを知った上でも
対処のしようが無いと思うのだが。
07127022005/04/30(土) 12:38:41ID:???
なんか最近しきりにシフトJISだと正しくマッチできないとか言うヤシが多いよな。

某サイトの表現が悪いのか、読み手の読解力がないのか。。
0713nobodyさん2005/04/30(土) 14:37:28ID:???
\Q \E でくぉーとすればできる → マッチできる
\Q \E でくぉーとしないとできない → マッチできない

ってだけだろ。くだんねーこと書き込むな。
0714nobodyさん2005/04/30(土) 14:50:58ID:???
ところで >>701 はコーディングと全然関係ない質問だったと思うのは俺だけか
0715nobodyさん2005/04/30(土) 16:38:52ID:???
HTMLタグを削除するのって

$html =~ s/<.*?>//g;

だけで良いですよね?
0716nobodyさん2005/04/30(土) 17:44:57ID:???
番号順にソートしたいのですが、うまくできません。
@a=(1,32,6,14);
という配列があります
これを
1,6,14,32という風な順番にしたいです。
@result=sort @a;
という風にしても
結果は1,14,32,6という文字列の順番になってしまいます。
おねがいしますs

0717nobodyさん2005/04/30(土) 17:50:59ID:???
>>715
$html = '<<aiueo>kakikukeko>';

>>716
<=>
0718nobodyさん2005/04/30(土) 17:58:07ID:???
>>716
my @result = sort { $a <=> $b } @a;
07197022005/04/30(土) 18:37:50ID:???
>>713
おまいもわかってないのかよ。。
0720nobodyさん2005/04/30(土) 18:40:29ID:???
無知は書き込むな
0721nobodyさん2005/04/30(土) 18:54:13ID:???
そこでuse encoding 'shiftjis'ですよ。
07227162005/04/30(土) 18:59:52ID:???
>>717 >>718 どうもありがとうございました
0723nobodyさん2005/04/30(土) 19:04:24ID:???
>>715
$html =~ s/<.*?>//sg;
じゃないかな。タグが1行で書かれてるとも限らないし。
0724nobodyさん2005/04/30(土) 20:14:30ID:???
>>723
>>717
0725nobodyさん2005/04/30(土) 22:17:11ID:???
おまいには>>717がHTMLに見えるのか?
まあ<.*?>だけだダメなケースがあるのも確かだが。
0726nobodyさん2005/04/30(土) 22:20:19ID:???
input が valid な HTML だと誰か定義したか?
0727nobodyさん2005/04/30(土) 23:02:52ID:???
あほすぎ。うざすぎ。
0728nobodyさん2005/05/01(日) 01:45:23ID:???
あれは例がイマイチだな。
<a href="〜" title="いれるなら<ここ>だ!">

Shift-JISで検索や置換するときは、タブとかでぶった切ってから処理するという荒業をやってる。もっとマシな手はあるんだろうけど。
$str =~ s/([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf])/$1\t/g;
0729nobodyさん2005/05/01(日) 02:11:46ID:???
>>728
おいおい、おまえもイマイチだぞ。
HTMLならたとえクオーテーション内でも < とか > は &lt; や &gt; って書かなければいけないことくらい知ってるだろう?
正しいHTMLの例で例外を例示しろよ。
0730nobodyさん2005/05/01(日) 02:22:23ID:???
コメントやCDATAなら<や>はそのまま使えるな。
これらの場合だけ別に処理すればいいでしょう。
0731nobodyさん2005/05/01(日) 12:27:22ID:???
んじゃこう?
s/<!--.*?-->//sg;
while (s/<[^<>]*>//g) { }
0732715NGNG
なんかそういうのまとめたサイトがあったと思うんですが
忘れました・・
0733715NGNG
すみません>>7の
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
ですね・・
0734nobodyさん2005/05/01(日) 18:53:42ID:???
>>731
[^<>]の'>'に意味あるか?
0735nobodyさん2005/05/02(月) 02:22:08ID:???
>>734
→>>717
0736nobodyさん2005/05/02(月) 03:24:44ID:???
すまん、*の後ろに?を勝手に脳内補完してたようだ。
0737nobodyさん2005/05/02(月) 03:30:04ID:???
マッチング演算子のmオプションで複数行の検索ができるというので
やってみているのですが、ぜんぜんできません。何がおかしいんでしょうか。

use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本来/m) {print "OK!\n";}

perlのバージョンは、v5.8.5 built for cygwin-thread-multi-64intで、
スクリプトおよび対象テキストの文字コード-改行コードは、すべてsjis-dos
です。
07387372005/05/02(月) 03:34:27ID:???
>>737の訂正です。

×「複数行の検索」→○「複数行にまたがる文字列の検索」

test.txtは、
----
おかしいな。区切り文字($/)未定義にすれば、本
来できるはずだが。
----
です。
0739nobodyさん2005/05/02(月) 03:38:21ID:???
mは^$の意味をかえるだけ。
sjisなら本の2バイトめが{になってるようだけど?
07407372005/05/02(月) 03:44:31ID:???
>>739
どんな文字でもだめです。そもそもuse encodingしてるから
そこら辺のエスケープはしなくていいものと思われ。
0741nobodyさん2005/05/02(月) 03:52:34ID:???
念のため、
「本\n来」じゃないよね?
0742nobodyさん2005/05/02(月) 04:03:24ID:???
>>737
違う、違うよお馬鹿さん。
mオプションってのは、イメージ的に
/^本来/m ≒ /(?:^|\n)本来/
/本来$/m ≒ /本来(?:$|\n)/
ってなるだけであって、そういう使い方じゃない。
0743nobodyさん2005/05/02(月) 07:01:48ID:???
open(FILE,"<:encoding(shift-jis)", "test.dat") or die $!;
でうまくいった。
07447372005/05/02(月) 08:14:55ID:???
>>741-742
ども、mオプション使えね。
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本\r\n来/m) {print "OK!\n";}
でOK!ですた。
>>743
encoding関係なく行けた。
07457372005/05/02(月) 08:16:16ID:???
間違え、
if($text =~ /本\r\n来/) {print "OK!\n";}
が正解。mオプションなんて関係なかたてことですた。
0746nobodyさん2005/05/02(月) 14:21:32ID:???
モジュールがインストールされて無い場合のエラー処理はどうやれば良いのでしょうか?

とりあえず、これだとダメでした。
eval { use Image::Magick; };
0747nobodyさん2005/05/02(月) 14:50:30ID:???
>>746
Test::Moreのuse_okを見るとrequireとimportにわけてevalの中でやってますね。

07487462005/05/02(月) 15:20:42ID:???
>>747
thx!
そもそもが間違ってますたorz
0749nobodyさん2005/05/02(月) 21:41:42ID:???
>>746
> eval { use Image::Magick; };
eval q{ use Image::Magick; };?
07507462005/05/02(月) 22:35:06ID:???
>>749
ありがとー。すんなり出来ました。
コンパイル時と実行時の違いの勉強になりますた。
0751nobodyさん2005/05/05(木) 11:35:47ID:???
疑問になったので質問です。
クラス内の変数をさまざまな表現で表示したい時は
「表示させる関数を用意する」と
「表示させるクラスを用意する」、どちらが一般的なのでしょうか。
もし使い分ける、などならメリットとデメリットも教えて頂きたいです。
PHPもオブジェクト指向も初心者なので的外れな質問だったらごめんなさい。
なお環境はPHP4.3.10 AN http WindowsXPです。
//クラス内に表示させる関数を用意する-----------------
$text = new Text;
echo $text->i();
class Text{
var $a="AAA";
function i(){
return "<i>{$this->a}</i><br>";
}
}
//クラス外に表示させるクラスを用意する-----------------
$text = new Text;
$html = new Html;
echo $html->i();
class Text{
var $a="AAA";
}
class Html{
function i(){
global $text;
return "<i>{$text->a}</i><br>";
}
}
0752nobodyさん2005/05/05(木) 11:36:15ID:???
↑激しくスレ違いゴメンナサイTT
■ このスレッドは過去ログ倉庫に格納されています