Perlコーディング初心者質問スレ Part 43
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/08/12(金) 01:26:47ID:mHnZWvqz【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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);
}
0306nobodyさん
2005/09/05(月) 00:12:17ID:???\0
というのは何を表しているのでしょうか?
ぐぐって見たのですが、見つかりませんでした。
(あまりにも単純すぎて、検索するのが意外と難しい)
0308nobodyさん
2005/09/05(月) 00:19:28ID:???0310304
2005/09/05(月) 00:24:11ID:???日転送量が3GBぐらい行ってるらしくて。普通の鯖なら蹴られて当然な数値ってことはすぐ分かりました。
まだ許してくれてるので早急に対応したいなと。とりあえず今は画像の表示にsleepで時間差を付けて耐えております。
0311nobodyさん
2005/09/05(月) 00:39:15ID:???とりあえず最後のif文で、$Traffic_now(ファイル名)と
$Traffic_min_limit(バイト数)を比較してるのはおかしいだろ。
$ntrafficじゃないのか?
あと$ntrafficがリセットされるのが、リクエスト間が$Traffic_Timeout秒
あいたときだけなんだが、これはそういう仕様なのか? $Traffic_Timeout秒
以下の間隔でリクエストが来続けるといったん制限かかったらかかりっぱなし
になりそうだが。
0312nobodyさん
2005/09/05(月) 00:55:25ID:???すっゲー間違いしてました。サンキューです。
修正してみましたがまだ正しく動かないっす・・・。
とりあえずできるまで粘ってみます。
0313nobodyさん
2005/09/05(月) 01:20:29ID:???>>311が書いてるけど、各秒ごとの転送量を保存しないと、
指定時間内の転送量が出せないね。
↓文法チェックもしてないけど。ファイルロック処理等も無し。
0314nobodyさん
2005/09/05(月) 01:21:54ID:???my $plus = shift; # 増加量
my $Trafic_min_limit = 202400;
my $Trafic_Timeout = 60;
my $now = time; # 現在時刻
my %traffic; # 転送量
# ファイルから転送量情報を読み込む。
open(IN, 'traffic.dat');
my %in = split(/,/, <IN>);
close(IN);
for ( keys %in ) { # $Trafic_Timeout秒以前の情報を捨てる
$traffic{$_} = $in{$_} if ( $_ > $now - $Trafic_Timeout );
}
$traffic{$now} += $plus;
my $sum; # 指定時間内の転送量合計
for ( keys %traffic ) {
$sum += $traffic{$_};
}
# 転送量情報を保存。
open(OUT, '> traffic.dat');
print OUT join(',', %traffic);
close(OUT);
if ( $Trafic_min_limit > $sum ) {
TrafficError();
}
}
0315nobodyさん
2005/09/05(月) 06:55:48ID:???GDインストール解説サイトに5.8はまだPPMが使えないのでActivePerlは5.6をインストールするように書いてありました
その解説は2004年9月に書かれたものですが
現在も5.8ではPPMは使えないのでしょうか
0316nobodyさん
2005/09/05(月) 08:41:06ID:???rep add theoryx5 http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer58
としてから
search GD
で見つかると思う
0318304
2005/09/05(月) 11:26:42ID:???sub TrafficPlus{
$plus = $_[0];
#現在の転送量保存
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 > $Traffic_Timeout){$ntraffic = 0;$straffic = $noTime;}
#現在の転送量に新たな転送量を加える
$ntraffic += $plus;
$straffic += $plus;
#現在の転送量をファイルに記録する
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0319nobodyさん
2005/09/05(月) 11:34:24ID:???sub TrafficPlus{
$plus = $_[0];
$Traffic_min_limit = 500000;
$Traffic_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 > $Traffic_Timeout){
$ntraffic = 0;
$straffic = $noTime;
}
$ntraffic += $plus;
$straffic += $plus;
`echo '$ntraffic' > $Traffic_now`;
`echo '$straffic' > $Traffic_total`;
`echo '$nowTime' > $Traffic_time`;
&fileunlock('tr.lock');
if($ntraffic > $Traffic_min_limit){&TrafficError;}
return ($Traffic_now,$Traffic_total);
}
0320nobodyさん
2005/09/07(水) 13:59:48ID:oYntvDxu同時に書き込むような仕組みでなにかよい方法はございます
でしょうか。
この2サーバはロードバランサーで動作しております。
現在は各サーバに受け側CGIを設置(ファイル書き込みCGI)。
それぞれのサーバにアクセスがあった場合、SOCKET通信で
もう一方のサーバのCGIを叩く仕組みでファイルの同期を取って
いるのですが、アクセスが集中したりすると
「Resource temporarily unavailable」とエラーが出たりしてしまい、
多少怒られております。
何かよい案があればご教示いただけますでしょうか。
宜しくお願いいたします。
0321nobodyさん
2005/09/07(水) 20:41:36ID:3mQbsuSc<A href=http://a.jp/abc.cgi?menu=1>メール</A>
というリンクでabc.cgiへ移るとき、メニュー番号をmenu=1で渡すと同時に
<INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=$wk_id >でIDとパスワード
も渡すことはできないでしょうか?そもそもhiddenはフォームのボタン等
がクリックされた場合のみで、リンクの場合には渡せないのでしょうか?
リンクでID、パスワードを渡すとアドレスに表示されるので、できれば
hidden等が良いのですが。
よろしくお願い致します。
0322nobodyさん
2005/09/07(水) 20:50:01ID:???<A>のリンクでhrefにアドレスを設定するのではなく、
onClickでJavascriptのfunctionよんで、そこでsubmitさせる
0323nobodyさん
2005/09/07(水) 20:50:14ID:???CGIを動かしてる鯖以外に、ファイルサーバを導入する。しかないような…。
しかも、Resource temporarily unavailableのメッセージはhttpdが出してるやつでしょ?
単なるアクセス制限だからCGIのコーディングと関係ない。
0324nobodyさん
2005/09/07(水) 20:53:03ID:???JavaScript を使えばできますよ。
<a href="http://hoge/abc.cgi?menu=1" onclick=〜>
# onclick で呼ばれる関数で post メソッドで submit (CGI呼び出し)。
それか素直に、button にしておくか。この場合でも、
<form method=POST action="./abc.cgi?menu=1">
としておくと、URLには menu=1 が現れる。
上記いずれの場合でも、CGI側で menu と id の値を両方取得可。
# JavaScript と HTML の細部の記憶は曖昧なのでスペルミス等あれば悪しからず。
0325nobodyさん
2005/09/07(水) 23:53:10ID:???ご返答有難うございます。
アクセス制限ですか。
とくに認証等はかけてないのですが、接続数制限という意味でしょうか。
0326nobodyさん
2005/09/07(水) 23:59:39ID:???他で管理している鯖ですか?
認証は関係ありません。
制限自体は、その鯖の設定によりけりです。
単位時間あたりの接続数、ヒット数、転送量、など
いろいろな情報を元に制限をかけることが可能です。
制限がヒット数になっていて、そのページに画像が多い場合、
すべてヒットとカウントされて制限に引っかかることもあります。
0327nobodyさん
2005/09/08(木) 00:24:20ID:???あれ?ちょっと変じゃないですか??
ロードバランサ入れてるんですよね。
一方のCGIが叩かれた時に、もう一方のCGI叩いたらダメでしょ。
負荷分散してる意味が無いような…。
0328nobodyさん
2005/09/08(木) 01:46:08ID:???CGI側ではどうすることもできないんですね。
サーバの設定を見直してもらいます。
>>327
一部だけファイルを同期する必要があるので、この手法を
とりました。
0329nobodyさん
2005/09/08(木) 03:24:01ID:vnFPn7Ff2 => '2です',
6 => '6です',
'Y' => '12です'
);
このようなハッシュを
foreach my $key (sort { $a <=> $b || $a cmp $b } keys %test) {
print "$key\n";
}
こう並べ替えますと、なぜか
Y
2
6
になってしまいます。
2
6
Y
にしたいのですが、
ご教示いただけますと幸いです。
0331nobodyさん
2005/09/08(木) 04:24:19ID:???sort { $a cmp $b }
でいいんじゃね?
0332nobodyさん
2005/09/08(木) 04:27:51ID:???0333329
2005/09/08(木) 11:27:17ID:???実はこの部分、サブルーチン化していて使いまわして
いるので何かよい方法はないかと思っていたのですが、
$a <=> $b の数値比較のあとに $a cmp $bが評価されて
いないのではなく、$a <=> $bの時点でYが0になっていたの
ですね。
このルーチンは多くのところで使われておりますが、$a cmp $b
に統一するよう検討してみたいと思います。
本当に有難うございました。
0334nobodyさん
2005/09/08(木) 13:51:44ID:+KUBGHaQログをどうするか悩んでいます。
プレインテキストで数千件の登録を管理するのは可能でしょうか。
また不可能だとすればどういう方法があるでしょうか。
是非ご教示願います。
0337nobodyさん
2005/09/08(木) 19:09:08ID:vnFPn7Ffsub send_socket{
use Socket;
my ($host, $filename, $data) = @_;
my $path = "$filename?$data";
my $return_value;
my $port = getservbyname('http','tcp');
my $iaddr = inet_aton("$host") or return 0;
my $sock_addr = pack_sockaddr_in(80,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0) or return 0;
connect(SOCKET,$sock_addr) or return 0;
select(SOCKET);
$| = 1;
select(STDOUT);
print SOCKET "GET /$path HTTP/1.0\r\n\r\n";
while(<SOCKET>) {m/^\r\n$/ and last;}
while(<SOCKET>) {$return_value .= $_;}
close SOCKET;
return $return_value;
}
これで内容を取得するのと
sub send_socket{
my @wget_status = `/usr/bin/wget -q -O - "http://$host/$path"`;
foreach (@wget_status){ $return_value .= $_; }
return $return_value;
}
これで取得するのとでは同等という考えではございませんでしょうか。
ご教示いただけますと幸いです。
0338nobodyさん
2005/09/08(木) 19:32:32ID:???単に負荷と言われても、どこに注目するかによって違うので、一概には比べられない。
上のは、スクリプトの部分が多い。
下のは、プロセスをforkしてる。
0339nobodyさん
2005/09/08(木) 20:26:41ID:???100アクセス/secくらいのキャンペーンサイトで後者を使用
するのですが、非常に不安で胃がいかれそうです。。
何かアドバイス等ございましたら何でもよいのでいただけ
ますと幸いです。
0340nobodyさん
2005/09/08(木) 21:12:24ID:???コケそうな感じですね…。
どうしても後者なら、キャンペーン中だけでも
鯖で起動できるプロセス数を引き上げておかないと…。
0341nobodyさん
2005/09/08(木) 21:29:41ID:???前者だったらいけそうなのでしょうか。
まだ半日くらい猶予があるので、違いがあるのであれば
前者を検討してみたいと思います。
アドバイスいただけますと幸いです。
0342nobodyさん
2005/09/08(木) 21:51:45ID:???偉い人に聞いてみたところ、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」といわれたのですが、一体Perlで
どのようにしてこのような通信ができるのかが全く思い浮かびません。
これ以上何も教えてくれそうもないので調べてみたのですが、これといった
答えも見つからず呆然としております。
2台は同ネットワーク上にあるものです。
ご教示いただけますと非常に助かります。
0343nobodyさん
2005/09/09(金) 00:20:57ID:???$BB = 10;
$CC= '$AA' . "$BB" . "[0]";
$CC を表示させると $AA10[0] となってしまいます。
どうしたら $BB などの文字を変えずに「0」と表示できるのでしょうか?
よろしくお願い致します。
0346nobodyさん
2005/09/09(金) 01:35:56ID:DzBAr2beタグ内部まで変換されてしまって困っています。
<font size="7"> ほげほげ </font>
$text =~ s/ / /g;をすると
<font size="7"> ほげほげ </font>
~~~~~~~
になってしまいます。
タグ内部を除いた部分だけを置換するにはどうしたらいいでしょうか?
0347nobodyさん
2005/09/09(金) 01:41:53ID:???正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0348329
2005/09/09(金) 04:28:01ID:???たしかに
%test = (
2 => '2です',
6 => '6です',
'Y' => '12です'
);
は
foreach my $key (sort {$a cmp $b} keys %test) {
print "$key\n";
}
で
2
6
Y
こうなりましたが、たとえばキーに10や100といった数字が入っていると、
一番上にきてしまいます。
数字順>英数字という優先順位で並び替えるにはどうしたらよいのでしょうか。
0349nobodyさん
2005/09/09(金) 06:19:11ID:???if ($a =~ /[^0-9]/ && $b =~ /[^0-9]/) {
$a cmp $b;
} elsif ($a !~ /[^0-9]/ && $b !~ /[^0-9]/) {
$a <=> $b;
} elsif ($a =~ /[^0-9]/ && $b !~ /[^0-9]/) {
1;
} elsif ($a !~ /[^0-9]/ && $b =~ /[^0-9]/) {
-1;
}
}
foreach my $key (sort sortfunc %test) {
print "$key\n";
}
まあもっといい方法あるかな?
0350349
2005/09/09(金) 06:28:21ID:???0351nobodyさん
2005/09/09(金) 06:44:26ID:???print map { "$_\n" } sort {
$a !~ /^\d+$/ <=> $b !~ /\d+$/ ||
$a <=> $b ||
$a cmp $b
} keys %test;
0352nobodyさん
2005/09/09(金) 08:09:10ID:???print map "$_\n",
sort {
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
} keys %test;
>>348 のケースだと四行目は単に $a cmp $b; でもヨシだけれど、1 と -1 を交換すると逆のニーズにも対応できるという噂。
0353nobodyさん
2005/09/09(金) 11:49:05ID:???半日っていうともう猶予は過ぎてるかも知れないけど、>>338は
Perl始めたばかりのド素人のようだから無視するように。
mod_perlを使っていないのなら下の案はwgetを子プロセスとして起動する分、
サーバー負荷は無条件に高い。
単純計算で1アクセスにつき無条件にperlとwgetで計2プロセスが起動される
ことになる。wgetの中で上のコードと同じようなことをやっているのだから、
上の案のほうが負荷は半分になると考えていいだろう。
しかしそんなにアクセス数が見込まれるサイトがHTTP経由でデータ取得を行う
なんていうアホな設計になっているところが信じられん。
0354348
2005/09/09(金) 11:50:39ID:???本当に有難うございます。
とりあえず一旦
foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}
sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}
こんな感じで後で試してみようかと思います。
結果は追ってご連絡いたします。
0355nobodyさん
2005/09/09(金) 12:06:18ID:???有難うございます。
あれから実はソケット通信をやってみたのですが、エラーが出てしまったんです。
Object not found!
The requested URL was not found on this server.
If you entered the URL manually please check your
spelling and try again.
If you think this is a server error, please contact
the <a href="mailto:webmaster@localhost">webmaster</a>.
Error 404
localhost.localdomain
それで偉い人に聞いてみたら、「uname -nで分かるノード名を使って通信して、
2台のサーバのファイルの同期を取れ」とか言われたのですが、これがさっぱり
わからず、もうどうにでもなれといった感じでオープンが近づいております。。
ノードを名取った後どのような処理をすればよいのか、もしもご存知のようでしたら
ご教示いただきたく思っております。
0356nobodyさん
2005/09/09(金) 15:06:48ID:???なんか予想の斜め上をいく展開だな。
とりあえずその偉い人に
同一セグメントのサーバ同士のファイルの同期をとるのが目的なら
いっそのことNFSかsambaかWebDAVでディレクトリを共有したらどうですか?
と進言してみたら?
リアルタイム性を要求されないのならrsyncとかも使える。
0358nobodyさん
2005/09/09(金) 17:56:17ID:???数じゃない文字列を <=> で比較すると use warnings 下では
Argument 〜 isn't numeric in numeric comparison (<=>) at 〜
が出ることをいってるんじゃないだろうか。
0359nobodyさん
2005/09/09(金) 18:18:45ID:???NFS等の導入は一番初めに提案させていただきましたが、
上から許可がおりないとか何とかであっさり却下されました。。
もうどうしたらよいのやら。。
0361nobodyさん
2005/09/09(金) 20:40:27ID:???プロジェクト全体が腐ってるっぽいな。
404になる件はノード名を/etc/hostsに登録すれば
なんとかなるだろうが…
0362nobodyさん
2005/09/10(土) 10:54:03ID:???ヘッポコ上司に連座させられたくなかったら、
ちゃんとしたプロマネつれてこないとポシャルと、
上司を飛び越してその上の上司に進言しなさい。
>>361
> 404になる件はノード名を/etc/hostsに登録すれば
> なんとかなるだろうが…
ならない。
0363nobodyさん
2005/09/10(土) 11:15:29ID:???open(LOG,"$logfile");
$count += tr/\n// while(read LOG, $_, 1024);
close(LOG);
どうしてこれで$logfileの長さをカウントできるのか教えてください。
3行目のtr/\n// while(read LOG, $_, 1024);がよく分かりません。
0364nobodyさん
2005/09/10(土) 11:15:52ID:???0365nobodyさん
2005/09/10(土) 11:19:09ID:???ファイルのサイズではなく、行数をカウントしてるのでは。
ちなみに
open(LOG, $logfile);
の方が良いと思います。余計な変数展開がなくなります。
0366363
2005/09/10(土) 11:22:57ID:???行数でした。
C言語しか知らないもので、while(条件){実行する内容}
という形式は理解できるのですが、perlではwhile文はどのように展開されるのでしょうか?
0367nobodyさん
2005/09/10(土) 11:34:44ID:???while を後置しているだけです。スクリプティング言語では多く見られます。
以下と同じ意味です。
while (read(LOG, $_, 1024)) {
$count+= tr/\n//; # trは置換に成功した数を返す。
}
0371nobodyさん
2005/09/10(土) 15:15:07ID:???0372名無しさん@そうだ選挙に行こう
2005/09/11(日) 16:20:19ID:yhvSpEP/サーバー1: Fedora Core release 3, Kernel 2.6.9-1.667, Perl version 5.8.5
サーバー2: FreeBSD 5.4-STABLE, Perl v5.8.2
どうすればよろしいでしょうか?
sub SHA {
### &SHA("squeamish ossifrage\n");
### Should return 82055066 4cf29679 2b38d164 7a4d8c0e 1966af57
local ($temp, $m, @A, @K, $x, $n);
local ($b, $c, $d, $e, $S, $r, @W, $t, $v);
my ($msg, $p, $l) = @_; #$p=0; $l=0
my $inputp=$_[0];
local $_;
$temp = 'D9T4C`>_-JXF8NMS^$#)4=L/2X?!:@GF9;MGKH8\;O-S*8L\'6';
$m = 4294967296;
###$m=1+~0;
@A=unpack"N*",unpack "u",$temp;
@K=splice@A,5,4;
sub M{($x=pop)-($m)*int$x/$m};
sub L{$n=pop;($x=pop)<<$n|2**$n-1&$x>>32-$n}
@F=(sub{$b&($c^$d)^$d},$S=sub{$b^$c^$d},sub{($b|$c)&$d|$b&$c},$S);
do{
$msg=~s/.{0,64}//s;$_=$&;
$l+=$r=length;
$r++,$_.="\x80"if$r<64&&!$p++;@W=unpack N16,$_."\0"x7;$W[15]=$l*8
if$r<57; for(16..79){push@W,L$W[$_
-3]^$W[$_-8]^$W[$_-14]^$W[$_-16],1}($a,$b,$c,$d,$e)=@A;
for(0..79){$t=M&{$F[$_/ 20]}+$e+$W[$_]+$K[$_/20]+L$a,5; $e=$d; $d=$c;
$c=L$b,30; $b=$a; $a=$t}$v='a'; @A=map{ M$_+${$v++}}@A
}while$r>56;
return sprintf'%8x'x4 . '%8x',@A;
}
0373348
2005/09/11(日) 16:54:25ID:???foreach my $key (sort k::sort_rule keys %$refs) {
print $key;
}
sub sort_rule{
return $b =~ /^\d+$/ ? $a <=> $b : -1 if $a =~ /^\d+$/;
return $b !~ /^\d+$/ ? $a cmp $b : 1;
}
これでいきました!本当に有難うございました!
まだまだ技術レベルが低いので意味がわかってないのですが、
これから勉強してこの構文を十分理解できるようになりたいと
思います。
ご教示、誠に有難うございました。
0374名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:02:31ID:moSzhZBr説明を読むと、デフォルトの変数として、省略されている場合も
自動的に代入や出力されている特殊変数とあるのですが、たとえば
if ($_[0] eq 'bye') {
いきなりこんなのが出てきた場合、一体何をしてるんでしょうか。
自動的に配列を作って、0に何かが代入されている?
うかがうのに妥当なスレがないようだったので、こちらで尋ねました
よろしくお願いします。
0375名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:05:32ID:???サブルーチンの第一引数とか
0376名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:07:43ID:???0377名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:12:45ID:???@hoge = (1 ,2, 3);
↓
$hoge[0] == 1
@_ = (1 ,2, 3);
↓
$_[0] == 1
ok?
0378374
2005/09/11(日) 23:22:07ID:???レスありがとうございます。
>377の例、わかりやすかったです
特に個別に名前はつけてないけどこーゆー配列(変数)だよ、っていう事なんでしょうか。
もしかしてすごくアホな事聞いてるかもしれないんですが、さっきの
if ($_[0] eq 'bye')
コレ、いきなり出てきたんです。>377で言う@_ = (1 ,2, 3); みたいなのがなくて。
@_ = (1 ,2, 3); がないのに、一体何と比較してるんだろう???となってしまったんですが…
0379名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:29:33ID:???サブルーチンの引数は、勝手に @_ に入ります。
というか、基本なんだからマニュアルか、本を読もうよ…。
0380374
2005/09/11(日) 23:37:29ID:???すみません。実は本読んでもよくわかりませんでした。
もうちょいスクリプトいじってみて、悩んでみます…
0381名無しさん@そうだ選挙に行こう
2005/09/11(日) 23:41:56ID:???その本、巻末に索引付いてませんか?
そこで、$_ と @_ を探しましょう。
■ このスレッドは過去ログ倉庫に格納されています