Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0206nobodyさん
2005/08/26(金) 09:10:00ID:???JavaScript の escape 関数でエンコードされた文字列
(%uXXXX形式)を Perl でデコードしようとしています。
次のようにやると全てマルチバイト文字の場合はうまくいくのですが、
半角文字が入っているとうまくデコードできないようでした。
use Jcode;
$a = '%u3042%u3044%u3046%u3048%u304A'; # あいうえお
$b = '%u3042a%u3044b'; # あaいb
$a =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;
$b =~ s/%u([a-fA-F0-9]{4})/pack('H4', $1)/ge;
print Jcode::convert($a, 'euc', 'ucs2'), "\n";
# あいうえお と表示されOK
print Jcode::convert($b, 'euc', 'ucs2'), "\n";
# あ豹? と表示される。a以降文字化け
環境は、Linux, Perl 5.8.4, Jcode.pm 0.88 です。
Windows, ActivePerl 5.8.6, Jcode.pm 0.86 の環境で出力を sjis に
変えても同じでした。
Jcode.pm で変換できる方法はありますでしょうか?
Encode等、他の方法でもありましたらよろしくお願いします。
0207nobodyさん
2005/08/26(金) 10:23:29ID:???$bが正しいucs2じゃないからじゃないだろうか。
$b = '%u3042%u0061%u3044%u0062'; # あaいb
となるはずだと思うのだが。
0208nobodyさん
2005/08/26(金) 10:57:46ID:???\x00を補う方法も考えられる。ブラウザなどからその形で送られて
くるので手出しできないとするとこの方法の方がいいかもしれん。
$b =~ s/(?:%u([a-fA-F0-9]{4})|(.))/($1 ne '')? pack('H4', $1): "\x00$2"/ge;
0209206
2005/08/26(金) 11:46:38ID:???ありがとうございました。うまくいきました。
正しいucs2ではなかったのですね。
アドバイス通り修正することで、Jcodeによる文字コードの
自動判別も使えるようになりました!
print jcode($b)->euc, "\n"; # OK!
0210nobodyさん
2005/08/26(金) 13:56:08ID:0igOMeuLありがとうございます!
$body =~ /^([\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*$/ or chop $body;
↑こっちのやりかたで完璧でした。ShiftJISのままできました。
>>202
うーん。まぁ今となっては確かにeucでやった方がいいのかなぁ?
サイト上でテキスト(HTML)がSJISでCGIだけEUCだとチグハグ感がありますので。
0213nobodyさん
2005/08/27(土) 11:09:24ID:???うーん。そうですよねぇ。真摯に受け止めます。
>>212
それも手間じゃないですか?
そうそう、jcodeを使うと半角が化ける以外に、処理が遅くなるっていうのがありました。
最近はハードのスペックが上がったから問題ないとも思うのですが。
0214nobodyさん
2005/08/27(土) 11:54:37ID:???2、チ、网簗ムエケ、キ、ハ、、、キ。」
0215nobodyさん
2005/08/27(土) 12:25:45ID:???ロジックが甘いか、工夫が足りないだけ。
EUCだと正規表現で楽できることもあるけど、クライアントのほとんどはSJISの住人だから。
SJISの住人相手にはSJISで組んだほうがメリットになることも多いよ。
そもそも、最近はjcodeの出番がめっきり減った気がする。
0216nobodyさん
2005/08/27(土) 13:01:28ID:???オススメしないけどな。入り口と出口で変換する方が楽。
中身は古い人はEUCで、イマドキの人はunicodeが良いでしょう。
0217nobodyさん
2005/08/27(土) 14:53:32ID:???0218nobodyさん
2005/08/27(土) 19:10:26ID:???0219nobodyさん
2005/08/27(土) 19:25:06ID:???grep等のツールが使えなくなるのがちと痛いんだよなぁ。
新しめのLinux環境だと使えるのかな。。?
0220nobodyさん
2005/08/27(土) 22:05:10ID:???0221nobodyさん
2005/08/28(日) 16:08:49ID:???use encodingやuse Encodeをソースに記述し起動させると、「問題が発生しました。ご迷惑をおかけして(ry」が出てPerlが強制終了してしまいます。
Encode.pmをコマンドラインで直接立ち上がげても同じでした。
何が原因でしょうか?
0222nobodyさん
2005/08/28(日) 16:11:45ID:AszUkSZsEncode.pmがインストールされている環境とそうでない環境とで、プログラム内部で処理を分けようと思っているのですが、なぜかうまく行きません。
$Eflag = eval('use Encode qw/ from_to :fallbacks /; 1');
とやっておいて、
if ($Eflag) {
from_to($_, 'utf8', 'cp932', FB_XMLCREF);
}
という風に処理したいのですが、evalを通したらfrom_toだけだとうまくインポートできるのですが、この書き方だと:fallbacksのほうだけインポートされないようです。
普通にevalを通さないで、use Encode qw/ from_to :fallbacks /;と書いたら正常に動くのですが、これだとEncode.pmのない環境ではコンパイル時エラーが出てしまうので困っています。
ここでevalを通すと、:fallbackはインポートされないのでしょうか?
うまく処理する方法または、これに代わる何かいいアイデア等ございましたらぜひとも教えていただきたく思います。
0223nobodyさん
2005/08/28(日) 16:50:57ID:???とりあえず、アンインストールして、ディレクトリも全部消してから、再インストール。
できれば、最新のバージョンのものを。
>>222
BEGIN{
eval("use Encode qw(:fallbacks from_to)");
$eflag = ($@ ? 0 : 1);
}
if ($eflag){
from_to($d, 'utf8', 'cp932', FB_XMLCREF);
print $d;
}
0224nobodyさん
2005/08/28(日) 17:01:40ID:???ここスルーでつか?
0225nobodyさん
2005/08/28(日) 17:05:14ID:???0226nobodyさん
2005/08/28(日) 18:08:27ID:AszUkSZsどうもありがとうございました。
参考にさせてもらったところ無事問題が解決できました。
0227nobodyさん
2005/08/29(月) 02:19:20ID:???$sendmail = '/usr/sbin/sendmail';
open(LOG,"$datfile");
flock(LOG, LOCK_EX);
@alldata = <LOG>;
close(LOG);
foreach $mail (@alldata){
$mail =~ s/ //g;
open(MAIL,"| $sendmail -t");
print MAIL "To: $mail\n";
print MAIL "From: magazine\@foo.co.jp\n";
print MAIL "Subject: bar\n\n";
print MAIL "$message\n";
close(MAIL);
}
メールアドレスが格納されているファイル($datfile)を展開して、各行を$mailに代入(万が一を考えて半角スペースの除去も行っています)して、同じメールを送信しようとしているのですが、送信されるメールは、
差出人:ユーザーID
受信者:$mail該当者
で、本文に、
From: [email protected]
Subject: bar
$messageに入ってる文字列
と出てしまいます。
試しに$mailの部分の記述を実在するアドレスに差し替えたところ、$datafileの行数だけ(その回数だけforeachが実行されるから)記入したアドレスにメールが届きましたが、その場合は、差出人にFrom: の内容が、件名にSubject: の内容が入り、本文にこれらは出ませんでした。
なぜ、ズレが生じるのでしょうか?根本的に理解できてないかもしれません。お教えいただけると幸いです。
0228nobodyさん
2005/08/29(月) 02:31:55ID:???0229nobodyさん
2005/08/29(月) 02:32:27ID:???0230nobodyさん
2005/08/29(月) 02:35:14ID:???改行コードが残っていて、改行のみの行が存在し、それ以降が本文扱いにされているのでしょうか。
有難う御座います。早速試してみたいと思います。
0231nobodyさん
2005/08/29(月) 02:39:07ID:???うまくいきました。有難う御座いました。
>>229
そういう誤解を招くと思ってメルマガと言ったんですが、信用はないですよね。
気分を害してしまい申し訳ありませんでした。
0232nobodyさん
2005/08/29(月) 22:53:35ID:2Z/c1c0/質問させて下さい。
perl 5.0 linux apache環境です。(あまり環境は関係ない質問ですが。。)
国語,30,53,23,23
算数,35,35,12,64
公民,43,43,34,56
日本史,33,2,2,2
といった感じのCSVファイルがあったとして一部のデータのみ書き換えるという処理は
可能でしょうか?
つまり80行目の3列目だけデータを書き換えるとか、公民の5列目(56の部分)だけ56を52にするとか
することは可能でしょうか?
私の知識では
このCSVをすべて@配列にいれてこれをforeachで一行一行読んで5つにカンマでsplitして変数に保存していき、
($date.=date[0].",".date[1].",".date[2].",".date[3].",".date[4]."\n" )
date[0]が公民だったら4行目を52にして
($date.=date[0].",".date[1].",".date[2].",".date[3].",52\n" )
$dateを print FILEHANDLE date.csv;
ですべて上書き保存するという非効率な方法しか思いつきません。
要所部分だけ書き換えるという方法がありましたら、ないかも知れませんが。。
教えていただければ幸いです。
0233nobodyさん
2005/08/29(月) 23:02:38ID:???その環境でDB使わないで、あくまでcsvで行くのですね…。
すべて配列に入れるよりも、
正規表現で「公民」にマッチする行だけsplitして書き換えては。
0234nobodyさん
2005/08/29(月) 23:06:26ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_do_I_change_one_line_in_a_fi
http://www.rfs.jp/sitebuilder/perl/05/func/join.html
0235232
2005/08/29(月) 23:36:34ID:2Z/c1c0/ありがとうございます。mysqlもpostgreも使えない環境です。。
仰るとおりの方法にしたいのですが、
splitして該当の行だけ書き換えるという処理がわかりません。
もしよろしければ、ヒント下さい。
>>234
ありがとうございます。
読んでみましたが、私が232で試そうとしている
方法のようです。確かにこれが一番簡単で
私のような初心者にもわかりやすいのですが、
書き換える箇所が何箇所もあると
同じファイルを1回の処理で何回も上書き保存しないと
いけない重たい処理になってしまいます><
0236nobodyさん
2005/08/29(月) 23:36:40ID:???扱うファイルが小さいなら、DBを使うよりも
現在のようにシーケンシャルファイルを扱う方法のままが手軽でいいかも。
その上で、
1. 2次元の表を扱うので2次元配列に読み込む
2. ファイルからの読み込み、ファイルへの書き出しは
push, join, map 等を使って簡潔に書けるので、その辺りを調べてみる
といいと思う。
my @data;
open(IN, 'data.csv');
for (<IN>) { # ファイルサイズが大きいなら while で
push(@data, [ split(/,/) ]);
}
close(IN);
$data[79][2] = 'hoge'; # 80行3列を書き換える
$data[2][4] = 52; # 公民の5列目を52に
open(OUT, '> data.csv');
print OUT map { join(',', @{$_}) . "\n" } @data;
close(OUT);
# チェックしてないのでミスありそう
こんな感じはどうでしょう?
0237nobodyさん
2005/08/29(月) 23:39:03ID:???0238232
2005/08/30(火) 00:03:14ID:x5m98we0ありがとうございます。
その方法でやってみます。
確かめていないのでうごくかはわかりませんが、
取次ぎお礼まで!
ありがとうございました。
0239nobodyさん
2005/08/30(火) 01:18:03ID:???0241nobodyさん
2005/08/31(水) 14:49:41ID:2aj3BZHt0242nobodyさん
2005/08/31(水) 14:56:42ID:???0243nobodyさん
2005/08/31(水) 16:24:59ID:???-----
next if (!$acl{$base_remote_user,$minfo->{'dir'}} &&
!$acl{$base_remote_user,"*"});
-----
という箇所があったのですが、中括弧($acl{})の中の意味が分かりません。
中括弧でかこって中にカンマというのはどういう意味でしょうか?
0244nobodyさん
2005/08/31(水) 16:38:21ID:???多次元配列のエミュレーション用の機能で
$foo{$a,$b,$c}
は
$foo{join($;, $a, $b, $c)}
と同じ。詳しくはperlvar(1)の$;の項などを参照されたい。
0245nobodyさん
2005/08/31(水) 18:22:07ID:???また、逆にコードを文字に戻したりもしたいのです。
0246nobodyさん
2005/08/31(水) 18:23:01ID:???0247nobodyさん
2005/08/31(水) 18:30:58ID:???pack、unpack、ordあたり調べてきな。
# 実際に '\x' も付けて表記してるならevalで戻せるけどな。
0249nobodyさん
2005/08/31(水) 19:01:48ID:???あまりきれいに書けてないけど。例を。
for ('A', 'a') {
print '\x' . unpack('H2', $_);
}
for ('\x41', '\x61') {
/\\x(..)/;
print pack('H2', $1);
}
0250nobodyさん
2005/08/31(水) 19:11:24ID:4hPwGNyx日本語使うと文字化けしちゃって読めません。
# どうやらbase64に強制変換されてる様子。
どうすれば日本語を使えるようになるでしょうか。
なお現在のソースはイカの感じです。
use strict;
use XMLRPC::Lite;
use Jcode;
my $name = "name";
my $pass = "pass";
my $title = "たいとる";
my $description = "ほんぶん";
#&Jcode::convert(\$title,'utf-8');
#&Jcode::convert(\$description,'utf-8');
print $title;
my $msgresult = XMLRPC::Lite
-> proxy('http://blog.fc2.com/xmlrpc.php')
-> call('metaWeblog.newPost', "0", $name, $pass,
{
'title' => $title,
'description' => $description,
'mt_allow_comments' => 1, # must be int, not string
'mt_allow_pings' => 1 # must be int, not string
},
1
)
-> result;
0251nobodyさん
2005/08/31(水) 21:12:32ID:HyyIksuTif( $a == 0 || $a == 1 || $a == 2 || $a == 3 ){
$aに0、1、2、3のどれかが入っていたら…、という文なんですが、
これをもう少し簡潔に書くとどうなるでしょうか?
数字が0、1、2、3……10くらいまで続き、また別のグループで11〜20、21〜30までを
今はそれぞれelsifで処理しています。
効率が悪いかな?と思いまして…。よろしくお願いします。
0252nobodyさん
2005/08/31(水) 21:19:36ID:ihFBKKnRTIMTOWDI
if $a =~ /(\d+)/ and 0 <= $1 and $1 <= 30
if defined $a and 0 <= $1 and $1 <= 30
0253nobodyさん
2005/08/31(水) 21:19:58ID:???if ( 0 <= $a && $a <= 10 ) { }
elsif ( 11 <= $a && $a <= 20 ) { }
elsif ( 21 <= $a && $a <= 30 ) { }
0255251
2005/08/31(水) 22:24:49ID:???>254
すみません、なんかこの処理を他に変える方法が今の自分にはわからなくて…
スキル不足ですね。勉強します。
0256nobodyさん
2005/08/31(水) 22:28:33ID:ihFBKKnR10ごとに区切る前提なら
my $flag = int $a / 10;
if ( $flag = 0 ) {}
...
if ( $flag = 3 ) {}
は?
0257nobodyさん
2005/08/31(水) 23:09:37ID:???if ($a =~ /1[0-9]/) {}
if ($a =~ /2[0-9]/) {}
0258nobodyさん
2005/08/31(水) 23:15:40ID:???どこか設計が間違ってると疑った方がいい。
0259nobodyさん
2005/09/01(木) 09:17:57ID:???$flag という変数名を使う習慣は捨てたほうがいい。
(そもそも割り算の商はフラグじゃないし)
もし意味がフラグだったとしても何のフラグなのかあらわす単語を名前にしる。
0260250
2005/09/01(木) 10:18:56ID:pBV3XGF+'title' => $title,
'description' => $description,
の所を
'title' => XMLRPC::Data->type('string', $title),
'description' => XMLRPC::Data->type('string', $description),
とする事で解決しました。
# $title及び$descriptionの中身はutf-8に変換してます。
0261nobodyさん
2005/09/01(木) 14:07:05ID:???下記のようなやり方だと出来ません
どのようにしたらよいのでしょうか?
$b = system("vuserinfo -l $a");
print $b;
0262nobodyさん
2005/09/01(木) 14:37:00ID:???$b = `vuserinfo -l $a`;
print $b;
systemはコマンドの戻り値が返されるのかな。
あと、openかsystem関数かでパイプを使う方法等もあったと思う。
0266nobodyさん
2005/09/01(木) 18:37:12ID:???0268nobodyさん
2005/09/01(木) 21:28:02ID:???0269nobodyさん
2005/09/01(木) 21:29:53ID:???0270nobodyさん
2005/09/02(金) 01:43:26ID:5yfALZxBpush(@tmp, $line);
}
close(FILE);
で、
print @data;
とすると、2行目以降、各行の先頭に半角スペースが入ってしまうのですが、
何が原因でしょうか?
0271nobodyさん
2005/09/02(金) 01:48:22ID:???0272270
2005/09/02(金) 01:50:31ID:5yfALZxBそれはないです。。。
1行ずつ
while($line = <FILE>) {
print $line;
}
close(FILE);
とすると大丈夫なので。
0274nobodyさん
2005/09/02(金) 01:54:19ID:???0275270
2005/09/02(金) 01:54:19ID:5yfALZxBとやっても変化無しです。
0276nobodyさん
2005/09/02(金) 01:54:50ID:???0277270
2005/09/02(金) 01:55:26ID:5yfALZxBすみません、
open(FILE, $file);
が抜けてましたorz
0279270
2005/09/02(金) 01:57:14ID:5yfALZxBすみません、書き込む時に間違えました。
手元のは大丈夫です。
あぁ、もうだめぽ。
0280nobodyさん
2005/09/02(金) 01:58:11ID:???0281nobodyさん
2005/09/02(金) 02:00:22ID:???print "@temp";
以上の違いを説明せよ
0282民主党
2005/09/02(金) 02:36:21ID:9iT1X8+f韓国大手テレビ局の8月15日番組「日本軍731部隊の生体実験」が、実は真っ赤なウソ、中国映画の盗用でっち上げだった。
韓国マスコミは反日番組で、この種のでっち上げ「歴史歪曲(わいきょく)」をよく行うが、今回の事件で 「日本糾弾ならウソも平気」 という腐敗体質が改めて確認された。
番組では実験の様子を「白黒の記録フィルム風」に紹介したが、視聴者から「映画の場面と同じだ」との声が上がり、悪質なでっち上げが露呈した。
この中国映画はカラー作品だが、テレビでは本物に見せかけて「白黒」に変えられており、意図的なでっち上げであることは明白。
日本の 民 主 党 【岡田党首】 は、日本国内に数十万人もいる反日的な在日韓国・朝鮮人に、日本の選挙権を与え、 民 主 党 に投票させようと画策している。
在日韓国・朝鮮人の大部分は、戦後のドサクサで勝手に密入国した不法滞在者とその子孫だが、「強制連行された」とウソをつき、被害者のフリをして日本国内に居座っている。
収入があっても税金は一切払わず、さらに毎月二十数万円の生活保護をもらい、日本人の悪口を言いながら遊び暮らしている。
0283nobodyさん
2005/09/02(金) 10:04:13ID:???% perl -e '@temp=("a\n", "b\n"); $,=" "; print @temp;'
a
b
0284nobodyさん
2005/09/02(金) 12:41:24ID:???Perlのバージョンは?
それから、問題が再現する最小のコードを作ってそのまま貼ってもらえると
アドバイスしやすいかな。
おれは昔(1〜2年ほど前)、print @hoge; とすると最初の行だけ先頭に
半角スペースが入ったことがあった。
print にスカラーやリストを渡した場合等は大丈夫なんだが、配列1つだけ
(もしくは先頭に配列変数だったかな)を渡すとそうなった。
(270さんと逆だなぁ。)
今、win & Linux 上で試してみたけど、そういう現象は起こらなかった。
もしかすると、Perl の、print あたりの実装上の問題かも。
# 今試して再現しなかったと書いたけど、なにぶん昔のことなので
# 方法を間違えているだけかも。
0285nobodyさん
2005/09/02(金) 12:56:58ID:???どうやらおれが書いた問題は
>>281さんが指摘したことだったみたいだ。
多分、自分の場合は、ヒアドキュメントの中で変数展開を使おうとして
先頭に改行が入っていたのだった。
print <<END;
@hoge
END
これだと改行が入るので、苦し紛れにリファレンスとデリファレンスを
使って次のように回避していたのを思い出した。
print <<END;
${ \join('', @a) }
END
>>281
文字列中での配列変数の展開では、要素間に半角スペースを入れて
結合されるのかな。
一方、引数として配列変数を指定した場合(前者)は、最初にリストに展開される
ため期待通りに処理される、と。
0286nobodyさん
2005/09/02(金) 14:02:12ID:???文字列中での変数展開では$"が間に挿入される。デフォルト値は空白。
printでは要素間に$,が挿入される。デフォルト値は空文字列。
0287nobodyさん
2005/09/02(金) 23:01:28ID:???「ひょっとして、ダブルクォート文字列の中に、chomp していない配列を入れていませんか?」
というやつだね。
0288nobodyさん
2005/09/03(土) 03:59:11ID:???0289nobodyさん
2005/09/03(土) 05:05:43ID:???あれはいったいどうやってtor経由か判断しているのでしょうか
0290nobodyさん
2005/09/03(土) 15:37:23ID:???スレ違い
0291nobodyさん
2005/09/03(土) 15:49:52ID:???これでも参考に
風呂敷確認君 弐式 2.07
http://sv2ch.baila6.jp/chk_proxy.cgi
http://sv2ch.baila6.jp/chk_proxy.cgi?source
0292nobodyさん
2005/09/04(日) 03:20:49ID:pmMRy4XZ意味がわかりません。
「$v1 . hex(09) . $v2」というように項目の区切りとしてhex関数
を指定してみましたが、エラーが出てしまいます。
質問すると怒られるので焦ってます、、
ご教示いただけますと幸いです。
0294nobodyさん
2005/09/04(日) 04:03:51ID:???本当に有難うございます。
「受付データの区切りはタブ(\t)を入れており、
項目区切りはHex(09)となってますので」
と言われた意味がようやくわかりました。
Hex(09)=\tということなんですね。
勉強になりました。
0295nobodyさん
2005/09/04(日) 04:45:50ID:???えーと、まぁ正確には
hex 関数は 「16進数 → 10進数 変換」する関数
(例: print hex('0a'); # 10 と表示される)
なので今回の例では hex は使えず。
代わりに、「10進数 → バイナリ 変換」 できる chr 関数、pack 関数、\x?? の表記
あたりのいずれかを使えばOKということです。
(例: print chr(9); # tab文字が表示される)
今回の例だと、
・$v1 . chr(0x09) . $v2
・"$v1\x09$v2"
・$v1 . "\t" . $v2
・"$v1\t$v2"
辺りでもOK。
0296nobodyさん
2005/09/04(日) 08:02:46ID:???0297nobodyさん
2005/09/04(日) 12:20:52ID:???ありがとうございます
見たところ単純にリストと照合してるだけのようですが
そのリストをどうやって作ってるのかがなぞですね
0298nobodyさん
2005/09/04(日) 13:47:14ID:???勉強になるお話、ありがとうございます。
なぜ指示した人は「Hex(09)で」といったのでしょうかね。
「\x09で」と自然に結び付けていったつもりだったのでしょうか。
言い方は間違ってないかと思いますが、少しおかしいとも思いました。
というか僕が混乱しているせいもありますが。。
素直に\tを使うことにします。
0299nobodyさん
2005/09/04(日) 13:58:15ID:???一般的に hex は 16進法の という意味で(語源の英語 hexadecimal がそういう意味)、
担当の人は 16進表記での09 というつもりで Hex(09) と書いたのかもしれないね。
でもまぁ、開発言語がPerlと限定されてるなら、hex と chr 関数を間違えた可能性も。
おれも普段はそこらへんは曖昧だしなぁ。
Perlでhex(09)で と指定されたら、あまり慣れてない人なら少々誤解してもある程度無理ない罠。
開発&上達ガンガレ。
0301nobodyさん
2005/09/04(日) 22:22:16ID:???そこで次のサブルーチンを作成してみました
[ $Trafic_Timeout ]秒間に [ $Trafic_min_limit ] バイト転送したら転送量エラーと封\示したいとしbト &TraficPlus(画像サイズ); って感じで呼び出したいと思っています。
全くスマートなプログラムではありませんが、これでいけると思ってやった見て、何度か改良しましたがうまくいきません。
どなたか改良又は知恵をかしていただけませんか?宜しくお願いします。
sub TracficPlus{
$plus = $_[0];
my $size;
&filelock('tr.lock');
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $nowtime=time;
open(IN,"time.trafick");$mtime = <IN>; close(IN);
open(IN,"now.trafick");$total = <IN>;close(IN);
$time = $nowtime - $mtime ;
if($time > $Trafic_Timeout){
$total = 0;
open(IN,">time.trafick");print IN $nowtime; close(IN);
}
$total += $plus ;
open(IN,">now.trafick");print IN $total;close(IN);
open(IN,"total.trafick");$ttt = <IN>;close(IN);
$ttt += $plus;
open(IN,">total.trafick");print IN $ttt;close(IN);
&fileunlock('tr.lock');
if($total > $Trafic_min_limit){&Error($Limit);}
return $size;
}
(http://pc8.2ch.net/test/read.cgi/tech/1121804136/658 からのスレ違いとのことでこちらにマルチっぽくなってしまっていますが宜しくお願いします。)
0302nobodyさん
2005/09/04(日) 22:52:45ID:???とりあえずすぐに気づくのは、$size に値が代入されずに return されてることだなぁ。
1. 各 .trafick ファイルの役割
2. どういうふうに うまくいかないのか
を書いてもらえれば、アドバイスしやすいかも。
0303nobodyさん
2005/09/04(日) 22:57:53ID:???トラフィックの綴りはtraffic
0304nobodyさん
2005/09/04(日) 23:10:18ID:???真剣に綴りミスしてました。忠告サンキューです。
>>302
えと、今もう一度プログラム書き直しているので>>301の物はおいとかしてください。
今やろうとしているのは、 n 秒間に m バイトのデータが転送されたら n 秒経過するまで転送量エラー画面で止めておくプログラムを組みたいと思っています。
0305304
2005/09/05(月) 00:04:16ID:???この状態で、$Trafic_min_limitの値を0にして、実行しても記録はされているもののエラーには飛びませんでした。
各行で何をやろうとしているのかは注釈を入れておきました。宜しくお願いいたします。
sub TrafficPlus{
$plus = $_[0];
$Trafic_min_limit = 202400;
$Trafic_Timeout = 60;
my $Traffic_now = 'traffic.now.hidden'; #現在の転送量保存
my $Traffic_total = 'traffic.total.hidden'; #全体の転送量保存
my $Traffic_time = 'traffic.time.hidden' #現在の転送量を保存したときの時間
my $nowTime=time; #現在の時間
&filelock('tr.lock');
$ntraffic = `cat $Traffic_now`; #現在の転送量取得
$straffic = `cat $Traffic_time`; #保存したときの時間を取得
$ptime = $nowTime - $straffic; #現在の時間と保存したときの時間差取得
if($ptime > $Trafic_Timeout){$ntraffic = 0;} #指定時間を超えていた場合リセット
$ntraffic += $plus; $straffic += $plus; #現在の転送量に新たな転送量を加える
#現在の転送量をファイルに記録する
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowtime' > $Traffic_time`;
&fileunlock('tr.lock');
if($Traffic_now > $Trafic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
■ このスレッドは過去ログ倉庫に格納されています