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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0208nobodyさん2010/09/17(金) 16:09:32ID:???
>>207
添付ファイルを一旦サーバー上に保存せんとダメ

だから
open FileName.jpg: No such file になる

メール送信後に削除ね。
0209nobodyさん2010/09/17(金) 16:14:59ID:???
>>207
スクリプト2行目に
use CGI::Carp qw(fatalsToBrowser);

の1行かいたら、わざわざエラログ見なくて済む。
0210perl初心者2010/09/17(金) 16:15:05ID:vsIN50JT
ご回答ありがとうございます。
たしかに我ながらアポーンな痛い愚問でした。
0211nobodyさん2010/09/17(金) 17:02:13ID:???
あぽーんて
0212nobodyさん2010/09/17(金) 17:31:13ID:???
まともなプログラム書くならお好みでってとこだけど、
コマンドラインでワンライナー限定だとperl最高だと
思う。慣れもあると思うが。
0213nobodyさん2010/09/17(金) 19:21:26ID:???
perl はサンプルは一杯あるけど、自分で試行錯誤しようとする気持ちがないと
クソサンプルの餌食になってしまうよ

1つのやり方に色んなやり方あって柔軟だとは思うけど、初心者には迷うだけなんだよねw
0214nobodyさん2010/09/17(金) 19:38:09ID:???
>>213
日本語でおk
0215nobodyさん2010/09/17(金) 19:40:23ID:???
Perlが読めればいろんなCGIスクリプトが読めるわけでうらやましい
0216nobodyさん2010/09/17(金) 19:40:52ID:???
もしかしてお前読めないの?
0217nobodyさん2010/09/17(金) 21:52:11ID:???
>>214
ちしょうはチンコでも吸ってろ
って意味
0218nobodyさん2010/09/18(土) 14:29:16ID:???
今では、フォームの受け取りに

my $query = CGI->new;
*in = $query->Vars();

って、たった2行で書くようになってるけど、
昔みたいに、

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
for $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\t//g;
$in{$name} = $value;
}
} else {
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
for $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\t//g;
$in{$name} = $value;
}
}

って書いたほうが、
素人からは何やってるかが書かれている分、良いように思う。
0219nobodyさん2010/09/18(土) 17:41:29ID:???
あっ、そう
0220nobodyさん2010/09/18(土) 17:57:39ID:???
仕組みなんて分からなくていいんだよ
ブラックボックスでおk
0221nobodyさん2010/09/18(土) 23:52:38ID:???
inとか使ってる奴はcgi-lib.pl時代の亡霊
0222nobodyさん2010/09/19(日) 15:20:57ID:???
ライブラリに入ってるコード毎回コピペするのかよw
0223nobodyさん2010/09/19(日) 16:24:14ID:???
写経だよ写経。
悟りが啓けるだろ。
0224nobodyさん2010/09/19(日) 17:09:11ID:???
何かバグってるときライブラリならアップデートが楽なのに、
あらゆるプロジェクトを書き直すのか。ご苦労さんってこった。
0225nobodyさん2010/09/19(日) 23:22:09ID:ND7IF1JX
>>218

my $query = CGI->new;
*in = $query->Vars();

の二行をわかりやすく説明してくれたらどんなに感謝することか。(;´Д`)
0226nobodyさん2010/09/20(月) 01:01:04ID:???
>>225
http://search.cpan.org/dist/CGI.pm/lib/CGI.pm#FETCHING_THE_PARAMETER_LIST_AS_A_HASH:
http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod

二行目は真似せず素直に %in = $query->Vars; とした方がいい。
0227nobodyさん2010/09/20(月) 12:16:11ID:???
おーー!
1行になったw
0228nobodyさん2010/09/20(月) 12:19:01ID:???
( ゚д゚ )
0229nobodyさん2010/09/20(月) 12:30:44ID:???
> の二行をわかりやすく説明してくれたらどんなに感謝することか。(;´Д`)

それこそソース嫁。
0230nobodyさん2010/09/20(月) 12:33:54ID:???
>>224
プロジェクト書き直すのにお金が発生するって前提だと
ある意味、悪いことではないかも

新言語がリリース→新言語でソフト開発→普及する→追加機能のニーズ
→車輪の再開発→開発案ネタ切れ→仕事がなくなる→誰にも見向きされなくなる
→ちょっと使いやすくした新言語をリリース→新言語でソフト開発→普及する
→追加機能のニーズ→車輪の再開発→開発案ネタ切れ→仕事がなくなる
→誰にも見向きされなくなる

プログラミング市場とは、ちょうどウィルスとウィルス対策ソフトの関係のように
イタチゴッコな構造でなければ繁栄しない。
0231nobodyさん2010/09/20(月) 12:41:55ID:???
my @List = WorkA -> WorkB

の「->」の意味ってそもそもどんな意味?

WorkAをWorkBに任せる?

それとも

オブジェクト指向的に
@List.WorkA.WorkB;

ってこと?
0232nobodyさん2010/09/20(月) 13:15:25ID:???
WorkAのWorkBを@listに代入する
0233nobodyさん2010/09/20(月) 16:07:19ID:???
>>230
どこから新言語の話が出てきたの?
0234nobodyさん2010/09/20(月) 22:53:46ID:???
新言語にリプレースしないからといって脅威が発生するわけでもないのに
0235nobodyさん2010/09/21(火) 05:32:11ID:???
workAオブジェクトの属するクラスで呼び出せるworkBを呼び出す。
workBはリストを返すので代入する。
0236nobodyさん2010/09/21(火) 08:10:37ID:???
>>231
http://perldoc.perl.org/perlop.html#The-Arrow-Operator
http://perldoc.jp/docs/perl/5.12.1/perlop.pod

a. 右辺が [Num] なら左辺を配列リファレンスと看做し、添え字 Num の値を返す。
  右辺が {Key} なら左辺をハッシュリファレンスと看做し、キー Key の値を返す。
  右辺が (Args) なら左辺をコードリファレンスと看做し、Args を渡して呼び出す。

my $ref = bless [qw( foo bar baz )], 'Foo';
print $ref->[1]; # bar
print { a => 'Foo', b => 'Bar', c => 'Baz' }->{'b'}; # Bar
sub { print join '-', @_ } -> (0..2, 'a'..'c'); # 0-1-2-a-b-c

b. 左辺がクラス(パッケージ)名かそれを収めたスカラー変数なら、右辺にはそのクラス
  から辿れるサブルーチン名かそれを収めたスカラー変数、又はコードリファレンスを
  収めたスカラー変数を置ける。この場合、右辺のサブルーチンには左辺が第1引数と
  して渡される。他の引数は (...) を続ける事で渡せる。

sub Foo::foo { print map("[$_]", @_), "\n" }
my $bar = sub { print 'Bar:', map("[$_]", @_), "\n" }; # パッケージに依存しない
my($Baz, $baz) = ('Foo', 'foo');

Foo->foo, $Baz->foo, Foo->$baz; # [Foo]\n[Foo]\n[Foo]\n
Foo->foo('quux'), $Baz->$baz('quux'); # [Foo][quux]\n[Foo][quux]\n
Foo->$bar, $Baz->$bar('quux'); # Bar:[Foo]\nBar:[Foo][quux]\n

c. 左辺が bless されたリファレンスなら、bless されたクラスを元に b. 同様の動作
  をする。第1引数にはクラス名でなくリファレンス自身が渡される。

$ref->$baz('quux'); # [Foo=ARRAY(0xhhhhhh)][quux]
02372312010/09/21(火) 10:22:02ID:???
>>235,>>236
なるほど、ありがと!
ドキュメントあったのね。

グーグルで「perl ->」で検索できなかったら
ドキュメントが探せないってのは痛いなぁ。

googleは、「->」の文字列が無視されてしまう。
0238nobodyさん2010/09/21(火) 18:44:47ID:???
Perl アロー演算子
0239nobodyさん2010/09/21(火) 19:16:06ID:???
検索で困る人が多そうなのはたいてい perlop か perlvar の
どっちかに載ってる傾向があるような気がする。
0240nobodyさん2010/09/22(水) 01:11:34ID:AC22vKYS
1: 自分はこういう事がしたい。
  index.htmlのプルダウンメニューで「あ」を選択すると、value="01"がchoice.cgiに渡されて
  http://www.ほげ.jp/a/ に飛ぶようにしたい。
2: それでこんな風にやってみたが・・・
  index.htmlとchoice.cgiは下に記載。
3: こんなエラーが出て上手く行かなかった。
  choice.cgiの数値を$page08ぐらいまで作ると500 Internal Server Errorを吐き出して停止する。
  これを$page08、$page09と数値を増やしても、しっかり動くようにできませんか?

index.html

<form action="choice.cgi" method="GET">
<select name="choice" onchange="this.form.submit();" size="10" style="width: 200px;">

<option value="01">あ</option>
<option value="02">い</option>
<option value="03">う</option>
<option value="04">え</option>
<option value="05">お</option>
<option value="06">か</option>
<option value="07">き</option>
<option value="08">く</option>
<option value="09">け</option>
<option value="10">こ</option>
<略>
</select>

</form>
0241nobodyさん2010/09/22(水) 01:12:47ID:AC22vKYS
choice.cgi

#!/usr/bin/perl
$page01 = "http://www.ほげ.jp/a/";
$page02 = "http://www.ほげ.jp/i/";
$page03 = "http://www.ほげ.jp/u/";
$page04 = "http://www.ほげ.jp/e/";
$page05 = "http://www.ほげ.jp/o/";
$page06 = "http://www.ほげ.jp/ka/";
$page07 = "http://www.ほげ.jp/ki/";
$page08 = "http://www.ほげ.jp/ku/";
$page09 = "http://www.ほげ.jp/ke/";
$page10 = "http://www.ほげ.jp/ko/";
<略>
$jump = "http://www.ほげ.jp/";#変な値が入力された時に飛ぶURL

$query = $ENV{"QUERY_STRING"};
($key,$value)= split(/=/,$query);

if($value == 01) {$jump = $page01;}
elsif($value == 02) {$jump = $page02;}
elsif($value == 03) {$jump = $page03;}
elsif($value == 04) {$jump = $page04;}
elsif($value == 05) {$jump = $page05;}
elsif($value == 06) {$jump = $page06;}
elsif($value == 07) {$jump = $page07;}
elsif($value == 08) {$jump = $page08;}
elsif($value == 09) {$jump = $page09;}
elsif($value == 10) {$jump = $page10;}
<略>
print "location: $jump\n\n";
exit;
0242nobodyさん2010/09/22(水) 01:39:35ID:???
世の中には8進数というものがあってだな。
0243nobodyさん2010/09/22(水) 01:39:54ID:???
>>240
> $page08ぐらいまで作ると500 Internal Server Errorを吐き出して停止する。
それは君が書き損なっているからだ。
下のように2行付け加えて、出てくるエラーメッセージを読みなさいな。

#!/usr/bin/perl

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use warnings;

これらの説明は以下。
http://search.cpan.org/dist/CGI.pm/lib/CGI/Carp.pm
http://perldoc.jp/docs/modules/CGI-2.89/CGI/Carp.pod
http://perldoc.perl.org/warnings.html
http://perldoc.jp/docs/perl/5.8.1/warnings.pod
0244nobodyさん2010/09/22(水) 01:45:55ID:???
> elsif($value == 08) {$jump = $page08;}

書き損なうも何もここで Illegal octal digit 出るだろ
0245nobodyさん2010/09/22(水) 02:51:53ID:???
08 は八進数っていう認識になっちゃうから

数字で扱うならアタマに 0 は付けないように。


でも文字列として扱った方が何かと楽なので、
elsif($val eq '08')〜
とした方が良いかと
0246nobodyさん2010/09/22(水) 02:55:05ID:???
if($value eq '01'){ $jump = $page01; }
elsif($value eq '02'){ $jump = $page02; }
elsif($value eq '03'){ $jump = $page03; }
elsif($value eq '04'){ $jump = $page04; }
elsif($value eq '05'){ $jump = $page05; }
elsif($value eq '06'){ $jump = $page06; }
elsif($value eq '07'){ $jump = $page07; }
elsif($value eq '08'){ $jump = $page08; }
elsif($value eq '09'){ $jump = $page09; }
elsif($value eq '10'){ $jump = $page10; }
<略>
print "location: $jump\n\n";
exit;
0247nobodyさん2010/09/22(水) 03:15:38ID:???
正規表現でカッコにマッチしたのは $1、$2、$3、…に格納されますが、
これらをまとめて取り出すための特殊変数とかありますか。
「perl 特殊変数」でぐぐっていくつかページを読んだのですが、
それらしい特殊変数がみつかりませんでした。
0248nobodyさん2010/09/22(水) 03:34:18ID:???
use strict;
use warnings;

my $str = '今日は暑かったかもしれない。 しかし今日と違って明日は寒いようだ。 今日はお買い物に行った。';
my @test = $str =~ /今日.*?っ/gi;
print join("\n", @test);

0249nobodyさん2010/09/22(水) 03:44:24ID:???
>>248
ありがとうございます。
while文との組み合わせでも動くでしょうか。
ためしたとろ、無限ループになるようです。
my @x;
while (@x = $str =~ /¥w+/g) { print Dumper(¥@x); } # 無限ループ?
0250nobodyさん2010/09/22(水) 04:34:43ID:???
for my $str ( @str ){
if( my @x = $str =~ /\w+/g ){
print Dumper( \@x );
}
}
0251nobodyさん2010/09/22(水) 05:38:12ID:???
use strict;
use warnings;

my $str = '今日は暑かったかもしれない。 しかし今日と違って明日は寒いようだ。 今日はお買い物に行った。';
my @test = $str =~ /今日.*?っ/gi;

print "文字列:$str\n";

print "_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n";
print "foreach を使う場合の一例\n";
foreach my $regex (@test){
print "取得したのは : $regex\n";
}

print "_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n";
print "while を使う場合の一例 \n";
my $str_bak = $str; # 削除しながら取得するため、バックアップをとる
while($str =~ s/(今日.*?っ)//){
print "取得したのは : $1\n";
}
$str = $str_bak; # バックアップを戻す
0252nobodyさん2010/09/22(水) 05:39:07ID:???
実行結果:
文字列:今日は暑かったかもしれない。 しかし今日と違って明日は寒いようだ。 今日はお買い物に行った。
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
foreach を使う場合の一例
取得したのは : 今日は暑かっ
取得したのは : 今日と違っ
取得したのは : 今日はお買い物に行っ
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
while を使う場合の一例
取得したのは : 今日は暑かっ
取得したのは : 今日と違っ
取得したのは : 今日はお買い物に行っ
02532402010/09/22(水) 19:08:57ID:???
>>242-246
うおーーー、皆さんレスありがとうございます。
やっとこ仕事が終わったので、これから弄ってみます。
02542402010/09/22(水) 20:22:03ID:???
動作確認完了しました。
08に特別な意味があることを勉強できました。
感謝です。
0255nobodyさん2010/09/23(木) 02:39:42ID:???
my $s = "a s,d f";
my @r = split /[\s,]+/, $s;
my @f = split /([\s,]+)/, $s;

@rと@fの結果が一致しないのは何故ですか?m//において()は特殊変数$1,$2...への記憶でしかないのですよね?
0256nobodyさん2010/09/23(木) 02:51:47ID:???
see perlfunc.pod

PATTERN に括弧が含まれていると、デリミタ内の部分文字列にマッチするものも、 リスト要素に含まれるようになります。

split(/([,-])/, "1-10,20", 3);
は、以下のリスト値を生成します。

(1, '-', 10, ',', 20)

0257nobodyさん2010/09/23(木) 10:20:23ID:???
>>256
ありがとうございました
0258nobodyさん2010/09/23(木) 22:06:19ID:???
Shell::* や Term::* のように、CLI環境でシェルのようなものを提供するモジュールで、出力にlessのようなページャを使えるものはないですか?
出力が長い場合、ターミナルのバックログを見ているんですが、lessが使いたいです
0259nobodyさん2010/09/24(金) 04:43:44ID:???
>>258
perl hoge.pl | less

これじゃだめなの?
0260nobodyさん2010/09/27(月) 11:10:54ID:hIL0AOHQ
自作のアクセス解析なんだけど、これ分かる人いないかな?

1秒間に6回のアクセスをし、
アクセスする度に違ったHPのURLをリンク元として記録を残していく同一アクセス者がいるんだよ。

以前から見慣れないリンク元URLが見受けられるようになったんだけど、
見に行くとリンクなんてしてなにわけ。おかしいでしょ?

これは何かあるんじゃないかな。
思うに、SEO業者でリンク元URLを残していくことで、、、
0261nobodyさん2010/09/27(月) 11:55:17ID:???
スレ違い、あと普通
0262nobodyさん2010/09/27(月) 11:56:15ID:???
しかもマルチポストか死ね
0263nobodyさん2010/09/27(月) 14:22:26ID:o+RpwStb
駄目なスレだなあ
何の役にもたたない
0264nobodyさん2010/09/27(月) 14:31:18ID:???
>>263 ID変えて逆キレ カコワルイ(・A・)イクナイ!!
0265nobodyさん2010/09/28(火) 02:16:52ID:???
すんません。宿題下さい、ってとこにも書き込んでしまいました。
真面目に質問です。

トーナメント表を作りたくてPHPの勉強始めました。

ここが目標です。
http://hanamachi.com/tnmt/i212.html

1.ブラウザから参加者登録
2.点数を記入して、勝ち上がりを更新する

参考になる考え方、sampleなどご指導下さい。

よろしくお願いします。
0266nobodyさん2010/09/28(火) 04:11:04ID:5eMRq53y
unless (-d "~/foo/bar") {
system("mkdir ~/foo/bar");
}

linux で ~/foo/bar が存在しないなら、そのディレクトリを作成する
ということをしたいのですが、-d "~/foo/bar" が正しく判定されません。
~/foo/bar ディレクトリがあるのに、無いと判定されてしまいます。
-d "/home/andy/foo/bar" というように絶対パスなら正しく判定されます。
-d "~/foo/bar" の場合何がまずいのでしょうか?
0267nobodyさん2010/09/28(火) 04:26:46ID:???
>>265
>>1-2
0268nobodyさん2010/09/28(火) 04:36:14ID:???
>>266
なんかようわからんけど -d "$ENV{HOME}/foo/bar" なら動いたよ
想像だけどPerl自体はチルダを展開しなくて、systemなんかでシェルが処理するときは展開するんじゃないか?
0269nobodyさん2010/09/28(火) 07:01:19ID:???
>>268
ありがとうございます
多分>>268さんのおっしゃる通りなんでしょうね

「初めてのperl」にも chdir の説明のところですが「チルダがホームディレクトリを指すのは
シェルの機能だからOSを直接呼び出すPerlでは使えないよ」と書いてあります
でもなぜ system 関数では使えるの?という疑問が出るのですが
はっきりした事はググっても見つかりませんでした
0270nobodyさん2010/09/28(火) 10:21:28ID:???
>>269
いやぐぐるまでもなくマニュアルに書いてある。

ttp://perldoc.jp/docs/perl/5.10.0/perlfunc.pod より:

# system LIST system shell
# system PROGRAM LIST

exec LIST とほとんど同じですが、まず fork を行ない、親プロセスではチャイルドプロセスが終了するのを wait します。
exec の項で述べたように、引数の処理は、引数の数によって異なることに注意してください。 LIST に複数の引数がある場合、
または LIST が複数の要素からなる配列の場合、リストの最初の要素で与えられるプログラムを、リストの残りの要素を引数
として起動します。スカラの引数が一つだけの場合、引数はシェルのメタ文字をチェックされ、もしあればパーズのために引数
全体がシステムコマンドシェル (これは Unix プラットフォームでは /bin/sh -c ですが、他のプラットフォームでは異なります)
に渡されます。シェルのメタ文字がなかった場合、引数は単語に分解されて直接 execvp に渡されます。この方がより効率的です。

「スカラの引数が一つだけの場合〜」のところをよく読め。この説明でわからなければ
勉強が足りないのでがんばれ。
0271nobodyさん2010/09/28(火) 16:37:35ID:???
>>270
どうもありがとう
やっぱりちょっと難しい。もうすこし調べてみます
0272nobodyさん2010/09/29(水) 14:40:47ID:LPXumyyo
if(-f "hoge"){}
の否定は

if(!-f "hoge"){}
でしょうか?

if( !(-f "hoge")){}
でしょうか?
0273nobodyさん2010/09/29(水) 15:02:32ID:???
unless(-f "hoge"){}
0274nobodyさん2010/09/29(水) 15:16:31ID:???
>>273
ありがとうございます
ifを使った否定はどちらでしょうか?
0275nobodyさん2010/09/29(水) 15:30:59ID:???
試せばわかると思うけどどっちでもいけるので後は好み
0276nobodyさん2010/09/29(水) 15:55:23ID:???
use CGI;
my $cgi = new CGI;
my $cgi = CGI->new;

上述の二つはどう違うのでしょうか?
0277nobodyさん2010/09/29(水) 16:06:44ID:???
おんなじです。
my $cgi = CGI::new('CGI');
とも書けます。まず使わないけど。
0278nobodyさん2010/09/29(水) 16:21:07ID:???
>>277

結果は同じだけど過程が違わなかったっけ?
記憶が曖昧ですまんが
0279nobodyさん2010/09/29(水) 16:46:42ID:???
>>276の2つはDeparseしたらどっちも 'CGI'->new と解釈されてたよ。
んでもってそれは>>277のシンタックスシュガーであると。
0280nobodyさん2010/09/29(水) 17:11:05ID:???
newに引数使うときにCGI->newとか使う希ガス
0281nobodyさん2010/09/29(水) 17:12:15ID:???
俺が勘違いしてたみたいだね。 横やり失礼
0282nobodyさん2010/09/29(水) 19:18:53ID:???
open( DATA, "<", $logAll);
flock( DATA, 2);
$cnt = <DATA>;
close( DATA);
chomp( $cnt);
$cnt++;
open( DATA, ">", $logAll);
flock( DATA, 2);
print DATA $cnt;
close( DATA);

このように書くと、ログがリセットされてしまうことがあります。
どのようにかけばいいでしょうか?
0283nobodyさん2010/09/29(水) 19:37:55ID:???
open DATA, "+<", $log;
flock DATA, 2;
$cnt = <DATA>;
chomp $cnt
$cnt ++
seek DATA, 0, 0;
print DATA $cnt
truncate DATA, tell(DATA);
close DATA;

# chompする必要あるの?
0284nobodyさん2010/09/29(水) 19:40:08ID:???
注意する点は、

flockが有効な間に読んで1増やして書くまでやらないと
ロックする意味がない

'>'で開くと開いた瞬間にファイルが空にされるので、
そのあとでflockしても手遅れ(ロックしてないうちに
ファイルを壊したことになる)


use Fcntl qw(:flock :seek);

open( DATA, "+<", $logAll);
flock( DATA, LOCK_EX);
$cnt = <DATA>;
chomp( $cnt);
$cnt++;
seek(DATA, 0, SEEK_SET);
print DATA $cnt;
close( DATA);
0285nobodyさん2010/09/29(水) 19:43:15ID:???
セミコロン抜けすぎワロタ>283
02862822010/09/29(水) 21:14:18ID:???
ありがとうございました。
リセットされないようになりました。

教えていただいたコードの中でわからないことがあるので、
もう一度質問させてください。

seekについてしらべてみたのですが、どのような動作をするのでしょうか?
ポインタを移動させるということはわかったのですが、そのポインタが先頭に行くということは
既存の文字の前にインサートすることにはならないのでしょうか?

また、>>283さんのtruncateはファイルサイズを変更しているようですが、
どのようないみがあるのでしょうか?

お手数をおかけしておりますが、宜しくお願いいたします。
0287nobodyさん2010/09/29(水) 21:26:51ID:???
>>286
インサートじゃなくて上書き。

truncateしないと新たに書いた文字列がもとのより短いときに
問題になる。たとえば100を99にしようとしても990になっちゃう
みたいな。今回は1ずつ増やすので桁が減ることがないから
truncateしなくても大丈夫なので284はさぼったんだと思うけど
一般的には必要。
02882822010/09/29(水) 21:31:14ID:LPXumyyo
>>287
ありがとうございます。
ポインタはC言語と同じ動きをするんですね。

0289nobodyさん2010/09/29(水) 22:34:03ID:???
ファイルポインタ移動後に挿入してくれる言語があるなら知りたい
0290nobodyさん2010/09/30(木) 00:16:07ID:???
蝉焜炉
0291nobodyさん2010/10/01(金) 01:36:17ID:qWU05yPj
自作のショッピングカートを使ってきたんだけど、
この度、クレジットカード決済を同CGIに導入することになったんだが、
接続とデータの渡しに更なる知識と技術が必要みたいなんだな。

リファレンスっていうのがよくわからない。
どなたか、分かりやすく説明していただけませんか?
0292nobodyさん2010/10/01(金) 01:45:18ID:???
>>291
さすがにそれは…
頼むから人の金を扱わないでくれないか
0293nobodyさん2010/10/01(金) 01:49:05ID:qWU05yPj
>>292
どうして?
どういうこと?
SSLは導入してるよ?
0294nobodyさん2010/10/01(金) 06:38:46ID:???
リファレンスも理解してないレベルの奴が作ったプログラムに
金を扱わせるのは怖いって話だろ。SSL使ってりゃいいって
もんじゃない。
0295nobodyさん2010/10/01(金) 13:02:48ID:???
リファレンスもわからずに組んでるようなショッピングカートって……
0296nobodyさん2010/10/01(金) 13:52:43ID:???
>>291
perlrefを嫁。
↑に書いてあるようなボリュームのことを1行で聞いて済ますとは大胆な。
0297nobodyさん2010/10/01(金) 14:11:15ID:???
こういう人はクレジット会社に不正データ送りまくって
損害賠償請求でもされないと、自分のやっていることの
問題がわからないタイプの人
0298nobodyさん2010/10/01(金) 16:13:17ID:???
>>293
そもそもクレジットカード決算とリファレンス直接関係ないし

WEBでビジネスやろうと思うなら少なくともCSRF・XSS・SQLインジェクションくらいは理解した上で質問をしろ
熟練して、リスクとコストを見比べてそれでも自作でやろうと思うならそれでもいいが、
どんなリスクがあってそれがどれほどの損害を生むかを理解していないうちから人の金を扱うのは
無責任にもほどがある
0299nobodyさん2010/10/01(金) 16:27:35ID:qvat8ps4
そうすると、CGIで注文を受けるシステムを作るのは無謀だと?
それは全く違うと思うのだが。
クレジットカード決済代行業者の存在は知ってる?
上手く繋げられれば決してありえない話ではないと思うのだが。
0300nobodyさん2010/10/01(金) 16:35:07ID:???
知識もなしに作ろうとするのは無謀だろ
0301nobodyさん2010/10/01(金) 16:37:13ID:???
直接は関係ないけどそういうレベルだと他のスキルもそれなりなんだろうな
ということだよ。

決済代行につなげて出来た出来たじゃすまないんだよね。
0302nobodyさん2010/10/01(金) 16:39:17ID:???
その程度の知識で進むステップじゃないだろう
ってことだよw

>>クレジットカード決済代行業者の存在は知ってる?
たぶんみんな知ってる
あまり、自分だけ知ってるんだぜ?的な発言は敵を増やすだけで良質な回答は増えないと思う。
質問したなら、回答を得るまで下手にかつ積極的に動けないかねぇ



まぁ手数料覚悟で自分のカードでテストするのも手だけど、
とりま paypal つこーとけ
あそこはカード決済がテストで出来たと思った
0303nobodyさん2010/10/01(金) 16:43:40ID:qvat8ps4
>>302
代行業者の利用案内ではCGIからの繋げ方が解説されていて、
努力すれば可能なんだがな。

>自分だけ知ってるんだぜ
回答はありがたいが、どの程度の前提なのかは当然わからないわけで、
技術者は兎角視野が狭まりがち。
プログラマーでも決済代行業者知らないことはあり得るんじゃないか?
0304nobodyさん2010/10/01(金) 16:46:53ID:qvat8ps4
ちなみにじゃあ、実際にCGIプログラムから決済代行業者へ接続させるプログラム作ったことある人いる?
渡すデータってどんなデータだと思う?
カード番号等は代行業者のページに入ってから入力するから、
ショップ側はタッチしないシステムになっている。

なんら問題はないと思うけどな。
0305nobodyさん2010/10/01(金) 17:07:01ID:???
>>304
業者によるぞ
決算代行と単に決済システムを置いてくれてる会社がある

代行で簡単なところはデータ渡すだけでいいけど、決済システムを置いてくれてるだけなら
自分でデータを加工して指定の方法に従って渡さないといけない。

何度も作ったことがあるけど、結構めんどくさい。
業者のシステムの仕様のマニュアルから読まないといけないから。

完全な代行業者ならデータすら渡さずに、代行業者のサイトに遷移させるだけだから、
CGIを導入するって言った時点で前社ではないんじゃないの?

しらんけど
0306nobodyさん2010/10/01(金) 17:17:03ID:qvat8ps4
>>305

>代行で簡単なところはデータ渡すだけでいいけど、決済システムを置いてくれてるだけなら
>自分でデータを加工して指定の方法に従って渡さないといけない。
これです。
つまり、商品メニューの表示と支払い合計額の計算、
個人情報の入力と送信はショップが行い、
支払い手続き等の決済は決済代行業者が行う。
ショップは名前と電話番号と決済額を決済代行業者に渡すだけで、
クレジットカード手続きは代行業者ページで行う。

めんどくさいけどギリギリでできそうなところにきている。
クレジットカード番号等の保管をしなくてもいいし、リスクもショップ側は少ない。
なにが問題だろうか。

ところが、リファレンスがわからないんだな。
配列の配列(の配列?)みたいなデータを扱う場合に必要になるっぽいのはわかりかけてるけど、
おそらくここのところがネックになってるものかと。
0307nobodyさん2010/10/01(金) 17:25:59ID:???
perllol を読めばリファレンスが何なのかわかんないままでもデータの扱いかたはわかると思う。
■ このスレッドは過去ログ倉庫に格納されています