POEのComponent::Server::HTTPを使ってリアルタイム更新にゃコアを作ってみようとしてたら、どうも挙動が変。
各コネクションで@Globalにpushしたりshiftしたりすると、全配列がforで回ってこにゃい。つまり
foreach ( @ARRAY ){
$var = shift(@ARRAY);
print $var;
}
を各所に挟むと、場所によって@ARRAYの内容が全て列挙されず、前半分くらいしかprintされにゃい。あ、shiftだと実際には変更されちゃうけども。
@ARRAYにはきちんと値が入っており、
print @ARRAY;
すると全部表示される。大して試してにゃいがforとforeachがだめっぽい。
で、
while( $var = shift(@ARRAY) ){
print $var;
}
にすると全部列挙されたので一応これで行こうかって状態だが、原因が分からんのはきつい。配列でforが信用にゃらんてどうすれば・・・
まーたぶんPOEの非同期動作が多重に動いてるから何かやばいことやっちゃってるんだろうけど。
追記:
foreachもたぶん for(i = 0;i < @ARRAY.length ;i ++){ 的動作してるからshift毎に.lengthが減って半分ほどでループ終了するんじゃね、というツッコミが(笑)
にゃるほど! foreachがwhile($_ = shift @ARRAY_copy){ 的動作だと勝手に思ってた(笑)