Perlについての質問箱 63箱目
レス数が1000を超えています。これ以上書き込みはできません。
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/ # [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";
use Encode;
# 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう
# おまじないです。 ■推移
ttp://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
2013.Dec 1.072%
2014.Jan 0.917%
2014.Feb 0.887%
■推移グラフ
ttp://www.tiobe.com/index.php/content/paperinfo/tpci/Perl.html
■Perlの今後
他言語に対する優位性がほとんどないため、消滅に向かって進んでいる。
近い将来消えるのは確実。 TIOBEって日本じゃほとんど聞いたことがないよね?Perlは日本語をちゃんと処理
できる数少ない処理系だから、海外とは状況が違うと思うんだよね 自分がほとんど聞いたことがないという無知っぷりを晒しつつ
その前提で語る基地害がPerl厨 乱立してる統計サイトの内の一つで、たいしたサイトじゃない。
http://langpop.com/
こんなサイトもあって、今話題に登ってる言語の項目とか見たら
PHPもPerlも似たりよったり。
こんなもんに一喜一憂するのはアホのする事。
#別に「Perlが落ち目じゃない」と主張するつもりも、毛頭無い。 WebProgの方で、その活動すれば?
そのスレの内三つは荒しが立てたスレだし、Perlと名前が入るスレ自体も10個しかないけど
向うには両手に余るくらいのスレは乱立してるぞ。 久々の正式なスレ立て乙
個人的には「ミニマルPerl」が俺の目を覚ましてくれた本だなあ
まあ、解ってる人には間違いなく退屈な本だけれども スレ乱立のうちの1つだから全く乙じゃない
ただの迷惑行為 重複によりこのスレには削除依頼が出されました
↓のスレに移動してください
【誘導】
Perlについての質問箱 63箱目
http://toro.2ch.net/test/read.cgi/tech/1392906213/ 【プログラミング自体の経験が無い奴はまずココを読め]】
Perl プログラミング講座: ttp://nyx.pu1.net/
【本】
リャマ: ttp://www.oreilly.co.jp/books/4873112575/
駱駝: ttp://www.oreilly.co.jp/books/4873112869/
Effective Perl: ttp://www.c-r.com/book/detail/888
クックブック: ttp://gihyo.jp/book/2012/978-4-7741-4972-1
Perl ベストプラクティス: ttp://www.oreilly.co.jp/books/9784873113425/
Perl Hacks: ttp://www.oreilly.co.jp/books/4873112915/
【オンラインマニュアル】
最新のドキュメント: ttp://blog.livedoor.jp/kumagai_nori/archives/52255109.html
perldoc.jp: ttp://bg.pi-ppi.com/
perldoc.perl.org: ttp://manual.xwd.jp/ 例のPHP厨毒の精神異常者がスレを乱立させてから動きがパッタリやんだが、規制食らったのか?
それとも夜に活動が再開されるのか? 乱立させてたのってPHPユーザーなの?
てっきりPerl厨だと思ってたんだけど。
スレ乱立とか頭の悪いことをするのはPerlを選ぶような知能の低いPerl厨くらいしかいないだろ。 php厨()とか妄想をベースに考えるから、事実と整合性が取れなくなって>>17みたいな書き込みをするようになる
というかその不整合からくる違和感に耐えられなくなって書き込んでるって言ったほうが正解か
>>17は自覚がないみたいだけど糖質の疑いがある >>17
糖質も発見が早ければ投薬で治療できるから病院行ってみたら? 自覚があれば病院行くだろうし
糖質と診断されればネットは控えろと言われるだろうから
こんなところにはいない 罵倒スレのほうが内容にマッチしてるじゃん、何でわざわざ質問箱で立て直したの? Perl=ちんこ言語
男のちんこをしゃぶれない弱輩には使いこなせない言語 perl 5(v5.16.3)で
http://d.hatena.ne.jp/syohex/20110616/1308237655
を走らせると
BEGIN not safe after errors--compilation aborted at ~/op.pl line 16.
と止まってしまいます。
解決策を教えてください。 >>36
mac持ってないから試せないけど、一応これで動くんじゃないかと。
adhocな対応でセキュリティ考えてないから注意してね。
open my $fh, '<', \(my $dmy = `@cmd`) or die "Can't exec @cmd"; 正規表現で
aaa 99 PPP
iii 87 XYZ
uuu 32 XXX
の PPP以降 と XYZ以降 と XXX以降 を取り出すのはどうすれば良いでしょうか?
aaa iii uuu が半角の文字 99 87 32 が 数字である事は保証されていますが
PPP XYZ XXX に至るまで半角スペース、もしくは全角スペースがいくつあるかは保証されておらず
substr 等で切りだす事はできません。わかる方宜しくお願いします。 文章が不透明だから分からなくなる。(誰にも分からない)。
正規表現は完璧に仕様を出さないと書けない。出せば単にそれを書くだけ。
行頭は半角文字列である → ^[a-z]
その後に半角スペースがある → \ (←見えないが半角スペース)
その後に2桁の数値がある。 → [0-9]{2}
その後に一文字以上の半角スペースと全角スペースが不定数混在する → ([\ \ ])+
その後に大文字が3つある → [A-Z]{3}
以降、行末まで。(取り出し対象文字列) → .*$
まぁ辞書やないんやけどな。ここは。 URLに?記号が2つある場合のデータの取得について
たとえばhttp://○○○.com/pagejump.cgi?http://△△△.com/disp.cgi?mode=testのよう?が2つある場合
$ENV{'QUERY_STRING'}だとhttp://△△△.com/disp.cgiまでしか取得できなくて?mode=testの部分が取得できないんですけど
フルに取得できるにはどうしたらいいんですか? フル?
「http://○○○.com/pagejump.cgi?http://△△△.com/disp.cgi?mode=test 」の場合、
query文字列は、「http://△△△.com/disp.cgi?mode=test」 だから、それが取れれば
十分なのでは?
その中の一部を取り出したいなら自分で好きに取り出せばいい スマヌ質問内容理解してなかった
だがPerl関係なくね? >>43
本当にクライアントが
http://○○○.com/pagejump.cgi?http://△△△.com/disp.cgi?mode=test
を送ったのなら、それが原因だと思う。
URL の各部分は適切にエスケープされなければならない。
Perl でやるならこうだ。
use URI;
use URI::Escape;
$u = URI->new("http://○○○.com/pagejump.cgi");
$u->query( uri_escape("http://△△△.com/disp.cgi?mode=test"));
# クライアントに適切なエスケープを期待出来ないなら……まあ、がんばってくれ。 >>40-42
これで一致した、次の文字から、行末までを取得する
^([a-z]{3})([\ \ ])+[0-9]{2}([\ \ ])+
半角・全角スペースは、「aaa○99○PPP」
○の所にしか入らないのだな?
つまり、各トークンの中には、入らないのだな?
それなら、全行のすべての全角スペースを、
半角スペースに置換して、その後、
連続した半角スペースを、1つの半角スペースに置換する
そして、8文字目から行末までを、取得する
>>44-46
URLの各部分では、特別に扱う文字が決まっているから、
クエリ文字列部分で、「? =」・日本語などは使えないので、
エスケープする http://andtokyo.jp
&TOKYO
sub TOKYO {
#だれか面白いルーチン書いて 趣味と勉強を兼ねてcgi使ったホームページを作ってるんだが
セッションって格納した値は、同じルーチン内でしか使えないの?
格納したセッションをLocationでとんだ先で取得したいんだけど
何かと組み合わせないとそういうのできないのかな プログラム板でもやっぱそうか・・・・・
バグ発見!
名前欄に0と英数字で入力すると出力されないバグ!
変数の文字の長さで入力を判定して出力させれば
バグは治る!
すぐに対処を申請します! 質問です。
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
my $ua = LWP::UserAgent->new;
$ua->timeout('7');
my $req = POST('http://yahoo.co.jp');
my $res = $ua->request($req);
print $res->content;
のようにすると文字化けします。文字コードの指定方法も分からず困っております
だれかおしえてくだあさい もらった文字列と、表示されている文字の、
文字コードが異なっているのだろう
文字を表示しているソフトの、文字コードを変えれば?
たぶん環境変数か設定項目にある
文字を表示しているソフトは、何を使っているの? yahoo.co.jpは301 Moved Permanently だけど、move先を指定しても文字化けはない win10の64bit版でperl32bit版動くかな?
ちなみにwin7の64bitではperl32動いてます もう1個のスレのほうがメインみたいなのでそっちで聞いてきます ヒアドキュメントで表示は
print <<"EOS";
(中略)
EOS
だけど
これをファイルに書き込むにはどうしたらいいんですか? print $fh <<"EOS";
中身
EOS 別解として
perl script.pl > file.txt もしかして、Windowsのスタート→プログラム→アクセサリ→メモ帳
を実行して
print <<"EOS";
(中略)
EOS
を打ちこみ、メモ帳のメニューのファイル→名前を付けて保存
のほうを知りたかったのですか? いきなりだけどPerlのクラスの仕組み(かなり手抜き)
+ JavaScript の質問用スレッド vol.128 +©2ch.net
http://peace.2ch.net/test/read.cgi/hp/1454390682/401- のJavaScriptのthisの話の余談
大雑把に言うとPerlのクラス(オブジェクト)はハッシュに毛が生えたもの
※この段階ではクラスではない。ただのハッシュを返すnew関数とそれを入れたKlassパッケージ
package Klass;
sub new { return {a=>1, b=>2 } }
sub foo {}
Perlにはメソッドというものはない。全て関数。
コンストラクタ(一般的にnewという名前にする)もただの関数。
Perlではクラスやオブジェクトはこのようにして呼び出す。
my $obj = Klass->new();
$obj->foo();
ここで問題がある。$obj->foo()は、Klass::foo()を呼び出すことになるが、
$obj(ただのハッシュ)からどうやってKlass::foo()であることを知るのか?
ただのハッシュを返しているだけのnew関数にはそれは無理なので
ただのハッシュに毛を生やす。
sub new { return bless({a=>1, b=>2 }, 'Klass') }
これでただのハッシュじゃなくてKlassという情報がくっついたハッシュになった。
これで$obj->foo()はKlass::foo()を呼び出せる。 ここからが面白くて「アローの左側は関数の第一引数になる」というルールを追加する。
そうすると、Klass->new() という呼び出しは、 new('Klass') 相当になることがわかる。
ということで、newの第一引数にはクラスの文字列が入ってくるのでそれを使える。
sub new { my $class = shift; return bless({a=>1, b=>2 }, $class }
さらに、$obj->foo() の呼出も同じ。 foo($obj) 相当になる。
なので、sub foo { my $self = shift; } の$selfにはnewの戻り値である
毛が生えたハッシュ、つまりオブジェクト自身(他の言語のthis相当)が入ってくることになる。
このようにアローの左側が第一引数になる。という挙動は他の言語でも一緒で
JavaやC++は内部的にそれを行ってるだけ。
そしてJavaScriptでも.(ドット)の左側が第一引数になると考えると、
JavaScriptのthisがよくわからんという問題も簡単に理解できるはず。
JavaScriptのthisの話は元スレへどうぞ うん。そしてそれが有用ならもっと使われているはずだが、現実はあまり使われていない。
コードが実行時に生成されるようなダイナミックなものはデバッグ、テスト、保守がしにくい。 文字列の/*と*/で囲まれた部分と/*と*/に色をつけたい
例えば$str="/*abcdef*/";の場合は
$str =~ s/\/\*/<font color=\"green\">\/\*/g;
$str =~ s/\*\//\*\/<\/font>/g;でできましたが
$str="/*//////abcdef/////*/";の場合はうまくできませんでした。
どうすればうまくいくのでしょうか? $str = ̄ s{(/¥*.*?¥*/)}{<font color=”green”>$1</font>}g; my $data = {
'data1' => [1,2,3],
'data2' => [4,5,6],
'data3' => [7,8,9]
};
上のような配列のハッシュで
ハッシュそれぞれの0番目、1番目、2番目のデータを
取り出したい場合どうすればいいのでしょうか
for (my $i = 0; $i < 3; $i++) {
print $data->{"data1"}[$i],"\n";
print $data->{"data2"}[$i],"\n";
print $data->{"data3"}[$i],"\n";
} ごめん、ちゃんと書いたのに何かアクシデントがあったようだ。もう一回送るよ。
それで合ってるよ。
http://perldoc.jp/pod/perldsc
を読みなさい。
$data->{"data1"}->[$i]
が正式な書き方だが (配列|ハッシュ)要素の参照が連続していれば間の矢印を省略してもいい。
個人的には、リファレンスだということを意識していたいから省略しないけどね。 シングルクォートもダブルクォートも要らねぇ。
my $data = {
data1 => [1,2,3],
data2 => [4,5,6],
data3 => [7,8,9]
};
print $data->{data1}[$i],"\n"; >>75-77
勉強になりました。
ありがとうございます。 Web::Scraperでスクレイピングしているのですが
サンプルでは
use YAML;
warn Dump $res;
という書き方でこの方法だとデータの構造がよくわからないのですが
Dump何をつかっているのですか?
Ubuntu14.04の64bitを使っています。 >>79
データの構造はData::Dumperをイントールしたらわかるようになりました。
すみません。 print $res->{list}[1]->{link}[0]->{url},"\n";
print $res->{list}[1]->{link}[0]->{title},"\n";
print $res->{list}[1]->{link}[1]->{url},"\n";
print $res->{list}[1]->{link}[1]->{title},"\n";
こういったデータをforeahで出力したい場合
???にはどのようにかけばいいのでしょうか
foreah my $i(???) {
print $i->{url};
print $i->{title};
} >>81
my $links = $res->{list}[1]{link};
for my $link ( @$links ) {
say $link->{$_} for qw/url title/;
} >>83
say forの行が気持ち悪い。やり直し >>84
やり直し(キリッ
じゃなくて自分ならこうするというのを示せよw >>83
ありがとうございました。
一度変数に保存してからすればよかったのですね。
my $links = $res->{list}[1]{link};
for my $link ( $res->{list}[1]{link} ) {
こういう書き方をしていてリストにするにはどうしたらいいのか
わからないので質問させていただきました。
たいへん勉強になりましたありがとうございました。 >>86
デリファレンスは一度代入しなくてもできるけどちょっとわかりにくいかなって
for my $link ( @{ $res->{list}[1]{link} } ) {
新しい書き方だとこんなのもあったり(postfix dereferencing)
$res->{list}[1]{link}->@* 1位は「Python」、プログラミング言語別の平均年収ランキングが発表
http://www.mdn.co.jp/di/newstopics/44248/
2位には「Perl」(平均年収633万円)、3位には「Ruby」(平均年収606万円)がランクインした。 >>67-68
超亀レスですがありがとうございます、勉強になりました! my $date = '平成28年2月26日18:55';
my $week = '金';
$date =~ s/日/日 $week曜日 /;
print $date;
をすると文字化けするのですが原因がわかりません。 さくらのレンタルサーバーのCGIでPerl 5.14.4です。
$weekを削除すると文字化けはおこりません。
別のプログラムではうまく動いているのですが $week\xe6\x9b\x9c\xe6\x97\xa5になっているみたい
プログラム内に入力している日本語がprint表示するときにくずれるようです。 ${week曜日}
${week}曜日
>プログラム内に入力している日本語がprint表示するときにくずれる
やっぱutf8フラグかなあ… 日付で教えて下さい
1/23 12:34
を西暦をくっつけて
2016/1/23 12:34に変換したいのですが
例えば未来の日時の場合は
5/1 12:34
を2015/5/1 12:34と1年引いた年にしたいのですが
下のプログラムでは
2015/05/02 06:45:10になります
年の引き算はどうすればいいのでしょうか
use strict;
use warnings;
use 5.010;
use Time::Piece;
use Time::Seconds;
my $t = localtime;
my $year = $t->year;
my $str = "1/23 12:34";
my $date = Time::Piece->strptime("$year/$str", '%Y/%m/%d %H:%M');
if ($t < $date) {
$date -= ONE_YEAR;
}
say $t->strftime('%Y-%m-%d %H:%M:%S');
say $date->strftime('%Y-%m-%d %H:%M:%S'); >>96
いや、年の引き算って言っても一年は365日とは
限らないんだから、仕様を決めないとだめでしょ?
例えば2月29日の1年前は何日なのか?っていう。 だからそうすると2月29日が出来てしまうって言ってるわけ pythonのスクリプトの頭に、use strict;って書いた。頭いかれてきたw my($year,$month,$day,$hour,$min) = (localtime)[5,4,3,2,1];
my $str = "1/23 12:34";
my($strmonth,$strday,$strhour,$strmin) = $str =~ m|([0-9]+)/([0-9]+) ([0-9]+):([0-9]+)|;
if (
sprintf('%02d%02d%02d%02d',$strmonth,$strday,$strhour,$strmin)
gt
sprintf('%02d%02d%02d%02d',$month+1,$day,$hour,$min)
) {
printf("%04d/%02d/%02d %02d:%02d\n",1900+$year-1,$strmonth,$strday,$strhour,$strmin);
}
else {
printf("%04d/%02d/%02d %02d:%02d\n",1900+$year,$strmonth,$strday,$strhour,$strmin);
}
# 基本に忠実に。応用はそれから >>102
$month -= 2;
my $str = "2/29 12:34";
したら、2015/02/29って答が出るコードなんぞ貼るなや
元の質問者のコードに、
ふつうに$obj->is_leap_yearの判定加えて、
2/29跨ぎなら、LEAP_YEAR
引けばいいだけだろ。 要件にない仕様を自己満足で追加してはいけない
この件はTime::Pieceだとうまくこなせない問題
融通がきかないのがオレオブジェクトのつらいところだ localtimeとTimelocalは次スレのテンプレに追加するか
同じ質問が繰り返されてみんな同じところではまるからなあ クッキーへの書き込み処理での質問
エラーメッセージを取得処理
print "Content-type:text/html\n";
if(エラー数が0の場合){
投稿データをクッキーに書き込む処理
}
print "\n";
エラーメッセージの表示処理
というようにエラーメッセージの取得と表示の間に
print "Content-type:text/html\n";print "\n";を挟む形になってしまうので
これらをまとめてサブルーチン化したくてもできません
こういう場合でもうまくサブルーチン化できる方法を教えてください エラーメッセージの出力時にContent-typeから出力すればいいのでは >>109
そのためにCGI.pmなどのライブラリや
各種フレームワークがある。 何をしたかったのかよくわからないけど、せめて cookie と書いてほしかった。 住所を入れる変数でさ
$adoresu = ・・・
みたいな名前つかうヤツ、いるよね
英語なのか何なのか、よくワカラン $message = エラーメッセージを取得;
print "Content-type:text/html\n";
if(エラー数が0の場合){
投稿データをクッキーに書き込む処理
}
print "\n";
print $message; # エラーメッセージの表示処理 my $str = "あああabcあああcdefghあああ123456";
この文字列で半角英数字の部分をAAAに置換するにはどうすればいいですか?
あああAAAあああAAAあああAAAになればOKです my $str = "あああabcあああcdefghあああ123456";
print $str, "\n";
$str =~ s/[A-Za-z0-9]+/AAA/g;
print $str, "\n"; ありがとうございます。おかげで宿題を提出することができました。
リンク先のページを読んでも何が何だかさっぱり分かりませんでした。 パールでまた問題に直面したら話題を提供してあげますので楽しみにしてるんだぞ。 ファイル演算子の-eと-fの違いは?
ファイルが存在するかどうかはどっちを使っても良いのですか? すみません。初めてperlを使うのですが、perlでQRコードを生成したいです。
ブラウザからアクセスしてQRコードの標準出力は出来たのですが、ファイルを生成する方法がわかりません。
以下のソースを実行すると、pngが生成されるのですが、生成されたpngをダブルクリックしても開けなくなります。
use GD::Barcode::QRcode;
binmode STDOUT;
my $qr = GD::Barcode::QRcode->new('test',{Ecc=>M, Version=>5, ModuleSize=>3})->plot();
open my $fh, '>', 'qr.png' or die;
print $fh $qr->png;
close $fh;
もしお分かりの方がいらっしゃったらお願いします。 >>123
-fは指定されたものが通常ファイルで存在した場合のみ真
-eは同名のディレクトリやシンボリックリンクでも真
>>124
openの次の行にbinmode $fh; >>125
ありがとうございました。
初心者なもので、もう丸一日困っておりました。 centos、zshの環境で、plenvを使っていて、apacheでcgiを動かそうと考えています。
/var/www/html 直下で #!/usr/bin/perl のcgiが動くところまではブラウザで確認できました。
あとはplenvの下記初期設定をするだけ、と思ったところで詰まりました。
export PATH=~/.plenv/bin:$PATH
eval "$(plenv init -)"
apacheの自動起動では ..zshrc を指定するところがありません。
とりあえず下記で、plenvでインストールしたパスだけは設定したのですが、
eval "$(plenv init -)" の中でどんな処理がされているのかわかりません。
# echo "PATH=/home/centos/.plenv/shims:$PATH" >> /etc/sysconfig/httpd
# /etc/init.d/httpd restart
eval "$(plenv init -)" ではどんな処理がされているのでしょうか?
また、plenvの環境は、パスさえ設定しておけば、特に支障はないのでしょうか? 最後の行だけ。
普通に、echo $(plenv init -)すれば、標準出力に内容が出ます。 >>128
なるほど!
評価してるだけだから、echoで出力できますね。
気づきませんでしたありがとうございます。 echoしなくてもplenv init - だけでいいよw
もっとも、それ見た後は
そーすこーどみれだけどなw openで開いたファイルをcloseで閉じる前にexitなのでプログラム強制終了した場合
自動的に閉じられてますか?
何か問題ありますか? closeされることが保証されるわけではないが、普通のOSなら
OSがcloseを発行する。何を問題とみなすかによるが普通は問題ない cgiなら問題ないけどmod_perlとかだとファイルディスクリプタ消費したままになる exit ではなく die を使うという方法もある。もちろん eval ブロックの中で。 END {
close(FILE);
}
もしくは
open(my $file,'file.txt');
だな tmp.datをlog.datにrenameするときrename失敗したら成功するまで繰り返す処理をしたい
このようにrename成功したらループを抜けるというやり方でもいいんでしょうか?
他にいいやり方はありますか?
for($n=0;$n<=100;$n++){
$rename_seikou = rename("tmp.dat","log.dat");
if($rename_seikou==1){
last;
}
} 本当にそういう繰り返しをしたいのなら sleep を入れた方がいいと思う。
それから、失敗した時は原因を確認した方がいいと思う。つまり、こんな感じ。
use Errno 'EBUSY';
if ( rename( $src,$dest)){
# 成功
} elsif ( $! eq EBUSY){
# 多分、別のプロセスで使用中。少し待てば成功するかも。
} else {
# 待っても無駄だろう。
die( $!);
} ごめん、間違えた。
$! eq EBUSY
じゃなくて
$! == EBUSY 正規表現での置換について質問です。
<ul>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li>あ</li>
</ul>
上の最後の<li>だけ<li class="a">に置換したです。
1時間以上考えてますができません。 正規表現は少しでもほんの条件が不明瞭であれば誰にも書くことはできない 自己解決しました。
$a =~ s/(^.*)\<li\>(.*$)/$1\<li class\=\"a\"\>$2/s; すみません。
新たな問題が発生しました。
<ul>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li>あ</li>
</ul>
<ul>
<li>い</li>
<li>い</li>
<li>い</li>
<li>い</li>
<li>い</li>
</ul>
上記の文字列が$aに入っている場合で、各<ul>の最後の<li>だけ<li class="a">に置換したいです。 木構造のものを正規表現で置換するのは無理
JavaScriptのjQuery の、addClass, removeClass, toggleClass などを使う
それか、HTMLをパースする、ライブラリを探す 否定の文字クラス使えば、普通に最短マッチで出来る事だろ。
s{<li>([^>]*?</li>¥s+</ul>)}{<li class="a">$1}sg
パースするライブラリ使えっつーのは同意だがな ああ、否定の文字クラス使わんでも出来るわ。
アホだ俺 >>145
ツリー構造というよりまさにあの並びの時だけの正規表現でいいんでPerlでやりたいんです
>>146
ありがとうございます
$a =~ s/\<li\>([^\>]*?\<\/li\>\s+\<\/ul\>)/\<li class\=\"a\"\>$1/sg;
では動きませんでした そのコードそのまま(円マークをバックスラッシュにして)
動かしたから、何らかの置換↓が得られたけど?
<ul>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li>あ</li>
<li class="a">あ</li>
</ul>
<ul>
<li>い</li>
<li>い</li>
<li>い</li>
<li>い</li>
<li class="a">い</li>
</ul>
無意味なエスケープは、コードの邪魔になるだけだからしない方がいいよ。
置換 s/// の右辺は正規表現ですらない(よってエスケープの必要無い)し。 /[0-9]{$num}/
のような量子数は変数にできないんでしょうか?(^^? # 実行してみて
for $num (1..3){
$_ = '1' x ($num - 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x $num;
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{$num}/ ? 'ok,' : 'not ok,';
print "\n";
} >>152
ありがとうございます。
変数は使えたんですね!
演算子が使えないようでした…申し訳ありません。
/[0-9]{$num+1}/
のような使い方がだめでした orz $n = 2;
$pat_qr = $n + 1;
$pat_qr = qr/[0-9]{$pat_qr}/ ;
$pat_ev = eval( sprintf("qr/[0-9]{%d}/",$n+1));
$pat_co = qr/(??{ sprintf("[0-9]{%d}",$n+1) })/ ;
print( $_,"\n") foreach $pat_qr,$pat_ev,$pat_co;
# 個人的には $pat_qr がいいなぁ。eval を使うほどのことじゃないし $pat_co はデバッグしにくい。 # こうですよ
for $num (1..3){
$_ = '1' x $num;
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 1);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
$_ = '1' x ($num + 2);
print /[0-9]{@{[$num+1]}}/ ? 'ok,' : 'not ok,';
print "\n";
} >>155
すごーい\(^^)/
ありがとうございます!
>>154
ありがとうございます! あのあのもう一つ
ファイルハンドルで3行読み込むのを作ってみたのですがうまくいきませんでした…
どうしたらよいのでしょうか…
while ( $line[0..2] = <DATA> ) {
print $line[0];
print $line[1];
print $line[2];
}
__DATA__
なんたら
かんたら
たらのめ ちょっとサンプル省略しすぎてすみません。
":encoding(cp932)"
等で漢字の表示は問題ありませんm(__)m
while ( $line[0] = <DATA> ) {
$line[1] = <DATA>;
$line[2] = <DATA>;
....
のように分解して書くと問題ありません。(DATAは必ず3行一組になります)
一度に、3行読み込む方法があればお教えくださいm(__)m 都合よく固定長を前提にはできないだろうから、
# 全部読んじゃって
chomp(@_ = <DATA>);
# 3つづつ処理する
while (@line = splice(@_,0,3)) {
print map {"[$_]"} @line;
print "\n";
}
__END__
1
2
3
4
5
6
7
8
9 $text = 'hoge<span class="hoge" id="hoge">"hoge"</span><span class="huge" id="huge">"hoge"</span>huge';
上のような文字列で<〜>(タグ内)に囲まれた"だけ $text = 'hoge<span class="hoge" id="hoge">"hoge"</span>
<span class="huge" id="huge">"hoge"</span>huge';
上のような文字列(改行されてますが1行です)で<〜>(タグ内)に囲まれた"だけ " に置換したいです
s/(<.*?)"(.*?>)/$1"$2/g;
上のように試してみましたが、最初の1つのみ " に置換されるだけです
よろしくお願いします タグの外側だけ置換する方法としては下記がどこかに載っていました
s/((?:\G|>)[^<]*?)"/$1"/g;
タグの内側だけ置換したい場合は>と<を逆にすればいいかと思ったのですができませんでした >>161-163
$text =~ s{(?<=&lt;)(.+?)(?=&gt;)}{ $1 =~ s/&quot;/"/gr }eg; >>164
ありがとうございます
やってみましたがエラーになりました
もちろん&は半角に直しました どんなエラーか解らないことにはなんとも……
ひょっとして、5.14 以前の Perl を使ってたりする? >>166
5.8系です
AddHandler cgi-script-debugが使えなくなってデバッグができないんです
この文法チェッカもいつの間にか消えてました
http://homepage2.nifty.com/sophia0/perl.html teraterm入れてSSH登録してエラーチェックしてみました
Bareword found where operator expected at test.cgi line 7, near "s/"/"/gr"
syntax error at test.cgi line 7, near "s/"/"/gr "
test.cgi had compilation errors. 置換の r オプションは 5.14 からです。従来通り
perl -pe 's{(?<=&lt;)(.+?)(?=&gt;)}{ ( $str = $1) =~ s!&quot;!\"!g ; $str ; }eg'
みたいな感じでどうでしょうか。 >>169
できました!
本当にありがとうございました!
(Perl 5.8.8なのにエラーが出たのは謎ですね) そいや5.24でpushやpop,shiiftなどにリファレンスを渡したときの
自動デリファレンスが止めになったのはなぜ?
折角5.14で入れた機能なのに。 なぜも何も。
もともと「実験的に採用した」って宣言してるし、
失敗でした、って delta に書いてあるし。 perlは、常にunstable ♪
オレの人生もunstable ♫ Windows 7で
tree D: /f > tree_list.txt
これで書き出した物をperlでフルパスに変換したいのですが、
何か良いモジュールなどはありますか? cmd.exe にまかせるがよろし
dir /s /b D: 2>NUL >>176
いまいち良い方法が見つからなかった
再帰処理でがりがり頑張ったけど、ものすごい時間が掛かってしまった
>>177
ありがとう
無事いけた
コマンドライン詳しくないから、NULでひかかった
NULの代わりに、list.txtなどにするとサクッと記録された
速度滅茶苦茶早いなー ループの条件を満たしてなくてもredoでループされるんだけど、そうゆうことでいいのかな >redo コマンドは、条件を再評価しないで、ループブロックの始めからもう一度 実行を開始します
そうかそうか、これが欲しかった。どうも。 ちょっと相談と言うか、バグの原因が想像つかなくてこまっちんぐなんだけど、
$| = 1;
for(.....){
................
.................
print $x;
}
みたいな感じでいっぱいプリントしてる時、
プロセス実行中は8.00KB(8192B)しか出力されないんだよね。
本来は9.22KB程度出力されるはずで、これはプロセスが終了したら出力される。 どうしても即時出力したいなら、バッファリングで検索 10GBくらいのCSVで作成された辞書の文字を置換して出力する場合最も適切な方法はどんな感じ?
すぐ思いつくのは下記だけど、膨大な回数HDDにアクセスして大丈夫かと不安になるがバッファリングされるから影響はないかな?
open(IN,"<Wikipedia.txt");
open(OUT,">>test.txt");
while(<IN>){
$_ =~ s/<|>/<>/g;
print OUT $_;
}
close OUT;
close IN; そら最低の理論値でも10GB分HDDから読み出しして10GB分HDDに書き出ししないとな >>186
単にリードするだけなら10GBは大丈夫だろうけど、
出力のバッファリングが甘いと、何度も書き込みHDDに凄い負担掛かるんじゃないかと思って・・・
因みに、昔は下記みたいにしてた、やたらHDDがガリガリ言ってた気がする
正しい方法はどうするのが良いのかと思ってね・・・
$| = 1;
open(IN,"<Wikipedia.txt");
while(<IN>){
open(OUT,">>test.txt");
$_ =~ s/<|>/<>/g;
print OUT $_;
close OUT;
print $count++;
print "\n";
}
close IN; >>185
単純な置換、大きなファイルサイズなら、
perl より sed 使ったほうが速いかもな。 どんな言語で書いても10GBのHDDをアクセスすること自体に変わりはない。
温度が上昇してエラーになるなら、扇風機で冷やしながら実行するとよい。 そうかなー
スクリプトだとなにやられてるんだか分からない印象だけど そもそも10GBのテキストなんざ、
今の基準で言えば普通よりちょっとデカい程度。
日常的に扱かってる人間からすれば、質問自体が意味不明。
一回こっきりの捨てスクリプトなんだろうから、
検証以前にさっさと書いて終りにすりゃあいい。 でも>>187は毎回やってると流石にHDD痛めそうな気がする
ベストな方法や、やってはならない方法はあるでしょ ちょっと待って>>187は、論外だろ?
これを含めて、ベスト云々を議論すんなら、
「初歩から教えろ」って言ってるのと変らんぞ?
普通に、>>185でいいじゃん。
>>186とか、>>190とか指摘してる通り、
どうあがこうが、10GBの書き込みは生じるんだから。 まぁ俺は10GB程度のファイル、頻繁にDLしたり削除したりコピーしたり色々してるけどな、ほぼ毎日。 プログラムもだけど$|=1;使って動作確認してたり、
バッファリング無し、バッチ処理で毎晩10GB1行毎の書き込みは流石にまずいんじゃない?
185も$|=1;使ったらどんな動作になるんだろ?
187はコードが見やすくなるからテストでは結構使ってる
そのまま忘れてて大きなファイルを解析させてたりもある
みんな185形式で書いてるの? 速度も考えて最近は配列に貯めてからすることがある
ただWindowsだとすぐout of memoryでる まあ自分のPCならサブマシンでもメモリ32Gあるし別に・・・って感じだが でもPerlってメモリの量が異常に増えるんだよね
10MBのデータを読み込んでごにょごにょしてたらなぜかメモリ200MBになってたり
普通にネイティブな言語使ったほうがいいのでは どんなレス考えても、罵倒しか思い浮ばん。
HDDの負担以前の問題だよ。
open/closeを行数分繰替えすのが、
どれだけ時間の無駄(=マシンに負荷がかかる)か実例貼っとく。
$ perl -le ' sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 13.2 0.1 2445400 3344 s002 S+ 8:24PM 0:00.16 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 36471 22.5 0.0 2445400 1664 s002 S+ 8:24PM 24:21.88 perl -le sub ps { print `ps ux $$`}; ps ; for( 0 .. 9999999 ){ open my $h, ">>", "test.txt" ; print {$h} "h" } ; ps ;
CPU time で24分だけど、実際には、9時半まで処理掛かってる。 $ perl -le ' sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;'
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 7.0 0.1 2445400 3324 s002 R+ 9:36PM 0:00.09 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
XXXXX 40081 96.8 0.1 2445400 3340 s002 S+ 9:36PM 0:03.08 perl -le sub ps { print `ps ux $$`}; ps ; open my $h, ">", "test.txt" ; for( 0 .. 9999999 ){ print {$h} "h" } ; ps ;
$ ls -alh test.txt
-rw-r--r-- 1 XXXXX staff 19M 6 12 21:36 test.txt
今の時代の強力なマシンだろうが、こんだけ負担をかける事は、一昔前の人間だったら常識の範囲。
ちなみにフラッシュしようが、出力される量は変動しないんだから、
HDDの負担は変らん。と何回指摘されりゃ気が済むんだ? >>201
今の時代マシーンパワーに物言わせてと言うことが意外と出来きてしまう
勿論、限度はあるけど
朝までに終わればいいわ程度で一度コード作ったらあとは触らないとかね
それと、昔デフラグし過ぎるとHDDが壊れるとか言われてた
出力される量でHDDの劣化が決まるって話だけど、細かいファイルを大量に書いたり作成するのはHDDにとって過大な負担になるんじゃない?
例えばだけど、100GBのファイル一つ書き込むのと、1バイトのファイルを100GB分毎回書き込むのでは違うと思うのだが?
>>198
配列をアホみたいに増やしたらメモリー(SSDで仮想いくらでも増やせるし)が一杯になる前に落ちる >>203
意味不明。
細かいファイルの件なんか、俺のコードにも、>>185にも>>187にも
全く触れられてないんだけど?
百歩譲って、断片化の可能性が高まるのは、open/close を繰替えす
>>187のコード(膨大な処理時間中に他のIOが割って入る)だが、
擁護してんのか晒してんのかも不明。 >>201
> ちなみにフラッシュしようが、出力される量は変動しないんだから、
> HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
出力される量は変動しなくても
書き込み回数は増えるじゃん。
フラッシュって何をやってるのか知らないの?
HDDに書き込まないでメモリに蓄えているものを
書き出す処理だぞ。
だからHDDの負担は増える。 ちなみに、出力される量も実際に変動する。
HDDに限らないが通常書き込みっていうのは
ブロック単位で書き込まれる。
HDDの場合は512バイトだったり最近は4Kバイトだったりする。
1バイトの書き込みでも4Kバイト書き込まれるわけだ。
だからデータ量が1000バイトだった場合、
フラッシュ無しだと4KBの書き込みだが
1バイト毎にフラッシュすると、4KB×1000=4MBの書き込み量になる。
ファイルサイズはどちらも同じ1000バイトであっても
それを作るための書き込み量は違う。 >ちなみにフラッシュしようが、出力される量は変動しないんだから、
>HDDの負担は変らん。と何回指摘されりゃ気が済むんだ?
この二行は、あなたのご指摘通り。
訂正します。
>>187の
>$| = 1;
は、*OUTのフラッシュになんの関与もしていないけど。 >>204
205-206が言いたいこと言ってくれた
擁護でも晒すわけでもなく、より適切な方法が見つかれば良いと思う
185にしても、もっとバッファリングしてやればHDDへのIOが減りHDDの負担は減るんじゃないかなと
標準だと4/8KBでフラッシュしてるよね、これを100MBにすればHDDへの負担はぐっと減りそう
今時のキャッシュ大きめのHDDでどの程度意味があるのか分からないし
寿命に影響するかどうかは分からないけど毎日繰り返す処理なら意味があるかも
>>207
そうなの?って思って調べてみた
http://mikeda.hatenablog.com/entry/20090503/1241365884
みたらselectしないと効かないっぽいな 夏場なんで、while ブロックの先頭に
sleep 2 unless $. % 10000;
を入れるとよい。2つの数字は調整してみてくれ。 #!/usr/bin/perl -w
use strict;
use File::Path;
use IO::File;
sub diskstat {
system( https://ideone.com/fUNKyh
このプログラムの意図 : >>185 と >>187 の違いがディスクアクセスに及ぼす影響の検証。
明らかに >>185 よりも >>187 の方がシステムコールの回数が多い。
しかし、それだけでディスクアクセスに違いが出てくるわけではない。
実行時間を同程度にしてみたらどうなるだろうか。
実行する前に
grep sda5
の sda5 を環境に合わせて書き換えてほしい。 > 実行時間を同程度にしてみたらどうなるだろうか。
実行時間を同程度にしたら、遅い方の書き込み量が減るから
比較にならんだろw プログラムを見てくれてないのかな……だとしたらその時点でもう対象外なんだけど。
ろくに見もしないで何を想像したの? そう言えば古いDiffソフト(AikoWin)やたらHDDガリガリ音鳴ってたな
あれ読み出しが少しずつでHDDに相当の負担が掛かるとか聞いたことがある
細かいファイルを書き込むのも良くないけど、自分でソフト作る時にには
呼び出しも気を付けないとまずいんだよなー もう少しマシなプログラムを書いてみたよ。
https://ideone.com/Nh4Esi
Linux 限定だけど無修正で実行できる。
実行時間は 5 分くらいかかるよ。正確なデータを得るにはそうした方がいいみたいなんだ…… 自分の実行結果を書いておくよ。
sub f_a {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 0);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_b {
my $fh = IO::File->new( &genfn(),'>') || die( $!);
$fh->autoflush( 1);
$fh->print('h') foreach 0 .. 65535;
$fh->close;
}
sub f_c {
my $fn = &genfn();
foreach ( 0 .. 65535) {
my $fh = IO::File->new( $fn,'>>') || die( $!);
$fh->print('h');
$fh->close;
}
}
これらを 16 回ずつ実行した結果、f_a,f_b はそれぞれ 2232 セクタ、
f_c は 2224 セクタ書き込んだみたいだよ。もちろん書き込んだ回数だよ。 https://ideone.com/K0qeSx
もう少しユーザーフレンドリーな感じにしてみたよ。これで最後だよ。
Windows ではこういう情報を得る方法は無いの?
非同期書き込みが無いのなら彼らの言うことも間違いではないんだけど。 $ perl -p -e 〜
となっているのですが、-p と -e の意味を教えてください。 一行構文のOPだとわかりました。
しかし、
C:\perl\bin\perl -e 'for $i (@ARGV) { print $i ,"\n";}' args1 args2 args3
をWindows環境で実行すると
Can't find string terminator "'" anywhere before EOF at -e line 1
と出てしまいます。
解決方法を教えほしいです。 'print "\n"'ではなく"print qq(\n)"のように C:\perl\bin\perl -e 'for $i (@ARGV) { "print $i ,qq(\n)";}' args1 args2 args3
で試したがダメでした… >>221
俺は昨日から始めたんで確かなことは言えないけど、
DOSプロンプトだと、''で括ってもダメだったよ
(何か設定があるんだけど昨日からなんで...)
例えば、
perl -e 'print "hello"'
は
perl -e "print \"Hello World\n\""
ってしないと動かなかった よくよく考えたら、コマンドプロンプトで''はいけるはず無いよね
だって、まずコマンドプロンプトで命令が解釈されるわけだから
'a b'だと、連続した文字列とはならずに
'aとb'の2つの引数が指定されたと受け取られちゃうわけだしね DOS/Windowsコマンドプロンプトのクォートは "
UNIXのシェルのクォートは '
ただそれだけ
コマンドプロンプトのクォートとして "" を使っているから、Perl部分は
qq() を使ってる ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか
どっかの国のどっか語でファイル名書いてあって、ファイル一覧を入手したら全部文字化けみたいな感じになってて困った まず、そのファイルが壊れてないかどうかエンコーディングが判らないことには確認しようがありません。
そして、そこに書かれているファイル名が正しいとしても、問題はそのファイル名で何をするかです。
ファイルを作成するとしたら少々困難を伴うと思いますが、何をしますか?
もう少し説明が欲しいです。 1: ファイルは壊れてないです。あとファイルの中身はどうでも良くて困ってるのはファイルですね。
2: こちら側からバイナリを含めて希望してるのでそもそも文字コードは問わないです。
なおwindowsですので強制的な解釈としてはcp932でしょうか。文字かどうかは不明ですか。
3: 書いてある通り、ファイル一覧を入手したいです。(と言うよりすでにしました)。その時点での文字化けについてです。 >>224
単にprintのあと改行したいだけなら、面倒なエスケープを避けてsayを使うのが楽だと思う。
perl -E ‘say “hoge”;’ >>231
CPANにあるWin32::Unicodeを使ってみてはどうだろう。 ちゃんと話を追ってればシングルクォートではコマンド文字列をperlに渡せないってことを理解できるのに
だから>>220では全体をダブルクォートで括ってるわけ >>231
「そのファイルが壊れてないか」と書いたのはファイル一覧のことだったんですが……
まあ、それは置いといて。
困っていると言われても、何をお望みなのかよく分かりません。
マルチバイト文字を作成者が意図した通りの文字として読みたいということなら、
やはりエンコーディングを知る必要があります。
そして、そのエンコーディングを扱うことが出来るソフトウェアと、もちろんフォントも必要です。
どんな環境で、どこからどのような手段で入手して、何をして文字化けだと思ったのか、
それがどうなるのが望みなのかを書いていただけないと、お役に立てそうもありません。 ファイル名はテキストだろ。
バイナリのファイル名など、聞いたことがない
フォントが無いだけで、たぶん正常だろ。
それか、ファイル一覧を表示している、端末の文字コードが違うだけ
そのファイル名をエディタにコピーして、色々な文字コードに変えて、試してみる 先日も申しましたが、ファイル名はOSの仕様によってcp932扱いで表示されたバイナリです。
windowsにおけるバイナリとテキストの違いは、改行など一部の文字の解釈です
すなわち、ファイル名を入手した時点で破損しています うーん・・・
関係ないけど
ハートマークのファイル名作ったけど、
ちゃんと表示できたよ >>238
「ファイルはテキストだが何のコードでエンコードされたものかわからん」をcp932で開いた
ではなくて
「cp932でエンコードしてしまって、もう元のファイルの情報は欠けてしまった文字化けファイル」を開いた
ってことか? >>238
破損とは何か。期待値と実際値を言わないとわからん もう一度聞くけど、どこからどのような手段で入手して、どうやって見てるの?
どうなってほしいの? 使ったソフトウェアの仕様はちゃんと理解できてるの? Aディレクトリの中のファイル名をopendirでとってくる。
この時のファイル名ってどう言う扱い?バイナリ?テキスト?コードは?フラグは?
とってきたらそれがすでに破損してて開くこともできない。 もちろん cp932で定義されてる範囲のバイト列ではバグらないよ -------------------------------------------------------
Perl に関係ない話題は、以上で終了。 >>ファイルの中身じゃなくて、ファイル名をバイナリかなんかで扱いたいときはどうすれば良いでしょうか
特別なことをしなければバイナリで扱うことになる。むしろファイル名は文字列では扱(え|わ)ない。 Perlを使って下記のように2文字半角スペースを入れたいのです。
0015000008006a3376 -> 00 15 00 00 08 00 6a 33 76
下記を教えて貰いましたが旨く出来ません・・・アドバイス願います。
$ perl -p -e 's/(..)/$1 /g;'
001500 -> 00 15 00 いや、ちゃんとその通りになったけど……どううまくいかなかったの?
末尾にスペースが入っちゃいかんとかなら、方法はあるけど。 試したのは下記ですが、進まないと言うか終らないんです。
連続数字は変えますが・・・123456に変更
perl -p -e 's/ 123456/$1 /g;'
perl -p -e 's/(123456)/$1 /g;'
perl -p -e 's/( 123456)/$1 /g;'
perl -p -e 's/\(123456\)/$1 /g;' >>252
色々と試行錯誤した中で試してみましたが、ドットを入れるならスペース入れても
同じような・・・
perl -p -e 's/(12.34.56)/$1 /g;' もう連続した数値を2桁ずつ区切るとは話が違ってきてるぞ
まあ色々試しているんだろうが、まず正規表現をちゃんと勉強した方が結局は早道だよ >>253
正規表現を使っているという事は理解してる?
ドット一つは「任意の一文字」を意味しているのだけれども… $string = '012345';
$string =~ s/(..)/$1 /g; s/(..)/$1 /g
( ) で囲むと、キャプチャーできて、$1〜9 で後方参照できる。
. は、任意の1文字だから、.. で2文字
その2文字を、$1で参照して、その後ろに、半角空白を付けている。
$1の後ろに、半角空白があるだろ
g(global)フラグは、すべて置換する
だから、ab なら、ab半角空白 となる。
正規表現の説明を参照 質問者は本当にやりたいことを隠して質問してるからもうどおでもいいけど
なぜ perl -p -e 's/(..)/$1 /g;' でうまくいっちゃうんだろうね。
ぱっと見だと
001500 -> 00 01 15 50 00
になってもおかしくないのになと思った。 >>249->>258 皆さまスレ汚してすみませんでした。
Perlは使うばかりで、プログラミングはど素人です。
(..)は顔文字だと思っていました・・・お恥ずかしい
○○○@H170M-PLUS ~
$ perl -p -e 's/(..)/$1 /g;'
123456
12 34 56
あ〜スッキリした。
有難うございました。 >>258
1234なら、12 23 34 にはならない
.. は2文字に一致するから、12に一致する。
すると次は、3からスタートするから、34に一致する
つまり、一致した次の文字から、スタートする なるほろー。
最初はこんな感じが頭にうかんだけど冗長だね。ワンライナー3級ですな。
perl -ne 'for( $i = 0; $i < length() ; $i += 2 ){ print substr($_,$i,2)" " }' >>243
もう見てないと思うけど、一応書いとくよ。君はまず、
Perl readdir Windows
でググってみるべきだった。 複数の文字列フィルタ (grep や s) を連続で通す書き方って、どうだったっけ?
ある文字列を
・grep でフィルタ → grep で再度フィルタ → s で置換 → split で分割 → 先頭要素だけスカラー変数に格納
これをスマートに(可能ならば1行で)やりたい。 @result = map {(split //)[0]} map {s//;$_} grep {} grep {} @strings;
こんな雰囲気でええんでないかい? mapやgrepを一行で複数書くのはアホの代表だと思いまーす 基本的に日本語で書いたときの逆順に記述するだけなんだけどね
マニュアル読んで分からなければたぶん無理だろう id="011"<width>1</width>
この文字列から011だけ正規表現で抜き出す方法教えてください
idの数値だけを抜き出したい >>270
これで文字列全体?
その前後にいろんなタグがありそうないやな予感がするんだが? >>271
ありますが、かなり長いxmlなので必要だと思った部分だけ抜き出しました
もう少し抜き出してみるとこんな感じです
source="http://hogehoge.xml" />
<name="foo" id="0110"
このような文字列が大量にあってそのなかからidの数値だけが欲しいです >>270
/id="([0-9]*)/g
これでできたような気がします HTMLパーサーを使うのが一番簡単で正確
コメントの中にHTMLがあったらどうするんだ?
つーか正規表現を乱用するな。 >>270 だとタグの外にあるように見えるのに >>272 ではタグの中になってる。
だから静観してたけど、結局どっちなの? なんか最初のだと後に<width>のある特定のidの値が欲しいのかな?って思ってたけど
そうでもなくて全部のidの値でいいんだってのが>>273でわかったんで拍子抜けしたところ 宜しくお願いします。
$ua->cookie_jar(HTTP::Cookies->new(file => "cookie.txt",autosave => 1));
でcookie.txtにクッキーを取得できるのは分かりますが
削除したい場合にはどのようなコードを書くんでしょうか? そういえばいつもお世話になってるのに知らないな……と思ってマニュアルを読んでみた。
どうやら clear を使うらしいな。まずは scan で中身を見てみるのが良さそうだ。
これ以上は説明のしようがない。自分で頑張ってほしい。 マルチプロセス処理の Parallel::Prefork は、
Windows の StrawberryPerl か ActivePerl に、インストール可能ですか?
http://pass.cpantesters.org/distro/P/Parallel-Prefork.html
Strawberry、Active、旧バージョン、32bit、64bitなど色々試したけど、
>Can't locate Parallel/Prefork.pm in @INC (you may need to install the Parallel::
>Prefork module) (@INC contains: C:/... 突然文字が正しく表示できなくなるゴミPerl
人をイラつかせるために作られた言語だなこれ
存在価値がないどころか存在事態が害悪
早く消滅すればいいのに マジで使い物にならない
「ゴミPerlで文字がいきなり変になる対処」
「産廃Perlの文字取り扱いがおかしいのをなんとかする方法」
「糞Perlが文字をまともに扱えないことへの特効薬」
もう数時間検索してるが解決案が出てこない
こんなに酷い言語はPerlくらい Perlは本物のゴミ
文字すらまともに表示できないとか利用価値なし Perlのゴミなところ
文字「あ」すら表示すらできないためとてつもなくイライラする 明日納品なのに解決する兆しなし
こういうときは一から書き直すことも多いが何千行もあるシステムを明日までに書き上げられるわけもない
本当にPerlはゴミすぎる だからバイナリで扱えと口が酸っぱくなるほど言ってきたわけで聞き入れないお前が悪い。 テンプレの>>5 を誰かが勝手に変えたからだ。
元々はこうなっていた。
http://pc12.2ch.net/test/read.cgi/tech/1234181856/4
------------------------------------------------------------
# [Perl 日本語処理の基礎の基礎]
# このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。
# このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。
# 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。
# まず、以下の行を先頭に入れて下さい。
use utf8;
use open IO => ありゃ?途中で切れちゃった。>>291のリンク先見てね。 とりあえず Data::Dumper と PerlIO::get_layers を使えば助けを求めるのに役立つと思うが
責任転嫁しかできないゴミに言ってもなぁ…… >>285 それからな、
> ゴミPerl
> 産廃Perl
> 糞Perl
どれも、なかなかいいところを突いているが、ちょっと外れているな。
正解は「ガラクタ」だ。
Perl とは「pathologically eclectic rubbish lister」
(病的折衷主義のガラクタ出力装置)の 略なのだ。 内部エンコードはperl独特だよね。
扱えれば入力と出力がどんなエンコードだろうが無双出来るけど >>294
「Perl を愛する人にとっては」と前置きするのを忘れてるぞ。 まぁperlなんて使い物にならないでしょ
use utf8;付けたらそれまで文字化けしなかったUTF8の文字列が文字化けしたし ではperlじゃないならなにがいいのかな。python?
rubyはパイプ記号が変なところで出てくるからちょっと違和感有り。 賭けてもいいが、文字コードが分からないのをPerlのせいにしてるやつが、
自分で1からプログラミングしたら壊滅的な状況になると思う。 >賭けてもいいが、文字コードが分からないのをPerlのせいにしてるやつが、
>自分で1からプログラミングしたら壊滅的な状況になると思う。
意味不明な言動をする気違い。
「賭けてもいいが、腹が痛くなるのを残飯のせいにしてるやつが、
自分で1から料理したら壊滅的な状況になると思う。」
と言ってるのと同等で意味不明。
気違い。 自分で料理出来るのであれば、残飯なんて最初から食べないよ…
残飯を食べるという事は、食べざろうえない理由があっての事だろうに… すくなくとも腹痛を人のせいにしなくてすむんじゃね? 高級料理も残せば残飯になるのさ。
最後の姿を見ただけで、本来の姿を判断するのは
無能というもの。 文字コードが分からないのをPerlのせいにしてるのは馬鹿の上限を突破してるが、
腹痛を残飯のせいにするのは間違ってないだろう。食ったと言う意味では馬鹿だが どんなに文字コードを理解している人間でも文字をまともに扱えないピログラム言語の前では無力
その程度のことも分からないのかはたまたPerlがまともな言語だと錯覚しているのか
もし錯覚しているならば自分の使っている言語についてほとんど何も知らないということになる
まずはその自覚をすべきである 参考までに聞くけど、文字をまともに扱える言語って何? んで俺も文字をまともに扱える言語がなにか気になるわけだが
310とは別人 文字は知らんけど、
Perlってあらゆる面でPHPより劣ってるよな。 PHPってHTML言語じゃないの?比較の対象にもならないと思うんだが。
rubyに負けてるというならまだわかるけど。 >>314
HTML言語ってなんやw
HTMLに埋め込めるってだけでごく普通の
プログラム言語だぞ。
どれくらい普通かというと以下の機能が搭載されてる
・クラス
・インターフェース
・トレイト
・ラムダ
・クロージャー
・名前空間
・例外
・ジェネレーター
・ガベージコレクション
あと言語機能じゃないが、CLIプログラムの作成や
ウェブフレームワークなどもある。 >PHPってHTML言語
Perl厨は他の言語をロクに知りもしないで
敬遠してるんだろうな。
だからPerl厨はいつまで経っても
エンジニアとして半人前なのだろう。 309ではないがC言語。もちろんPerlもだ。
ついでなんで
s/ピログラム言語/プログラム言語/; Cって純粋なC?
ご冗談を。
あれは何も文字を扱ってないよ。
自分で作って下さい、ってね。 >>316
だからなに?
その機能'(笑)はわざわざ書かなくてはならないことなの?
だから文字の扱いに対してもおかしな考えを持つんだね。
文字を扱うのは言語の機能(笑)が大事なんだってね。
基本プログラムが出来ない人はスクリプトが持つ機能とやらに注目したがる。
自分でプログラミングできないからね。 普通のunix処理系にperlは入ってるけどPHPは入ってないでしょ。
Webプログラミングなんてどうでもいい。システムプログラミングとか
テキストマイニングしたいんだって動機から入るとぱっと見PHPは目に入らないよ。
紹介がWeb用ですなんだし。
幼児的に誹謗中傷しないで諭すコミュ力をつけたほうが。。 PerlとPHPを比較するって事自体、CGIの定番としてPerlが使われはじめた15〜20年ぐらい前の話だから >>320
> その機能'(笑)はわざわざ書かなくてはならないことなの?
わざわざ書かないとわからないでしょ?w
これ以外に何が必要なんだい?
言ってみ。 質問者が言う文字だ
質問じゃなくて子供の八つ当たりに見えたが 普通のunix処理系wwww
普通てwwwwwwwwwww
こんな曖昧でいい加減な単語を使って反論になると思ってんのかwww
こんな客観的数値も示せない思い込みが根拠になるなら
普通の人間はPerlなんざ使わねーよwwwwwwwww
普通の人間はなwwwwwwwwwwwwwwwwwwwwwww perl-5.24.0.tar.gz 開いて見てみたけど
ソースはC言語で書かれているんだよね
作った人は「自分で作って下さい」を実行したんだろうね 文字を扱うのは人間。Perlが扱っているのは文字コードな。 >>316
post/getがよしなにスーパーグローバル変数(笑)に入ったり
何もしなくてもエラーがブラウザで見られたり(言語がhttpプロトコルを理解できてる?)
iniファイルで挙動が変わったり
ごく普通のプログラム言語からはかけ離れてるだろ
Javascriptの方がよっぽど普通なんだけどなぁ > post/getがよしなにスーパーグローバル変数(笑)に入ったり
それは10年以上前の話だよw
知識止まってんなぁ。 >>330
お前の使ってるナウ(笑)なPHPはquerystringに値いれてもvar_dump($_GET)するとnullなの?
言語って10年経とうが根本的な部分はそうそう変わんないだぜ >>331
Perlでは グローバル変数$ENVの$ENV{'QUERY_STRING'} に
querystringが入るけど、それと何が違うん? >>332
それはCGIとかがquerystringを環境変数へセットしてるだけであって(postは標準入力)
環境変数や標準入力、argsを読む機構はperlに限らずどの言語で備えてるでしょ。
デリミタも指定せずname[]のようなオレオレ仕様で勝手に解釈して予め変数に入れるのを
言語のレイヤーで行うのはphpぐらいしか思いつかない。 いきなりなんの前触れもなかったし、何言ってんだ?と思ったら、PHPのdisりかよ。
知らんがな… 言い訳が苦しくなってくると、最後に「だけ」を付加するPerl厨
窃盗犯が「ちょっと借りただけだろ」と言い訳するのと同じ
犯罪者と同じ思考パターンを有するPerl厨
ちなみに犯罪者と同じ思考パターンを持つヴァカがPerlを選ぶのか
Perlを使ってるうちに犯罪者と同じ思考パターンを持つようになるのかは不明
どちらにせよPerl厨はヴァカで犯罪者予備軍ということに変わりはない
まともな人間はPHPを選ぶ 今時仕事にも趣味にも役に立たないPHP選ぶバカはいないだろ >>334
php以外の該当する言語を一つあげるだけで完全に論破できるチャンスだよ! はいはい。犯罪者予備軍ね。NGにしときますわ。
やりたいことやりたい人は処理系にこだわりはないのにアホか。
コード書けない中学生がVBよりVCと言ってるのと変わらんわ。 >>340
逆だろ?
PHPが他の言語と一緒だということを証明するために
他の言語でもあるような機能を言う。
PHPは他の言語と同じであることを示すことが、正しい論破の仕方だ。
PHPは「他の言語+αの機能」であるという事実に対して
それと同じものを出すことで、何を論破することになるのか? そろそろ邪魔くさくなったから消えてほしい
劣等感のかたまりは迷惑関係なく必死で長所をアピールしはじめるってね
適切なスレでやってくれんかね 嫌なら見なければいいのに
他人にあっちいけとか指示する池沼っているよな。
自己中心的な池沼のお手本。 他プロセスでファイルをopenしているときにそのファイルをrenameしようとすると
renameできないみたいだけどうまくrenameする方法は? >>346
それだとopenとcloseする間にrenameが割り込むとだめ
そこで自分で方法を考えました
まずディレクトリにaccess_kinshi.datというファイルを作ります
このファイルが存在している間は他プロセスでこのディレクトリにあるファイルは全てアクセスできないものとする
そしてディレクトリ内にあるファイルを全てrenameする
そのあとaccess_kinshi.datファイルを削除すればいいということです 他のプロセスってなに?
どっちもPerlで自分の作った物なら、ファイルロックでも使うと良い。
自動待機してくれる 後方参照で教えていただきたいことがあります。
A 80 90
(空白の部分はタブかスペース)
と書いてあるファイルの80とか90の部分を書き換えたいのです。
perl -pe 's/^([A-Z])(\s+)([0-9]{2})(\s+)([0-9]{2})/$1$2$3$4$5/' file で
マッチした部分を参照できるのはわかっているのですが、この場合$3の「80」を「1」にするには
どのような方法をとればよいでしょうか?
perl -pe 's/^([A-Z])(\s+)([0-9]{2})(\s+)([0-9]{2})/$1$21$4$5/' file とすると
$21と解釈されるようで結果がA 90となってしまいます。 シェルスクリプトと同じで、{} で変数名を明治する。
/${1}${2}1${4}${5}/ >>351
出来ました!!
{}で囲むのは思いつかなかったです。 >>349
他プロセスとは同じプログラムを複数で同時実行したやつです
それとファイルロックだとディレクトリにあるファイル1つ1つにロックしなきゃならないので
ディレクトリにあるファイル全てにアクセス禁止するために
アクセス禁止用ファイルを作りました スクリプトを動かすときは、「動きますように」と昭和する。 自分で考えているというのは大変良いことだと思うけど、聞きたいことがあるなら
環境くらいは書いてくれないと……
それに、使用中のファイルを rename することの何が問題なのかさっぱり解らない。
まず、何をするプログラムなのかを書いた方がいいと思うよ。 なんか書き込こもうとするとエラーが出て書き込めないわ ようするに
てすと1シージーアイ
OPEN(IN、”あああ.DAT”);
すりーぷ(5);
cLOSE(IN);
てすと2シージーアイ
リネーム(”あああ.DAT”、”AAA。DAT”);
これを同時実行してもリネームはできなかったってこと 同時実行って言ったけど先にてすと1の方を起動して5秒以内にてすと2を起動です 他のプロセスが開いているファイルを、更新できるわけないだろ
2つのプロセスで、ファイル共有できるのは、read & read、の組み合わせだけ。
read & write, write & read, write & write は、共有できない >他のプロセスが開いているファイルを、更新できるわけないだろ
何を前提に話してんだ?
更新出来るから、ファイルロックなぞの方法が開発されたんじゃねーの?
$ for i in 1 2 3 4 5 ; do
> perl -le 'open my $f, q{>>}, q{foo.txt} ; print $f q{foo} ; sleep 2' &
> done
$ cat foo.txt
foo
foo
foo
foo
foo >>361
更新 ”できないようにする" から
ロックなんだよ。アホかw >>362
ん?
(デフォの状態では)更新出来るから、
(更新出来ないようにするための)ファイルロックなぞの方法が開発されたんじゃねーの?
ってレスだったんだが、、、 更新できるのは、同一プロセス内のマルチスレッドだろ
だから、マルチスレッド・プログラミングは難しい ファイイルロックのモードは2より5のノンブロッキングの方が軽いですか? >>365
軽いかどうかで決めるんじゃない。
それが必要かどうかで考えろ。
ホント頭が悪いやつは、軽いかどうかの基準しか
持ち合わせてないんだよな。 上の2行は頭いいように見えたが
下の2行でホントに頭が悪い人だと思った。
誹謗癖はやめようね。嫌われるよ。というかすでに嫌われてると思うけど。 ノンブロッキングは、Node.js などが並行処理で、リクエストを受け付ける場合に使う。
こういうのは、プロ中のプロが使うもので、プログラムも順序通りには進まないから、
プログラミングが極めて難しい(イベントドリブン)
初心者は、ブロッキングを使え。
プログラムは一本道で、順序通りに進む >>358
少なくとも Linux では問題なく rename できるよ。
rename できないというのはシステムコールのマニュアルに書いてあるの?
テストのやり方に問題は無かったの? こんなふうに同期させた方がいいと思うんだけど。
https://ideone.com/639PgP このようにflockをネストするのは問題ありますか?
open(IN, "< $datafile");
flock(IN, 1);
open(IN2, "< $datafile2");
flock(IN2, 1);
close(IN2);
close(IN); >>371
windows環境だけどopen中のファイルのrenameはできなかった
例えばtestディレクトリがあって、プロセスAでtestディレクトリにあるファイルのrenameやファイルの作成、
プロセスBでtestディレクトリを削除するとした場合
testディレクトリにファイルが残っているとrmdirが成功しないのでtestディレクトリを削除できない
unlinkでtestディレクトリのファイルを全て削除してからtestディレクトリを削除しようとしても
その間にプロセスAでファイルが作成された場合ディレクトリを削除できない
だからディレクトリそのものをロックしたいっていうこと >>373
そういうことを先に書いてくれないと……
そうか、Windows ではできないのか……
プロセスAの処理が終わるまでプロセスBを待たせておきたいということなら
普通に mkdir でどうでしょう。可搬性も高い排他制御の定番です。 >>373
File::Path -> remove_tree
http://search.cpan.org/~riche/File-Path-2.12/lib/File/Path.pm 何が目的でそのための何をしている状況なのかというのがいまだに理解できないんだけど、
そもそもそんな状況にしないやり方を考えた方がいいのかもしれない。
どうしても排他制御が必要なら例えばデータベースを使うというのは Windows でも出きると思う。
Windows のことは知らないからこれ以上はお役に立てそうに無い。 簡単に言うとディレクトリをmkdirで削除したいけど
削除しようとしている間にディレクトリ内にファイルを作られるとmkdirできなくて削除できないので
ディレクトリ内にファイル作成もディレクトリ内のファイル読み込みも禁止にしたかったってこと 任意のプロセスがアクセスできるディレクトリを削除したいという要求自体が間違っている >>380
bbsディレクトリの中に各掲示板ごとのディレクトリがあって、さらにその中にログファイルや掲示板設定ファイルがある
削除したい掲示板は各掲示板のディレクトリごとに削除するしかないのでどうしても任意のプロセスがアクセスできる
ディレクトリを削除するしかない
test1掲示板の場合
ファイルはbbs/test1/logfile.datとbbs/test1/settei.datがあって
掲示板を削除する場合はまずこの2つのファイルを削除してtest1ディレクトリを削除するということです その掲示板とやらのディレクトリは本当に、自分のプロセスだけでなく任意のプロセスからもアクセスできるのか?
であれば、ディレクトリのパーミッションが間違っている。自分のプロセス以外のアクセスを禁止せよ。
自分のプロセスしかアクセスできない前提であれば、好きなように自分で排他制御を行えばよい。例えば>>375のように。 >>382
普通の掲示板やで
普通掲示板は誰でも観覧と書き込みができるので任意のプロセスからでも読み書きできる
それとディレクトリの削除はブラウザからperlで書いたcgiを起動して削除するので
パーミッションでのオーナーとかの判別はできないんや 掲示板のcgiが動いてるプロセスは掲示板を閲覧しているユーザとは関係なかろうが。
これ以上はperlの話ではなく、そのcgi固有の話だ。
ここでやる話ではない。 my(@aaa);
@aaa = sort {$b <=> $a} @aaa;
このとき$a,$bをmy($a,$b)やlocal($a,$b);と宣言するとエラーになります
$a,$bはどのように宣言すればいいんですか? aとbはあらかじめ用意された特殊変数。
特殊変数は全部グローバル変数 >>378
他のプロセスに使われる前にディレクトリ名をランダムな名前に変更
するとよい。変更後に rmdir する。 1:投稿ファイルをロックして書き込み
2:投稿数ファイルをロックして書き込み
1の排他ロックが成功して2の排他ロックが失敗してタイムアウトになり書き込みできなかった場合
投稿数が実際の投稿より少なくなりが整合性がとれなくなる
この場合下記のようにまとめてロックするのが普通?
まとめ排他ロック
1の処理
2の処理
ロック解除 >>388
そういう場合はまとめた単位でロックを取ることが多い
あるいはロールバックできるようにするしかないけど、それはたいてい難しい 1:投稿ファイルをロック
2:投稿数ファイルをロック
3:投稿ファイルを書き込み
4:投稿数ファイルを書き込み
5:投稿ファイルをアンロック
6:投稿数ファイルをアンロック PostgreSQLのTIMESTAMP形式の文字列を秒数(Perlのtime関数で取得したような状態)に直す関数教えて use DateTime::Format::Pg;
print DateTime::Format::Pg->parse_datetime( '2016-08-21 23:50:01' )->epoch; 実行時間が0.15秒から0.2秒のperlスクリプトは重い部類ですか? >>390
データとは別にロック中か識別するためだけのロックファイルまたはディレクトリを用意するものなんじゃないの?>>389のように 1:投稿数ファイルをロック
2:投稿数ファイルを書き込み
3:投稿数ファイルをアンロック
4:投稿ファイルをロック
5:投稿ファイルを書き込み
6:投稿ファイルをアンロック
じゃだめなのかな。 それ投稿数と投稿が連動してないやん
ロック
必要な書き込み全部
ロック解除
が普通 それは「普通」というより「手抜き」だね。最初はそれでいいと思うけど。 >>398
普通じゃなくて天才だよ。
完璧な答え。 まあ質問の直後にいきなり答えが書いてある
それを分からないのが混ぜ返してるだけだ
>>388-389 (書き込み時)
1:まとめロックようファイルを作る
2:まとめロック用ファイルを排他ロックする
3:投稿ファイルにを投稿を書き込む
4:投稿数ファイルに投稿数を書き込む
5:まとめロックの解除
(観覧時)
1:まとめロック用ファイルを共有ロックする
2:投稿ファイルを読み込んで表示する
3;投稿数ファイルを読み込んで表示する
4:まとめロックを解除
これが正しい >>393
何のために数字が振ってあるのか分かる? なんのため?
プロセス間の整合を取るのにプロセス内の順序は全く意味ない数字と思うけど。
うーん、なんのためだろ?教えてくれないかな? > プロセス内の順序は全く意味ない数字と思うけど。
え? 順番を入れ替えても同じなると思ってるの?
例えば5 → 1 → 4 → 3 → 2 → 6 の順番で
実行しても同じ結果になると?
ロックの話以前に、あんたが何が言いたいのかわからない んでなんのため?
あと関係ない話しかしてないようだけど、同じになるって情報はどこから?
そしてその話になんの意味があると思い込んでますか? >>390が書いてあることは正しくて、
この順番通りの処理をすると不整合が起きない。
重要なのは書き込みを行う前に書き込むファイルすべてを
ロックするということ。最初にまとめて行う。
こうすることでロックの間に処理が割り込まれず
正しく書き込むことができる。 ここまで正しい回答が何度も出てるのに、そのあとから間違った回答を自身満々にするのもすごいと思う
ロックは常にプロセス間の整合のみ取るべし ごめん。外部仕様としてはこの場合正しかった。
内部的にはやってはいけないお手本のような無意味なロックがされてて、それで勘違いした。すまんかった。 確かにロックはプロセス間通信の一種で使う技術も同じか
こうゆうのはスクリプトをプログラムと思ってる人と、プログラムの基礎的な部分から学んだ人とでは差が出そうだね windows7で文字化けファイル名を取得するとショートファイルで得られるようですが、
ロングファイルのビットの並びをそのまま得たいです。
指定して得るにはどうすれば良いでしょうか?
ちなみにDOSなどでのコマンドは知っています。 `dir /b *.*`
次スレのテンプレに追加するから コマンドじゃなくてPerlでどうにかしたいのだけど my @file = split(/\n/,`dir /b *.* 2>NUL`);
# あとは夏休みの宿題、な すまん、回答してるつもりだろうけど、頭悪い人に用はないんだ。
わざわざ何度も書いてる様だが、一番最初に(も)言った通りコマンド使うやりかたはできるから。
あと全レス会話の繋がりもなく、堂々と好き勝手なこと書く人間もしんどい。 いや、君の記述能力が頭悪いんだよ。
流行の言葉で言うとコミュ力やプレゼン力がない。
コマンド知ってますなんて言い方じゃ伝わらない。
少しは自分の不徳を省みたらどうか。 再現出来る環境無いんだけどWin32::GetLongPathNameはどうかな >>422
すまないがそれでは得られる文字は同じで、文字化け文字にはショートが適用されます。
おそらくwindowsに対するアプローチを変えないとだめだと思うのです。
>>421
いけたよありがとう。
API叩いてやりくりしてたけど、暫定的にそれを使わせてもらうよありがとう。
windowsは外部的にもさっさとunicode使ってほしいと思う。
>>420
その無駄な4行必要か?なんか書きたいなら頑張って回答書けば?(俺としては書かないで頂きたいけどな) まあとにかく特殊な環境なんだね。もう少し前提条件を書いたほうが早く欲しい回答を得られたと思うよ。
>>413の書き方じゃ>>420に文句を言う筋合いはないよ。 どうでもいいけど特殊な環境じゃなくてwindows標準の仕様かと なぜ化けるのか、と言う話だ
CP932とunicodeが混在してる場合はどうすりゃいいですかって話じゃね ココ参考にして ttp://hirobanex.net/article/2015/03/1425807814
こういう呼び出ししても
$teng->sql_builder->load_plugin('InsertOnDuplicate');
$teng->sql_builder->insert_on_duplicate(略)
Can't locate object method "insert_on_duplicate" via package "Teng::QueryBuilder"
で呼べないんだけどどうしたらいい? ちなみに
__PACKAGE__->load_plugin('+SQL::Maker::Plugin::InsertOnDuplicate');
でもダメ PODに別パッケージから plugin生やす方法なんて書いてないでしょ マジレスするなら、
別の方法で呼べるか試してみる
何が起こっているのか調べてみる
ってところか。 はっきりしてるのはhirobanexのとおりに書いてもエラーで動かない事
それも $teng->->execute なんていうタイポレベルの話じゃなく
根本的にどこか間違ってるけど、どこだかわからんということ
$teng->sql_builder ってSQL::Makerを継承した状態でnewされてるんじゃないの?
Teng::QueryBuilder = SQL::Maker だから
これで動くんじゃないの?
$teng->sql_builder->load_plugin('InsertOnDuplicate');
$teng->sql_builder->insert_on_duplicate(略) $teng->sql_builderでTeng::QueryBuilderのオブジェクトが帰ってくる
これはほぼSQL::Makerを継承しただけなのでSQL::Maker::load_pluginを読むとどうやらクラスメソッドとして書かれている
実際SQL::MakerのPODにも継承したクラスでクラスメソッドとして呼び出す例が書かれている
つまり $teng->sql_builder->load_plugin('foo') という書き方はオブジェクトから呼び出してるので間違い(おそらくTeng::QueryBuilder=HASH(0x000000)みたいなところに生えてる)
Teng::QueryBuilder->load_plugin('foo') とするか ref($teng->sql_builder)->load_plugin('foo') とするか
もしくはブログの例にもある通り独自のQueryBuilderクラスを用意するか
>>429
この__PACKAGE__はどこに書いたんや?__PACKAGE__の意味わかってる? もう、馬鹿過ぎて哀れだ。実際にやりたいことは
*SQL::Maker::insert_on_duplicate = \&SQL::Maker::Plugin::InsertOnDuplicate::insert_on_duplicate;
ってことでしょ? もうこれでいいでしょ。POD すら読まないんじゃ助けようがないよ。 ごめん、言い過ぎた。とりあえず、正解が分らない段階で俺ならどうするかを書くよ。
まず、何をしているのかを POD で確認する。
POD では load_plugin についてはクラスメソッドとして使う例だけが書かれている。
ここで「おかしい」と思わなければならない。
オブジェクトメソッドとして使えないとは書かれていないのでソースコードを読む。
%INC を見ればソースコードの場所は分かる。
load_plugin は予想以上にシンプルだった。これで解決。
解決しなかった場合。
まず、SQL::Maker::Plugin::InsertOnDuplicate を明示的に use する。それで間違いなく呼べる。
SQL::Maker::Plugin::InsertOnDuplicate::insert_on_duplicate( $teng->sql_builder)
あるいは
$teng->sql_builder->SQL::Maker::Plugin::InsertOnDuplicate::insert_on_duplicate
好きな方でいい。これでうまくいくなら load_plugin で何かが間違っている。
デバッガを使うか、load_plugin を差し替えて動作を詳しく調べる。 Tengを使うのかどうか自分で選べるのなら、自分が理解していないものを使わないという選択肢がある。
他の人が選んでしかも使わなければならないという状況なら、選んだ人にどう使うのかを聞くといい。 多分ブログ書いた人やその人に教えた人はTeng本体と混ざって勘違いしたんだろうな
Teng自体はインスタンスからもロードできるから この記事、オレオレメモだって自分で書いてるからわざわざつっこむのも野暮だけどOR検索の例もちょっとひどい。
どうしてこうなった? Windows の Strawberry Perl で、「Parallel::ForkManager」は使えますか?
----------------------------------------
use LWP::Simple;
use Parallel::ForkManager;
...
@links=(
["http://www.foo.bar/rulez.data","rulez_data.txt"],
["http://new.host/more_data.doc","more_data.doc"],
...
);
...
# 最大30プロセスで並列的にダウンロードを行います
my $pm = new Parallel::ForkManager(30);
foreach my $linkarray (@links) {
$pm->start and next; # forkさせます
my ($link,$fn) = @$linkarray;
warn "Cannot get $fn from $link"
if getstore($link,$fn) != RC_OK;
$pm->finish; # 子プロセスをexitします
}
$pm->wait_all_children;
----------------------------------------
の様なスクリプトで、数万ファイルをダウンロードしようとすると、
child process '-*****' disappeared.
A call to `waitpid` outside of Parallel::ForkManager might have reaped it.
のエラーを出しながら、メモリを全消費・開放を何度か繰り返した後に、
最終的には、「Out of memory!」で異常終了します。
Cygwin の Perl では、「Cannot get $fn from $link」エラーを出しまくりますが、
メモリを全消費する事はありません(異常終了もしません)。 windowsのForkは、表面上は同じように動作する仕様になっているが、
実際にプロセスやスレッド、CPUの動作が期待通りになってるかと言うとそれは違う。
ほとんどの場合が、unixとの互換性を保つための見せかけ。 if($hoge=~/(\d+)$hoge3$/){$hoge2=$1}
これの意味は
$hoge3が数字のみなら$hogeに代入し、$hoge2にも代入するという意味でしょうか? >>443
「WindowsのFork」の意味は分かりませんが(Windows用PerlのFork?)、
Cygwin の perl は、
C:\cygwin64\bin\bash --login -i -c "perl ...
等としなくても、Windows から直接起動出来るので、
あのスプリクトで直接起動しても、メモリエラーは出ませんでした。
Cygwin の perl を、Strawberry Perl の代わりに、、、と思ったら、
いきなり chomp が、CR+LF を削除してくれなかった。
>>444
perldoc.jp からのコピペです。
>>445
if ( 文字列 =~ /パターン/ )
もし「文字列」の中に「パターン」が含まれていれば、
if ( $hoge =~ /(\d+)$hoge3$/ ) { $hoge2 = $1 }
もし「 $hoge 」の中に「 \d+$hoge3$ 」が含まれていれば、「 $hoge2 」に「 \d+ 」を代入 >>446
ありがとうございます。
他言語の底辺SEなので助かりました。 普段それを読む文化にない人がいきなり読めたら逆にすごいと思う
PerlってPerlが分かる人だけの言語 Perl on Bash on Ubuntu on Windows10 での、
モジュールのインストールで、無駄に苦労した。
解決法: Config.pm の修正
Windows10 のコマンドプロンプトでも、
エスケープシーケンスが使えるらしい。
PROMPT $E[96m$T$E[3D $E[93m$P$G$E[37m$E[1C
懐かし C:\> prompt $e[1;36m[$d$s$t$h$h$h] $e[1;33m%USERNAME%@%COMPUTERNAME% $e[37m$p$_$g$s ビット演算を多用したいんだけど、変数のサイズを指定したい。longとか。
とりあえず、16bitと32bitと64bitの整数が欲しい。
あと数値と文字が勝手に切り替わらないようにしたい。
ビット演算してるブロックだけでいいんで。
あと環境の保証も欲しい。どのマシンでどのbitのPerlとか関係なく。
俺が32bitのビット演算って言えばそれはもう絶対32nit演算。
もちろん不当に遅くなる方法は許さない。 vec かな。それでも不満なら perlfaq3 を読んで C で書け。 実際に何をして、その結果何が問題だったの? そのくらいは書いてくれないと…… >>457
xsと言うのがあるが、一時的に値が複製されて良いなら標準入出力(メモリ渡し)のほうが絶対に楽だと思うのだ。
ま、perl使ってるなら複製されたメモリのほうが元のデータより圧倒的に小さいはずだが ビット演算したいなら普通にすればいいよ。
◯ビット変数がほしいといわれても、それは適切にマスクすればいいだけだし。
◯ビット変数のように振る舞うものがほしいということなら、Perl は C よりも期待に応えられると思うよ。
まずは C と同じ書き方をして速度を計ってみてよ。話はそれからだ。 もう連休終わっちゃうんだけど結局何をしたかったのかな。 その日のうちに解決したんじゃね?
木曜日の相手になに言ってんだか しかし普通の言語やったあとにPerlやると異常なほど即座に短く書き終えるからなにか書き忘れてるんじゃないかと不安になる。
正しく動くと分かると異常なほど楽で嬉しくなるし、C++とかが馬鹿らしくなる。
そして実行速度計ると結局全部納得してため息。 stat($file_path);でファイルを作成したtimeは
atime,mtime,ctimeのどれなの? >>468
http://perldoc.jp/func/stat
> 8 atime 紀元から、最後にアクセスされた時刻までの秒数
> 9 mtime 紀元から、最後に修正(modify)された時刻までの秒数
> 10 ctime 紀元から、inode 変更(change)された時刻までの秒数 (*)
> 明らかに、ctime のフィールドは移植性がありません。
> 特に、これから「作成時刻」を想定することは出来ません
http://perldoc.jp/docs/perl/perlport.pod#Files32and32Filesystems
> ファイルシステムはアクセスタイムスタンプや変更タイムスタンプに
> 対応していないかもしれません (つまり移植性のあるタイムスタンプは
> 変更タイムスタンプだけです); またタイムスタンプは 1 秒単位では
> ないかもしれません (例えば、FAT ファイルシステムは時刻の単位は
> 2 秒単位です)。
>「inode 変更タイムスタンプ」 (-C ファイルテスト) は (Unix 以外では)
> 実際には「作成タイムスタンプ」かもしれません。 Perlのオブジェクト指向読んだばっかりで理解が曖昧なんだけど、
これだと、オブジェクトがオブジェクトなのか関数なのかって呼び出し側で決める事にならない?
コンストラクタもメソッドも。
ついでに、インスタンスのカプセル化どうこうも、呼び出し側の権利?
みたいに見えたのですが。 >>471
ありがとう
以下みたいな感じの記述は使っても問題ない?
あと穴があった場合も教えて欲しい。
(複数回に分けて書くので途中で書けなくなるかも)
use utf8;
use strict;
use warnings;
#ただの実験
# 1: メソッドとインスタンスをカプセル化する。
# 2: クロージャを、あたかもオブジェクト指向と同じ記法で呼び出せるようにする。(クロージャとオブジェクト指向の同一視)
# 3: クロージャをクロージャのまま使いたければそうできるようにした。そもそもクロージャのほうが速いので。 {
package Class;
sub new{
my $class = $_[0] eq __PACKAGE__ ? shift : undef ; #オブジェクトとして呼び出されたかどうか
my $self = {
Name => shift,
};
my $method = {
NameGet => sub{ $self->{Name} },
NameSet => sub{ $self->{Name} = shift; },
};
return $method if(!$class); # 普通の関数(クロージャ)として呼ばれた場合
return bless $method, $class; # オブジェクトとして呼ばれた場合
}
sub AUTOLOAD {
our $AUTOLOAD;
my $method = shift;
ref($method) eq __PACKAGE__ or return("error");
my @load = split '::', $AUTOLOAD;
my $load = $load[-1];
$method->{$load}->(@_);
}
} {
package test;
my $c = Class::new("Closure"); #クロージャとして呼び出すと、一般的なクロージャと同じように使える。
print $c->{NameGet}->() . "\n";
my $o = Class->new("Object"); #オブジェクト指向として呼び出すと、オブジェクト指向と同じように使える。(中身はクロージャ)
print $o->NameGet() . "\n";
print Class::NameGet(); #関数のように呼ぶとエラー
}
__END__
以上です オブジェクト指向=カプセル化ではないし、perl5でももう少しスマートなカプセル化のやり方もあるが筋が悪いからおすすめはしない
perl6はオブジェクト指向に関してはかなりマシだけど、そもそも速度気にするならperlは向かない
perl5じゃないとダメなら規約などで上手く付き合うしかない
ちなみにそのコードだとまともに継承できないね やりかたがあると言うのなら、提示して欲しいのだけど。(ただの俺は知ってるぞ自慢?)
事前に試しましたが、継承はできましたよー。
複数クラスを書くと長くなるので書きませんが、
まったく同じように別のクラスを書いて、ベースにしたいクラスを呼び出して更新すれば
とりあえずインスタンスもメソッドは継承されるですね。
あと穴は一つ発見しました。
これは後出しにしようかな。 スーパーコンピューターのアプリケーションしか作ったことがないのですが、
そんな私でも作れるでしょうか? スパコンのSIMDやMPIの方が楽だから
無理しなくていい 2つのテキストファイルを比較し、一致した文字列を取り出したいんですが、教えていただけませんか 一致した文字列を穴なく完璧に厳格に定義して示して下さい。
そしてそれが出来ればプログラミングの8割は終了しています。 diff 系かなあ。CPAN で検索してみるといいよ。 Perl使うまでもないような
cat fileA fileB | sort | uniq -d いやいや、一致した「行」とは言ってないから。何を望んでいるのかを確認しないと。 単語だと形態素解析が必要になるけどこいつにそんな課題出さないだろう my $input = [];
CSVファイルを一行づつ配列にして多元配列にした後
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
で全データ出力するのですが、その後(?)関数内で同じく
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
とすると、1行目の内容が、$#$inputの数だけ繰り返し表示されます。
関数内でも全データを出力したいのですが、どうしたらよいでしょうか。
どなたか教えてください。よろしくお願いします。 1回ずつループしながら、デバッグして、使っている変数を見れば?
変数のwatch 機能、あるだろ? >>489
アドバイスありがとうございます。VisualStudioCodeを素で使ってまして
perlのwatch機能は無いようなのです。 watch機能はないのですが、添字の$iを具体的な数字を入れてはprintで確認して
1行目のデータになっていると気づいた次第です。 >>488
こういうこと?再現しないよ
use Data::Dumper;
my $input = ["abc", "def", "ghi"];
for(my $i=0; $i<=$#$input; $i++) {
print Dumper($input->[$i]), "\n";
}
&func;
sub func {
for(my $i=0; $i<=$#$input; $i++) {
print Dumper($input->[$i]), "\n";
}
} >>492
要はそういうことなんだと思います。csvファイルを読み込んで
$input[[1, 2, 3],[4, 5, 6],[7, 8, 9]];
for (my $i=0; $i<$#$input; $i++) {print Dumper($input->[$i]),"\n";}
でDumperのフォーマットですが[1, 2, 3],[4, 5, 6],[7, 8, 9]を表示
sub funcの中で同じforをすると
Dumperのフォーマットですが[1, 2, 3],[1, 2, 3],[1, 2, 3]を表示します。
必要なところを抽出して現象がでたらソースをアップします。 ループ内で行っていた条件分岐の間違いでした。お騒がせしました。
489さん、492さん、ありがとうございました。 良い回答はないと思うんだけど、正規表現で指定する内容をランダムで作り出す方法ってないかな。
例えば
/^[0-9][0-9a-zA-Z]{4}[A-Z]$/;
だったら
5scDuZ
とかが得られますよ的な。 CPANのモジュールも更新されないものが増えてきた
もうオワコン Windows環境でUnixのテキストファイルを処理します
改行LFがCR+LFに変換されてしまうのを防ぐために
perl -i.bak -p -e "BEGIN{ binmode STDIN; binmode STDOUT; } s/unko/manko/g;" hogo.txt
みたいな風に書いてるんですけど
もうちょっとスマートな書き方ありませんか? binmodeしないと自動変換されるの?
まぁ試してないけど、ワンライナーをやめれば良いのさ perlの場合は文字コードがEUCのデータファイルがあって
入力フォームからハングル文字で書き込むと自動的に&#○○○;の形に変換されて書き込まれるのですか? 最近はフォームを知らない人がいるんだ
おぢさん、世代ギャップを感じるよ うわ、知能障害者がまた来たよ。
それともゆとり世代の代表例かな? my $str = "aaa〹&bbb&ccc";
という文字列があって
&#以外の&を&に置換するやり方は? my $str = "aaa&#12345;bbb&ccc";
という文字列があって
&#以外の&を&に置換するやり方は?
#はここでは全角で入力したけど半角です 訂正
my $str = "aaa&#12345;bbb&ccc";
という文字列があって
&#以外の&を&amp;に置換するやり方は?
#はここでは全角で入力したけど半角です s/&(?!#)/&amp;/g
(?!...) 否定先読み こういう時日本語は全角文字を使えて便利だね
海外の人は&や#が入力できない時苦労しそう 文字参照で書けばどうか?
s/&(?!#)/&/g できました
それとこの文字列で
my $str = "&amp;&amp;&am";
それとこの文字列で&amp;でない&(この場合一番後ろの&)を&amp;に置換するには
どうすればいいんでしょうか? それも否定先読みじゃないの
同じようにやってごらん すみません教えてください。
DBD::CSVというのは
標準モジュールに含まれるのでしょうか? >>517
http://perldoc.perl.org/perlmodlib.html
Perl の標準モジュールではないが
Active Perl のようにバンドルされているディストリもある >>518
ああ、DBIは標準モジュールじゃないんですか。
ありがとうございました。 >>519
なるほど納得です。
開発環境がAcrivePerlで、libに入ってるモジュールは標準と思ってました。
ありがとうございました。 perlの乱数生成器の内部状態を保存するにはどうしたらいいですか
seedだけ保存しても100万回 rand を呼んだところで中断したら再開するときまた100万回呼ばないとダメですよね と言うか動作の保証が求められる乱数みたいなのはオブジェクトごとに専用で実装する 乱数用のモジュール使うしかないんだろうけど有名どころの Math::Random::MT は状態保存はできないみたいだな
pure perl実装の方は無理矢理シリアライズすればできそうだけど 再現性が必要な乱数は、一旦作成してファイルに保存して利用する push pop shift unshiftが未だにどれがどうだったか覚えられません。
毎回ググるのも面倒なのですが、何か覚えるコツみたいなものはありますでしょうか。
ディスプレイに付箋を貼るのは嫌です。 あああ、オレも覚えるのに苦労した
だって、アセンブラの push 命令とは伸びる方向が真逆なんだよ
shift はバッチファイルにも同じ命令があるから分かるよね
前にズラす
はい、お次の方、どうぞ、って感じ
朝勤、昼勤、夜勤、って感じ
push は後ろから押す、背中から押す、ケツから押す、とにかく押すんだ
満員電車に乗るとき、押さないでください、押さないでください、って感じ スマホかどうか判別するには
if(
$ENV{'HTTP_USER_AGENT'} =~ /iPhone/ ||
$ENV{'HTTP_USER_AGENT'} =~ /iPad/ ||
$ENV{'HTTP_USER_AGENT'} =~ /iPod/ ||
$ENV{'HTTP_USER_AGENT''} =~ /Android/
){
print "スマホだよ";
}
これでいいんですか? push,popは一般的なCPU命令のpush.popと同じだね。スタック末尾に積んだり取り出したり。
shift,unshiftは直感的とは言いがたいけど、まあ覚えるしかない 対にして使うならば、push-pop、ないしpush-shift、unshiftはいったん忘れたほうがいい >>531,533-534
ありがとうございます。
pushは何とかそれで覚えられそうです。
何とかpush-shiftで覚えてみます。
>>530
レスしたいだけのゴミクズはさっさと消えろ。
まともに回答もできないクセに自己顕示欲だけは人一倍。
お前みたいな奴が社会のお荷物なんだよ。
お荷物=捨てるに捨てられないゴミ、だからな。
本当はさっさと処分したほうが社会のためだが憲法と法律によって処分できないだけ。 >>535
自己紹介乙
簡単なことも覚えられない記憶障害者か?それとも統合失調症か? 一行レスにこれだけの長文で応えるのは愛があるからだと思うの 無理のある例えだが、配列がロケット鉛筆だとしたら
<0[1][2][3]
ケツに押し込むのが push
<0[1][2][3] ← [4]
ケツから飛び出ちゃうのが pop
<0[1][2] → [3]
芯を引っこ抜くのが shift
<0 ← <0[1][2]
先から無理矢理突っ込んじゃうのが unshift
→ <0[1][2][3][4] まあどうせすぐ忘れるだろ
結局は染み付くまで調べるのを繰り返すしかない >>535
いやいや、毎回調べるのも十分ありだと思うぞ。
俺はそのうちになんとなく覚えちゃったことけっこうあるよ。 うろ覚えで使うとバグの発見に苦しむんで
ほんのちょっとでも不安を覚える感じがしたら大丈夫だとは思ってても
必ず調べる方が良いよね 俺も毎回調べてることは色々ある
同じことを100回調べた疑いすらある そんなこと言ってるとまた精神障害者の>>536に記憶障害とか言われるぞw 毎日のように使ってりゃそりゃ忘れることは無いだろうけど
数ヵ月とか間を空けると忘れてて調べなおすことはままある
記憶障害って言われるのはちょっときつい 覚えにくいことは自分で一覧表を作ると良い
C#の宣言一覧とか目につく所にファイルしてある shiftは考えてみたけど、底の抜けた箱に物が詰まってて、箱自体を上にシフトすると一番下の物がまろび出てくるってイメージかな 干草プッシュだけ覚えときゃなんとかなる気がするが、ロケットペンシル記憶術も捨てがたい 配列のスライスとリストのスライスは微妙に仕様が違うんだな。最近まで気づかなかったよ。 モジュールのインストールすらできないPerlはマジでゴミ
膨大な依存関係を調べて手作業でインストールすればできないことはないのかもしれないが、
そんな暇があるのはニートくらいだろ
ゴミニート専用言語Perl 今ケツの穴が痛くてモジュールのインストールができない
・・・まで読んだ HTTP::Liteモジュール使うのと、ソケットでガチアクセスするのと、systemでwgetを実行するのではどれが一番速いですか? HTTP::Liteは余計な処理がある分遅い、wgetはネイティブだがforkする分遅い。よってsocketかな >>556
ありがとうございます。
それではソケットでガチアクセスします。 ネトゲで寄生してくる香具師まじでウザい
レベルも装備も明らかに足りてないくせにパーティー入ってくるんじゃねーよ
前半はやる気を見せるためか最前線で敵に突っ込んでいって何度も即死
蘇生スキル持ちの職がいるとはいえMPも有限だし、死ぬと分かってるのに突っ込んで手間かけさせるな
後半は後ろからついてくるだけ
パーティーの人数によって敵の強さが変わるから、攻撃も回復もしない寄生虫一匹分、敵が強くなってるんだよ
まじでお荷物なんだが そういう糞雑魚がパーティーに入れない(入ったとしてもデメリットが大きい)MMORPG作りたいんだけど、
PerlでMMOサーバー作れる?
そうした寄生のできないちゃんとしたMMORPGを作りたい 誰とは質問言わないが、明後日の方向向いたレスしてる知的障がい者がいるな
Perlで作れるかどうかという質問なんだがな
Perl使ってると日本語すら理解できなくなるのか、それとももともと日本語を理解できない朝鮮人が紛れ込んでいるのか 自分にできないものだから、それをこじらせて
自分以外の人間全員できないと思うようになったのか
ここまでくると哀れだな ID:Ba0Z9f3i
俺もこいつには無理って意見に全面的に賛成するわ。
そもそもPerlで作るって発想が馬鹿。 それ以前にそもそもPerlなんてゴミを使おうと思う時点で馬鹿。
使い物にならない時代遅れの言語が候補に出てくる時点でプログラマとして致命的。 サーバーサイドをPerlで作ってるところはそこそこあるだろう だから君には無理だって
perlでmmoサーバ作れないどころか想像すらできないみたいだし 俺は作れるかどうかを疑問視してるんでは無いと思うんだがな
>インタプリタを?
これをどういう風な意味に受け取ってるのかだろう 言語としてはPerlはチューリング完全を満たしています
最初に調べることだと思われますが mmoサーバも作れないゴミ乙
言語がゴミなのか、perl厨がゴミなのか、それとも両方か (´・ω・`)
/ `ヽ. お薬増やしておきますねー
__/ ┃)) __i |
/ ヽ,,⌒)___(,,ノ\
(´・ω・) チラッ
/ `ヽ.
__/ ┃ __i |
/ ヽ,,⌒)___(,,ノ\
(´・ω・`)
/ `ヽ. 今度カウンセリングも受けましょうねー
__/ ┃)) __i |
/ ヽ,,⌒)___(,,ノ\ オンラインゲームを支える技術、中嶋謙互、2011、技術評論社
サーバの構築・運営、通信量など、
オンラインゲームのほぼ全工程を、説明した本です
大人数用MMOと少人数用P2Pの、両方について書いてある
確か言語は、C++ だったかな? そらそうだろ、Perlなんて電子産廃なんだからC系とかPHPになるだろうよ。
Perlで何かを作ろうってほうがおかしい。 PHPに代えたって意味無いじゃん
同様の理由でPythonも却下 >>573
大規模なオンラインゲームだと
むしろJavaを使うんじゃないかな?
人集めしやすいし 寄生できないmmoとか簡単そうだけどな
(1)死ぬたびに獲得経験値1/10
(2)3回死亡でダンジョンから強制排出&所持金半減&獲得経験値ゼロ
(3)経験値はパーティーメンバーの敵に与えたダメージ比率
(3)があれば身の丈に合ってないダンジョンの時点で経験値はほぼゼロ
ほぼゼロなところへ(1)があるから限りなくゼロに近くなる
寄生でダンジョンクリアだけしようにも(2)のハイリスクがある >>581
回復職やサポート職の経験値もなしということでしょうか。 昔はこれでアラーにならなかったのですが、perl5.8でこれを実行すると @{$_[2]}が原因でこけてるらしいです。
どのように変えればよいでしょうか
my ( @WdayArr ) = ( $_[2] )? @{$_[2]} : ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ); >>583
# http://perldoc.perl.org/5.8.9/Scalar/Util.html
use Scalar::Util qw(reftype);
my @WdayArr = reftype($_[2]) eq 'ARRAY' ? @{$_[2]} : qw(Sun Mon Tue Wed Thu Fri Sat); >>584
ありがとうございます。やってみます。
>>585
曜日の文字を配列に指定する部分です。なければ、英語の曜日が入ります >>586
Perl 5.16.3 だが、下のスクリプトで1行目を入れても
消しても、きちんと動くぞ。
$_[2]に配列のリファレンス以外のものを入れたのだろう。
(エラーメッセージにそう書いてあるはずなんだが)
-----------------------------------------
$_[2] = [qw(a b c d e f g)];
my ( @WdayArr ) = ( $_[2] )? @{$_[2]} : ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' );
print @WdayArr; >>588
use strict;を指定すると参照ダメみたいなエラーが出るので
とりあえずuse strict;を外して応急処置しています。
参照渡しができなくなったんでしょうか こういう時はエラーメッセージをそのまま貼るのが正解 このようなエラーが
Can't use string ("ARRAY(0x10b0458)") as an ARRAY ref while "strict refs" in use at obj.cgi ARRAY(0x10b0458) というのは配列リファレンスを文字列として評価した時に出てくる
関数の呼び出し元で配列をそのまま渡さずにダブルクォートで囲うなどして文字列化してしまっているのだろう ありがとうございます。関数の実行側のほうを確認します。 Perlはマジで糞だな
リファレンスはリファレンスで同じじゃねーの?
バックスラッシュ付けたリファレンスでも種類によって違うとか意味不明 Cの共用体のようなことしなければ、
ある「型」のリファレンスは
その「型」のリファレンスのままでよい。
それ以外の使い方をすれば、「間違っている」として
エラーを吐いてくれるのが有難いではないか。
ただ、リストのリファレンスをハッシュの
リファレンスとして使いたい時(またはその逆)
がたまにあるが、それは可能にしてほしいと思う。 # こういうのじゃいかんか?
my $ref_to_hash0 = +{ @{ $ref_to_array0 } };
my $ref_to_array1 = [ %{ $ref_to_hash1 } ]; >>597
無駄なものがあって読みづらい
my $ref_to_hash0 = { @$ref_to_array0 };
my $ref_to_array1 = [ %$ref_to_hash1 ];
何がしたいのかわからん。
キーと値が交互に出てくるものを
ハッシュかリストに変換したいのか? my $ref_to_hash0 = { $ref_to_array0->@* };
my $ref_to_array1 = [ $ref_to_hash1->%* ]; Javaのクラス周りに慣れるとPerlのクラス周りは本当に不自由だと気付く 比較例に出すのにJavaのクラスなんぞを持ち出すのもどうかと xp 32bit
xp対応のアクティブパール(ActivePerl)がダウンロードできないです
旧バージョンはどこからダウンロードできますか? >>602
active perl old version
でググると、色々出てくるぞ。
実際、どれが使えるのかは知らんが。 $str = "LIST( '2016123456','2015123456','2017987654',…)
という$strがあった時に、シングルクオートに囲まれた部分だけを取り出して
@listに突っ込みたいんだけどどう書いたらいい?
splitの正規表現でいけるかと思ったけどどう書いていいかわからない。 >>602
5.16なら間違いなく使えてる
5.18と5,20はファイル名に64intがくっついてて動くかどうかはわからない 今activesite見てきたら、まあ流し読みしかしてないけど、古いバージョンは有料で提供してやるよって買いてあった Need Perl on production servers or access to Perl 5.6, 5.8, 5.10, 5.12, 5.14, 5.16, 5.18 or 5.20?
Learn more about ActivePerl Business Edition
--------------------------------------------------------------------------------------------------------------------------
Get the language version you need on the platform you want. The following versions are available for purchase with Business Edition+:
ActivePerl 5.8, 5.10, 5.12, 5.14, 5.16, 5.18, 5.20, 5.22, 5.24
ActivePython 2.5, 2.6, 2.7, 3.2, 3.3, 3.4, 3.5
ActiveTcl 8.4, 8.5, 8.6 >>604
push @list, $1 while $str =~ /'([0-9]+)'/g; >>604
$str = "LIST( '2016123456','2015123456','2017987654',…)
$str =~ s/LIST/@list=/;
eval($str);
でいいんじゃね? >>608
> push @list, $1 while $str =~ /'([0-9]+)'/g;
惜しいね。それやるならこうだよ
@list = $str =~ /'([0-9]+)'/g; >>611
読みやすさなら上の方が良くね?
新人に引き継ぐ時の事考えると >>602
2014年にダウンロードした
ActivePerl-5.16.3.1604-MSWin32-x86-298023.msi
を持っている。
ただ、Active State が古いバージョンを有償でのみ提供
しているのに、勝手に古いバージョンをうpしていいものか解らん。
そのあたり、クリアにしたら、どこかにうpしてやってもいいが。 m//g の形式でグローバルマッチの意味がないように思うが >>614
m//g をリストコンテキストで使うと、
全てのマッチ部分のリストが返される。 あると高速化できるようなrecommendsだけどインストールされていないモジュールを一覧出来る方法を教えて下さい >>602
googleでググったらすぐに見つかったけど?
https://xray-engine.org/index.php?title=ActivePerl
(このサイトは開くとき継続しますかって警告が出たんで
ルート証明の認証に問題があるかも知れない
一応Java ScriptとActiveXの実行は切ってアクセスしたほうがいいだろう)
一応俺が使ってる(XP 32bit)
ActivePerl-5.20.3.2003-MSWin32-x86-64int-299574.msi
をダウンロードして保存していたファイルと比較してみたけど一致したから問題ないと思う
あと、5.22.1も試してPerlとしては動いたので
現行ダウンロードできる5.22.3も大丈夫じゃないかな?
(インストーラがexeに変わってるけど)
あと俺が使えると言った5.22.1を何故使ってないかと言うと
WSHから何故か正常に使えなかったので、使える5.20.3を使ってる https://amaten.com/
こんなサイトの情報をテキストか何かで取得したい
LWP::Simple とかでは取ってこれない
何を使うと一番簡単にできる? >>602
XPで動くかは試してないけど、Strawberry Perlっていうのもあるよ
どうしてもActivePerlじゃないとだめなの? おれ XP で Strawberry Perl つかってる
ActivePerl はモジュールの対応が遅いから乗り換えた >>617のところでActive Perlの古いのから最新まで全部ダウンロードできるじゃん
それで解決だろ >>624
それだけだったらLinuxやFreeBSDなどを使うって方法もあるだろ?
だからM$に金を払うのがいやだけど、MSのOSが好きという理由であるはずだ
もしくはMS以外のOSがクソだっていう可能性もあるけど >>618
perlはもう進化が止まってるので、あんまり新しいことは出来ない
自分で作るなら別だけど
rubyやpythonなら整ってる筈 >>618
もう見てないだろうけど
HTML::TreeBuilder
HTTP::Daemon
LWP::UserAgent
WWW::Scripter
くらいでなんとかなると思うよ。簡単かどうかは知らんけど大体なんとかなってる。 最近はperlは余り聞かないな
中学生の時にはブームだったけど……。(何十年も前)
学校ではpython とかだと思う。C# java が主力?
とにかく、滅多に聞かないな Perlは全然進化しないからな
一年ちょっと前に6がでて音沙汰なし
7はいつ出るんだ?って状態 >>634
> 実用性を重視するならJava一択
それって言語の実用性じゃなくて
人材的な意味での実用性だよな
つまりJavaは色んな所で使われてる言語だから
Javaできますって言っておけば採用されやすい。
自分が実用性がある人間になりたいならJava一択 言語なんかいくつ修得してもいいんだから、大人しくJava勉強しとけ 何がなんだか仕様に混乱するから3つまでしか習得出来ません
4つめ覚えるとなにかを忘れます 621
> むしろなぜXPを使ってるのか知りたい
動作確認だよ
XPと10で動くならVistaでも7でも8でもでも動く可能性が高いから
いちいち全OSを揃えて動作確認すると
シロウトの趣味でアプリケーション開発するには荷が重すぎる いちいち全OSで動作させたいと思う理由は何?
サポートが終了しているXPで動作する必要はないし
Vistaも2017年4月までだ。シェアから考えれば切り捨てても十分だし
7と10で動作確認すればいいじゃん 俺の周りでは、いまだにNT3.5.1を使ってる取引先があるのだが。 用途を特定した専用マシンみたいなのは、特にOSを入れ替えずにずっと使うな
測定機器や実験機器の一部とか、何かの制御用とか
ただ、そんなマシンは新しいソフトを入れたりもしないから、
互換性とかどうでもいい世界だけど 以前こちらでお世話になった顔文字のど素人です。
$ perl -p -e 's/(..)/$1 /g;'
123456
↓
12 34 56
恐縮ですが上記の逆(スペースの削除)をご指導願います。
00 06 fc 25 58 50 0a 00 54 92 31 03 49 46 88 d0 c6
↓
0006fc2558500a0054923103494688d0c6
よろしくお願いいたします _(_^_)_ とにかく学習しようという気がまったく見えないのが凄い 普通1時間以内に学習を完了してそうなものを、10日以上経ってるぞ active perlで、長いファイル名のあるフォルダに対して readdir すると、
エラーになって止まるんだけど、どうやって回避すればいいんだ
エラーが返るとかじゃなくて実行自体が止まるので、とりあえず読んでみて、
とかが出来ない windowsのエラーじゃねぇの?
とりあえずevalすれば実行は止まらないと思うけど >>653
ひょっとして、ファイル名にユニコード文字が混じったりしてない? readdirのユニコード版なら、こうゆうモジュールもある。
http://search.cpan.org/~xaicron/Win32-Unicode-0.26/lib/Win32/Unicode/Dir.pm それを使うと、既存のreaddir の挙動が変わるの? >>659
「長い」って何文字なん?260文字以下だと問題ないはず。 Windowsで260文字以上のファイル名を普通に作ろうとすると、
「ファイル名が長すぎる」とエラーが出るが、
ネットワークドライブを使うと、作れてしまうようだ。
ただ、それを実際に使おうとすると、ドツボに嵌るみたいだな。 @file = split(/\n/,`dir /s /b *.* 2>NUL`);
な。次スレのテンプレに追加するから。 シェルとカーネルを縦横無尽に使いこなすのがPerlプログラミングの醍醐味。 print 1+(2+3);
print (1+2)+3;
この二つの文の違いを使いこなすのが、Perlプログラミングの醍醐味。 awk 由来の 0+ ハックや "". ハックは常識として使いこなすのが、Perlプログラミングのたしなみ。 工夫できないなら何を使ってもダメ
sub to_s { $_[0].'' }
sub to_i { $_[0]+00 } >awk 由来の 0+ ハックや "". ハックは
そもそも、常識でないといいたげな、このレスは何?
まともな参考本読めば、最初の方に書いてある。
ハックでもなんでもない Win-7、Active Perl 5.16です。Unicode文字を含むperlの処理結果を
utf16leで出力しようとしています。下のようにやってみましたが、ダメでした。
出力をバイナリエディタでみると、改行コードが変な風にいじられていました。
binmode STDOUT => ":encoding(utf16le)";
print "ユニコード文字を含むテキスト\n";
色々試した結果、下のスクリプトのようにすると、概ね動くことが解り
ましたが、動かない場合もあります。下の例では、「aaaaa」は出力され
ますが、「bbbbb」は出力されません。どうするのが正しいでしょうか?
use utf8;
binmode STDOUT;
use Encode qw/ encode decode /;
sub wprint{
foreach(@_){
s/\n/\r\n/g;
print encode('utf-16-le', $_);
}
}
wprint "a"x5, "\n";
foreach (1..5){
wprint "b";
}
wprint "\n"; >改行コードが変な風にいじられていました
perlではどのOSでも改行をLF(\n, 0x0a)として扱っている
Windowsでは通常出力する際に自動的にLFをCRLFに変換している
0x0a (perlの\n)
0x0a 0x00 (utf16にエンコード)
0x0d 0x0a 0x00 (0x0a を 0x0d 0x0a に変換、正しくは 0x0d 0x00 0x0a 0x00 にしたい)
wprint関数のやり方が上手くいくのは
0x0a (perlの\n)
0x0d 0x0a (s/\n/\r\n/g で置換)
0x0d 0x00 0x0a 0x00 (utf16にエンコードし、自動変換も無効にしているのでこのまま出力される)
>「bbbbb」は出力されません
様々な事情で特殊変数 @_ の各要素やループ時に設定される一時変数 $_ は元の値の別名として扱われる
つまり同じ値を参照しているため、それらに代入や置換などを行うと元の値も変更されてしまう
元の値が変数ならそれが変更されるだけで問題はないが、定数の場合変更できないのでそこで死んでしまう
wprint関数では @_ でもループ内でも変数として受け取っていないため置換処理で引数の値を変更しようとしている
'a' x 5 は評価されたときに変数に入れられたように扱われるので問題はないが、直後の "\n" はまさしく定数なので変更できず死に、以降の処理が止まる
関数内で最初に my @args = @_; のように一度変数で受け取るのが意図しない変更を防ぐ意味でも良いだろう >>673
672です。
よく解りました。
ありがとうございました。 print print (1+2)+(4+5)+6+7;
3
23
print print print (1+2)+(4+5)+6+7;
3
23
1 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) $hash{'aaa'}{'bbb'}{'ccc'} = 1;
みたいなことをしても、普通に通るのが凄いよな
それでいて、仕様としては別に多次元ハッシュなんか対応してない なにをするんでもいちいちチェックが入って膨大な自動操作が裏で行われてる証拠。
さらに変数と実体を結びつけるデータテーブルもかなりの容量を使用してる。
木構造の探索などをやると、動作がCの10倍程度違うと言われるけど、やってみたらメモリ容量が100倍以上違うことも確認された。(将棋の盤面探索)。
まあ一時的にスクリプトが欲しいときとか、それが良い時はそれで良いけど、
通常のソフトウェアを作る時内部でそんなことが起きれてば完全な欠陥なわけであって。 そうか、100倍以上違うのか。試してみたいからソースコードを見せてくれ。 >>678
えーと、インタプリタとコンパイラって知ってるかい? 1 ビット × 8000000 のビットマップって Perl でどうやるんだろう? こうかな?
$perl -e '$h{ $_ } = 1 foreach 0 .. 7999999; system("bash","-c","ps -p \$PPID -F");'
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
i 5240 4743 96 253250 997920 1 11:18 pts/4 00:00:05 perl -e $h{
$
みたいなことでもしたんだろうか。 >>680
インタプリタとコンパイラの速度差は2倍未満と言われてるけどな
この場合は自動型変換などの暗黙の処理とデータテーブルが問題。
もちろん自動型のコンパイラを使用しても同じ結果になる。 「そう言われてる」ってやつだからな。
ただ有名なんで検索すればいろんなところで出てくる。
10倍遅くなるのは、自動処理が8でインタプリタが2、合計10 別に正確な情報どうこうじゃなくて、
おそいのがインタプリタのせいだと思ってるよりずっといいでしょって話 ろくに知らなければこういうことをするかもな、という想像なんだが。わかりにくかったのならすまん。
なにしろ何をしたのかまったく解らないから適当に想像するしかないんだよ。 Cでも
伸び縮みを含めた動的なメモリ宣言と開放と、呼び出しの度そのチェックと、管理情報の保存.
動的な値の自動変換と、呼び出しの度そのチェックと、管理情報の保存.
たったこんだけでも超遅くなるか
つか動的な宣言って超遅いよね それはそうと俺も稀にPerlやるんだが、
use utf8;
use strict;
use warnings;
binmode STDIN, ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
binmode STDERR, ':encoding(utf8)';
これ毎回書くんだが、全部省略できないかの
すぐこれ書くの忘れて文字コード関係でおかしくなるし、書いたら書いたで無駄に目障りなんだが・・・ # Hoge.pm
package Hoge;
use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
binmode STDERR, ':encoding(utf8)';
sub import{
strict->import;
warnings->import;
utf8->import;
}
1;
# script.pl
use Hoge; # ただし@INCからHoge.pmが見つかるようにする そういやutf8なら
binmode STDOUT, ':utf8';
で良かったか >>677
参照の -> を参照に対しては省略できるってだけだが。 それが凄いところ
オブジェクト指向だって、ほんの小手先でちゃんと実用になるものを実装しちゃってる >>693
最低レベルな。
小手先で済ませちゃったから、それ以上の
便利な機能はライブラリ任せになっちゃって
いつまでも標準が生まれなかった。
Perl6にさっさと移行すればいいのに 言語なんてそれでいいだろ
標準に拘っても何も得しない >>695
可読性の問題だ。
意味は全く一緒なのに、書き方を変えてどうする?
言語を変えるのと一緒だぞ どうせ定番の奴がデファクトスタンダードになるんだから同じことだ それは目的がニッチ過ぎたか利用者が少なすぎたからで、
どっちにしろ標準になんかならない Perl6 ? そういえばそうゆうものもあったな。ググると、
1年半前に正式安定版がリリースされたのか。知らなかった。
誰も、その事を話題にすらしていないし。
http://tamae.2ch.net/test/read.cgi/php/1162721943/
「 Perl6/Parrotスレ - Part2 」 >>689+690
PERL5OPTと組み合わせれば全て解消。 >>688
そうか?ディスクI/Oが絡まないようなメモリ上だけの操作ならさほど遅い感じしないけど。
まあ、単純なのと比べたら遅いけどね。 >>705
理論上完全に最適化できたとしても速度差は5倍以上あるよ $str = "みかん りんご ぶどう";
を・みかん ・りんご ・ぶどうというように文字の最初に・をつけるには
どう置換すればいいんですか? join '', map { '・' . $_ } split ' ', $str; linux mint18
perl6のインストールについて
$ sudo apt install rakudo
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ rakudo が見つかりません
どうしたらインストールできます? $ perl6 -v
This is perl6 version 2015.11 built on MoarVM version 2015.11
すいません、解決しました メモリリーク検出になに使ってる?
とりあえず昔からTest::LeakTrace使ってるんだけど
いまはもっと便利なものがあったりするのかな? Perl/Qt は癖があるね、Perl/Qtとクラスを同時に使おうとするとなかなか大変。 テキストファイルを読み込むときに
// (例えばfile://...)
があると、そこから行末まで読み込めない現象が起きるんだけど
どうしたらちゃんと読み込める?
binmodeにしても解決しなかった >>717
open fp, "<$file";
while(<fp>){
print $_;
}
みたいな感じで読み込んでる ファイルハンドルからダブルスラッシュが含まれる行を読み込もうとするとダブルスラッシュが行末と誤認されるという解釈でいいんですかね 絶対になにかカンチガイしてるだろう。
単に出力のバッファリングで単に表示されてないだけとか。
もしくは自分で"//"以降を削除するような処理をしているとかだな。
正規表現の書き誤りがあやしい。 実際に、>>717の方法で読ませればちゃんと読む筈
怪しい箇所を削っていって試せばいい カンチガイでした
別のところでCのコメント削除をしていて
そこで消えてました
テヘペロ C/C++のソースコードを読んで
コメント削除したソースコード
ifdefとかのプリプロセスしたソースコード
typedef, struct, unionとかを抽出した結果
を得たいんだけどどうするのがいいだろう
プリプロセスしたソースコードをcflowに渡すと
関数コールツリーを得られるから
それらを使ってCのソースコード理解に役立てたい >>726
何が難しいのか、なんでそんなことをしたいのかよくわからん。 >>726
自前で作るって話からは外れるけど、Doxygenに突っ込むとかじゃダメなの? >>727
Cのソースコード理解のため
難しいのは例えばif x>=10 && (defined(y) || z==1)とか
ifdef elif else endifとかの入れ子とか
を正しくパースしたりすること
structを抽出したあと
それらの参照関係も図示したい >>727
簡単なら作ってgitとかにあげてほしい >>728
プリプロセスする前のコードだと重複したりすると思う
gcc -Eとかだと
#defineとかまで展開されるからそれは抑えたい gcc -E じゃだめなのか。
cpp のソースコードを読んでみるのがいいと思うよ。
昔、LSI-C 86 のプリプロセッサのソースコード読んで勉強したなあ。 >>726
cflowの中でプリプロセスするから事前にする必要はないと思うけど >>733
一部だけプリプロセスさせたいんです
マクロとかはそのままの方がわかり易いので 例えば
#define ERRLVL 5
#define WARLVL 3
とかなってるのをプリプロセスすると
数字に置き換わるので意味が判りにくくなる
だけど#ifdefとかはプリプロセスしないと
例えば32ビット版の関数や構造体と
64ビット版の関数や構造体が重複してしまう CPAN に Text::CPP なんてのがあるよ。
そのままではご要望どおりじゃないと思うけど参考にはなるかも。 言いたいことはよく解る。
とりあえず、プリプロセッサの通常の動作から変更したいのは
・C ソースの中のマクロ置換はしない
・#define ディレクティブは用済みになっていないのでそのまま出力する
といったところ?
もし Text::CPP の作者がそれを有意義だと思ってくれたら、
なんとかしてくれる可能性もなくはないかもしれないな。
連絡先は README に書いてあるよ。 cpp をそのまま使うという方法もなくはないよ。
#define ディレクティブの前と C ソーステキストの前の行に
#line ディレクティブを入れる。
cpp の処理結果には #line ディレクティブがあるから
それを手がかりに元のファイルからコピーする。
この程度のことなら出来そうじゃない? あまり野暮なことはいいたくないけど、ファイルハンドルから行を読むんじゃなくて
トークンを読んだ方がシンプルに書けるんじゃないかな。そうすれば
while(( my $tokentype,my $str) = gettoken( $fh)){
if ( $tokentype == 'comment'){ case_comment;}
elsif ( $tokentype == 'string'){ case_string;}
みたいなやり方が出来る。気を悪くしないでほしい。本当にそう思ったんだ。 gettoken()を作ってread()で一文字ずつ読み込んでトークンを返すのは良さそうだけど
トークンタイプはその時の状態が判らないと判別できないと思う
//は普通の状態で現れたらコメント開始だけど
"の中だと文字列
/*の中だとコメント文字列 tcpのIO::Socket使ってサーバーに対してconnectした後、closeせずに親プロセスは接続を維持したまま、
forkした子プロセスでサーバーから受信した大量の文字列をファイルに書くとかするには子プロセスが継承したソケットをどう破棄したらいいの?
現状では当然の事ながら親プロセスの受信待ちが完全に止まってしまって困ってます >>743
客先のサーバーの仕様とやらで複数の接続(connect)に対応していない模様(爆) >>744
親プロセスの接続を切れば複数接続じゃなくなると思う 解決しました
fork()してから普通に子プロセス側で$socket->close();すれば良かったのですね。
ありがとうございました ヒント:
print"Hello world!\n";
print "Hello world!\n";
print("Hello world!\n");
print ( "Hello world!\n" ); 1. print 文は実行が成功するとTrue(1)を返す
2. すべての引数を括弧で括るのでなければ、print というキーワードの 次に開き括弧を書いてはいけません
ってだけの話。
print print print (1+2)+(4+5)+6+7;
は、
print (1+2) を実行したあとに
print 1+(4+5)+6+7実行して、
その戻り値1をプリントしてるだけ。 >>749
なるほど、すっきりしたありがとう。
>>748
これは逆に何のヒントか分からなかった。 >>741
そんな面倒なことを考えなくてもいいように gettoken を書くんだよ。
普通は C の文字列定数の中でわざわざ // を認識しない。どんなやりかたを考えてるの?
興味があるなら flex とかやったみたらどうかな。 >>751
文字列定数の中か外かはどうやって判別するの? ずいぶん前のことなのに反応があって嬉しいよ。
とりあえず、行継続もプリプロセッサディレクティブの処理もエラーチェックも無し、
コメントと文字列だけでいいなら flex ならこう書ける。
https://ideone.com/NbLVjc
本当は '"' みたいな文字定数も想定しなきゃまずいけどね。
もちろん、flex を使わなくてもできる。
yylex を手書きするなら、まず 1 バイト読んで
switch ( c){
case '"': read_string(); break;
case '/': read_comment(); break;
みたいにするのが伝統的な方法だったりする。
この方法では switch から出る前にトークンを完結させる。
コメントや文字列定数の中と、それ以外の部分で文法が違うから
別の処理になっていると理解してほしい。
こうしなければならないわけではなく、テーブル駆動とかステートマシンが好みならそうすればいい。
重要なのは、yylex を 1 回呼べばトークンが 1 個完結しているということ。
もちろん Perl でも同じやり方はできる。できるけど…… Perl ですよ?
助けてくれるモジュールがあるんだから使ってみない? Parse::Lex とか。
flex をかじっておけば理解しやすいと思うよ。 >>753
それはcase文の文字で状態遷移してるのと等価
"があったら文字列の中の状態
/があったらコメント開始の1文字目の状態
モジュールを使ったのがネットにあったから使ってみたけど
期待と違ったから自作した >>753
あとread_commentの中で*が直後にくる場合はコメント内だけど
別の文字が来たらコメントじゃない
read_commentとしてるけどコメントとは判別できない ネストしたブロックを正規表現でとりたくてperlreにある再帰パターンというのつかおうとしているですが(?>[^()]+)の部分うまくかきかえられません。
loop〜end loopの形にしたいのですが、 (?!)の使い方がわるいのかヒットしないorz (?>¥b(?!end loop|loop)で行けました。
ヒットしなかったのは再帰始まりのloopと干渉していたらしく、始まりをちゃんと書いたら動きました。 FW使わずにpsgi/slackを使おうとしてて、モジュールの名前と言うか場所に悩んでます(´・ω・`)
pathがperl -I /hoge/lib/として、
/hoge/lib/Controller.pmみたいのを置きたいけど名前被りが嫌なので避けるための手法として
/hoge/lib/myController.pmとか
/hoge/lib/MyApp/Controller.pmとかあると思うんですが
perlでこういう場合の命名規則?というかお約束みたいな名前ってあるんでしょうか。
/hoge/lib/作ってるサイトのドメイン/Controller.pm
みたいにしようと思ったけど、
use 作ってるサイトのドメイン::Controller.pm
こんなの使いまわし効かなさすぎて嫌すぎる お約束はない。
>こんなの使いまわし効かなさすぎて嫌すぎる
ん?
スクリプト内で動的に変更したいとか、そこらへん?
じゃなきゃ普通に use XXXX::Controller で作っちゃうけど?
あとは、物理的にパス切らない。くらいだよね?
$ cat Hoge.pm
package Hoge::Foo;
sub hoge{ "hoge" }
1 ;
$ perl -MHoge -le 'print Hoge::Foo::hoge'
myController.pm 一個作って、中で切り分けちゃえば? どもです。
URLで言うexample.comみたいな不可侵領域?的なのが無いのかなぁと思った感じでした。 >>761
> もしプライベートな内部やプロジェクト固有の用途のために開発中のモジュールが 決して公開されることがないなら、
> 将来の公開モジュールと名前が 衝突しないことを確実にしてください。
> これは、予約済みの Local::* カテゴリを使うか、 Foo_Corp::* のように 名前にした戦を含めることで行えます。
これだあああ
戦ってのが謎ですが、Localディレクトリに入れることにします。
ありがとうございます! たぶん「した戦」→「下線」アンダーラインのことかと
> Foo_Corp::* のように 名前に下線を含めることで なるほど…
ちゃんと訳した上で漢字を変な読み方した状態でのタイポとはw 今とあるスクリプトを見たら
1 while(s/[\012\015]$//);
こんなん書いてあったんだけど、
たぶん改行とおぼしきものは全部消すってことだと思うんだけど、
いらんもんまで消しすぎたりしてない? スカラー末の改行(の連続)を外す。
スカラー内の改行は外さない。
作者の意図通りに、余分なものは消さないと思うよ。
普通に、s/[¥012¥015]$//g ; すりゃいいと思うけど、、、 文字の末尾が012か015だったら消すんじゃない?
文字コードもわからないけど 動作は >>769 の通りだと思うけど
1 while が意味不明だな while 1 はマニュアルにも記載されてる基本的な手法
条件だけで実行が完了する 勉強し始めて1日で覚えるようなことを全然分からんようなやつが回答者ぶってるのかよ とりあえず一通り調べたけど、末尾に改行を使う文字コードはなかったから、
1 while(s/[\012\015]$//);
これは本当に改行を削除したいならあらゆる方法の中で最善だと思われる
本当にかたっぱしから消したいのなら、だけど… と言うより $ が自動でその判定してるから、関係ないものは消えないはずなんだよね 取り敢えず、ベンチマーク。
$ cat bench.pl
#!/usr/bin/perl
use Benchmark qw( cmpthese timethese ) ;
my $f = +( "42¥r¥n" x 1000 ) . +( "¥r¥n" x 10000 ) ;
sub _gm { my $f2 = $f ; $f2 =~ s/[¥012¥015]$//gm ; }
sub _while { my $f2 = $f ; 1 while $f2 =~ s/[¥012¥015]$// ; }
cmpthese(timethese (undef, {
while => '_while',
gm => '_gm',
})) ;
$ perl bench.pl
Benchmark: running gm, while for at least 3 CPU seconds...
gm: 3 wallclock secs ( 3.36 usr + 0.01 sys = 3.37 CPU) @ 356.68/s (n=1202)
while: 3 wallclock secs ( 3.06 usr + 0.00 sys = 3.06 CPU) @ 152.94/s (n=468)
Rate while gm
while 153/s -- -57%
gm 357/s 133% -- あ、単純に変数最後の CRLF 削りたいだけなら、比べ物にならん程
chomp の方が早い。
local $/ = “¥r¥n” ;
chomp $_ ; ActivePerlとCygwinの両方で動くようにしようと思うと、chomp使えないんだよな ん?
どっちが悪いか知らんが、
local $/ = “¥012¥015” ;
も効かんの? \rだの\nだの使ってることに神経を疑っちまうぜ
と言うかutf8にさえ文字とみなされない文字を使ってる時点で…
ところで以下の3つは全部挙動が違いので並列にベンチとっても無意味
chomp;
s/[\012\015]$//gm;
1 while(s/[\012\015]$//);
特に真ん中のは色々とひどいことになると予想した >>780
I/Oと言うのはその名の通りIとOがあってだな >>781
ご指摘の通り俺が間違ってたわ。
chomp が違うのは同意
#!/usr/bin/perl
use Benchmark qw( cmpthese timethese ) ;
my $f = +( "42¥012¥015" x 1000 ) . +( “¥012¥015" x 10000 ) ;
sub _gms { my $f2 = $f ; $f2 =~ s/[¥012¥015]$//gms ; }
sub _while { my $f2 = $f ; 1 while $f2 =~ s/[¥012¥015]$// ; }
cmpthese(timethese (undef, {
while => '_while',
gms => '_gms',
})) ;
Benchmark: running gms, while for at least 3 CPU seconds...
gms: 4 wallclock secs ( 3.24 usr + 0.03 sys = 3.27 CPU) @ 391.13/s (n=1279)
while: 3 wallclock secs ( 3.01 usr + 0.03 sys = 3.04 CPU) @ 155.26/s (n=472)
Rate while gms
while 155/s -- -60%
gms 391/s 152% -- >>783 は上手く動いてねーw
すまん。全面的の俺のレスは脳内から消してくれ。 連レスすまん。これを最後に消える。
s/[¥012¥015]¥Z//gm
出力を od -d -a で確認したから合ってると思う。
でベンチマーク取ったけど、記憶にある通りのベンチになった。
通りで>>777、>>783が遅いわけだわ。 うーん いくら考えても 1 while() と書いてる意味がわからん
gオプションついてないから while の意味ないし
結果知りたいなら s/// の値を直で調べりゃ済む話だし
何故なんだ 誰か教えてください 量指定子の存在しない世界線なのか。
#!/usr/bin/perl -w
use strict;
sub hd { print '[', join(' ', map uc unpack('H2', $_), split //, $_[0]), "]\n" }
my($lf, $cr, $n) = ("\012", "\015", "\n");
my $str = "$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n";
$_ = $str; 1 while s/[\012\015]$//; hd($_);
($_ = $str) =~ s/[\012\015]$//g; hd($_);
($_ = $str) =~ s/[\012\015]+$//; hd($_);
__END__
なお改行が \015 でも \012 でもそれらの組み合わせでもない環境があるので、
$ と \Z と \z の意味するところは元のコードが使われていた環境に依存する。
http://perldoc.jp/docs/perl/perlport.pod#Newlines ありがとう すごくよくわかった
1 whileの挙動をなにか勘違いしていたみたい
そしてベンチマーク取ってみたら
1 while s/[\012\015]$//; よりも while(s/[\012\015]$//){} の方が微妙に速かった
(すごく微妙なんだが 毎回1を評価しないでいい分の差??)
そして s/[\012\015]+$//; は1桁近く遅かった そうだったんだ… オレ速度はあまり気にしないから、いつも素直に s/(?:¥r?¥n)+$//; の感じだな。
¥b入れた方がいいのかもしれないけれど入れたことはない。
$とって、gつければ、改行全部きえるはずだよ。
(行単位に分離されてそうだけど。。。) >>789
一体どんな計り方をしたんだ。
http://perldoc.jp/docs/perl/perlperf.pod
http://perldoc.jp/docs/perl/perlcompile.pod#The32Decompiling32Back32End
#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese);
my($lf, $cr, $n) = ("\012", "\015", "\n");
for my $str ("$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n", "abc$n", 'abc') {
cmpthese(-5, {
ws => sub { $_ = $str; 1 while s/[\012\015]$//; 1 },
wb => sub { $_ = $str; while (s/[\012\015]$//) {} 1 },
qu => sub { $_ = $str; s/[\012\015]+$//; 1 },
});
print "\n";
}
__END__
これぐらいシンプルな正規表現なら
エンジン内でのバックトラック >> 文自体の反復 >= ループ構造
文字列内に [\012\015] にマッチする文字があればあるほど qu の方が速くなる。 こんな計り方↓
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/:all/;
my ($lf, $cr, $n) = ("\012", "\015", "\n");
my $str = "$n$cr$lf$lf${cr}1${cr}2${lf}3$cr${lf}4${n}5$n$cr$lf$lf$cr$n" x 100;
cmpthese -5, {
'1while' => sub {$_ = $str; 1 while s/[\012\015]$//;},
'1while_g' => sub {$_ = $str; 1 while s/[\012\015]$//g;},
quantifier => sub {$_ = $str; s/[\012\015]+$//;},
while_g => sub {$_ = $str; while (s/[\012\015]$//g){};},
while => sub {$_ = $str; while (s/[\012\015]$//){};},
};
__END__
同じwhileでもgオプションつけると微妙に速くなる
面白い >>792
自分の感覚と真逆の結果なんで -Mre=debug して調べたら、 [\012\015]$ だと
固定長だからエンジンが動作を最適化して最初から末尾しかみないんだな。
だから文字列自体が長くなると逆転が起こると。勉強になったよ。
#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese);
my $n = "\015\012";
my $sa = $n x 500; # 全文字にマッチ
my $sf = ($n x 250) . ('a' x 500); # + の場合前半に長くマッチした上で失敗する
my $sl = ('a' x 500) . ($n x 250); # 後半に長くマッチ
my $sn = 'a' x 1000; # マッチしない
my $su = ('a' x 998) . $n; # 末尾のみ
cmpthese(-5, {
wa => sub { $_ = $sa; 1 while s/[\012\015]$//; 1 },
wf => sub { $_ = $sf; 1 while s/[\012\015]$//; 1 },
wl => sub { $_ = $sl; 1 while s/[\012\015]$//; 1 },
wn => sub { $_ = $sn; 1 while s/[\012\015]$//; 1 },
wu => sub { $_ = $su; 1 while s/[\012\015]$//; 1 },
qa => sub { $_ = $sa; s/[\012\015]+$//; 1 },
qf => sub { $_ = $sf; s/[\012\015]+$//; 1 },
ql => sub { $_ = $sl; s/[\012\015]+$//; 1 },
qn => sub { $_ = $sn; s/[\012\015]+$//; 1 },
qu => sub { $_ = $su; s/[\012\015]+$//; 1 },
});
__END__ こちらこそ勉強になりました
まぬけな質問 >>787 やとんちきなベンチマーク >>792 でも
役に立つ(?)こともあるんですな Perlに向いてるIDE教えて
デバッグ機能とかはいらない
補完と文法チェックとオートインデントが欲しい CPANとの連携機能はどっちでもいい
みんなメモ帳レベルのテキストエディタで書いてるの? どこまでがエディタでどこまでがIDEなのか分からないが、それなりの機能は欲しい
自作関数とかも補完して欲しいしなあ
サンクス
vscode調べてみる pythonもVBもバージョン上がると別物になる
そして大抵古い方が使いやすい pythonはそろそろLinuxのデフォルトが3になりそうだけど
Perlはそんな気配全く無いよねw システム付属のスクリプト言語っていう立ち位置がかつてのPerlからPythonに変わったからなあ >>810
Unicode Character 'ATOM SYMBOL' (U+269B)
おいらのPCでは、コピペしてもフォントが対応していないので出てが。 環境によってはどうやってもアトミックにならんのでは 日本だとparameterもargumentもどっちも引数と訳して区別しないから、
何故ARGなのかピンときにくいな 引数は単に引数ってだけ。その使われ方は決まっていない。
例えば言語によっては関数の引数で戻り値を返すことだってできる。
つまり引数=パラメータではない
また関数の引数の多くはパラメータになるが、
引数だけがパラメータではない。
環境変数でパラメータを渡すことも有る
つまり「この関数の引数はすべてパラメータであり、引数以外のパラメータは取らない」
のような使い方をする なぜ $_ が ARGなのかというと
正式名称が「デフォルトの引数」だからである。 そういう理解なんだねとは思うけど、何も正しくない
パラメータは、数学の媒介変数から借りてきた言葉で、
それを変化させると結果がいろいろ変わる変数
argumentは訳語が無いのでアーギュメントとするけど、
これは仮引数とも訳されて、関数を定義する時に便宜的に使われる名前
y = f(a)
と使うけど、定義では
f(x) = x*x
みたいに違う名前で書く
ここで、aがパラメータで、xがアーギュメント 引数として使ってるものが引数
パレメータとして使ってる物がパラメータ パレメータでぐぐると600件くらいヒットするから、
それなりに認知された用語だ たまにいるよな。
大抵のカタカナ英語は日本語風に書いているのに
特定の単語だけネイティブ風に書くやつ
より正確な英語の発音にこだわってるんだー風を
だしていながら、その他のよく知られたカタカナ英語は
そうやってないから、ものすごく恥ずかしい 何言ってんだかさっぱりわかんないな。
これじゃ駄目なん? 普通にパラメータに聞こえますけど。
http://ejje.weblio.jp/content/parameter
元凶は日本のマスゴミなんだから逆らって
アイフォーンをアイフォンとかは全然いいんじゃない? アイフォーンはアイフォーンだろうがゴミ
日本企業の商標を無視するとか朝鮮人かよ 先にアイホンがあったから、アイフォンって名乗れないだけだけどな disableをディセーブルだと判ってるのに、どうしてもディザブルと読んでしまう >>836
お前PCニュース板で荒らしって叩かれてるやつだろw 質問ですが required.plをtest.plからrequire './required.pl'としたとき、
required.plの中でuse strict;と書いてもtest.plがstrictにならないのに
required.plの中でuse CGI;と書くとtest.plでmy $q = new CGI;できてしまうのは何で?
use xxxx;にスコープの違いがあるとして、何読んだらワカル?
ちなPerl 5 (v5.16.1) >>838=ゴミ言語に合理性や整合性を求める知恵遅れ
社会のお荷物だよお前 >>841
レスdくすあり〜
Perl 4時代のCGIをメンテ中なう、、
new CGI;すると何かページの挙動が変わってしまうので結局CGI使わずに調査することにすた、 >>838
そもそも概念が全く違うな
CGI->new が呼び出せるように strict->importは呼び出せるようになっているし
パッケージの定義がグローバルな名前空間に行われてるのは同じ
strictの有効化はコンパイル時のperl内部のスイッチの切り替え
同じ use でもやりたいことが違うからスコープの違いという視点で整理しようとすると混乱しそう 文字列$str2から文字列$str1に含まれている文字以外を全て削除する
例えば$str2="あaかbさcたdなe";$str1="あかさたな";ならば
absdeが残るということです
モジュール使えない環境なのでモジュールなしのやりかたで $str2="あaかbさcたdなe";
$str1="あかさたな";
$str2 =~ s/[^$str1]//g;
print $str2; # あかさたな 正規表現は書けても実行しようとするとむちゃくちゃ遅くなったり
メモリ足りなくなったりして、結局ループに開いたりする あああああああああまははあああああああああああああああああああああなやたはあああああああああああああああなはわたはなたかかなななななああああああああああああああああああああああああああああかかかかあああああああああああああかささやなさはななけなわまややゆか >>846
そのやり方だと
$str2="あaかbさcたdなe";が
$str2="あaかbさcたdなはe";
だったら結果が文字化けする >>847
それは大抵バックトラックのせいだからバックトラックを減らしなさい。
たとえば、単に \s* ではなく (?>\s*) と書く。 Perlは正則言語を最左導出に変換していないとか一体…
まあ一般に状態数が増えてメモリ食うけど ファイルロック用のファイルを使ってロックしている最中に
他プロセスでそのロック用ファイルを削除すると
ロック解除されてしまうの? ロックしているファイルを、他のプロセスは削除できないだろ
試してみれば? 見事にヴァカが釣れたw
腹痛いwwwwwwwwwww 試してみたけどwindowsサーバーだとロック中のファイルは削除できないけど
unixサーバーだと削除できてしまってロックが解除される
だからロック用ファイルは削除しないでそのまんまの方がいい >>859
unixでファイル削除してもロックは解放されない >>860
それどころか同名のロックファイルを作れるから 面倒なバグを生むよな
初心者がほんとによく作るバグが
「ロックを解放したらロックファイルも削除する」 perl6についてスレすらないけどみんな無関心なの? 違う言語だからなあ
そんなんに慣れるくらいなら別の言語やる 使えるとこではPerl使いたいけど
いよいよとなったら次はpythonかなぁ (lock_test1.cgi)
test.lockを排他ロック
sleep(10);
ロック解除
(lock_test2.cgi)
test.lockを削除
test.lockを排他ロック
ロック解除
lock_test1.cgiを実行した3秒後にlock_test2.cgiを実行して試したら
lock_test2.cgiの方はロック待ちにならなかった
test.lockを削除しない場合はロック待ちになった
だからロック用ファイルを削除するとロックが解除される pythonも新バージョンへに移行したくない同じ現象になってて、
次の言語が待たれている
perlからpythonはいろいろ新しいアイディアが追加されて、
より面白い言語になったけど、
次の言語では何が追加されるんだろう >>867
個人的にpythonは3から入ったから、
早く移行完了して欲しいw >>866
それはロック解除されてない
それは、毎回新しくロックファイル作ってロックする方法なら
常にロック出来るというだけ ロック状態を示すファイルを削除したら、その擬似的なロックが、解放されるのは当たり前だとおもうのだけど、結局何がしたいんだ? 基本的なことだったと思うのですが、忘れてしまって調べても見つけられなかったので質問させてください。
print関数のFHのようなスペースを伴わずに渡す第一引数って
* なんていう名前でしたっけ
* どうやって定義するんでしたっけ >print関数のFHのようなスペースを伴わずに渡す第一引数
???
何を指しているのかよくわからないし、定義するってどういうことだ?
print FH "hoge", "fuga";
print "hoge", "fuga"; >>872
自分で定義する関数にprintのFHような渡し方をする引数を定義するということです。
スロットとかいう名前だった気がしたのですが、どうも違うようで あ、スペースを伴わずに、じゃない
カンマを伴わずに… 間接オブジェクト構文
ttp://perldoc.jp/docs/perl/5.8.8/perlobj.pod#Indirect32Object32Syntax
new Hoge 'foo', 'bar';
Hoge->new('foo', 'bar');
普通にメソッドを定義すればよく、呼び出す時の書き方が違うだけ >>875
そうだったー!!
ありがとうございます!!! WWW-Curl-4.17.をインストールしたいと思っています。
perl Makefile.PLを実行して以下のエラーが出力されました。
原因と対応方法が分かる方、ご教示ください。
Locating required external dependency bin:curl-config... found at /usr/local/bin/curl-config.
The version is libcurl 7.19.6
Found curl.h in /usr/local/include/curl/curl.h
No working cpp (ファイルもディレクトリもありません。). Parsing curl.h in Perl at Makefile.PL line 105.
Building curlopt-constants.c for your libcurl version
Building Easy.pm constants for your libcurl version
Building Share.pm constants for your libcurl version
Generating a Unix-style Makefile
Writing Makefile for WWW::Curl
Writing MYMETA.yml and MYMETA.jso そのモジュールのことは知らないけど、とりあえず「cpp が無い」と言ってるようだね。
make と C をインストールすればいいと思うよ。 makeがちゃんとした文法になる日は来るんだろうか 880さん、ありがとうございます。
cppがインストールされていないのですね。。
pkginfoでみるとそれらしいものが入っているのですが、下記とは違うものでしょうか。
# pkginfo -i |grep cpp
system SUNWcpp Solaris cpp
GNOME2 SUNWsigcpp Libsigc++ - a library that implements typesafe callback system for standard
C++
GNOME2 SUNWsigcpp-devel Libsigc++ - a library that implements typesafe callback system for standard
C++ - development files 問題は解決しましたか? Solaris のことは分からないのでこれ以上お役に立てそうにありません。
まだ解決していないのなら perlsolaris というマニュアルがあるはずですから読んでみてください。
その上で、Solaris のことをよく知っている人に聞くのがよろしいかと思います。 ダメですね。。
もうちょっとネットで調べてみます。 流れを切ってすみません。
半角カタカナを全角カタカナにしてファイルに書き込みたいです。
Cannot decode string with wide characters at...
のエラーになります。どこをどう修正すればよいでしょうか。
use utf8; use Encode; use Encode::JP::H2Z;
open(IN, "<:encoding(cp932)", "src.txt");
open(OUT, ">:encoding(cp932)", "dst.txt");
...
#$strはファイルから読み込んだ文字列
Encode::from_to($str, "utf8", "euc-jp"); #どうもここでひっかかる
Encode::JP::H2Z::h2z(\$str);
Encode::from_to($str, "euc-jp", "utf8");
...
といったコードなのですが・・・。
Shift-JISのコードだと上手く動くのですが・・・。
utf8で標準モジュールの利用で行いたいです。どなたかよろしくお願いします。 目的がそれだけなら、こんな感じになるかな。
open( IN,'<','src.txt')
open( OUT,'>','dst.txt')
Encode::from_to( $str,'cp932','euc-jp');
Encode::JP::H2Z::h2z(\$str);
Encode::from_to( $str,'euc-jp','cp932');
どうしてかというと、from_to に渡すのは Perl の用語で言うなら文字列ではなくバイト列。
だから入力時にデコードする必要は無い。
日本語でのパターンマッチなどのためにデコードしてある場合は
from_to ではなく encode を使う。
Encode のマニュアルを読んでください。
標準モジュールしか使えないわけじゃないのなら Unicode::Japanese を使ってみてはどうでしょう。 >886
返信ありがとうございます。
他に日本語の処理があるのでencoding(cp932)としています。
$str=Encode::encode('euc-jp',$str);Encode::JP::H2Z::h2z(\$str);
$str=Encode::decode('utf-8',$str);
としても
#$str=Encode::encode('utf-8',$str);#これの有無に関わらず
$str=Unicode::Japanese->new($str)->h2zKana->get;
(ためしにUnicode::Japaneseを使ってみましたが、標準モジュールで行いたいです)
"\x{xxxx}" does not map to cp932 at ....
とワーニングだらけで>:encoding(cp932)がうまくいっていないというか
それ以前の変換がうまくいっていないようです・・・。 連投すみません。encodeとdecode間違ってるなと思い
$str=Encode::decode('euc-jp',$str);Encode::JP::H2Z::h2z(\$str);
$str=Encode::encode('euc-jp',$str);
とすると、
Wide character in subroutine entry at...
で出力が0バイトとなってしまいます・・・。 何度もすみません。できました。
$str=Encode::encode('euc-jp',$str);Encode::JP::H2Z::h2z(\$str);
$str=Encode::decode('euc-jp',$str);
でした。
> 886
encodeを使うアドバイスありがとうございました。助かりました。 #!/usr/local/bin/perl
use strict;
use CGI::Carp qw(fatalsToBrowser);
print <<"EOM";
Content-tyoe: text/html; charset=shift_jis\n\n
<html><body>
EOM
eval {require DBI;};
if($@) {
print "DBI NG<br>\n";
} else {
print "DBI OK<br>\n";
}
undef $@;
eval {require DBD::SQLite; }
if($@) {
print "DBD::SQLite NG<br>\n";
} else {
print "DBD::SQLite OK<br>\n";
}
print "</body></html>";
sqlchk.cgiの19行目の構文エラー。 "){"
と出るんですが何が原因か分かりません。もしよろしければ教えていただけないでしょうか? >>890
eval {require DBD::SQLite; }
の最後に ; が無い APIアクセスでのレスポンスをDumperしたら下みたいに返ってきたんだけど
'https://hogehoge.hoge/'を取得するにはどうアクセスしたらいいです?
$VAR1 = bless( {
'url' => bless( do{\(my $o = 'https://hogehoge.hoge/')}, 'URI::https' )
}, 'Entity::Tag' ); ファイルに書くときに、closeをせず明示的にフラッシュしたいんだけど
どうしたらいいの?
selectやautoflushは明示的ではないのでできれば使いたくない >>900
http://perldoc.jp/docs/perl/perlfaq5.pod#How32do32I32flush47unbuffer32an32output32filehandle63-32Why32must32I32do32this63
> IO::Handle オブジェクトには flush メソッドもあります。
#!/usr/bin/perl -w
use strict;
for (1..10) {
print '.';
sleep 2;
STDOUT->flush;
}
print "!\n"; =~ 正規表現で中身を置換ができる事は理解できたんですが、
中身を入れ替えたいんじゃなく別の変数に入れたいときはどう書けばいいんでしょうか?
現在の自分の知識だと、例えば引数にとった文字列を置換してある変数に入れるとき
$_ = $ARGV[0];
$_ =~ s/mukimuki/mukemuke/;
$hoge = $_;
こんな風に無駄に $_ を経由した書き方になってしまいます。
ほかの言語風に言うと
$hoge = $ARGV[0].replaceWith(s/mukimuki/mukemuke/);
こんな感じで書きたいのですが。 ($hoge = $ARGV[0]) =~ s/mukimuki/mukemuke/;
こう書くのがセオリーかな >>903-904
的確なご回答ありがとうございます。
試してみます。 perlスクリプトの稼働率は今どれくらいなんだろうか?
PHP流行から、徐々にフェードアウトしてるし
PHPオワコン説が流れだした頃から、perl6が登場したけど
存在感がないんだよなー DeNAとかmixiとかがPerIだけど、置き換えが進むだろうし
新規でメインスクリプトでってのはもうなかなか無いだろうね ちょっと何かするときはperl使うよ。慣れてるので何も見ずに書けるから。
phpがなぜ出てくるのかわからん。使ったことないけどあれwebアプリ用でしょ ま、しかし、PerlはWebでしか使われてないわけではないからな。 >>908
多分Webプログラムでの事しか思い浮かばなかったのだろう。 素人に毛が生えたレベルの低スキル層でも実用的なwebアプリ作れる点でPHPは凄いよ。
フレームワークの種類も情報量も多いし。
CLIも作りやすくなってる。一からCLIアプリ作るときにPHP使う優位性は無いけど
webアプリに付随するものとかなら十分。 フォーマット変換とかテキスト一括処理系は、perlでなれるとどれもしっくりこないんだよなぁ。
shを補完する感じで使ってる最近は。
cとセットで使いたくなったらpython?を勉強するかもしれない。 10年ぐらい前の入門書で、カンマとドットを間違えて
人工衛星が明後日の方向に飛んで言ったとか何とか、小中学生ぐらいの時に読んだ記憶が有る。 粗太陽センサーと精太陽センサーの取得先を取り違える >>918
あ、それで済んだの?そうか、じゃあ都市伝説か。 >>908
PHPが重宝されてるのはDB連携のPDOが便利すぎてハゲるから
PDO一つあれば、オラクル、ポスグレ、mysql、sqlサーバー、DB2、SQLITEなんでも
同じ記述で接続できるからな
ただ、関数定義に一貫性がない、変数スコープのグローバル化が面倒、
型変換で楽しいバグが発生するなど
素人向けと思って甘く見ると大火傷する諸刃の剣 手に馴染んだ道具として今後もperlを使うだろうな
rubyに持ち替えた方が使い勝手はいいんだけど、
そもそもrubyが無い環境が多いので使えなくては意味がない perlの持ち替えならpythonがいいと思う。
特に最近のlinux系はpythonものが増加傾向だし。
でもまあ、perlあればokじゃね?というのが正直なところ 今年の目標は、新たに言語を勉強することなんだが
Perl、Python、Rubyの違いとそれぞれのメリットを
教えてくだされ perl どこにでもある
python 人工知能に強い
ruby Railsが使える >>920
DBはPerlでもDBIと各DB用のDBIモジュールがあれば同じようにアクセスできるよ。
てか、その辺は他の言語でもだいたい同じようにできないか?みんなJavaのJDBCの影響受けて接続部分で違いを吸収してなんとかしてるように思うんだが。 >>925訂正
> 各DB用のDBIモジュール
じゃなくて
各DB用のDBDモジュール >>925
なるほど、どこも似たような機能を実装してきてるわけか ORM使えば各DBのSQLの差異も気にせず使えるぜよ Perl習得も今年の目標の一つなんだけど
Linuxの環境構築しておいた方がいい?
それともwin64でもサクサク動かせる? windows環境でperlなんてまず使わないだろうし、linux環境構築したほうがいいんじゃない?shも覚えるし。。。
webページ作りたいならperlはやめとけ >>929
どうしてもっていうならWindowsでもいいとは思うがいまいち面倒かも知れない。
知っての通りファイルシステムやその他細かい点が色々違うから。
かといってわざわざ Linux 動く環境を作るのは面倒だという場合は
Windows Subsystem for Linux 使えばいい。これだと Kernel は
Linux のふりをして動く Windows になって、その他は Linux とほぼ同じだ。
Windows 内のファイルは /mnt/c/ にマウントされていて Windows 用の
コマンドも(全てではないと思うが)使える。 要はダクトテープだから
それを必要とする環境で使うのが一番
日常的にいろんな作業をlinux上でしてるなら、きっといろいろ役立つ
そうでないなら用途が見つからない ありがとう、こっちの住民は親切で助かったよ
WSLはもっと調べて導入検討するわ
>>933
仕事でかなりLinuxは使ってるよ。特にVMは仕事で必須なんで
一からセッティングしてる
どうしても起動系とかハード周りになると
Perlの知識ないときつい部分が出てきたんで WSLは結構便利だと思うよ。何せWindows側のコマンド動くし、起動時にWindows側のPATHを /mnt/c 以下のディレクトリとして引き継いでくれるし。
前にKotlinをインストールした時はWindows側で C:\kotlinc 以下にインストールしてその下の bin に PATH 通しておいたら WSL の方でもそのままそれが使えた(JavaVMは別途インストールしたけどね)。
こんな感じで共有が当たり前のようにできる。
まあしかし今のところサーバー用のプログラムは完全には動かないだろうからサーバーとしての動きを期待するならやはり VirtuslBox とかで Linux 動かした方が良いだろうね。
または古いPC等に本当にインストールする。 ファイルにロックをかけないでロックされているか調べる方法あったらやり方教えて
flockだとロックかけちゃうのでだめです アトミックが保証されてるコマンドが必要とかそんなことになるような fcntl のマニュアルには、できるようなことが書かれてるけどどうか。
申し訳ないが実際に試してみるほど暇じゃないから、役に立つかどうかは自分で判断してほしい。 ロックしていないのに、ロックしていることを調べるとはこれ如何に。
まぁ、一般には、pidを別ファイルに保存しておいて占有するプロセスをはっきりさせるんじゃないかな〜
ハードリンクとkill -0あたりで調べてみるとよろし?? セマフォの処理はてきとーに作ってもだいたい動くんだけど、
極まれにおかしくなる
完璧に作ろうと思うとなかなか大変
っていうか、OSが提供してなかったら無理 >>936
ちょっとぐらいロック掛かってもいいじゃん。
F_SETLKなら他がロックしてたら待たずに即エラーになるんだし。
エラーにならずにロックできたら他にロックしてるやつは居なかったってことだよ。 あ、ごめん。fcntl()でのロックのはなしじゃなかったか。じゃあfcntl()使って。
使えないOSの場合は何かテクニックがあると思うがその場合はOSを書いてくれないと誰も答えられないと思う。 >>936
あっ、もしも、今使っているかどうかを調べたいならfuserコマンドかな?
windowsはしらぬ まあ落ち着け。まずは何のためにしたいのかということが重要だと思うよ。
ロックを試みることで他のプロセスの邪魔をしたくないというのも目的によっては理解できる。
目的によってはデータベースを使うのが最善かも。 >>936
> ファイルにロックをかけないでロックされているか調べる方法あったらやり方教えて
不可能だよ
なぜなら、仮にそういう関数が有ったとしても
ロックされていると判断した1ナノ秒後には
ロックが解除されてるかもしれないから
もちろんその逆もありうる
つまり関数を実行している時点では正しかったかもしれないが
関数から結果の戻り値を取得した段階では
間違った結果になってるかもしれない だから不可能では無いんだよな
その時点でそうだったことは判る
でも、その情報を元に何かをすることが出来ないので、
情報の使いみちが無い >>943
fuserはオープンしてるプロセス出すだけなのでロックしてるかどうかはわからない。
lsofだとそこまで出る。 >>946
使い道は単に確認するだけならあると言えるんじゃないか?
lsofコマンドみたいな確認するだけのコマンドもあるしな。
まあでもほとんどない事は確かだな。やはり自分でロックして成功するかどうかで見た方が良い。 そのファイルに対して何かしたいとはどこにも書かれていないんだけどな。
彼が充分に説明しないのが悪いというなら確かにその通りだが。 コマンドプロンプトを自動で開いてperl aaa.txtを自動起動させることはできませんか?
OSはwin7です
目的は複数のperlファイルを数秒で起動することです
日に何度かやるので、手間を省くために1個のperlプログラムを実行すれば10個のコマンドプロンプトが開かれてaaa1からaaa10まで全部実行、みたいにしたいです >>950
できるっちゃできるけど、その起動をPerlでやる必然性あるの?
バッチファイルでやればよくね?
perl_start.batに
start perl aaa1.txt
start perl aaa2.txt
みたいに書き連ねりゃいいだけじゃん そのbatファイルをタスク登録(ログオン時実行)とかにしとけば自動実行されるしね open(ロック用ファイルハンドル,ロック用ファイル);
flock(ロック用ファイルハンドル,2);
unlink(ロック用ファイル);
close(ロック用ファイルハンドル); #ロック解除
このようにロックを解除する前にロック用ファイルを削除するのは何か問題ありますか?
ロック解除したあとにロック用ファイルを削除するとロックに隙間ができるので >>954
flock使うならファイル削除しなきゃいいんだよ。そうすれば隙間はできない。
ファイル削除したいならopenの時のモードで O_EXCL | O_CREAT も指定しておいてエラーが出るかどうかで判別する。
エラーなくオープンできたら成功で、必要な処理が終わったらファイルをクローズする。
ただしこの方法はUNIX系OS以外では通用するかどうかわからないのと、NFS越しのファイルでは使えないかも知れない。
NFS越しでも使えるファイルロックは多分fcntl()のF_SETLKとかだろうと思う(しかしこれもまたOSしだいだ)。 ごめん。訂正。
ファイルクローズするではなくて削除だ。 >>954
flockで相互排他する場合普通はファイル削除しない
削除で隙間はできない。但し別プロセスがファイル作成するなら
隙間が生じるように感じるかもしれない >>957
感じるではなくロックとして機能しないよね? >>958
ファイルシステムから見ると削除して作成すると、同じファイル名でも別ファイルになる
排他処理は同じファイルを使ってるもの同士なら出来る
例えばopenしたものをずっと使い続けるプロセス同士なら、削除された後でも相互排他が出来る >>959
3つ以上のプロセスで必ず破綻するように思うが。
いや2つでも2回目でダメになるか。 あ、ずっとオープンしっぱなしならその後削除されても大丈夫ってことか。
それはそうだな。なんか危うさを感じるが。 ヒアドキュメントをファイルに出力する時に、
print $out <<"EOC";
ならokで、
print $out << "EOC";
だと駄目なのは何故? >>962
<< はビットシフト演算子でもあるので、優先順位的に
$out << "EOC" として解釈されちゃうから…?
print $out (<< "EOC"); や print << "EOC"; で通るならそうだと思う。 <<の直後が空白文字だと空白文字自体が識別子とみなされる
と、とある本に書いてあった <<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 >>962
<<の直後のスペースの有無?
そりゃシェルスクリプトみたいな <<EOL のような何もクオートしない形式も許している都合でシェルの文法に合わせたからではないかな。 あ、すまん。リロードせずに書いてしまった。既に回答書かれてたな。 スペース空けるの禁止ならそれでいいんだけど、
ファイルハンドラが無いならスペースがあってもokなのが納得行かない 気持ちは分からなくもないが、変数の場合はしょうがない。>>963 に書かれてるとおりだ。 誰もつっこまないが、
$out->print( << "EOC");
と書けばいいと思う。
bless されてない場合は昔は
use IO::Handle;
が必要だったが今では
perl -e 'STDOUT->print("abc")'
なんてこともできる。
個人的には、ファイルハンドルの後に , があるというアホな間違いをせずに済むというところで助かっている。 ヒアドキュメントなんてプログラムを読みにくくする諸悪の根源 Wikipediaの12桁トリップの生成スクリプトで12桁以上のトリップキーの変換が5chの結果と合いません。どうすれば合いますか。 Archive::Rar を使って、中身のファイルサイズを取得するにはどうすれば
無理なら、代わりに何を使えばいい? rar コマンドをインストールしてないから CPAN でソースコードを見ただけだが、List を呼べば rar の出力をパースして list に入れてくれるみたいだよ。
試してないから勘違いしてるかもしれないけど、使ってるならソースコードの List, _AddToList 辺りを読めばいいかも。 Listはファイル名一覧しか渡してくれないんだよな -alldata を指定すれば、->{size} で見えるのか
どうせやってるのは、rar.exe の出力を読んでテキスト解析してるだけなので、
似たようなことを自前でやった マニュアルには書かれてなかったのか……まあ、信頼性の低い方法だしね。 出力される表の形式に似せたファイル名とかにすると、多分騙されるんだろうな >>971
KENT WEBの見にくさを見てから言ってくれ 他言語弄るとき、まずヒアドキュメント探すつっても過言じゃ無いんだが… >>979
printはもっと読みにくいに決まってるだろ
テンプレートしかあり得ん here => <<~EOM
インデント
出来る
EOM
これ出来るようになって昔書いたソースが結構綺麗になった ソースにhereドキュメントが多量に含まれてる時点で
キレイじゃねーよw ヒアドキュメントはうまくやると配布するファイルをプログラムのファイル一つにまとめられる。
そういうのは何かのプログラムのインストーラやアップデータには良いかも知れない。 全てのスクリプト言語には、ファイルを一つに結合する機能と
コードを圧縮暗号化する機能が必要な気がする
JSにあるアレね ああ。そういやSQL文に使ったなあ。
長くなるのが普通だもんなあれって。 $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 Pealで正規表現なら、デミリタ変えるだけでいいじゃん
可読性下がるけど
$hoge =~ m!/!;!g;
みたいな >>991
何を言いたいのかさっぱり解らないが、ひょっとして >>990 に興味持ってくれた?
そうだとしてもやっぱり何を言いたいのかさっぱり解らないのだが。
ちなみに Perl と C を比較してるのであって、sed は関係無いよ。
「これに相当すること」の「これ」とは >>990 全体を Perl コードとして実行した結果のことで、正規表現は何の関係も無い。
大筋としては
・元のテキストはエスケープなどの加工をしないでおきたい。
・エスケープが必要な場合でも目視と手作業なんて論外。自動化したい。
・実行時に別ファイルから読むのではなくプログラムに埋め込みたい。
という前提があって Perl と C でそれぞれどのように実現するかという話だ。
Perl にいくつもあるクォーティングの正確な仕様、Makefile の仕様、C の言語仕様を知ってる人向けだから無理しなくてもいいよ。
>>990 に対してじゃなかったのならごめんね。自意識過剰だったね。 Perlコードでもレスでも変わらない真実
ぎっしり長文書くやつは無能 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1457日 21時間 15分 0秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。