Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0653nobodyさん
2005/04/27(水) 13:05:03ID:???10を越えた時点でフラグを立てればいいんじゃないの
if ($aaa >= 10) $flag = 1;
if ($flag && $aaa < 10) $aaa = 10;
0654nobodyさん
2005/04/27(水) 13:09:00ID:???一応突っ込んでおくが Perl にぶら下がり if は無い。
Perl のスレなんだから Perl で答えてやれよ。
0656nobodyさん
2005/04/27(水) 14:20:48ID:???0657654
2005/04/27(水) 14:39:18ID:???うーん、あまり一般的な表現ではないようだね。
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
0658652
2005/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:4gECGjaSphpの正規表現で
ereg(.*[EGG|EVA].*, $str);
とした場合、マッチするのは*****EGG****か*******EVA*******と言う
$strで良いのでしょうか?
0660nobodyさん
2005/04/27(水) 15:09:21ID:I4dBvpe7でelseをぶら下がり文に使った時に起きる問題がdangling else
>>658
おまえにプログラミングは無理だ
0661nobodyさん
2005/04/27(水) 15:11:46ID:4gECGjaS0662nobodyさん
2005/04/27(水) 15:47:03ID:???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:???基本的に「10より下にいかないようにする」ことはできないと思ってくれ
代わりに「10より下にいくたびに無理矢理10に戻す」処理を行なう
それも、スクリプト中の下にいきそうな可能性のある箇所全てで、ということになる
if ($flag= 0 && $aaa < 10) { $aaa = 10; } というのは
「もしフラグが立っていて、つまり $a が10以上になったことが過去あって、
しかも現在 $a が10を下回っていたら、$aを無理矢理10に戻す」
という意味だ
0664nobodyさん
2005/04/27(水) 16:17:40ID:???ああー、わかりました・・・!!!!
まずできる事とできない事の切り分けができていなかったんですねorz
今回のやり取り、ホント勉強になりました。皆さんありがとうございます。
0665nobodyさん
2005/04/27(水) 16:27:56ID:???つか $! にそのメッセージがセットされても -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:???なるほど、システムコールに失敗したとき以外の $! は何の意味も持たないんですね。
binmode(STDOUT,":shift_jis");
みたいな間違いをしたとき、期待した文字エンコーディングにならないだけで、
-wで警告もでなければ、エラーも起きず、$!を見てみると No such file or directory になっていたので、
これもまた表にでないエラーが起きているのかと思ってしまいました。
use encodingは、グローバルなんでちょっと使えませんでした。
他で何カ所かファイルを読み込むときに、それぞれのファイルの文字エンコーディングが統一されていない為です。
スッキリしました。
お返事、どうもありがとうございます。
0667nobodyさん
2005/04/27(水) 16:58:33ID:???すいません、警告でてました…。
warningsToBrowserでは表示されないみたいですね。
コマンドラインから実行したらきっちり、Unknown PerlIO layerってでてました。
0668nobodyさん
2005/04/27(水) 19:09:04ID:???$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 "> ";
}
0670nobodyさん
2005/04/27(水) 19:24:42ID:???$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:???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>=~/^((\+)|-)$/;
0672638
2005/04/27(水) 21:21:37ID:???>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 );
追記は出来ているんですが、
このモードでは読み込みができないのでしょうか?
0674103
2005/04/27(水) 22:57:19ID:???つかぬことをお伺いします。
掲示板への投稿内容を利用者に送信するというスクリプトを
作っている途中で思ったのですが、
sendmailを使って5通同報メールを送信する場合、
1)5回、メール送信動作を繰り返す
2)BCCに5通分のアドレスを記述してメールを送信する
どちらがサーバー負担軽いのでしょうか。
#メールを5通出すということには変わりはないですが。
それ以前にどうやってBCCに複数アドレスを書くかという
問題にぶつかっていたりしますが(爆死
0675nobodyさん
2005/04/27(水) 22:58:40ID:NwHD2MSRDES方式のパスワード認証をMD5に変えようとしました。
はじめのパスワード設定はしっかりできました。
しかしいざ認証になると”パスワードが違う”となってしまいます。
CGIレスキューチャレンジ/www.rescue.ne.jp/cgi/md5/を読むと、
認証の部分はDESとMD5は同じとあったので、同じにしたのですが
考え方まずいんでしょうか(汗)
0676675
2005/04/27(水) 22:59:05ID:NwHD2MSR#マスターパスワードのセット:動作する
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("パスワードが違います。");}#このエラーが出てる
(以下略)
0678673
2005/04/27(水) 23:11:04ID:???オライリーのラクダ本に書いてあったので使ってみました。
>> との違いは、読み出しがOKなだけみたいです。
そもそも +>> 自体が無い!?
0679nobodyさん
2005/04/27(水) 23:14:05ID:???たぶんファイルポインタがopen直後は末尾をさしてるとか
そんなとこじゃない? 読み出す前にseek DATA, 0, 0;してみ。
0680nobodyさん
2005/04/28(木) 00:48:30ID:???0681nobodyさん
2005/04/28(木) 01:39:04ID:A2bYvrGqprintではなくpushはだめなの。
0682nobodyさん
2005/04/28(木) 03:05:17ID:???0683nobodyさん
2005/04/28(木) 05:39:07ID:???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:???oepn直後に
print "tell:", tell(DATA), "\n";
でも入れてポインタの位置を確認。
# '+<'で読んだ後、seek(DATA, 0, 2)して追記でもいい気がする。
>>674
ルークよ、カンマを使え。
0686673
2005/04/28(木) 09:25:16ID:???回答ありがとうございました。
ご指摘の通り、ファイルポインタの位置が原因で
読み込みができていなかったようです。
seek( DATA, 0, 0 );
を追加したところ、正常に読み込めました!
また、追記のときはファイルポインタの位置に
関係なく必ず末尾に挿入されるようです。
seek( DATA, 0, 0 );
の後だったので
seek( DATA, 0, 2 );
が必要かと思いましたが、
無しでも正常に追記できてました。
0688nobodyさん
2005/04/28(木) 11:06:32ID:???">>"でopenするとO_APPENDが指定されるので
writeは必ずファイルの末尾に行われる。
逆にいうと末尾以外のところにseekして書きたい
のに ">>"や"+>>"で開くとあれ?とかいうことに
なるので注意。昔やってしばらく悩んだ(笑)
ファイルを読み書き両方で開きたい & なければ
つくって欲しい & 存在すれば中身はそのまま
という条件で開こうとするとつい '+>>' 使い
たくなるんだよね...
0690nobodyさん
2005/04/28(木) 16:03:43ID:???遅レスですが、>668さん、>670さん、
わざわざ書いて下さって感涙です・・・助かりました。
まだ知識も経験も少ないので、例があると理解しやすいです・・・
お礼もできましたので、これでホントに名無しに戻ります。
ありがとうございました。
0691nobodyさん
2005/04/28(木) 17:26:10ID:tmfF6IZwuse 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:???日本語訳もあるんだしさー。
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:???だうと。
プロセス 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:???とかわからないと議論できんな
0699nobodyさん
2005/04/29(金) 21:44:09ID:s7r+/5xEunicodeで書かれたサイトの抜き取りができません
どうすればいいですか
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:???サーバにアップってのは、開発をローカルでやるわけ?
サーバがあるのなら、サーバで開発すればいいじゃん。
日本語処理を別個にしたりはしないんじゃない?エディタ使うだけだし、敢えて
別文字コード変換とかあってもエディタに変換機能ぐらいあるだろうし。
0703nobodyさん
2005/04/30(土) 00:56:09ID:???0704nobodyさん
2005/04/30(土) 01:15:44ID:???文字コードを知った上で使う分には特に問題は起きないよ。
問題が少ないからとりあえずEUC使っとけ。って考えは間違っていると思うのだが。EUCにはあまりメリットを感じないし。
0705nobodyさん
2005/04/30(土) 02:10:32ID:???0706nobodyさん
2005/04/30(土) 04:29:56ID:???0707nobodyさん
2005/04/30(土) 04:40:04ID:???perl aaa.cgi > out.txt
俺はCGIとしての形をとっとと整えて、ローカルで鯖立ててテストするけど。
文字コードは何も考えずEUC。間違ってても動けばいいや。
0708nobodyさん
2005/04/30(土) 07:18:59ID:???EUCやUTF-8などでリリースするときは
文字コードに依存する部分を変更してる。
文字コードの変換、
依存部分の変更はスクリプトで自動化。
0709nobodyさん
2005/04/30(土) 08:55:13ID:???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:???0711nobodyさん
2005/04/30(土) 11:59:18ID:???シフトJIS使ってたら、例えば、マッチングで検索の対象となる文字列、
検索する文字列に何がくるか分からない時などは、文字コードを知った上でも
対処のしようが無いと思うのだが。
0712702
2005/04/30(土) 12:38:41ID:???某サイトの表現が悪いのか、読み手の読解力がないのか。。
0713nobodyさん
2005/04/30(土) 14:37:28ID:???\Q \E でくぉーとしないとできない → マッチできない
ってだけだろ。くだんねーこと書き込むな。
0715nobodyさん
2005/04/30(土) 16:38:52ID:???$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
0720nobodyさん
2005/04/30(土) 18:40:29ID:???0721nobodyさん
2005/04/30(土) 18:54:13ID:???0726nobodyさん
2005/04/30(土) 22:20:19ID:???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:???おいおい、おまえもイマイチだぞ。
HTMLならたとえクオーテーション内でも < とか > は < や > って書かなければいけないことくらい知ってるだろう?
正しいHTMLの例で例外を例示しろよ。
0730nobodyさん
2005/05/01(日) 02:22:23ID:???これらの場合だけ別に処理すればいいでしょう。
0731nobodyさん
2005/05/01(日) 12:27:22ID:???s/<!--.*?-->//sg;
while (s/<[^<>]*>//g) { }
0732715
NGNG忘れました・・
0733715
NGNG[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
ですね・・
0736nobodyさん
2005/05/02(月) 03:24:44ID:???0737nobodyさん
2005/05/02(月) 03:30:04ID:???やってみているのですが、ぜんぜんできません。何がおかしいんでしょうか。
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
です。
0738737
2005/05/02(月) 03:34:27ID:???×「複数行の検索」→○「複数行にまたがる文字列の検索」
test.txtは、
----
おかしいな。区切り文字($/)未定義にすれば、本
来できるはずだが。
----
です。
0739nobodyさん
2005/05/02(月) 03:38:21ID:???sjisなら本の2バイトめが{になってるようだけど?
0740737
2005/05/02(月) 03:44:31ID:???どんな文字でもだめです。そもそもuse encodingしてるから
そこら辺のエスケープはしなくていいものと思われ。
0741nobodyさん
2005/05/02(月) 03:52:34ID:???「本\n来」じゃないよね?
0742nobodyさん
2005/05/02(月) 04:03:24ID:???違う、違うよお馬鹿さん。
mオプションってのは、イメージ的に
/^本来/m ≒ /(?:^|\n)本来/
/本来$/m ≒ /本来(?:$|\n)/
ってなるだけであって、そういう使い方じゃない。
0743nobodyさん
2005/05/02(月) 07:01:48ID:???でうまくいった。
0744737
2005/05/02(月) 08:14:55ID:???ども、mオプション使えね。
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本\r\n来/m) {print "OK!\n";}
でOK!ですた。
>>743
encoding関係なく行けた。
0745737
2005/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:???Test::Moreのuse_okを見るとrequireとimportにわけてevalの中でやってますね。
0749nobodyさん
2005/05/02(月) 21:41:42ID:???> eval { use Image::Magick; };
eval q{ use Image::Magick; };?
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:???■ このスレッドは過去ログ倉庫に格納されています