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

【Perl】初心者コーナー Part16

■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo 02/09/15 15:11ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0054nobodyさん02/09/16 13:00ID:???
>>52 コテハンで継続スレ建てるな。売名厨房
00553PIO ◆3pIoOHKo 02/09/16 15:01ID:???
$_ =~ s/>>54/あぼーん/;
0056nobodyさん02/09/16 15:05ID:???
s/3PIO ◆3pIoOHKo/あぼーん/g;
0057nobodyさん02/09/16 15:10ID:???
>55
>29と同じ事を言わせるな。
スレ立て自体は感謝してる。
だが煽りにのって煽り返すなよ。
そんなだから延々煽られるんだろうが・・・。

コテハン煽りを放置できないならコテハン使うな。
名無しに戻れ。
じゃなければこのスレから去ってくれ。
真面目に返答してるコテハンまで悪い目で見られるだろ。
頼むから。

初心者スレを潰したいわけじゃないだろう?
あんた自身の手でこのスレをクソスレにでもしたいのか?
0058nobodyさん02/09/16 15:10ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
00593PIO ◆3pIoOHKo 02/09/16 15:11ID:???
while (1) { unlink(">>56"); }
ず〜っと氏んでろ
00603PIO ◆3pIoOHKo 02/09/16 15:11ID:???
>>57
へいへい
0061nobodyさん02/09/16 15:24ID:???
コテハン云々以前に3PIO ◆3pIoOHKoは厨であることが決定しますた
0062nobodyさん02/09/16 15:53ID:???
私は自分の名前を入力してあってるかあってないかと言うことを聞いてくるスクリプトをつくりたいのですが

print "あなたのお名前を入力してください:"; chomp($name = <STDIN>);
do
{
print "あなたのお名前は",$name,"さんですね?\n";
print "YES:0NO:1\n"; $logic = <STDIN>; print "\n"; chomp($logic);
if ($logic == 0)
{
print "やはりそうでしたか";
}
elsif ($logic == 1)
{
print "嘘はつかないでください\n";
}
else
{
print"YESかNOかで答えてください";
}
}
until($logic == 0);

と作りました。しかし0か1かを入力するところを0,1以外で入力するとelse構文のないようが表示されず
終了してしまいます。
なぜでしょうか?
0063nobodyさん02/09/16 16:18ID:???
>>62
eqで文字列比較にしてみてわ
0064nobodyさん02/09/16 16:20ID:???
わかりました。がんばってみます。
ありがとう
0065This is perl, version 5.003_0702/09/16 17:56ID:???
$str =~ /$hoge/;

という場合、$hoge の値として ? とか ( ) とかの
記号が入ってる場合、その記号を文字そのものとして
パターンマッチさせるにはどうすればいいんでしょか?
0066 ◆JAPH9PWA 02/09/16 18:08ID:???
$str =~ /\Q$hoge\E/;
# \Q はquotemeta()の頭文字で\Eはendの意かなぁ…
0067This is perl, version 5.003_0702/09/16 18:11ID:???
どもです〜!!
0068 ◆JAPH9PWA 02/09/16 18:12ID:???
ってマルチかい…。
まともな回答を望んでいるなら一言くらい何か書いた方がいいよ。
00694202/09/16 23:48ID:m4c9VqI1
どうも、CGI.pmのラジオボタンで質問した者です。
結局色々やっても>>43さんの方法は出来ませんでした。(TT

あとこの方法は非常に長いパラメータがついてしまうと大変な気がするのですが、、、、
例えば男、女ではなく
print
"問1: ", radio_group(-name=>'sex', -values=>[
'2ちゃんねるは諸言語のプログラミングを学ぶ上で非常に有用なコミュニティであり、云々〜(以下永延と)と思う',
'2ちゃんねるはどちらかというと学ぶと言うよりは遊び感覚で参加すべきであり云々〜(以下小一時間)だと思う'
],・・・・・・・・・・・・・

な感じだと文章をパラメータにして置き換えなければいけないんですよね。

こりゃ困ったな。。。
0070nobodyさん02/09/17 05:04ID:yqtkGr1m
windows上でPerlを使ってるんですが

opendir(DIR,"./");
while($_ = readdir(DIR)){
 print "$_," . (stat)[9] . "\n";
}
closedir(DIR);

とやっても、ファイルの更新時間が見れません。
statがWindowsでサポートされていないのであれば、
ほかに代わる方法ないでしょうか?
00717102/09/17 08:09ID:???
イメージカウンタを作っています。
gifcat.pl を使って

open(PUT, ">counter.gif");
flock(PUT, 2);
binmode(PUT);# MS-DOS や Windows の場合に必要です。

foreach $gif (@num)
{
$int = $imgpath . $gif;
$imagefile = "$int . .gif";
push(@getimg, $imagefile);
}

print PUT &gifcat'gifcat("@getimg");
print <PUT>;
flock(PUT, 8);
close(PUT);

というコーディングをしたんですが、うまく表示できませんでした。
gifcat.plの使い方がおかしいのでしょうか?

0072nobodyさん02/09/17 08:19ID:???
>>70
ちゃんと出とるはず
perldoc -f stat
9 mtime last modify time in seconds since the epoch
(The epoch was at 00:00 January 1, 1970 GMT.)
# modifyはmodifiedの間違いじゃない?

0073nobodyさん02/09/17 08:24ID:???
>>71
$imagefile = "$int . .gif";
=>$imagefile = $int . ".gif";
でしょ

0074かるぴすうぉ〜た02/09/17 08:55ID:yqtkGr1m
>>72
それが、私の環境では、出ないんです。
Perlのバージョンは
This is perl, v5.6.1 built for MSWin32-x86-multi-thread
OSは、Windows2000。
0075nobodyさん02/09/17 09:00ID:yqtkGr1m
ああ、コテハン入れたままになってた、、打つ。

仕方がないので、ファイルの書きこみ時、最後の行にでもtimeの値を書きこんで
随時それを読み込んで参照することで、しばらくは解決させることにします。
もし、ファイルに対して直接更新時間にアクセスできるような処理方法があったら
おながいしうます。
0076 ◆JAPH9PWA 02/09/17 09:07ID:???
>>70,>>75
そんなはず無いんだけどね。そのPerlが壊れてるなら別だけど。
実際私の環境(ActivePerl631, WinME)だとそのコードだと正常に動くし。

それとももしかしてopendirの引数にカレントディレクトリ以外の値を与えてる?
それだと失敗するよ。
00777102/09/17 09:10ID:???
>>73
&gifcat に"$int.gif"("1.gif""2.gif"...)を渡したいんです。
それとも、GIF画像自体を渡すんでしょうか・・・

スレ違いかも失礼
0078nobodyさん02/09/17 09:16ID:???
>>70,>>75
おらwin98SEのActivePerlのv5.6.0 built for MSWin32-x86-multi-threadだけ
ど問題なく動いてるYo

0079nobodyさん02/09/17 09:20ID:???
>>77
だから、
$imagefile = "$int . .gif";
じゃ1\ .\ .gifとか2\ .\ .gigっていうファイル名になっちゃうんじゃないって
言ってるんだけど('\ 'ってのは半角空白ね)
0080nobodyさん02/09/17 09:26ID:???
>>77
答えてるヤシがいるんだからいちいち
スレ違いかも失礼
なんて書くなよ
0081nobodyさん02/09/17 11:52ID:???
$line が16バイト以上なら14バイトまで削って .. をつけるようにしたいです
自分なりにも考えました

if(length $line > 16){
    $line = (join "", (split "", $line)[0..13]) . "..";
}

これよりもっと効率のいい方法がありそうだと思うのですがあったら教えてください
0082nobodyさん02/09/17 11:56ID:???
substr
0083nobodyさん02/09/17 12:52ID:???
>>81
s/(.{14}).+/$1../;
00847102/09/17 12:54ID:???
>79
納得

>80
ごめん
00857102/09/17 13:12ID:???
71のコードをデバッグしてみました。
>79が原因でパスが間違っていたのと、変数名がサブルーチン部分と
重複しているものがありました。

>73=77さん、>80さん、ありがとうございますた!
00868602/09/17 15:28ID:???
cgiにアクセスした時、最初はパスワードの入力画面だけが表示され
パスワードを入力すると管理画面に入る、というのを行いたいです。
暗号処理はいらないです。うまいやり方を教えてください。
お願いします。
0087nobodyさん02/09/17 15:58ID:???
>86
if(パスワードが送信されてきた){
&管理画面;
}else{
&パスワード入力画面;
}
0088nobodyさん02/09/17 16:12ID:???
>>70
>>76 さんの答えがビンゴだと思うけど一応。

opendir DIR, ($dir = './');
print(scalar gmtime((stat $dir . $file)[9]), ' ', $file, "\n")
while $file = readdir DIR;
closedir DIR;

用途によっては stat よりファイルテスト演算子の方がいいかも。
0089必殺bodyさん02/09/17 16:22ID:???
>86
do {
&パスワード入力画面;
}
until($password == <INPUT>)
とか
0090nobodyさん02/09/17 16:23ID:???
あやや、>87さんとかぶった・・・
すみません〜
0091nobodyさん02/09/17 16:43ID:bZ09p6Xo
ファイルを作成するとき間違ってchomd 6666と記述したら、
---S--x-w-[000]という削除できないファイルができてしまったのですが
管理者に削除してもらわないと無理でしょうか?
0092nobodyさん02/09/17 17:23ID:???
>>91
unlink(削除したいファイル);
を実行しても消せなければ管理者さんにすがろう
00939102/09/17 17:31ID:???
unlinkでも消せませんでした。
管理者にすがってみます。
ありがとうございました。
0094nobodyさん02/09/17 18:39ID:???
>>82-83
Thanks to your kindness!!
00953PIO ◆3pIoOHKo 02/09/17 21:11ID:0b85vBv+
>>57
昨日は本当にスマンかった
今度から気を付ける。

許してくれm(__)m
0096nobodyさん02/09/17 21:30ID:???
もう帰って来んなよ
0097nobodyさん02/09/17 23:47ID:???
3PIO ◆3pIoOHKo だって   ( ´,_ゝ`) プッ
0098nobodyさん02/09/17 23:47ID:nVaQI6CN
私は今CGIの勉強中で本を買って自サーバーを立ててそこでテストしながら勉強中です。
そこでテストすると500InternetServerErrorが出てしまいます。
まったく内容の同じサンプルCGIを自サーバーで開くと問題なく作動します。
スクリプトは何回も確認しましたが間違ってはいないようです。
保存時の文字コードが関係あるようなのですが、調べてもなかなかわかりません。
cgiはメモ帳で作成しています。OSはXPで自サーバーはApacheです。
どうすれば正常に作動するのでしょう?
0099nobodyさん02/09/17 23:50ID:???
>そこでテストすると500InternetServerErrorが出てしまいます。

そこで って、どこ?
01009802/09/17 23:53ID:nVaQI6CN
>>99
文章拙くてすみません。
そこで = 自サーバー(Apache)です。
0101nobodyさん02/09/17 23:58ID:???
>>98
確かね、500 Internal Server Error になると、
そのエラーページの最後の方に「エラーログ
見ればもっと詳しい事が分るかも」って書いてあ
るんだよ。違う?

もしかして IE だと読めないんだっけ?
0102nobodyさん02/09/17 23:59ID:???
>>100
いや、その直後の行で「問題なく動作します」って書いてるよ?
01039802/09/18 00:04ID:P3Sos/ey
そうなんです。
教本に付属しているCDのサンプルCGIはきちんと動作しています。
が、まったく同じ内容の私の作ったCGIはエラーになってしまうのです。
保存時の文字コードによっては文字化けして表示されたりもするので文字
コードではないかと思うのですが、いろいろな文字コードで保存していま
すがどれもうまく作動しません。
原因は他にあるのでしょうか?
0104nobodyさん02/09/18 00:14ID:???
>>103
まったく同じ内容で動作が違うわけがないだろ。見直せ
きみの誤字・脱字までわかるわけないだろ!
01059802/09/18 00:17ID:P3Sos/ey
>>104
うーん、何回も見直してみたのですが……。
全角、半角も見直してみましたが間違ってはいないようです。
文字コードは関係ないのでしょうか?
0106nobodyさん02/09/18 00:18ID:???
>>105
じゃあ、ファイル容量を比べてみろ
01079802/09/18 00:22ID:P3Sos/ey
>>106
はい、比べて見ました。
どっちも1342バイトでした。
もしかしてもっと根本的な何かなんでしょうか?
Apacheを再インストールしてみます。
……普通は有り得ない現象なのでしょうか?
0108nobodyさん02/09/18 00:24ID:???
>>107
サンプルファイル名を自作CGI名にリネームして動作しなけりゃ
キャッシュだろ
01099802/09/18 00:30ID:P3Sos/ey

>>108
同じ名前で試してみました。
やっぱり動作しません。
キャッシュっていうのは、インターネット一時ファイルを削除すると言うことでしょうか?
01109802/09/18 00:37ID:P3Sos/ey
いろいろ質問してすみません。
もう眠るので落ちます。
ご意見ありがとうございました。
0111nobodyさん02/09/18 01:20ID:8kqybO5F
http://www.din.or.jp/~ohzaki/perl.htm#File_Lock
の排他制御を使わせてもらおうと思っているのですが
return \%lfh if (time - $1 > $lfh{timeout} and
rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
last;
ここの部分がいまいち何をしているのかわかりません。
特に\%lfhというエスケープ演算子の後のハッシュはどういう意味なんでしょうか?
0112nobodyさん02/09/18 01:48ID:???
>>98
セミコロンがコロンになってるとかそういうミスじゃないの?

>>111
参照渡し。
011311102/09/18 02:27ID:8kqybO5F
>>112さん
ありがとう!少しスッキリしました。
0114nobodyさん02/09/18 04:11ID:???
>>98
サンプルのディレクトリにはjcode.plがあるが、
キミのディレクトリには無い。

とか、

キミのファイル名が日本語だから(XP上で日本語じゃダメなのかは不明)

とか。
0115nobodyさん02/09/18 08:56ID:4xK36YHq
>>98
コマンドプロンプトで
perl -cw filename.cgi
しろ
0116nobodyさん02/09/18 09:45ID:04tSnTX3
perlでFTPモジュールを使ってファイルのアップ・ダウンを
やりたいのですが、特定の環境・ホストの組み合わせによっては
出来ない場合があります。

ログインまでは出来るのですが、なぜかリスト取得(nlst)や
ファイルのput・getができません(pwdやcwdはできます…)。

エラーが出るわけではなく、タイムアウトしてしまいます。
どうすればいいでしょうか。以下、ソースです。


#ここから
use Net::FTP;
$ftp = Net::FTP->new($ftphost, Debug => $ftpdbg, Passive => $passive)||die "Net::FTP FAILED";
$ftp->login($ftpuser,$ftppass);
$ftp->ascii();
$ftp->cwd("web/cgi-bin");
@files = $ftp->dir();
print join("\n",@files)."\n\n";
#ここまで

このソースを別環境で試してみたところ、問題無く
動きました…。ちなみに、当方LANからのADSL接続です。
0117nobodyさん02/09/18 10:21ID:???
Net::FTPのpasv()の項を見よ。
011811602/09/18 10:54ID:04tSnTX3
>117
接続先のftpサーバはPassive->0にしないとつながらないのです。
pasv()はPassiveに移行するコマンドですよね?

もしかしてデータポートの問題でしょうか。コマンドは
通るけどデータの受け渡しが出来ないので…。
011942=6902/09/18 13:38ID:g3HNafQf
まだ出来ません。。。
0120nobodyさん02/09/18 14:00ID:CaL1DwkZ
>>42
-values=>['M', 'F'],
で
%labels = (M => '男', F => '女', ) ;
じゃだめなの。
0121nobodyさん02/09/18 16:34ID:???
>>118
まず、PASV モードにする事で何が変わるか理解してる?
ttp://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html

実験結果を理解する為には、条件について理解してる必要があるよ。
0122nobodyさん02/09/18 19:54ID:???
>>116
他のFTPクライアント(何でもいい)はその動かない環境で
PASVモードを使わないで接続できているのでしょうか?
データポートの問題には違いないけど。
0123nobodyさん02/09/18 23:45ID:z0adaCjs
&&と&、|と||の違いがよくわかりません。
if文で試してもどちらも同じような挙動をします。
&&、||は数値比較ということのようで、解説サイトで
if(($a==2) && ($b==2))
というような例を見ましたが、($a==2)は数値を返すのでしょうか。
print (1==1); ###1を出力
print (1==2); ###なにも表示されず
よくわかりません。よろしくお願いします。
012411602/09/18 23:54ID:hRbwuJFL
>121
netpro01.html読んできました。ということは
Firewallの内側からftpする場合はpasv()する
ということですね。なるほど。

>122
他のFTPソフトでも、その動かないFTPサイトにはpasvか否かを問わず
同じ状況(ログインできるけどnlstやput・getができない)です。
それもそれで困っているのですが。仕方なくtelnetでつないで1ファイル
ずつftpしてます。

状況としては「クライアント→サーバはOK、サーバ→クライアントだと
データポートが食い違っている」ということ? なのかな。
0125nobodyさん02/09/19 00:25ID:qg0OuaDd
文字列1,文字列2,数値1,文字列3,数値2
といったフォーマットのcsvファイルを読み出して、もし上下(下の行)の
文字列2と数値1が同じならば、別のcsvファイルに”上下”の
文字列1と当然ながら、同じ値の文字列2、数値1を出力するのはどうやればよいのでしょうか。
(csvファイルの入力、出力は大体分かっているつもりです。内部的な処理が分かりません)

また、仮に上下の文字列2、数値1が合わない場合(行自体が奇数だったりした場合)
文字列3、数値2を上下で比べて同様の事をしたいのですがこの方法も分かりませぬ。
よろしくお願いします。
012612502/09/19 00:29ID:qg0OuaDd
補足:
AAA1,ABC,123,DEF,456(改行)
AAA2,ABC,123,DDD,444(改行)
というcsvファイルがあったなら、別のcsvファイルに

AAA1,AAA2,ABC,123
というのを出力したい、という意味です。
また、

AAA1,ABC,123,DDD,444(改行)
AAA2,ADD,777,DDD,444(改行)

ならば、同様に、別のcsvファイルに
AAA1,AAA2,DDD,444
というのを出力したいということです。
よろしくお願いします。
0127nobodyさん02/09/19 01:39ID:???
>>125-126
元csvは2行だけなのか?
0128nobodyさん02/09/19 03:24ID:???
>>123
&&と&、|と||が同じ挙動なんてことはない。
&&は左と右の条件が両方成り立ったとき真、
||は左と右の条件が少なくとも一つ成り立ったとき真。
真てのは1を返し、偽は0を返すから条件が成り立たなければ
上の論理演算子を評価したとき、1が出てきたり0が出てきた
りするのは当然。こいうのは戻り値という。


0129nobodyさん02/09/19 03:27ID:???
>>123
×真てのは1を返し、偽は0を返すから条件が成り立たなければ
○真てのは1を返し、偽は0を返すから
0130nobodyさん02/09/19 03:52ID:???
>>125 - >>126
こいうことかな?
while(<>){
chomp;
split /,/;
if ($o1 eq ($f1 = $_[1]) && $o2 == ($f2 = $_[2])) {
print "$o0,$_[0],$_[1],$_[2]\n";
} else {
print "$o0,$_[0],$_[3],$_[4]\n" unless $. == 1;
}
$o0 = $_[0];
$o1 = $f1;
$o2 = $f2;
}
0131nobodyさん02/09/19 05:08ID:Ab8J7aLw
>質問者へ
あのよ、プログラムの質問なんだから無理に文章にしないで

・プログラム概略
プログラムの説明、使用目的など
・環境
OS、使用アプリ、関連アプリなど
・入力
データ入力の方法、データ形式など
・処理
プログラム内で行うデータ加工、計算、アルゴリズムなど
・出力
出力データ形式、出力先など
・問題点
不具合の説明
・自分なりの解決法(試したもの)
自分で試した方法
・ソース
問題となっているプログラムソース

このくらいの箇条書きに整理して質問しろよ。書いてるうちに問題が解決する
場合もあるだろ。
どうも、解り辛い書き込みが多いよ。
0132nobodyさん02/09/19 06:51ID:???
>>123
if($a eq '1' && $b eq '1'){
print "$aと$bが1なので表示しました。";
}
if($a eq '1' || $b eq '1'){
print "$aか$bが1なので表示しました。";
}
こんな感じ。
0133nobodyさん02/09/19 10:58ID:IJ0KtDTA
$day = 3;
$day = sprintf("%02d",$day);
これを実行すると$dayが03になることはわかったのですが、
「%02d」の「2」は何を意味していますか?
0134nobodyさん02/09/19 11:20ID:???
>>123
ビット演算とか比較演算って知ってる?
解説書でも読めば必ず書いてあると思うんだが。
とりあえず出てきた演算子のperlでの分類と意味を書く。
・比較演算子
== 等しければ真、そうでなければ偽
・ビット演算子
| ビット演算した論理和(OR) (ex. 2|5 -> 7)
& ビット演算した論理積(AND)(ex. 2&5 -> 0)
・論理演算子
|| 真偽の論理和 (ex. 2||5 -> 2)
&& 真偽の論理積 (ex. 2&&5 -> 5)

ビット演算はその名の通りビットごとの演算がされる。
論理演算は、perlではundef,0,""以外は全て真なので
||なら最初の真の値、&&なら最後の真の値になると思って良い。

>>124
その状況でPASVが使えないならFTP接続は無理。
FW管理人と相談してね。
0135nobodyさん02/09/19 11:24ID:???
->はアロー演算子?というツッコミはなしでおながいします。。。

>>133
二桁の意味。
ちなみに%02dのそれぞれに意味がある。
% フォーマットを指定するよ宣言
0 隙間は0で埋めてね
2 2桁より少ないときにね
d 10進整数で表記してね
0136nobodyさん02/09/19 11:34ID:???
>>125-126 >>130
漏れはこう解釈したが

open O1, ">1.txt";
open O2, ">2.txt";
while(<>){
chomp;
split /,/;
if ($o[1] eq $_[1] && $o[2] == $_[2]) {
print O1 "$o[0],$_[0],$_[1],$_[2]\n";
} elsif ($o[3] eq $_[3] && $o[4] == $_[4]) {
print O2 "$o[0],$_[0],$_[3],$_[4]\n";
}
@o = @_;
}
0137nobodyさん02/09/19 11:38ID:???
>135
詳しい解説ありがとうございます。
0138&&と||の質問者02/09/19 18:03ID:???
>>128さん、>>132さん、>>134さん、どうもありがとうございました。
>>134さんの例で理解できました。
単に真偽を取り扱う場合は&&でも&でも同じということですね。
0&1 はビット比較で0=偽
0&&1 論理演算で0=偽
0139nobodyさん02/09/19 19:04ID:???
>>138
でも普通、真偽判定にビット演算子は使わない。
その文で何の処理をしているか読み下しにくくなるからね。

あとこういう場合、&& より and、|| より or を使う癖をつけとくと
後々幸せになれるかも知れない。数値として比較する時は
==、文字列として比較する時は eq、という区別もはっきり
させとくと尚良し。

$a = 0; $b = 1;
if ($a = 1 and $b == 1) {
print "$aと$bが1なので表示しました。";
}
$a = 0; $b = 0;
if ($a == 1 or $b = 1) {
print "$aか$bが1なので表示しました。";
}
0140nobodyさん02/09/19 19:10ID:???
>139
一応つっこんでおくと、下から3行目=が1個足りない。
0141nobodyさん02/09/19 19:11ID:???
上も足りてないみたいだね。
それで昔失敗したんだよなぁ。
懐かしい。
0142nobodyさん02/09/19 20:16ID:???
>>140 >>141
よく見よう。上の条件文は ($a = 1) && ($b == 1) と等価、
下の条件文は ($a == 1) || ($b = 1) と等価だ。
つまり代入の結果の値をそのまま条件に使っている。(w

&& と || は代入演算子より優先順位が高いが、
and と or は低いから括弧が不要。
0143nobodyさん02/09/19 20:17ID:???
>142
それだと、print文の内容が不自然なんだが?
014451802/09/19 20:32ID:???
ごめん、$ をエスケープするの忘れてたね。(w

$a = 0; $b = 1;

# $a = 1 で $a の値は 1
# ($a = 1) の式の値は 1 で真なので and の右の式も評価する。
# $b == 1 は真、両方真なので if ブロックに入る。
if ($a = 1 and $b == 1) {

# 条件文を解釈した時点で $a = 1, $b = 1
print '$a と \$b が 1 なので表示しました。';
}
$a = 0; $b = 0;

# $a == 1 は偽なので or の右の式も評価する。
# $b = 1 で $b の値は 1
# ($b = 1) の式の値は 1 で真なので if ブロックに入る。
if ($a == 1 or $b = 1) {

# 条件文を解釈した時点で $a = 0, $b = 1
print '$a か $b が 1 なので表示しました。';
}
0145nobodyさん02/09/20 03:12ID:tkLzuZ53
文字列の配列のソートとか、また単なる文字列比較とかするときに
アスキー配列ではなくて日本語辞書(?)の並びで簡単に扱う方法はありませんか。
たとえば、
あアいイ〜かカがガきキぎ〜(空文字が最後)
みたいな感じです。
普通にperlで並べたデータベースをexcelで編集して並べなおすと辻褄が
合わなくなってしまいます。
よろしくお願いします。
0146nobodyさん02/09/20 05:51ID:???
>>145
有名どころでは、
豊島正之sortf、http://www.asahi-net.or.jp/~ez3k-msym/archive/archive.htmには、益山って人のsortlもあるね。
Perlのライブラリではないんかい。
googleでPerl、辞書順ソートで調べたんだけど、
fj.cmp.lang.perlでそんな話し合ったみたいだけどその記事に行き当たらない。
JCPANがほしいね。
0147116=12402/09/20 11:07ID:???
ADSLモデムの設定でIPフィルタ(擬似ファイアウォール)の
設定を一部解除したらFTPできるようになりますた。

♪勉強に〜なりましたっ。
0148nobodyさん02/09/20 14:58ID:???
>>146
ご回答ありがとうございます。
僕も調べてみたんですが、見つかりませんでした。
自分で辞書順配列作ってやるしかないのかなあ。
やってみます。
0149nobodyさん02/09/20 15:32ID:???
>>148
できたら頂戴。
0150nobodyさん02/09/20 16:06ID:???
>> 149
超素人なので、僕の作ったものは役立たずだと思いますw。
とりあえず比較だけで、&jcomp($a,$b)が1,0,-1を返す関数から初めてみます。
0151 ◆AOHU.zVE 02/09/20 16:17ID:???
>>148
使ったことないから期待通り動くかしらないけど。。。
http://homepage1.nifty.com/nomenclator/perl/Lingua-JA-Sort-JIS.html
とかは?
015214602/09/20 16:34ID:???
>>151
こなのあったのね。情報アリガトン
0153 ◆AOHU.zVE 02/09/20 17:41ID:???
http://search.cpan.org/
で、sortで調べらたら出てきただけだったり
015414602/09/20 17:53ID:???
>>153
定番だよね、スマソ
■ このスレッドは過去ログ倉庫に格納されています