[過去ログ] Perlについての質問箱 64箱目 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
808: 2020/12/05(土)16:43 ID:dBHdheKW(1) AAS
>>805
おかしいな。それで合ってるように思えるんだが。
この辺りを読んで、何か誤解してないか確認したらいいかも。
外部リンク[pod]:perldoc.jp
809: 806 2020/12/05(土)18:18 ID:3OUqO/Qz(2/2) AAS
「perl 時刻 計算」で検索すれば?
日付・時刻を扱う標準モジュール、Time::Piece が標準で添付されています。
もっと便利なモジュールを、誰かが作っているかも
810: 2020/12/05(土)18:31 ID:+/FrBp4K(2/2) AAS
localtimeからスタートする時はそれが便利
何か基準の日付から計算しようとすると面倒になる
811(1): 2020/12/05(土)20:29 ID:5ARiBM7n(1) AAS
>>805
数式自体にエラーがあるんやろ。w
じゃなきゃエラーをはれ。
812(1): 2020/12/05(土)23:54 ID:DP7JjxAq(2/2) AAS
>>811
print <<"eos";
@{[print "aaawww";]}
eos
これでエラーだった
813(1): 2020/12/06(日)00:14 ID:GZ1arJtc(1/2) AAS
>>812
だからエラーの文面をはれっつーの。
でも、わかった。
「[]」の内側に書けるのは、式のリスト。
最後に「;」を書くのは、「式」でなく「文」というか。
しかし、それだとうまくいっても「aaawww1」と表示される気がするが、どうなの?w
814(1): 532 2020/12/06(日)00:15 ID:1Uj+ZrCS(1) AAS
print <<"eos";
@{[print "aaawww"]}
eos
$ perl aaawww.pl
aaawww1
;を省くと動くが、「1」とか余計なものがつくな
815: 2020/12/06(日)00:43 ID:Znd8Qdfl(1) AAS
>>813
CGI 実行エラー syntax error at test.cgi line 10, near ""aaawww";"
Execution of test.cgi aborted due to compilation errors.
816: 2020/12/06(日)01:06 ID:rqNKNacS(1) AAS
単なる構文エラー
無名リストの中に裸のセミコロンがあったらまずいでしょ
["A", "B", 3, ";"] OK
["A", "B", 3, ;] エラー
余計な1じゃなくてprint関数の返り値
printが成功したので真(1)を返して無名リストの要素になった
printで"aaawww"が表示された後デリファレンスされて展開された1がヒアドキュメントで表示される
817: 2020/12/06(日)01:06 ID:GZ1arJtc(2/2) AAS
>>814
仕様どおり。w
記述したとおりに正しく動作しているな。
818: 2020/12/06(日)01:19 ID:d/9HsImJ(1) AAS
>>802
今更だけど日付をエポック秒で表して日数×24*60*60を足すんじゃだめ?
車輪の再発明というかただの製作を承知で、自分で日付変換の関数を一通り作ったらそれで十分だった
便利そうなライブラリを探そうとしたこともあるけど、オブジェクト指向的なやつだと結局その
オブジェクトを介した変換が頻出することになってスラスラ書けないなあと思ったのです。
もし今後UTCとかJSTとか出てきたときはそのときまた考える。
819: 2020/12/06(日)02:06 ID:fHRDTQ7E(1) AAS
PerlのYAML関連のモジュールが全部重くて厳しい
高速なYAMLモジュールはないのか?
820: 2020/12/06(日)10:37 ID:kLx/M/5Z(1) AAS
まずは高速なCのライブラリを見つけます
821(1): 2020/12/06(日)11:42 ID:BlX3SIQO(1) AAS
>>803 だが、>>802 の質問は>>803 で終わったと思ったのだが、不親切だった?
例えば2019年12月1日から365日後の日付は、次のようにすれば得られる。
use Time::Local;
$year=2019;$mon=12;$mday=1;$hours=12;$min=0;$sec=0;
$intvl=365;
$basetime = timelocal($sec, $min, $hours, $mday, $mon-1, $year-1900);
$basetime += $intvl*24*60*60;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime($basetime);
$mon+=1;$year+=1900;
print STDERR "$year.$mon.$mday\n";
822: (ワッチョイ be3b-cfMa) 2020/12/06(日)11:58 ID:5Rf1GOX10(1) AAS
見るからに面倒臭い
823: 2020/12/07(月)09:18 ID:zfvnE2zk(1) AAS
$basetime = timelocal_nocheck($sec, $min, $hours, $mday+$intvl, $mon-1, $year-1900);
824: 2020/12/07(月)09:43 ID:UAiCPmDo(1/3) AAS
Time::Piece はよくできてて、何かのログとかに現在時刻を書き出す、
とかの用途には十分に使える
でも、時刻計算や日数計算はあまり考慮されていない
現在時刻からの計算はできても、任意の時刻からだと弱い
825: 2020/12/07(月)14:03 ID:tC78i6pr(1) AAS
>>807
use Time::Piece;
use Time::Seconds;
my $day = Time::Piece->strptime('2020-12-05', '%Y-%m-%d');
$day += ONE_DAY * 100;
print $day->date, "\n";
print $day->year, "\n";
print $day->mon, "\n";
print $day->mday, "\n";
826(1): 2020/12/07(月)14:21 ID:UAiCPmDo(2/3) AAS
まあ、strptime さえ目を瞑れば
こんなもん、何か見ないと書けない
827: 2020/12/07(月)15:40 ID:15jj6qfl(1) AAS
use POSIX; を宣言してCの標準関数に似た時刻処理機能を使うのが普通じゃないの?
Cの時刻処理サンプルコードを円滑にPerlに移植できるよ。
828: 2020/12/07(月)17:17 ID:VC6/tHTg(1) AAS
>>826
DateTimeモジュール使えば全て解決なんだが
クソデカくて重いという弱点が
829: 532 2020/12/07(月)21:57 ID:WG5ppFXF(1) AAS
Time::Pieceの弱点は
strptime()で作ったインスタンスのtimeゾーンをいじれないとこかな?
後1つなんか弱手あった気がするが忘れた
830: 2020/12/07(月)22:38 ID:UAiCPmDo(3/3) AAS
strptimeはpythonでもrubyでも同じだから、もう慣れなんだろうな
'YYYY-MM-DD' とかではあかんかったのか
831: 2020/12/08(火)04:35 ID:65P2yCaW(1/2) AAS
>>821
timeLocal()の年は1900引かない方がいいよ。これちょっとCのライブラリとは違うんだよ。詳しくはドキュメント読んで。
832: 2020/12/08(火)04:36 ID:65P2yCaW(2/2) AAS
あ。タイプミス。timelocal()ね。
833(5): 2020/12/08(火)23:53 ID:VS4VHEi1(1) AAS
すみません、ソートで教えて欲しいんですが下記のようにみたいな枝番号が付いてる文字列をハッシュのキーとして
ハイフン前の数値でソートした後にハイフン後の数値でソートしたいのですが
普通に$a <=> $bだとハイフンの後の値がバラバラになって上手くいきません
キーを作る際に別々に作ってループ増やすくらいしか自分には解決方法が無いのですが、スマートに出来る方法は無いのでしょうか?
1-1
1-2
2-1
2-2
3-1
834(1): 2020/12/09(水)00:31 ID:LWKBPFtb(1/7) AAS
>>833
シュワルツ変換で検索!
たとえば :
mapでソート用の値として、前の数字×10000+後ろの数字の値をつくって、それともとの値のペアにする。
それを<=>でソートする。
mapで、ソート結果からもとのデータ部分を取り出す。
835: 2020/12/09(水)00:39 ID:LWKBPFtb(2/7) AAS
要は、map{...} sort{...} map{...}となる。
変換のためのループが2回入る(map)が、記述としてはあっさりなので、特殊なソートをしたいときにはよく使われる有名な方法。
伝わるかな?w
836(1): 2020/12/09(水)08:45 ID:UMU4oc+t(1/7) AAS
それで書けるなら、sort { } でも書けるよね
837(2): 2020/12/09(水)09:35 ID:sn/SI4a+(1) AAS
>>833
こんな感じかな。デバッグはしていないが。
@newlist = sort compare @oldlist;
sub compare{
my ($ap, $bp) = @_;
($ap1, $ap2) = $ap=~/([0-9]+)\-([0-9]+)/;
($bp1, $bp2) = $bp=~/([0-9]+)\-([0-9]+)/;
return 1 if $ap1 > $bp1
return -1 if $ap1 < $bp1
# $ap1 == $bp1;
return 1 if $ap2 > $bp2;
return -1;
}
上下前次1-新書関写板覧索設栞歴
あと 165 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.014s