電子書籍の厳選無料作品が豊富!

スパイダーの動作で、ネットが重たくなりがちな時間帯には動作を遠慮しようと思っています。
その場合、下記のように書けば動作するとは思いますが、unlessと&&を使うと可読性というか意味を理解するのに時間がかかる気がします。もっと良い書き方はないものでしょうか?
アドバイスいただけると幸いです。

for(;;){
for(;;){
my ( $sec, $min, $hour, $mday, $mon, $year, $wno ) = localtime(time);
unless ( $hour >= 19 && $hour <= 23 ){
last;
}
sleep 1;
}
#スパイダーの動作
}

A 回答 (3件)

判定が複雑になるなら、 「判定して、実行可能時間なら1(true),そうでないなら0(false)を返す関数」を作るのがスマートで

はないかと
    • good
    • 0

コーディグスタイルの領域になるかと思いますが



・unless がわかりずらい、ということで、使わない、という流儀があります。
特にelseに相当する処理がある場合
 条件が成立しなかったらthen(相当)を実行
 「条件が成立していない」**ではない**なら、else(相当)を実行
と、「二重否定」になるため、とてもわかりずらくなります。

・処理や判定の量や質によりますが、

for(〜) {
 除外条件が成立したらlast や next 等のジャンプ
 ループ処理
}

という書き方が見易いことがありますが

for(〜) {
 if (ループ処理する条件 ) {
  ループ処理
 } else {
  そうでない処理
 }
}

とした方が、ループの意図がはっきりします。

for(〜) {
 if (ループ処理しない条件 ) {
  そうでない処理
 } else {
  ループ処理
 }
}

でも、意図がわかりやすいでしょう。

・ $hour >= 19 && $hour <= 23
のような条件は、数学で使われる
 19 ≦ h ≦ 23
と書きたいところですよね?
Perlではそれは叶いませんが
 19 <= $hour && $hour <= 23
と <= の方向を揃えると、近い雰囲気になる上、 $hour が近くに並ぶので、同じ変数に対する条件だ、ということがわかりやすくなります。

------
for(;;){
my ( $sec, $min, $hour, $mday, $mon, $year, $wno ) = localtime(time);
unless ( $hour >= 19 && $hour <= 23 ){
last;
}
sleep 1;
}

これは、言葉にすれば
「19:00〜23:59でなければループ終了して後の処理をする、『19:00〜23:59ではない』でないならループ続行する」
となります。
&& がわかりずらいというよりは、やはり、 unless と二重否定の構造がわかりずらいのでしょう。

このforループで意図しているのは
「19:00〜23:59なら、次へ移行せずにループを続ける」
ということでしょう。

ならば、中の判定も
「19:00〜23:59ならループ続行する。そうでなければループ終了して後の処理をする」
とした方が意図がはっきりするのでは?


さらに言えば、この二重forループ構造自体が無駄で
for(;;){
 if ( 実行可能時刻ならば ) {
  #スパイダー実行
 } else {
  sleep 1 ;
 }
}
でいいかと。
それこそ「決めた時刻のときだけ実行する」という意図がわかりやすいのでは
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。

>unless がわかりずらい、ということで、使わない、という流儀があります。
趣味で書いているだけですので意味を逆にしたい時に多用していました。
二重否定、確かに言われてみると分かりづらいですね。

最後の方法が実は私も好きなのですが、19-23までという感じで境界線を考える必要が無く考えやすかった問題が(実はそれでも間違えたのですが)、0-19、23-と2パターンで考える必要があり更にミスが増えるのではないかと思い質問した感じです。

お礼日時:2017/04/30 10:03

19時から23時までスリープということは、


23時10分はスリープしないとしました。
であれば、
unless ( $hour >= 19 && $hour <= 22 ){
になるかと。

又は
if ($hour < 19 || $hour >=23 ) {
last;
}
のどちらかでしょう。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
境界線問題、どうも苦手なようです。普通に間違えていました。訂正ありがとうございます。
二番面の回答については確かにその通りなのですが、19-23までという感じで考えやすかった問題が、0-19、23- と2つのパターンで考える必要があり、もう少し簡単にできればと思っています。

お礼日時:2017/04/30 09:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!