Perlについての質問箱 63箱目

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん2014/02/19(水) 23:36:23.29
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板: http://kohada.2ch.net/php/

このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
荒らしはスルー推奨。

"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

www.perl.org/get.html
Download Latest Stable Source (5.18.2)

▼前スレ
Perlについての質問箱 61箱目
http://toro.2ch.net/test/read.cgi/tech/1381561905/
Perlについての質問箱 62箱目
http://toro.2ch.net/test/read.cgi/tech/1385039352/

952デフォルトの名無しさん2018/01/08(月) 16:46:09.77ID:QsqxlxVF
そのbatファイルをタスク登録(ログオン時実行)とかにしとけば自動実行されるしね

953デフォルトの名無しさん2018/01/08(月) 18:09:00.53ID:uJ83jHj4
perl関係ねえ

954デフォルトの名無しさん2018/01/23(火) 09:36:50.60ID:vYqw+N7N
open(ロック用ファイルハンドル,ロック用ファイル);
flock(ロック用ファイルハンドル,2);
unlink(ロック用ファイル);
close(ロック用ファイルハンドル);  #ロック解除

このようにロックを解除する前にロック用ファイルを削除するのは何か問題ありますか?
ロック解除したあとにロック用ファイルを削除するとロックに隙間ができるので

955デフォルトの名無しさん2018/01/23(火) 10:33:50.77ID:ytLWcXDj
>>954
flock使うならファイル削除しなきゃいいんだよ。そうすれば隙間はできない。
ファイル削除したいならopenの時のモードで O_EXCL | O_CREAT も指定しておいてエラーが出るかどうかで判別する。
エラーなくオープンできたら成功で、必要な処理が終わったらファイルをクローズする。
ただしこの方法はUNIX系OS以外では通用するかどうかわからないのと、NFS越しのファイルでは使えないかも知れない。
NFS越しでも使えるファイルロックは多分fcntl()のF_SETLKとかだろうと思う(しかしこれもまたOSしだいだ)。

956デフォルトの名無しさん2018/01/23(火) 10:34:51.22ID:ytLWcXDj
ごめん。訂正。

ファイルクローズするではなくて削除だ。

957デフォルトの名無しさん2018/01/23(火) 12:02:42.65ID:N8Mjx+M1
>>954
flockで相互排他する場合普通はファイル削除しない
削除で隙間はできない。但し別プロセスがファイル作成するなら
隙間が生じるように感じるかもしれない

958デフォルトの名無しさん2018/01/23(火) 12:28:01.19ID:f+jO8q2F
>>957
感じるではなくロックとして機能しないよね?

959デフォルトの名無しさん2018/01/23(火) 19:08:17.77ID:N8Mjx+M1
>>958
ファイルシステムから見ると削除して作成すると、同じファイル名でも別ファイルになる
排他処理は同じファイルを使ってるもの同士なら出来る
例えばopenしたものをずっと使い続けるプロセス同士なら、削除された後でも相互排他が出来る

960デフォルトの名無しさん2018/01/23(火) 20:56:31.43ID:wO1dM6nx
>>959
3つ以上のプロセスで必ず破綻するように思うが。
いや2つでも2回目でダメになるか。

961デフォルトの名無しさん2018/01/23(火) 22:04:43.15ID:ZqrAOfGF
あ、ずっとオープンしっぱなしならその後削除されても大丈夫ってことか。
それはそうだな。なんか危うさを感じるが。

962デフォルトの名無しさん2018/01/30(火) 21:14:29.11ID:SNmuV+Ws
ヒアドキュメントをファイルに出力する時に、

print $out <<"EOC";
ならokで、
print $out << "EOC";
だと駄目なのは何故?

963デフォルトの名無しさん2018/01/31(水) 01:11:29.08ID:ajZ2gLGd
>>962
<< はビットシフト演算子でもあるので、優先順位的に
$out << "EOC" として解釈されちゃうから…?
print $out (<< "EOC"); や print << "EOC"; で通るならそうだと思う。

964デフォルトの名無しさん2018/01/31(水) 01:46:30.10ID:PKL4UNme
<<の直後が空白文字だと空白文字自体が識別子とみなされる
と、とある本に書いてあった

965デフォルトの名無しさん2018/01/31(水) 03:10:45.37ID:ajZ2gLGd
<<964
http://perldoc.jp/docs/perl/perlop.pod#Regexp32Quote-Like32Operators
> <<EOF
<略>
> 識別子がクォートされていない場合は、<< と識封ハ子の間に 空白を入れてはいけません。
> (もし空白を入れると、空識別子として扱われます; これは有効で、 最初の空行にマッチ
> するようになります。)

昔は
print <<;
document here.

print "foo";

みたいにできたけど、今これやると警告が出る。<<""; なら OK。

#!/usr/bin/perl -w
use strict;
sub E { print "\n6\n" }
open my $out, '>&STDOUT' or die $!;
print $out <<"";
1

print $out (<< 'E', "3\n", <<'');
2
E
4

print $out << 'E'; # Argument "E" isn't numeric in left bitshift (<<)
"5"; # Useless use of a constant ("5") in void context
E

966デフォルトの名無しさん2018/01/31(水) 09:25:45.73ID:H6iQ2Lk/
>>962
<<の直後のスペースの有無?
そりゃシェルスクリプトみたいな <<EOL のような何もクオートしない形式も許している都合でシェルの文法に合わせたからではないかな。

967デフォルトの名無しさん2018/01/31(水) 09:27:00.94ID:H6iQ2Lk/
あ、すまん。リロードせずに書いてしまった。既に回答書かれてたな。

968デフォルトの名無しさん2018/01/31(水) 19:05:43.73ID:vCtk0IVE
スペース空けるの禁止ならそれでいいんだけど、
ファイルハンドラが無いならスペースがあってもokなのが納得行かない

969デフォルトの名無しさん2018/02/01(木) 07:25:10.05ID:Msx4nr7P
気持ちは分からなくもないが、変数の場合はしょうがない。>>963 に書かれてるとおりだ。

970デフォルトの名無しさん2018/02/01(木) 12:35:16.66ID:Msx4nr7P
誰もつっこまないが、
$out->print( << "EOC");
と書けばいいと思う。
bless されてない場合は昔は
use IO::Handle;
が必要だったが今では
perl -e 'STDOUT->print("abc")'
なんてこともできる。
個人的には、ファイルハンドルの後に , があるというアホな間違いをせずに済むというところで助かっている。

971デフォルトの名無しさん2018/02/02(金) 07:43:01.24
ヒアドキュメントなんてプログラムを読みにくくする諸悪の根源

972愛知人2018/02/02(金) 12:10:04.50
Wikipediaの12桁トリップの生成スクリプトで12桁以上のトリップキーの変換が5chの結果と合いません。どうすれば合いますか。

973デフォルトの名無しさん2018/02/03(土) 08:12:51.87ID:hZgGNvq2
Archive::Rar を使って、中身のファイルサイズを取得するにはどうすれば
無理なら、代わりに何を使えばいい?

974デフォルトの名無しさん2018/02/03(土) 09:38:14.14ID:nCUOym6+
rar コマンドをインストールしてないから CPAN でソースコードを見ただけだが、List を呼べば rar の出力をパースして list に入れてくれるみたいだよ。
試してないから勘違いしてるかもしれないけど、使ってるならソースコードの List, _AddToList 辺りを読めばいいかも。

975デフォルトの名無しさん2018/02/03(土) 10:13:43.25ID:hZgGNvq2
Listはファイル名一覧しか渡してくれないんだよな

976デフォルトの名無しさん2018/02/03(土) 10:20:52.21ID:hZgGNvq2
-alldata を指定すれば、->{size} で見えるのか

どうせやってるのは、rar.exe の出力を読んでテキスト解析してるだけなので、
似たようなことを自前でやった

977デフォルトの名無しさん2018/02/03(土) 14:48:15.33ID:nCUOym6+
マニュアルには書かれてなかったのか……まあ、信頼性の低い方法だしね。

978デフォルトの名無しさん2018/02/04(日) 11:13:30.15ID:22FJuDW8
出力される表の形式に似せたファイル名とかにすると、多分騙されるんだろうな

979デフォルトの名無しさん2018/02/09(金) 18:18:02.60ID:U+AwHosU
>>971
KENT WEBの見にくさを見てから言ってくれ

980デフォルトの名無しさん2018/02/09(金) 20:07:25.83ID:VqU2EMqO
ヒヤー

981デフォルトの名無しさん2018/02/09(金) 20:21:39.58ID:67QUQBJT
他言語弄るとき、まずヒアドキュメント探すつっても過言じゃ無いんだが…

982デフォルトの名無しさん2018/02/09(金) 20:58:36.22
>>979
printはもっと読みにくいに決まってるだろ
テンプレートしかあり得ん

983デフォルトの名無しさん2018/02/09(金) 21:23:05.06ID:ukY4fsl4
   here => <<~EOM
   インデント
   出来る
   EOM

これ出来るようになって昔書いたソースが結構綺麗になった

984デフォルトの名無しさん2018/02/13(火) 11:06:08.61ID:b5aNFBbA
ソースにhereドキュメントが多量に含まれてる時点で
キレイじゃねーよw

985デフォルトの名無しさん2018/02/13(火) 21:01:03.94
それな

986デフォルトの名無しさん2018/02/13(火) 21:31:52.97ID:RM6vxbUw
ヒアドキュメントはうまくやると配布するファイルをプログラムのファイル一つにまとめられる。
そういうのは何かのプログラムのインストーラやアップデータには良いかも知れない。

987デフォルトの名無しさん2018/02/14(水) 01:07:32.41ID:eq6pqk6J
全てのスクリプト言語には、ファイルを一つに結合する機能と
コードを圧縮暗号化する機能が必要な気がする
JSにあるアレね

988デフォルトの名無しさん2018/02/14(水) 02:24:43.93ID:kFW7p5Uz
SQL使うときだなヒアドキュメントは
ORM嫌い

989デフォルトの名無しさん2018/02/14(水) 09:08:25.15ID:1w/9kxzB
ああ。そういやSQL文に使ったなあ。
長くなるのが普通だもんなあれって。

990デフォルトの名無しさん2018/02/14(水) 13:42:37.08ID:eEfPvNoj
$str = <<'EOF';
エスケープの必要性から解放されたい場合もあるんだよなあ。
これに相当することを C でやるには別ファイルに分けて Makefile で

str_escaped : str_raw
sed 's/\([\"\\]\)/\\\1/g ; s/^/\"/ ; s/$/\"/ ;' < str_raw > str_escaped

みたいにして C の方で

str[] =
#include "str_escaped"

とする必要がある。Perl は本当に便利だ。
EOF

991デフォルトの名無しさん2018/02/14(水) 13:50:00.92ID:L6K2VJP2
Pealで正規表現なら、デミリタ変えるだけでいいじゃん
可読性下がるけど

$hoge =~ m!/!;!g;

みたいな

992デフォルトの名無しさん2018/02/14(水) 19:56:29.61ID:JCOq4GRt
終わりを示す文字列にQEDを使う

993デフォルトの名無しさん2018/02/14(水) 20:05:36.90ID:eq6pqk6J
それが厨二病

9949902018/02/14(水) 22:39:20.53ID:eEfPvNoj
>>991
何を言いたいのかさっぱり解らないが、ひょっとして >>990 に興味持ってくれた?
そうだとしてもやっぱり何を言いたいのかさっぱり解らないのだが。
ちなみに Perl と C を比較してるのであって、sed は関係無いよ。
「これに相当すること」の「これ」とは >>990 全体を Perl コードとして実行した結果のことで、正規表現は何の関係も無い。
大筋としては
・元のテキストはエスケープなどの加工をしないでおきたい。
・エスケープが必要な場合でも目視と手作業なんて論外。自動化したい。
・実行時に別ファイルから読むのではなくプログラムに埋め込みたい。
という前提があって Perl と C でそれぞれどのように実現するかという話だ。
Perl にいくつもあるクォーティングの正確な仕様、Makefile の仕様、C の言語仕様を知ってる人向けだから無理しなくてもいいよ。
>>990 に対してじゃなかったのならごめんね。自意識過剰だったね。

995デフォルトの名無しさん2018/02/15(木) 09:02:00.83ID:8SUVFt/S
> 自意識過剰だったね。

そのとおりだろうなw

996デフォルトの名無しさん2018/02/15(木) 23:40:07.21
Perlコードでもレスでも変わらない真実

ぎっしり長文書くやつは無能

997デフォルトの名無しさん2018/02/15(木) 23:41:00.25ID:8SUVFt/S
短文なら有能!俺とか!

998デフォルトの名無しさん2018/02/16(金) 10:21:33.25ID:OW1usLwi
俺も俺も

999デフォルトの名無しさん2018/02/16(金) 18:54:42.22ID:ZDCA61/e
die;

1000デフォルトの名無しさん2018/02/16(金) 20:51:22.93ID:YSXjevvC
ひでぶ

10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1457日 21時間 15分 0秒

10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

レス数が1000を超えています。これ以上書き込みはできません。