![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
スパイダーの動作で、ネットが重たくなりがちな時間帯には動作を遠慮しようと思っています。
その場合、下記のように書けば動作するとは思いますが、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パターンで考える必要があり更にミスが増えるのではないかと思い質問した感じです。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?e8efa67)
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で質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- 英語 提示した名言の文の構造について(waste one hour of time) 5 2023/05/20 15:22
- 英語 約1時間の表現 2 2022/11/22 22:32
- 電子レンジ・オーブン・トースター 電子レンジの非科学的(カルト的)動作の原因について考えられる理由を知りたい 8 2022/11/29 14:47
- 英語 中3の英語についてです。 have been 〜ing (現在完了進行形)の使い道がよくわかりません 8 2022/06/08 18:02
- 英語 提示した名言の解説について(unless節) 3 2022/12/15 10:30
- 英語 英語について 名詞に数量詞がついた場合も 目的語になりうるのでしょうか? I saw some st 2 2023/02/18 23:06
- 物理学 時間を語るなら、(複数の時間の正体)を知る必要が有る。 1 2023/02/16 22:14
- オープンソース Pythonのコードをexe化 1 2023/07/03 08:01
- 英語 英語で「1年半」と言いたい時、「a year and a half/one and a half y 2 2023/07/28 00:52
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別フォームから戻ったときのイ...
-
「Cancel = True」とはどういう...
-
VBAでIEの「Web ページからのメ...
-
VB6にて、バックグラウンド処理...
-
マイページはどこを開くの
-
ウインドウを毎回同じ位置、大...
-
デジタル時計の時刻合わせの方...
-
スクリプトって、何ですか?ど...
-
VBAで任意のウインドウのサイズ...
-
エクセルのシート上に別のシー...
-
リストビューをスクロールさせ...
-
小さな表示窓の呼び方は
-
PL/Iについて、教えてください。
-
Visual Basicから Spreadのスク...
-
子ウィンドウより親ウィンドウ...
-
Excelでワードアートや図を常に...
-
Excel VBAでの右クリックのポッ...
-
5ちゃんねる
-
PDFを(htmlのように)無限に縦...
-
表示するウィンドウのサイズを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「Cancel = True」とはどういう...
-
別フォームから戻ったときのイ...
-
VB2005 DataGridView上でクリッ...
-
VBAでIEの「Web ページからのメ...
-
excelのタスクバーアイコンが・...
-
Perlで数値(小数点、負の数、...
-
ASP DB検索結果の件数を事前表示
-
【ImageMagick】 PDF → JPG 変...
-
【C#】ラベルのダブルクリック...
-
リンクをクリックしたのと同じ...
-
VB6.0のEnabledをfalseにしても...
-
エクセル アプリケーションの...
-
Perl, Ruby, Pythonどれを使え...
-
左シングルクリックと左ダブル...
-
MSFlexGrid
-
実行中のOSを知るには?
-
C# マウスオーバーの記述方法
-
VBAにてjavascriptを起動したい
-
バナーに影
-
テータベースのページ処理
おすすめ情報