
スパイダーの動作で、ネットが重たくなりがちな時間帯には動作を遠慮しようと思っています。
その場合、下記のように書けば動作するとは思いますが、unlessと&&を使うと可読性というか意味を理解するのに時間がかかる気がします。もっと良い書き方はないものでしょうか?
アドバイスいただけると幸いです。
for(;;){
for(;;){
my ( $sec, $min, $hour, $mday, $mon, $year, $wno ) = localtime(time);
unless ( $hour >= 19 && $hour <= 23 ){
last;
}
sleep 1;
}
#スパイダーの動作
}
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
コーディグスタイルの領域になるかと思いますが
・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 ;
}
}
でいいかと。
それこそ「決めた時刻のときだけ実行する」という意図がわかりやすいのでは
回答いただきありがとうございます。
>unless がわかりずらい、ということで、使わない、という流儀があります。
趣味で書いているだけですので意味を逆にしたい時に多用していました。
二重否定、確かに言われてみると分かりづらいですね。
最後の方法が実は私も好きなのですが、19-23までという感じで境界線を考える必要が無く考えやすかった問題が(実はそれでも間違えたのですが)、0-19、23-と2パターンで考える必要があり更にミスが増えるのではないかと思い質問した感じです。

No.1
- 回答日時:
19時から23時までスリープということは、
23時10分はスリープしないとしました。
であれば、
unless ( $hour >= 19 && $hour <= 22 ){
になるかと。
又は
if ($hour < 19 || $hour >=23 ) {
last;
}
のどちらかでしょう。
回答いただきありがとうございます。
境界線問題、どうも苦手なようです。普通に間違えていました。訂正ありがとうございます。
二番面の回答については確かにその通りなのですが、19-23までという感じで考えやすかった問題が、0-19、23- と2つのパターンで考える必要があり、もう少し簡単にできればと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
処理終了後のに砂時計が、クリ...
-
デジタル時計の時刻合わせの方...
-
マイページはどこを開くの
-
[Java] Edgeでのアドレスバー非...
-
Youtubeのバグ
-
Outlookでこのような表示がされ...
-
パソコンを起動させたら文字の...
-
スクリプトって、何ですか?ど...
-
リンク時、親ウインドウを最前...
-
Outlookのエラー表示について
-
小さな表示窓の呼び方は
-
サブウィンドウを常に最前面に...
-
LINEのポップアップの順番を教...
-
Javascript_submit()完了後に処...
-
MFCを使って、ひとつのkey(CStr...
-
スライドショーを全画面でなく...
-
Edge Chrom などの超初心者質問...
-
文章の自動スクロール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
同一の検索値が複数存在する場...
-
excelのタスクバーアイコンが・...
-
処理終了後のに砂時計が、クリ...
-
VBAでグーグルにインデック...
-
VBAでIEの「Web ページからのメ...
-
エクセル アプリケーションの...
-
VC++2010 エディットボックスに...
-
C++での連続した左クリックの禁...
-
時間のかかる処理中にメッセー...
-
ASP DB検索結果の件数を事前表示
-
vba IE操作で こういう事って...
-
Sleep関数の最大時間について
-
マウスオーバー時に効果音を鳴らす
-
cgiを使用して時間制限
-
Perlで数値(小数点、負の数、...
-
【C#】ラベルのダブルクリック...
-
VB6にて、バックグラウンド処理...
おすすめ情報