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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0261nobodyさん05/02/09 16:07:48ID:???
キーは数字からはじまってもいいんだよ。
0262nobodyさん05/02/09 16:11:56ID:???
>>258
手元で試した限りではそのままで出ますね。

026325905/02/09 16:15:15ID:XVTcbf3E
>>260
そうか・・・・・
>>261
それは知りませんでした;

しかし>>260さんが言うようにa行数のようにしたい時点で配列を使えばいい状況
ということですねm(_ _)m
配列の中にリファレンスでいれておきます。解決です。ありがとうございました!
0264nobodyさん05/02/09 16:16:02ID:???
>>259
配列に入れちゃダメなの?

open(FHIN,'csvfile') or die "can not open csvfile\n";
$i = 0;
while(<FHIN>) {
($time[$i],$name[$i],$coment[$i]) = split(/,/,$_);
}

とかで、いろいろ出来ると思うけど。

逆の他の人に聞きたいのは
while(<FHIN>) {
@datas[$i] = split(/,/,$_);
}
とかで
@datas0にデータ入れて
じゅんじゅんに
@datas1とかに入れるのってどうやってやんの?
0265nobodyさん05/02/09 16:16:49ID:???
>>264
インクリメント忘れた
026625105/02/09 16:27:57ID:???
俺の環境じゃダメだわ、もう逝くわ

みんな、ありがとう。

いい夢みろよ!!
0267nobodyさん05/02/09 16:51:03ID:???
>>264
#!/usr/bin/perl -w
my @data;
chomp, push @data, [ split /,/ ] while <DATA>;
print $data[1][2]; # h
__DATA__
a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
0268nobodyさん05/02/09 17:27:25ID:???
>>264
pushだろ

って書こうとしたら267に先越された
0269nobodyさん05/02/09 17:31:30ID:???
>>267
chomp, push @data, [ split /,/ ] while <DATA>;

はいくらなんでも詰めすぎじゃないかと。

普通に書くなら

while (<DATA>) {
chomp;

push @data, [ split /,/ ];
}

ぐらいじゃないかなー。
0270nobodyさん05/02/09 17:54:45ID:???
>>269
そうかくと分かりやすいね。
0271nobodyさん05/02/09 18:59:46ID:???
人それぞれじゃない?
私は
chomp, push @data, [ split /,/ ] while <DATA>;
の方が直感的に頭に入ってくるな
0272nobodyさん05/02/09 19:02:07ID:???
育ってきた環境かね?
俺ってオライリーのperl本で勉強したから
>>269がわかりやすいなぁ
0273nobodyさん05/02/09 20:09:21ID:???
上我流
下主流
0274nobodyさん05/02/09 21:09:26ID:???
だな。
0275nobodyさん05/02/09 22:00:05ID:???
オライモンのperl CGIってのあると思うけど、
あれ面白い?っていゆーか実践的な内容?
0276nobodyさん05/02/09 22:19:03ID:oNgMiBuj
リダイレクトで'Location:http://hogehoge/'と出力させるとGETメソッドでしか
データを送ることができないと思うのですが、POSTで送る方法などはありますか?
0277nobodyさん05/02/09 23:07:01ID:???
>>276
http://homepage3.nifty.com/hippo2000/perltips/lwpcook.html#POST
0278nobodyさん05/02/10 02:07:22ID:???
@hoge=<IN>;
とするとき、改行\nを消す方法があれば教えてください
0279nobodyさん05/02/10 02:36:02ID:???
@hoge=<IN>;
chomp @hoge;
0280nobodyさん05/02/10 03:26:26ID:???
use strict;

$::info{'no_dir'} = [ q[test], q[test2] ];
BEGIN {
  #▼なんかディレクトリからファイルを返す関数
sub file_list (&$;$) {

  my ($code, $dir_name, $mode) = ($_[0], $_[1], $_[2]);

  my $pass;
    {
      $pass = $dir_name . q[./], last if(qq[\l$mode] eq q[p] or !$mode);
      $pass = "", last if(qq[\l$mode] eq q[f]);
    return();  #モードが変なのは処理しない。
    }
  opendir DIR, $dir_name or return ();
     my @file_list = grep{ $_ = $pass . $_; &$code; } (readdir DIR);
  closedir DIR;
  foreach my $file (@file_list){$file =~ s[/\./][/]g;}

  return(@file_list);

  }
0281nobodyさん05/02/10 03:27:00ID:???
#▼対象ディレクトリ全取得
{
search($::info{'pass'});    #対象ディレクトリ全検索

sub search {
  foreach my $dir (@_){
    my @list;
      @list = file_list {  #ディレクトリ全取得
        -d                      #範囲をディレクトリに絞って…
      and !(m/[\/\.]+$/)                #自己参照ディレクトリの類は排除して…
      and my $now_dir = $_            #ちょっとキモい処理をして…
      and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} )  #除外指定ディレクトリは無視。ところがこれがエラー
      } $dir;
      @list = map {$_ . '/'} @list;    #なんかUNIXではこれやらないとダメっぽい。(winではいらない)

    push @::dir_list, @list;      #ディレクトリ追加
    search(@list) if(@list);      #ディレクトリがまだあったら再帰
    }
  }
}

0282nobodyさん05/02/10 03:27:47ID:???
and my $now_dir = $_ #ちょっとキモい処理をして…
and !( grep { $now_dir =~ m[/$_$]; } @{$::info{'no_dir'}} ) #除外指定ディレクトリは無視。ところがこれがエラー

↑ここんことが変になるんですけど、どーしたらいいんかね?
028328205/02/10 03:32:30ID:???
あ、上げるの忘れてた。
あと、>>280の最後んとこでBEGINブロック閉じるの忘れたのは突っ込まないで。
0284nobodyさん05/02/10 05:12:42ID:FuWRzUOO
スレ違いだったすいません。
新しいサイトでフォームを使いたいのですがうまくいきません。
書き込み用のform.html(仮名)とform_mail.cgiは古いサイトでは
フォームの送信後メールがちゃんと届いたのですが、
新しいサイトでは何故か機能しません。
cgiのパールへのパスとドメイン所属のメールアドレス、
form.html内のform_mail.cgiへのパスは正しく書き換えている
(つもり)のに。。。ディレクトリーも同じように設定してます。
フォーム送信にhtmlとcgiファイル以外でしなければいけない事、
必要なファイルってありますか? 
ひとつ疑問に思ったのは古いサイトではcgiのパーミッションを入力して
再接続すると前回に入れた数字(755)が残るのに、
新しいサイトでは入力後に再接続してもその数字は残っていません。
あとフォームを機能させるためにhtaccessって必要ですか???? 
分かる人どうか宜しくお願いします!!
028528405/02/10 05:14:53ID:FuWRzUOO
284ですが、CGI質問スレ発見 あちらで聞きまスルー。
0286nobodyさん05/02/10 09:55:26ID:GQajLbsS
if (条件a){
$a = 1;
}elsif(条件b){
$a = 2;
}else{
$a = 0;
}

これを1行ないし2行で収めることはできませんか?
?演算子を使えばできるかと思ったのですが、3つは無理みたいで;
知恵をお貸し下さいm(_ _)m
0287nobodyさん05/02/10 10:09:46ID:???
>>286
$a = 条件a? 1: 条件b? 2: 0;

で普通にいけると思うけどなんか変になるのかね?
条件の部分は場合によってはカッコいるかも。
028828605/02/10 10:25:55ID:GQajLbsS
>>287
!?
そういうのもありなんですねm(_ _)m
028928605/02/10 11:06:28ID:GQajLbsS
追加質問ですみませんが、以前から気になっていたことがありまして;

XSS対策にメタ文字エスケープをするときってCGI関係ではよくありますよね。
基本的には埋め込む直前にケースバイケースのエスケープをするのですが、
みなさんはどうやってますか?

元の文字列を加工したものを『他の新しい変数に入れて』ますか?それとも
『元の変数に上書き』してますか?
後者だと元データがなくなるので何かと不都合の原因になりますよね。
しかし新しい変数を用意すると、色々なところで色々なエスケープが必要になるので
だんだん頭がこんがらがります;簡潔性を欠くといいますか・・・
0290nobodyさん05/02/10 11:42:53ID:???
>>289
俺は普通に上書きしてる
>元データがなくなるので何かと不都合の原因になりますよね
これの意味がわからん。必要なときは元に戻せばいいじゃないか。不可逆変換やってるわけじゃないんだから。
0291nobodyさん05/02/10 11:45:26ID:???
>>289
私は最終出力時にエスケープ派であります。といっても
最近はほとんどテンプレートライブラリ使うので、テンプレート
側でエスケープ形式を指定するだけのことがほとんどですが。
029228605/02/10 13:35:23ID:GQajLbsS
>>290-291
ありがとうございます。

やはりみなさんそれぞれなのですね。
見易さ・わかりやすさの点でやはり変数を用意したほうがいいのかなと思ってます。
%form
%form_html
%form_sql
現在こういう感じです。
0293nobodyさん05/02/10 13:58:59ID:???
>>292
SQLはプレースホルダ使うのでデータをエスケープすることは
ないなぁ。
0294nobodyさん05/02/10 15:15:16ID:???
mysqlのテーブルにデータを挿入時にユニークキーとして任意の数字列を使っています。(挿入時に重複でインクリメント)
インクリメントのせいで、一度入れないとユニークキーが何かわからないのですが
挿入した直後にそのユニークキーを表示させたいのですが、どうすればいいでしょうか?

ユニークキー以外は重複している可能性が十分にあるデータ群なので、途方にくれています

そのプロセスが今挿入したデータに挿入時に自動的につけられたユニークキーが
何だったのかを調べるにはどうすればいいでしょうか?
0295nobodyさん05/02/10 15:21:20ID:???
>>294
無理だろ。
だって極端な話にすれば、ユニークキー以外が全部同じ内容のものなら
自分のユニークが何なのかを調べる方法なんてない。
0296nobodyさん05/02/10 15:27:41ID:???
DBI使ってるならインクリメントしたかどうかを調べられたんじゃなかったか?
最近使ってないから忘れたw
0297nobodyさん05/02/10 15:36:08ID:???
面倒な方法だが、プロセスIDと挿入時の時間もとっておけば
それを元に取り出せるけどな。
まぁそのためだけに二つもフィールドを増やすのはあまり気分がよくないわな。
029829405/02/10 15:57:58ID:???
>>295
そうなのですかorz
実際にどういうデータが入ったかを確認するすべはないんですね…
>>296
本当ですか!?DBI使ってます。調べてみます。
>>297
そのためだけに増えるのはちょっとしんどいですよねorz

自分が挿入したレコードに付けられたユニークキーを調べることができないって…
つまり自分が何を入れたのかを確実に調べる方法が用意されてないってことですよね;
0299nobodyさん05/02/10 16:19:29ID:???
>>298
俺いまPostgreでユニークキーをインサートするためにやっているのが、
普通に順序のテーブルからnextvalでとってきて、
INSERTするときにnextvalからとってきてのをvalueで指定してるけど、
その考え方はだめ?
0300nobodyさん05/02/10 16:53:46ID:???
>>294
autoincrementじゃいかんの
030129405/02/10 17:06:32ID:???
>>300
いえ、ユニークキーがautoincrementになってるので、実際に挿入するまでは
どういうユニークキーになるのかわからないんです。
それで挿入した本人に自分が今入れたユニークキーを知らせることができずに困ってるのです。

>>299
nextvalって使ったことないです。ちょっと勉強してきます。
0302nobodyさん05/02/10 19:29:44ID:???
>>301
auto_incrementならば、select last_insert_id()で取り出せるし。
http://dev.mysql.com/doc/mysql/ja/miscellaneous-functions.html
> LAST_INSERT_ID([expr])
> AUTO_INCREMENT カラムに挿入された値のうち、最後に自動生成された値を返す。
> mysql> SELECT LAST_INSERT_ID();
> -> 195

>>294の説明では、自前でユニークキーを作成しているみたいに読めるが。
SQLの問題だね。
0303nobodyさん05/02/10 19:37:17ID:???
>>282
use vars qw(%info @dir_list);

$info{no_dir} = { map{$_ => 1} qw(test test2) };

...

{
search($info{path}); #対象ディレクトリ全検索

sub search
{
my @dirs = @_;

foreach my $dir (@dirs){
my @list = map{$_. '/'} file_list { #ディレクトリ全取得
-d #範囲をディレクトリに絞って…
and !(m/[\/\.]+$/) #自己参照ディレクトリの類は排除して…
and !$info{no_dir}->{(m|/([^/]+)$|)[0]} #除外指定ディレクトリは無視。
} $dir;

push(@dir_list, @list); #ディレクトリ追加
search(@list) if(@list); #ディレクトリがまだあったら再帰
}
}
}
ちょっと書き換えちゃったけど、適当に戻しておいて。
0304nobodyさん05/02/10 19:40:55ID:???
変数【$bbb】の後ろに【.txt】と書きたいのですが、どう区別したらいいのでしょうか?

my $aaa = "$bbb.txt";
0305nobodyさん05/02/10 19:49:39ID:???
>>304
区別って$bbbと".txt"の境界をはっきりPerlに伝えたいってこと?
とりあえず、"."は変数の一部とは見なされないから、そのままでもOKだけど、
もっと安全に書きたいというのなら、

my $aaa = $bbb . ".txt";
my $aaa = "${bbb}.txt";
030630405/02/10 19:59:43ID:???
>>305  サンクス

でもできない...  他にない?
0307nobodyさん05/02/10 20:24:57ID:???
>>306
なぜ出来ないの?
030828205/02/10 20:46:53ID:???
>>303
やべー。恥ずかしい。pathとpassを間違いまくってた。_| ̄|○
そっか、ハッシュを使うんですね。ハッシュ。
しかも所々細かいアドバイスありがとう。
って事で今からテストしてきます。

030930405/02/10 21:41:23ID:???
変数に複数行のHTMLを格納したいのですが、できますか?
0310nobodyさん05/02/10 21:46:11ID:???
$sazae = "<p>でら<br />\nべっぴん</p>";
0311nobodyさん05/02/10 21:50:00ID:???
>>504 

$sazae = "

<table width=675 border=0 cellspacing=0 cellpadding=0 height=5>
<tr>
<td><img src="http://img.yahoo.co.jp/images/clear.gif" alt="" width=1></td>
</tr>
</table>

";
0312nobodyさん05/02/10 22:23:33ID:???
>>304
$masuo = <<"EOM";
<p>
でら<br>
べっぴん
</p>
EOM
0313nobodyさん05/02/10 22:24:27ID:???
>>311
エスケープ汁。バーヤ。
0314nobodyさん05/02/11 01:43:21ID:???
Win2000環境にてAN HTTPD+Perlで2chの板一覧を取得したいと考えています。
しかし、「www6.ocn.ne.jp」からは取得できますが、「www.ff.iij4u.or.jp」からは「Access Denied」となります。
当然ブラウザからならアクセス可能。User-Agent等を変えてもうまくいかず・・ご助言宜しくお願いします。

#!/usr/local/bin/perl -w
use Socket;

#$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
#$host = "www.ff.iij4u.or.jp";

$address = "http://www6.ocn.ne.jp/~mirv/2chmenu.html";
$host = "www6.ocn.ne.jp";

$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET $address HTTP/1.0\r\n";
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
0315nobodyさん05/02/11 02:07:19ID:???
LWP使(ry
0316nobodyさん05/02/11 02:29:31ID:???
#!/usr/local/bin/perl -w
use Socket;

$address = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html";
$host = "www.ff.iij4u.or.jp";



$myagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)";
$rhost = "hoge.com";
$port = getservbyname('http','tcp');
$iaddr = inet_aton($host) or die "aton-err\n";
socket (SOCKET,PF_INET,SOCK_STREAM,getprotobyname('tcp'));
connect(SOCKET,sockaddr_in($port,$iaddr));
binmode(SOCKET);select(SOCKET); $| = 1; select(stdout);
print SOCKET "GET /~ch2/bbsmenu.html HTTP/1.0\r\n"; #ここがおかしい
print SOCKET "Host: $host\r\n";
print SOCKET "User-Agent: $myagent\r\n";
print SOCKET "Accept: */*\r\n";
print SOCKET "Accept-Charset: *\r\n";
print SOCKET "Accept-Language: jp\r\n";
print SOCKET "Referer: http://$host/\r\n";
print SOCKET "Remote-Host: $rhost\r\n";
print SOCKET "\r\n";
while (chop($buf=<SOCKET>)) {print "$buf\n";}
close(SOCKET);
exit;
031731605/02/11 02:35:22ID:???
あぁ 途中で書き込んでしまった。

$address =~ m|^http://([-_\.a-zA-Z0-9]+)/?(.*)$|;
$host = $1;
$path = $2;

と付け加えて、

print SOCKET "GET /$path HTTP/1.0\r\n";

と変更すると汎用性があっていいかも。
031829405/02/11 08:42:07ID:4xNa2hhv
>>302
ありがとうございます。
ユニークキーは一応Perl側で作成してますが、万が一の重複の可能性を考えて
インサート時にauto_incrementになってます。
なのでユニークキーについては役割は半々ですね。

LAST_INSERT_ID()ではアクセスが集中した時にミスりますよね?
プロセスAが入れる→プロセスBが入れる→プロセスAからのLAST_INSDERT_ID()を処理
=プロセスBが入れたものがプロセスAに渡されてしまうorz
031929405/02/11 10:01:49ID:4xNa2hhv
すみませんサイト読んでたらそういうことは起こらないと書いてありましたm(_ _)m
今回のCGIではPerlで半分ユニークキーを作成してますので、auto_incrementする可能性は
ほとんどないので、last_insert_id()がauto_incrementしてない時には初期値の0まま
(もしくは前回値ですが今回はinsert1回しかないので)という仕様を利用して、

my $your_id = $last_insert_id == 0 ? $perl_creat_id : $last_insert_id;

のようにして確実に自分が入れたデータの取り出しが可能になりました。
お世話になりましたm(_ _)m
0320nobodyさん05/02/11 10:31:52ID:???
よかったね
0321nobodyさん05/02/11 11:11:35ID:???
activeperl5.6
テスト環境は(local)→winXP
サーバ→Linux

@array = qw/a b c d e f g/;
@arrayの中に7個あります。インデックスは0-6になります。

これをランダムに表示させたいんですが単にrand関数を使っただけでは均等には
なりませんよね?(rand関数自体どこまで完全確率に近づけられているのかはわかりませんが、
それはおいといてください。)

print $array[(rand 6)];
これだと圧倒的に最後の$array[6]だけ選択率が落ちます。
0-5は小数点も付きますが、6だけ付かないのでまあ当然なのですが。

かといってrand 7にして7が選ばれたらマイナス-1するというのではまだ不公平ですよね。
rand 7にして7が選択されたらマイナスもrandで決定するというのも結局
そのときもマイナス7が選ばれる可能性が・・・・次に続けます
032232105/02/11 11:15:15ID:???
$number = rand 7;
$number = $number == 7 ? $number - rand 7 : $number;
print $array[$number];

前回言いかけましたがこうしても結局今度は$array[0]が選ばれる可能性がちょっと増える
ので不公平ですよね。

公平に0-6を抽選することはできないのでしょうか?
0323nobodyさん05/02/11 11:40:10ID:eHptbqsS
>>322

言ってることがよくわかりませんが

http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020909010545.shtml

このへん読んでみれば?


というかrand関数を使えば均等になるし、ちゃんとrand呼び出す前に
srand関数で初期化してますか?

032431405/02/11 11:54:58ID:???
>315-316さま
教えていただいた方法で無事取得できました。
ありがとうございました。
032532105/02/11 11:56:27ID:???
>>323
Perl5.1以降は自動的にsrandされてるみたいです。

もしかしてrand 8;
って0-8をランダムに選ぶのではなく0-7(小数点つき)を選ぶんですかね?
確かにprint rand 8;として
>8
となった経験はありませんが、ただ確率が極端に8だけ落ちるからだと思ってました・・・
私の勘違いだったのでしょうか?
0326nobodyさん05/02/11 11:57:37ID:???
rand(8)は、0以上8未満を返す。
032732105/02/11 12:23:35ID:???
>>326
すみませんでしたorz
0328nobodyさん05/02/11 14:06:49ID:???
print gmtime(time+32400)[5]+1900;

これで今年が何年なのかを表示させようと思ったらエラーがでました。
near ")["
となってたのですがこの形式はダメなのでしょうか?
gmtime(time+32400)自体はリストなので大丈夫だと思ったのですが。
0329nobodyさん05/02/11 14:14:41ID:???
かっこつけろよ
0330nobodyさん05/02/11 14:14:45ID:QAwMbYUp
(time+32400)
↑これをリスト扱いしてるでしょ。どう見ても。
0331nobodyさん05/02/11 14:24:46ID:???
W3C形式の日時を YYYY年 MM月 DD日 hh時 mm分 に変換したいです。

参考
Perlメモ/W3C形式の日時の解析
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FW3C%B7%C1%BC%B0%A4%CE%C6%FC%BB%FE%A4%CE%B2%F2%C0%CF

2005-02-10T14:54:18+09:00 を変換する場合、どう書けばいいのでしょうか?
0332nobodyさん05/02/11 14:32:58ID:???

open FH,"+>>test.txt";
seek FH,0,0;
print FH "ファイルの先頭";
close FH;

これを実行したら何故かファイルの末尾にかかれました。
seekが効いてないのでしょうか?
0333nobodyさん05/02/11 14:33:32ID:???
>>327
init(rand(7));
でいいんじゃね?
033432805/02/11 14:34:37ID:???
print (gmtime(time+32400))[5]+1900;
でも同じエラーがでます。
0335nobodyさん05/02/11 14:42:49ID:???
>>332
+>>
ではseekは使えない。ポインタの移動自体が不可能。
もし先頭に追加したければ一度中身を配列に読み込んでから
unshiftで先頭に入れて上書きするしかない。

>>334
当たり前。かっこなんかつけてどうこうなる状況ではない。
@{[gmtime(time+32400)]}[5]
とすればいい。
0336nobodyさん05/02/11 15:19:23ID:???
>>334
print((gmtime(time+32400))[5]+1900);
0337nobodyさん05/02/11 15:37:08ID:???
>>332
">>"はO_APPENDがつくのでwriteがかならずその時点でのファイルの
末尾からになる。

ファイルをもしなければ作成して読み書き両用で開きたいんじゃないかと
思うが「>」使うのでちょうどいいのはたぶんない。openでシステムコール
のオプションを明示的に指定できるのでそれを使うのがいいと思われる。
0338nobodyさん05/02/11 15:45:03ID:???
>>334
print+(gmtime(time+32400))[5]+1900;
0339nobodyさん05/02/11 17:00:15ID:CPrSGSxU
perl初めてなんですけど、

print(
"引数",
"引数",
);
↑こーゆーのってコーディングスタイルとしてどーなんですか?
エラーはでないみたいなんですけど。
0340nobodyさん05/02/11 17:07:21ID:4xNa2hhv
if (){
my $test;
〜処理〜
undef $test;
}

ブロックの終端で人間が見たときにこのブロックでどういうローカル変数を使っているかを
わかりやすくするためにわざわざundefしてます。

私のテキストエディタでは関数名は太字になりますので、もの凄く見やすいです。
それでそのブロックないで作った(いじった)グローバル変数もまとめて列挙したいんですが、
# $global
とかしてもコメント用の色にはなりますが、太字にはならず見づらいです。

そこで何か変数に対して何もしない関数があればいいなと思ったのですが、何かいいのはありませんか?
scalar $global;
みたいな感じです。

undefにしろ完全に処理効率を落とすものでしかないのでなるべくその影響が
小さいものがいいです。undef以下の処理時間の関数だと最高です!
0341nobodyさん05/02/11 17:15:59ID:???
>>339
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
あとは君が書いたスクリプトを誰が保守するのか考えた上でご自由に。

>>340
エディタの為のコードを書くな。コードに合わせてエディタを設定しろ。
034234005/02/11 17:26:02ID:4xNa2hhv
>>341
エディタの設定ではできないのです。
0343nobodyさん05/02/11 18:20:17ID:???
>>339
リストの最後にカンマが付いているのを懸念しているのか?
結論から言えばアリ。ハッシュでも良く使うね。
{
foo => 1,
bar => 2,
}
後で項目追加したりするときに、ミスが出なくていい。
034434305/02/11 18:33:32ID:???
ちなみに根拠は
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
0345nobodyさん05/02/11 21:22:27ID:???
>>331
use HTTP::Date qw(parse_date);

my @date = parse_date("2005-02-10T14:54:18+09:00");
my $date_str = sprintf('%04d年 %02d月 %02d日 %02d時 %02d分 %02d秒', @date);
034633905/02/11 21:26:56ID:CPrSGSxU
CGIで使う時にprintが乱立するのが見苦しいから
こっちのほうがいいな、と。
Cのprintfだと引数1つしかだめなんでちょっと
おどろいたついでに確認してみたんですが・・
アリということなのでがんがんつかいますw
034733905/02/11 21:31:01ID:CPrSGSxU
あ、あと
print と print() だとなんか前者の方がよくみるんですが
print()の方でもいいんですよね?
関数に()がないのがなんか気持ち悪くて・・
034833905/02/11 21:37:39ID:CPrSGSxU
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html
↑に書いてありましたね、連投スマソ
0349nobodyさん05/02/11 23:14:45ID:???
>>345 できた。 サンクス
0350nobodyさん05/02/12 00:13:28ID:???
>>340
あまりいい趣味とは思えないが、どうしてもやりたければ

use Filter::cpp;
#define NOOP(x)

とか?
0351nobodyさん05/02/12 00:15:44ID:???
>>347
俺は関数に限らず極力()を付けない。
基本的に見易さと理解しやすさが第一だから。
もちろんぱっと見たときにどういう優先順位かわからなくなりそうな時はつけるけどね。

>CGIで使う時にprintが乱立するのが見苦しいから
それとこれは君がしょぼいだけと言わざるを得ない。
出力内容はユーザによって変えないといけないことが多いCGIではprintを始める
以前にほとんどのデータを用意しておく。

そして何行にもなるならヒアドキュメントを使ってスッキリさせる。

まぁプログラミングなんて誰でもできるものだけど、
読みやすく効率のいいものが作れるかが馬鹿と賢者の分かれ目かな。

ってえらそうにごめんねm(_ _)m
とりあえず処理効率よりも読みやすさを薦めるよ。
0352nobodyさん05/02/12 01:31:57ID:???
一般的に、多くの場合関数には()をつけ、
演算子には()をつけないほうが読みやすいとされるそうです。
俺もそう思いますが、printは演算子です。
035334705/02/12 01:34:34ID:DEctNxAs
>>351
なるほど〜、うまいことやる方法がきちんとあるのですね。
なんせCGIは初めてで正直まだ何もわかっていないんです。
でも351さんがおっしゃっていることは自分も同意で、普段書く時
は気をつけています、綺麗なコーディング。

とにかくがんばります。
035434705/02/12 01:40:35ID:DEctNxAs
>>352
え、、、PerlやPHPだとprintは演算子なんですかぁ、ちとびっくり。
てっきり関数かと思ってました。
だから()がいらないんですね、なるほどなるほど。
0355nobodyさん05/02/12 03:35:24ID:W11W0gdq
>>346
そもそもCGIでprint文なんていくつも書かないだろ。
出力用のルーチンに投げてprintは1つでお終い。そこで変数展開してやればいい。
0356nobodyさん05/02/12 10:55:57ID:???
()の省略をprintとprintfでしかやってなかった俺は馬鹿者ですか、そうですか。('A`)
0357nobodyさん05/02/12 12:43:51ID:???
>>354
正確に言うと少し違う。Perlの組み込み関数はある意味で全て演算子であるといえる。

>>356
それでいいよ。その方が分かりやすい。
0358s05/02/12 16:09:49ID:???
文字「&」をpostで送りたいんですが、受け渡し後&を区切りとしているので
うまく読み取ってくれません。どうやればいいのでしょうか?
0359nobodyさん05/02/12 16:22:44ID:???
>>358
エンコード
0360nobodyさん05/02/12 17:35:59ID:???
>組み込み関数はある意味で全て演算子であるといえる
こら。好き勝手書くんじゃない。
■ このスレッドは過去ログ倉庫に格納されています