1 :
デフォルトの名無しさん :
2005/06/04(土) 16:31:48 "The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc5.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
http://www.perl.org/get.html ● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2
2 :
デフォルトの名無しさん :2005/06/04(土) 16:33:04
3 :
デフォルトの名無しさん :2005/06/04(土) 16:33:32
4 :
デフォルトの名無しさん :2005/06/04(土) 16:34:00
/ /
| ./`ー _ ,ヘ /
| /:: ─ _ / ヽ/ 静粛に・・・・!
| ./:::: ─ _/ ヽ 今
>>1 はPerlでプログラムを書いた・・・・・!
| /:::::::::ミ_ ─ _ /'〃
| \:::::::::: ─ _ ─ _ /::/ヽ
| \:::: ─ _||| ||:::/ ヽ 最初に言ったはずだ
| /⌒l ━┳━━━━━━━━━━━━┓ そういったことは一切認めていないと・・・・・・!
| |:i⌒|::|:::::| :::illlllllllllllllll|━━| ::illllllllll|
| |:l⌒| |::::: | :::iillllllllllllllll/ ::::::| :::iillllllllllノ
| |::「]| |::::: \::iillllllllllllllノ/ :::::| :iillllllllノ
|. \_.l |:::::::  ̄ ̄ ̄ ::/ :::::|  ̄ ./
. ./| N:::::::::: (_ ::::_:丿 /
./::: | /: :|::::::::: ー /
/ :::::: |. ./:: ::|::::::: ( ̄ ̄ ̄ ̄ ̄ ̄) /
/:::::::::::::| ./:::: ::|:::::  ̄ ̄ ̄ ̄ ̄ ̄ /
: : :::::::::::::|.../::: ::|:::: __ /
: : :::::::::::::|/:: ::l:: :::::::: /\
::::::::::::::::::|\ ::\ /:::::::::\
:::::::::::::::::| \ ::::\______/:::::::::::::::::
::::::::::::::::| \ ::::::::::::/ |::::::::::::::::::::
Perl信者がキリスト教徒みたいに必死に宣伝しマンセーするので、非常に迷惑しています。 早く死んで欲しいですね。
>>6 どいつもこいつもほっときゃいずれ死ぬよん♪
漏れもなー
>>7 ああ、「早」という漢字が読めなかったんですね ;-)
乙
枯
http://bulknews.net/lib/doc-ja/etoys.ja.html で、Error.pmの弊害、以下のようなクロージャがメモリリークを起こすと書いてありました。
my $foo;
$subref1 = sub {
$subref2 = sub {
$foo++;
};
};
よーわからんのですが、myを指定してもクロージャブロックは勝手に変数のコピーを持ちつづけるからってことでしょうか?
そしてそれを回避するには?クロージャの中でundefしたら後でクロージャを実行できなくなるだろうし、わからん。
>>11 私も良くわからない。
for (;;) {
my $foo;
$subref1 = sub {
$subref2 = sub {
$foo++;
};
}
}
みたいにしてみたがいくら待ってもperlのプロセス太らなかった。
こういう意味ではないのだろうか?
mod_perl上ではリークするって事じゃね?
だれがリークしやがったんだ!ちくしょう!
そんなことするのはきっと mod_env の野郎に違いない!
16 :
デフォルトの名無しさん :2005/06/06(月) 19:05:50
use strict 下で、サブルーチン foo() に参照渡しされた配列に、別名 x を与えて、 (いちいち ${$ref_x}[0] とか書くかわりに) $x[0] と言う風にアクセスしたいのですが、 試したところ、下のリストのように、いちいちパッケージ名 Hoge で修飾しないと怒られる個所ができてし まいます。 use strict の安全性と、別名を使ったアクセスの簡便性を両立させるのって無理なんで しょうか _| ̄|○||| use strict; package Hoge; sub foo(\@) { local *x = $_[0]; print "(foo) "; foreach (@Hoge::x) { print "$_ "; } print "\n"; push @Hoge::x, ('this', 'is', 'a', 'pen', '.'); } package main; my @bar = ('Hello', 'World', '!'); Hoge::foo(@bar); print "(bar) @bar\n";
mkdir -p 相当 (必要に応じて途中のディレクトリを作成する) を やってくれるモジュールがあれば教えてください。
>>17 use File::Path;
mkpath("./h/e/l/l/o/w/o/r/l/d", 0, 0777);
>>16 $Hoge::xをuse strict下で$xと書いたら普通は怒られるというのが問題の本質と
思われるので、use varsかourで回避するしかないんじゃない? 型グロブによる
別名づけはパッケージ変数でしか使えないし。
あるいはCPANでさがせばレキシカル変数の別名を実現するモジュールがあるので
そういうのを使うことを考えてみるとか。たとえばLexical::Aliasを使うとこん
な風に書ける。
use strict;
package Hoge;
use Lexical::Alias;
sub foo(\@) {
my($arrayref) = @_;
my @x;
alias @$arrayref => @x;
print "(foo) ";
foreach (@x) {
print "$_ ";
}
print "\n";
push @x, ('this', 'is', 'a', 'pen', '.');
}
package main;
my @bar = ('Hello', 'World', '!');
Hoge::foo(@bar);
print "(bar) @bar\n";
>>18 ありがとうございます。 File::Path を使ってうまくいきました。
>>13 そんな気もするけど
>>11 の文書って結構古いよね。
今に至るまでのperlかmod_perlのバージョンアップで解消されてるってことはないの?
22 :
16 :2005/06/06(月) 22:06:39
>>19 ありがとうございます。
Cygwin 環境で Lexical::Alias をインストールしてうまくいきましたv
ただ、Win32 環境の方だとちょっと・・・
(nmake install までは正常終了してるっぽいのに、スクリプトを走らせるとうにゃうにゃエラーメッセージが出てきます orz
大袈裟なきもしてきましたので、foo() { } の先頭で no strict 'vars' として逃げてみます。
(すげー問題あったりして(汗
23 :
デフォルトの名無しさん :2005/06/06(月) 22:24:12
>>22 ん?
package Hoge;
sub foo(\@) {
our @x;
local *x = $_[0];
print "(foo) ";
foreach (@x) {
print "$_ ";
}
print "\n";
push @x, ('this', 'is', 'a', 'pen', '.');
}
とかでいけない?
UTF-8で書いたコードから、 SQL Server の nvarchar or ntext 型へのINSERT時に文字化けしてしまいます。 ソースコードをSJISで書けば問題なくINSERTできるので、 SJISへ変換してからINSERTすればうまく行きそうな気はしますが、 できれば、ConnectionString? だけ差し替えでDB切り替えられるような作りに したいのですが、なんか良い方法があったら教えて頂けないでしょうか? [環境] OS:Windows XP SP2 DB:SQL Server 2000 Perl:Active Perl v5.8.6 [コード] #!/usr/bin/perl -w use DBI; #my $dbh = DBI->connect('dbi:SQLite2:dbname=memo.db','',''); my $dbh = DBI->connect('dbi:ODBC:perl','user','password'); my $sth = $dbh->prepare("insert into memo ( title, content ) values( ?, ? )"); $sth->execute( "日本語", "ソースはUTF-8です。" ); $sth->finish; $dbh->disconnect;
25 :
22 :2005/06/07(火) 11:13:32
>>23 ガビーソ! ∑(゚Д゚;)
そうか、our 宣言って、local 宣言と組み合わせた場合は安全なんですね(汗
@Hoge::x (への|からの) 値の変更が筒抜けになる危険なものだとばかり思い込んでました。
それで逝きます。重ね重ねすいません on_
>>25 ourってuse strict "vars"で怒られなくするという以上の意味は
ないよ。
筒抜けとかなんとかって考えがどこから出てきたのかはわからんが
なんか激しく誤解しているようなので、いい機会だからきちんと
理解しといた方がいいんじゃないかな。
27 :
22 :2005/06/07(火) 12:55:39
>>26 > ourってuse strict "vars"で怒られなくするという以上の意味は
> ないよ。
まさに our 宣言がそれしかしない、つまり新しい変数を作るわけではない、という点が問題だと思うのでつ。
our $x と宣言したレキシカルスコープ内で、$x の実体はあくまで $Hoge::x でつ。
$Hoge::x をスコープ外から他人が触らない保障はないのでつA`;)。
(この意味で「筒抜け」と表現した。)
use strict;
package Hoge;
$Hoge::x = "This is a pen.";
sub foo() {
our $x;
# local $x; # <-- ここで local しないと、、、
print "(foo) $x\n";
}
package main;
foo(); # "(foo) This is a pen.
$Hoge::x = "Hello World!\n";
foo(); # "(foo) Hello World" と表示される。(筒抜け)
28 :
デフォルトの名無しさん :2005/06/07(火) 13:01:55
質問です。 my $i; my @hoge = (); for( $i = 0; $i < 10; $i++ ) { my $value = i; push( @hoge, \$value ); } と、やった場合に、ループの度に新しい$valueが生成される (前のものは残ってる)と思うのですが、これは 「push( @hoge, \$value );」をやらなくても同じ(毎回新しい$valueが 生成されて、前の$valueは解放されずに残っている)なのでしょうか? それとも参照方法を失った変数はその都度解放されているのでしょうか?
古い $value への参照が @hoge に保持されている限り、古い $value の実体 (参照先) も保持される ・・・と思う。 もちろんループ回数分の個数 (この場合 10 個) が、別々の実体として。 処理系のソース見たわけではないけど、 普通ガベージコレクタの仕事とはそういうものだよね・・・
30 :
29 :2005/06/07(火) 13:27:21
受け答えになってなかった・・・_| ̄|○ 仮にループ内で push( @hoge, \$value ); をやらなかった場合、レキシカル変数 $value がスコープから外れた瞬間 (つまりループ 1 回回る毎に) $value の実体は 削除される。 上の例のような単純変数の $value だと確かめようがないが、bless されたオブジェクトなら そのタイミングで DESTROY メソッドが呼ばれる・・・はず (未確認)。
>>28 ソースをしっかり読むのがいちばんなんだろうが、とりあえずおおざっぱに
知りたいのならばオライリーの「実用Perlプログラミング」の20章「Perlの
内部構造」を読むといい。
>>27 パッケージ変数はパッケージ名明示すればどこからでもいじれるので、
いやならレキシカル変数を使うしかない。ourに文句をいうのは筋違い。
そのためのmyだろ?
localは変数自体はそのままで、単に値の退避と復旧を自動的にやるだけ
のものだしな。
33 :
22 :2005/06/07(火) 14:20:20
>>32 > すればどこからでもいじれるので、いやならレキシカル変数を使うしかない。
これは正論だと思いますが、最初の質問 >16 のような、変数の別名を作る場合はそうはいかないのです。
(パッケージ変数 (ていうかシンボル) の型グロブは '*' で参照できて、名前とは独立に付け替えができるのに対し、
レキシカル変数への参照は名前と一体であって書き換えられない。)
まあ、our $x; のあと local*x = \$z; とすることによって $x が $z の別名になって (配列のときも同様)、
しかも「筒抜け」の危険も生じないことがわかったので私めは満足でございますv
34 :
28 :2005/06/07(火) 17:02:34
削除されているのですね。 DESTROYについて次の様に試しましたら毎回実行されました。 #newで"newしました。\n"、DESTROYで"DESTROYが呼ばれました。\n"を出力しています。 <hoge.pl> print "開始\n"; my $i; for( $i = 0; $i < 3; $i++ ){ print "ループ開始\n"; my $hoge = new HOGE(); undef $hoge; print "ループ終端\n"; } print "終了\n"; exit 0; <結果> 開始 ループ開始 newしました。 ループ終端 ループ開始 DESTROYが呼ばれました。 newしました。 ループ終端 ループ開始 DESTROYが呼ばれました。 newしました。 ループ終端 終了 DESTROYが呼ばれました。
>>34 あの~、、、
for ループの最後で明示的に undef $hoge; するから $hoge の DESTROY が呼ばれてる、
と思うのは勘繰りすぎでしょうか
36 :
34 :2005/06/07(火) 18:49:59
>>35 試しに「undef $hoge;」を外して実行しましたが同じ結果でした。
オレの手元のperlでは ループ開始 newしました。 DESTROYが呼ばれました。 ループ終端 の順番になり、undefをやめると ループ開始 newしました。 ループ終端 DESTROYが呼ばれました。 になる。どっちにしても ループ開始 DESTROYが呼ばれました。 newしました。 ループ終端 にはならんがなぁ。
38 :
36 :2005/06/07(火) 23:49:57
>>37 hoge.plを電源きると消える場所に置いていたので
再度打ち直して実行したら…ループ開始~ループ終端で
同じくDESTROYが呼ばれましたorz
DESTROYのタイミングがおかしかったのはnewの中身が次のようになってました(汗
sub new
{
$this = shift;
$self = {};
print "newしました。\n";
bless $self, $this;
}
#再宣言時(ループ2回目以降突入後)に消される仕様なのかと
#そんなわけなのに変な納得の仕方をしてました(汗
>>38 $selfがグローバルになってるので、次にnewが呼ばれて
上書きされるまではこっちからの参照が残ってるので
DESTROYされなかったわけですな。それならばあの結果
になるだろう。納得。
>>31 へぇ、あの本、そんな面白そうなことが載ってるんだ。
「実用」というタイトルで何となく敬遠してた本だけど・・・
>>40 そうやって決めつけて見聞の範囲を制限するから、お前はいつまで
も負け組なんだ。
>>41 そんな絡むことか? ちなみに、英語版(原書)はAdvanced Perl Programming。
中身も、「実用」よりPerlの内部構造を意識した発展的内容。
Perlはもう役目を終えるべき言語なので、真面目に勉強すべきではないと思うが。。
つ~か、何の脈絡もなくあちこちに出現してる罵倒師に構うなよ。
45 :
デフォルトの名無しさん :2005/06/08(水) 15:06:02
なんでPerlすぐ死んでしまうん?
>>44 >>43 ちょっとしたツールとしては
使いたい人間は使い続けるだろうから死滅はしないだろ。
47 :
デフォルトの名無しさん :2005/06/08(水) 15:31:32
>>42 > Perlはもう役目を終えるべき言語なので、真面目に勉強すべきではないと思うが。。
何に移るべきだと思う?
そう思って考えるとなんかこれだっていうのがないんだよな... なので今日もperlを使いつづけているのだった。
UNIXやx86(IA32)、生C、COBOLなんかも死んだ死んだ言われて今でも元気だ。 基盤業務のスクリプトなんかまだまだsh系とかだし。 sedまでで、awkはもうだめとかざらだし。 枯れてるってことはそれはそれで強いんだよね。 perl5も誕生10年、これからこれから。
>>49 それら被死亡宣告事象は、使ってない人、第三者が死亡宣告したもの。
Perlにとっとと氏ねと言っている連中は、中毒級のコテコテのすご腕のPerlian
だったりする。
要するに、転したいんだよね、Perlを。だけどもっと良いものが作れなかったり、
なかったり、あるいはなかなか移れなかったりして七転八倒してる。
しして、この進化の袋小路で転げまわってるんだ。いつまでもいつまでも(哀)。
キチガイの多いスレですね
俺も含めろ!
ノ
>>50 > それら被死亡宣告事象は、使ってない人、第三者が死亡宣告したもの。
それでいざ自分たちが当事者になるとMac板の祭りのような
面白すぎることになるわけですね
ruby
rubyはドキュメントシステムが整備されていないのがフラストレーションたまる所。
そういやようやくモジュールをネットワークからインストールできるようになったらしいね>ruby なんで最初から作ってなかったんだろ? 言語仕様は嫌いじゃなかったんだけど、ライブラリの未整備でrubyは速攻で捨てたんだよなぁ。。。 CPANやppmがなければ速攻で捨ててたのに>Perl
最近Perl始めた人はそんなもんかね? Perlは基本機能だけで十分便利なんだがね。awkやsedに比べて
最近何故かawkの仕事が増えた
Perlは使わせてくれないの? awkでヤル程度なら、Perlを使った方が良いと 思うけど。 で、Perlで30行以上になるなら、Javaとか真面目に設計された 言語を使うべきだな。
62 :
デフォルトの名無しさん :2005/06/09(木) 03:24:49
・awkってなんかUNIXごとに別々に実装してて動いたり動かなかったりしそうで嫌。 ・Perlの正規表現がデファクトスタンダードになって、その他のものが微妙に使いにくく 感じること多い。 ・なんだかんだ言いつつも、Cライクなシンタックスをベースにしてるので、 SHやPython,Ruby,Lispより馴染みやすい(これは本当に大きい)。 ・なんだかんだ言いつつもUNIX的なアイディアが素直に実装されている。 (そのせいでWindowsプログラマが馴染み難く感じるという不利な点もあるかも)
たとえばshなら マン頁をgroff -man -t psで man 1 sh(FreeBSDのがいい) をいんさつしても10頁ぐらいなので カンのいい人なら半日 筋の悪い人でも1週間ぐらい でたぶん覚えられるけど ちゃんとしたPerlの教科書は500頁超とかだし、 それに加えてライブラリのつかいかたとかあるし、 あと 優先順位が、低い C++とかJavaなどのほうが先にくる
>>63 >・なんだかんだ言いつつも、Cライクなシンタックスをベースにしてるので、
>SHやPython,Ruby,Lispより馴染みやすい(これは本当に大きい)。
大嘘こくなやボケ
オレはPythonのインデントとRubyのendは嫌いだがLispのカッコは好きだな。
折れはPerlのsub, shift, my, blessを見ると、オツムガおかしくなりそうになる。 Perlは関数の実装で既に道を踏み外した。
どういうオツムやねん っと煽り抜きに思うよな
>>61 perlで30行で出来ることはJavaへ持っていくと300行ぐらいになることがザラ。
単機能物ならshやperlが強いな。すぐ作れるし。
で、手順書(スクリプト)なのがshで、プログラムなのがperlってところか。
多機能でコアと機能ごとにソース分割して実装し、多人数でメンテする
ようなものこそJavaは強い。コーダの実力を言語仕様がカバーしてくれる。
Java人気の秘密はまさにそこだと思う。
5.8になって頭がおかしくなったことはある
72 :
デフォルトの名無しさん :2005/06/09(木) 13:11:07
>>67 > Perlは関数の実装で既に道を踏み外した。
その評価は酷と言うもの。Perlはもともと、室内を歩くスリッパでしかない。
それを勝手に道路に出たり、カバーをつけてぬかるみを歩こうとしたり、
フローターをつけて太平洋を渡ろうとしたり、翼をつけて空を飛ぼうという
連中がいるからいけない。
おまえら日本語分かってないだろ 「オツムがおかしくなりそう」 っていうのは実際に「オツムがおかしくなってしまう」ことを言っているのではないのは明白
オツムがおかしくなったこともなりそうになったことも無いので 両者にどれだけ開きがあるのか具体的には分かりません。 自分の状況から比べればどちらもそれほど違うものでは無いだろうと考えました。
プログラミング言語は馬鹿には扱えないという ただそれだけのことだと思いますが。
だから「なりそうになった」は事実じゃないんだってば 婉曲表現というものを知らんのか?
なりそうになる時点で馬鹿だと言っているのです。 なったと言っていると思い込んでる人間は一人もいませんよ。 馬鹿ですね。
Perlの言語仕様は 腐 っ て る
4.主観で決め付ける
80 :
デフォルトの名無しさん :2005/06/09(木) 18:49:57
>>78 その腐り具合がちょうど良いから、みんな鼻をつまみなが
らスプーンを突っ込んでるんですよ。
納豆みたいなもんか。。
生みの親がアニヲタらしいからな
なにこの流れ? 面白いからいいけど。
84 :
デフォルトの名無しさん :2005/06/09(木) 19:57:07
>>82 > 生みの親がアニヲタらしいからな
生みの親は「指輪物語」ヲタでつ。
でも、ドット・コムブームが弾けて会社首になって、奥さんにも捨てられたんでしょ。 今、何しているのかな?
86 :
デフォルトの名無しさん :2005/06/09(木) 20:36:43
CPANでモジュールインスコでなやんどります。 testは内部コマンド、または perl -MCPAN -e shell 外部コマンド、操作可能な プログラムまたはバッチファイルとして認識されておりません と出ます。どんなもんすかね?win2000です
漏れも確かに Perl はアレな言語だと思うのだが・・・ 1. 変数の先頭に $, @, %, \ とかいちいちつけねばならず、タイピングがわずらわしい (いつも 2 ~3 行で済ませられない人だっている!) 2. 括弧を几帳面につけていくと、記号だらけになって目がちかちかする (性格的に、括弧を省略できない人だっている!) 3. 多次元配列をまともにサポートしていない (一次元リストと参照を駆使せねば実現できない) 4. 構造体をまともにサポートしていない (苦し紛れにハッシュで代用) 5. 変な約束事が多い ($_ とか $a, $b と sort の関係とか、いろんな特殊変数とか、イテレータと keys とか <FH> とかシンボルのエクスポートが Exporter.pm だったり継承が @ISA だったり ',' とは微妙に違う '=>' とか etc.) 6. クラスをまともにサポートしていない (ハッシュと、bless がもたらす約束事一揃いで曲りなりに実現。狂気の一歩手前。) 7. 6. のせいで、大半の達人のソースは初心者にはまず解読不能。 8. サブルーチンのプロトタイプの考え方が、最初なんか非常にとっつきにくい。 9. ぬんでファイルハンドルだけが Bare Word っぽい書き方なのか説明できる人は世界に 3 人ぐらいしかいない。 10. 9. にまつわる約束事が原因で、レポート処理言語のはずなのに、サブルーチンにファイルハンドルを渡す方法を見つけるのに一苦労 11, サブルーチンからファイルハンドルを返そうとするともっと死ぬ 12. 最悪のジャーゴン 「型グロブ」。随所に出てくる割に、人に説明するには処理系のシンボルテーブルの話からはじめねばならない。 13. 遅い (以下可算無限個続く) しかし Perl は良い。文字列処理とライブラリが異様に充実してるので何をするにも楽ができる。 この長所が他の短所を圧倒する。 たとえ正気を失っても、得るものが非常に大きいのだから無問題。 だいたい Perl が腐ってるとかなんだとかいう香具師らは、腐ってない何かを生み出したことがあるんかい?
PerlのPathはちゃんと設定しているの? そのエラーが出るのは、Pathの設定以外考えられないけど。 echo %PATH% ってやってみれば。
89 :
デフォルトの名無しさん :2005/06/09(木) 20:42:56
>>88 多分してない。
サンクスコ。やってみる。
90 :
デフォルトの名無しさん :2005/06/09(木) 20:49:50
やってみた。 C:\PROGRA~1\JUSTSY~1\JSLIB32; C:\Perl\bin\;C:\WINNT\system32; C:\WINNT;C:\WINNT\System32\Wbem
91 :
デフォルトの名無しさん :2005/06/09(木) 20:53:50
>>87 > 5. 変な約束事が多い ($_ とか $a, $b と sort の関係とか、いろんな特殊変数とか、イテレータと keys とか <FH> とかシンボルのエクスポートが Exporter.pm だったり継承が @ISA だったり ',' とは微妙に違う '=>' とか etc.)
っていうか、ありゃインチキだろ、sort関数は。
> 9. ぬんでファイルハンドルだけが Bare Word っぽい書き方なのか説明できる人は世界に 3 人ぐらいしかいない。
この手抜きっていうか、手作り感が最高にイカシてるぜ。
> だいたい Perl が腐ってるとかなんだとかいう香具師らは、腐ってない何かを生み出したことがあるんかい?
なんでそんなつまらないことしなきゃなんないのサ?
92 :
デフォルトの名無しさん :2005/06/09(木) 20:56:18
perlの本質語るとか、他の言語と比べてとか、みんなすげーよな。 オイラモジュールインスコだけで手一杯だ(´・ω・`)。
>>86 Active Perlだよね?
ならばcpanよりもppmの方が良いと思う
まあ、その前に起動しないと話しにならんか・・・
とりあえず、DOSプロンプト開いて、
C:\hoge> cpan
とやってみたらどうなる?
94 :
デフォルトの名無しさん :2005/06/09(木) 21:03:38
95 :
デフォルトの名無しさん :2005/06/09(木) 21:07:59
'CPAN' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 (´・ω・`)。ス万。。悪いから一人でやってみるよ。アリガトね
96 :
93 :2005/06/09(木) 21:11:43
>>95 あれ・・・おかしいねぇ
>>88-90 からしてちゃんとパス通ってるのに・・・
ちょっと再起動して見れ。これでも駄目なら私にはわからん・・
97 :
デフォルトの名無しさん :2005/06/09(木) 21:15:16
>>87 1, 2, 4, 5, 8, 12⇒うむ、激しく同意。
3⇒うーん、9割がたの用途においてはリファレンスの入れ子で十分じゃない? 他の言語でも本物の多次元配列実現してる言語ってどれくらいあるのやら……。
6⇒オブジェクト指向を実現する方法としては意外と上手く出来てると個人的には評価してるんですが(^^; ま、@ISAだのAUTOLOADだのシンボルテーブルだのがもたらす諸々の事象については、実にbrain damagedなのには同意。
7⇒ぎくっ(達人、とまではいかんけど^^;)
9, 10, 11⇒同意するので、最早組み込み関数のopen/closeの知識は捨て去って、FileHandleやIO::Fileを使うこと強く推奨したい。ついでにstatはFile::statを、日付についてはDate::Calc等を推奨。
12⇒それなりにモジュールを使えば、大抵の場合は見ずに済ませられるはず……。
13⇒気になったことはありません:-)
Perlから入ったんで、理屈で納得できる箇所は幾つかあるけど 感覚的にはどれも大した問題ではないというのが俺の本音。
折れもPerlから入ったクチだが、確かにファイルハンドル関係の設計だけは どうしようもないほどイカレてると思うね。 最近(5.6.0から)は無名のファイルハンドルを作れるようになったのでまだマシだが…。 $aと$bやl、構造体がないためocaltime()/stat()がリストを返すというのも、まあ気になるっちゃ気になる。 他は大して気にならないね。
おまいらみんなPerl愛しすぎ。
『Perl脳の恐怖』
質問です。 Perl6 はどこに行ってしまったのでしょうか。 また、テンプレートは今度こそ実装されますか
Perlが生み出した有益な何かがあると言う人もいるが、 それはPerlなしでも実現可能なことばかりだと、僕自身は 思っている。むしろ、Perlに自由を奪われていると僕は思う。 Perlなしではプログラムが書けないなんて・・・あまりにも悲しい。
>>104 今現在のこの宇宙よりあちらの並行宇宙の方が良かった、なんて感想を述べられても困る。
今時書けない言語がある奴なんてお前ぐらいだよ(ガハハ
>>103 > Perl6 はどこに行ってしまったのでしょうか。
ていうか来てません
Perl詩のネタになりそうな流れだな
全・ て・ 計・ 画・ 通・ り・ だ・ : :
110 :
デフォルトの名無しさん :2005/06/10(金) 00:26:39
111 :
デフォルトの名無しさん :2005/06/10(金) 00:28:11
↑ 最初のURLですが、(CPAN)までURLです。 すみません。
112 :
デフォルトの名無しさん :2005/06/10(金) 00:28:11
ppmにしとけ
構造体なんて所詮配列ですよ? Perlがリストで表現することがおかしいと思う人は、 構造体を誤って認識してる人です。
>>114 やれやれ。あなたにとってはファイルシステムも木構造である必要はなくて、「所詮配列」 なのでしょうね。
関連の強いメンバ同士を一まとまりにして扱う、というのが構造体のポリシーなはずだが、 仮に 「構造体 A と構造体 B をメンバとする構造体 C」 をプレーンな配列で表現するとそれが破綻してしまう。
>>116 奇数と偶数をメンバとする自然数は破綻していますか?
すいません、perlでアプリケーションを起動する時は、 system ('C:\Program Files\hoge.exe'); とかで出来ると思うんですが、逆に終了させたいときはどのように書けばいいんでしょうか。 なんか引数にどうにかして終了を表すコマンドをくっつければいいのかと思ったんですが、 よくわかりませんでした…。 どなたかアドバイスのほど、よろしくおねがいします。
Win32::Process
forkとexecを使って説明しようと思ったけどうまくいかね
>>119 別プロセスが立ち上がってるわけで、
強引なコトしないと終了させれないってのはちゃんと頭にあってか?
もしhoge.exeが自作のもんならプロセス間通信でもしてて下さい。
123 :
デフォルトの名無しさん :2005/06/10(金) 08:50:17
>>122 > 強引なコトしないと終了させれないってのはちゃんと頭にあってか?
頭になかったです。
なんか起動は出来るから終了も簡単に出来るものと思ってました…
もちろん自作のもんでもなんでもないです。
すいません…。
ああ、なんか必要以上に卑屈になってしまた…
せっかくEncodeに乗り換えたのにJcode2.0ってなによ 便利じゃないのかぁ!
まあ落ち着け
>>126 そうか?
Encodeは環境。Jcodeは変換メソッドのあるオブジェクト、jcode.plは変換関数の集合体。
比較するもんじゃないと思うし、Encodeに"苦労して"乗り換えてJcodeのほうが便利に
みえるなら、Encodeの理解が足りないと思われ。
Jcodeの方が速い
>>130 Jcode 2.0はEncodeのラッパー。しかも多くの場合、Encodeのほうが旧Jcodeより早い。
速度だけで言うならUnicode::Japaneseが最速だが。
なんで旧Jcodeと比べてるんだ?
>>132 「ラッパーでもない旧 Jcode ですら Encode より遅い。
だから (速度をとるなら) Encode 使え。」
という文脈なのでは?
でEncode2.10になって何が変わったの?
>>123 びっくりした! 5.6 の typo やんけ ヽ(`Д´)ノ-3
137 :
デフォルトの名無しさん :2005/06/10(金) 22:33:36
perl で行入力演算子で読みこんでいるとき現在の行が何行目か知る方法はあ りますか?
>>118 Perl 詩になりそうな問いかけだぬ。
local $[ = 1;
@N = (); for ($i = 1; 1; ++$i) { push @N, $i } # 自然数の配列 (=構造体) @N を作る
@even_nums = (); for ($i = 1; 1; ++$i) { push @even_nums, $N[2 * $i] } # @N から偶数の配列 (=構造体) @even_nums を取り出す
@odd_nums = (); for ($i = 1; 1; ++$i) { push @odd_nums, $N[2 * $i + 1] } # @N から奇数の配列 (=構造体) @odd_nums を取り出す
まあたしかにとりたてて破綻はしないな(何
メンバの個数やサイズがきっちり事前に分かる世界なら、
>>114 氏の言うとおり、構造体を配列とみなして差し支えないし、
それは時間計算量的に有効な戦略ですらある。
実際、構造体を解するたいていのコンパイラは構造体アクセスを (まずは) インデックス参照命令なり OP なりに落とすしね。
しかしメンバの個数やサイズが実行時にならないと決まらない世界だと、構造体 = 配列、とみなす考え方は、全然有効でない(こともある)。
例えば上の Perl 詩なやり方は、@N = (\@even_nums, \@odd_nums); という木構造を用いた場合より、@even_num や @odd_num まるごとの取り出しに多くの計算量を要する。
それに、どっちみち構造体=配列、という考え方で書かれたソースは、人間様にとって分かりにくいという点は通底している気ガス。
>>114 氏は未だ人類の理解が到達していない深遠な何かを言わんとしているのではないかと期待しつつ、とりあえず常識的な線で反応してみた。
あるファイルの中身を変数につっこむ方法はありますか? $var = `cat hoge`; これだと外部コマンドが必要なので、もっとスマートなやつおねがいします。
142 :
デフォルトの名無しさん :2005/06/11(土) 00:57:23
>>141 > あるファイルの中身を変数につっこむ方法はありますか?
あるよ。
>>141 open FH, "<hoge" or die; $var = <FH>; close FH;
、、、って無理やり一行にしただけやん ヽ(`Д´)ノ-3
なんか質問者にスゲー試されてる気がする・・・
>>143 一行しか取れてない時点で負けっぽいが。
{ local undef $/; open FH, "<hoge" or die; $var = <FH>; close FH }
>>143 行入力演算子だと一行しか読みこめませんよ。
>>144 なるほど、そんな変数があるのですね。
$/ The input record separator, newline by default.
この場合 local は my におきかえちゃだめなんでしょうか?
$var = do { open my $fh, '< test.pl'; join '', <$fh> };
148 :
143 :2005/06/11(土) 01:37:30
ガーソ! > 一行しか取れてない時点で負 死にたい・・・_| ̄|○|||
149 :
デフォルトの名無しさん :2005/06/11(土) 02:00:19
File::Slurpは便利。
>>141 open FH, '<' . './hoge' or die $!;
read FH, my $var, -s FH;
print $var;
>>147 これの場合、 my $fh がブロックのスコープを抜けたときに暗黙に $fh は close されるの?
ラリーっていまどうしてるの?
>>145 これは?
@nullpo = <GATT>;
>>152 折れも尻たーい。 バブルが弾けて、会社クビになって、奥さんに捨てられて。。ってとこまで
知ってるけど、彼程度の腕なら再就職先を見つけるのは困難ではないし。。
でも、Perl 6は5年くらい出る出ると言われていた気がするけど、未だ出る気配すらないね。
>>153 なるほど。これは close し忘れにくくなって良いっすね。
WindowsXPでActivePerl5.8.4を使っています。5.8.7が出たので更新しようと思ったのですが、 XSを使ったモジュール(Cコンパイラを使うやつ)は再インストールしないといけないでしょうか。
まあ、Perl のプロセスが終了すれば全ハンドルは閉じられるわけだが。 全然関係ないけど。
ああ、確かに関係ないな
( ´_ゝ`)フーン
rubyやpythonが仕事で使えない(言語能力ではなく嫌がられるってこと)ので しぶしぶperlに戻ってきました。っつても以前はperl4の機能しか使ってなかったんで もう一度お勉強しなおしたらスゲー面白くて最近ハマってきた。 いい言語かどーかは置いといて、オモレーよperl
おもしろくねーよ。 おもりろりんな言語って言うのは、C++やLispのことを言うのだ。
perlでへんな癖付くと他の言語に戻ったときにそれを取り除くのが大変
あなたのeval使ったバリバリの変態コードを見せてください
s?? ,-、 nn .r-、 _00 /::::'┴'r' .|::::'´::::r┘ !「`L00、|.l└ク_;厂 / .|::::「|:::| l| |Ln:::r┘|.l _lニユ、 ./ . ̄└r''"´]_ l| | r゙=゙┐ |└ァ::/ / /. 、ヽ、 ,ゞ´_::::| l| |「二:::7 .|.l └′/ / / . \\`´ |:::|. l| l 〈::/ 、 ! '/ \ ̄ l ?,@_{'.',qq{\n},"'",q q/q,q q q}=0..4,s,(.),$_{$1},gs,s,(\d)\1,$1+1,eg,tr,0-9,,cd; s,(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d) ,(($1-$2*4+$3*2+$4+$5+$6+$7+$8+$9*7-3)%7+51).'.',exg,print eval;
暇人
168 :
デフォルトの名無しさん :2005/06/12(日) 10:56:49
Shift_jisにおいて半角全角の数字を正規表現マッチさせるにはどうすればいいでしょうか? [\d(\x82[\x4f-\x58])] というクラス内においてクラスを使おうとするとエラーになります。 何か上手い方法ってありますか?
変換すれば
>>168 /((?:\d|\x82[\x4f-\x58])+)/
[\d(\x82\x4f)(\x82\x50)(\x82\x51)(\x82\x52)(\x82\x53)(\x82\x54)(\x82\x55)(\x82\x56)(\x82\x57)(\x82\x5\ 8)]{10} やっぱりこうするしかないのかな。カッコ悪いけど。
>>170 ありがとうございます。カッコがなぜ二重に必要なのか分りませんが、それ使わせてもらいます。
あ、っていうか普通にこれでいいんすね。 (\d|\x82[\x4f-\x58]){10} {}←これってクラスにしか使えないのかと勝手に思い込んでました。すみません。
>>172 いや、matchした連続した数字部分を参照したいかな、と思ったから。
>>174 どもです、OKです。
/((?:\d|\x82[\x4f-\x58]){10})/
(?:.....)というのはマッチした部分的文字列をを
$1というのに保存しないでしないという意味っすね。
こうすることで全体の10文字が手に入ると。"+"なら一文字以上の
任意の長さの結果が手に入ると。うーん、Perl素晴らしい。
∑ (゚Д゚) 宇宙語だ!宇宙からの交信が届いた!!
177 :
162 :2005/06/12(日) 17:49:31
>>163 Lisp。クロージャ、遅延評価、ストリームなどキーワードはオモロそうだなーと思うが
lisp自体が アホなのでさっぱりわからん。
perl使いに分かるように lispの面白さを広告してみてくれ。
178 :
162 :2005/06/12(日) 17:51:10
>>177 まぁ、自分で書かないとわからんとか言われるんだろうな・・・。
179 :
デフォルトの名無しさん :2005/06/12(日) 18:22:48
>>178 > まぁ、自分で書かないとわからんとか言われるんだろうな・・・。
大学でやらされましたよ。人間インタープリタ。
UTF-8なら2バイト文字のマッチングも大丈夫? それともEUCにするべき?
use encoding
>>180 UTF-8 なのに 2バイト文字とはこれいかに!?
質問箱じゃなくて雑談スレみたいなのないの?
184 :
180 :2005/06/13(月) 01:00:29
>>183 伝統的に「質問箱」となっているだけで、雑談もかまわないとおも
雑談スレは過去何度か経ったが、雑談だけじゃ話が続かないからな
WebProg板に行けばPerl6スレ等もう少し雑談よりのスレも沢山あるがな
186 :
デフォルトの名無しさん :2005/06/13(月) 02:16:40
Perl6なんてもう消えたも同然だろ
use encodingの何が怖いのかわからない
こわがりすぎー
189 :
デフォルトの名無しさん :2005/06/13(月) 10:31:04
怖がり杉
動いてたコードにuse encoding "..."; って入れただけで動かなくなった。
191 :
デフォルトの名無しさん :2005/06/13(月) 11:06:26
DBMにしまってるデータをhtmlに一覧表示(例;アドレス一覧)したいんですが、 上手く1データ(日付・名前・アドで1行)ずつでんのです。 プログラム初心者でよくわからんのです。 拾い方教えてください。
193 :
デフォルトの名無しさん :2005/06/13(月) 18:53:50
現在Perl勉強中の初心者です。 TKモジュールを使って日本語混じりデータの処理をしているのですが、 使えそうな、デバッカーを教えてください。 しばらく前に perl -d:?????? perl.pl でデバッカが使える とあるWebで目にしました。しかしそのページをブックマーク し忘れてしまいました。 OSはWindows XP で、Perlは 5.8.6 です
>>193 perldoc perldebug
perl -d script.pl # CUIデバッガ 標準添付
perl -d:ptkdb script.pl # GUIデバッガ CPANからインストールする必要あり
196 :
デフォルトの名無しさん :2005/06/13(月) 19:09:19
>>195 ありがとうございました。ptkdb ですね。たしかに簡単にInstallできて
さくっと動きました。便利です。たすかりました。
>>194 知らないなら黙って居ろよ ボケェ
197 :
デフォルトの名無しさん :2005/06/13(月) 19:18:12
199 :
デフォルトの名無しさん :2005/06/13(月) 19:26:37
>>194 > デバッカって何?
デバック、デバッカ ――
能力に欠けるプログラマを検出する上で重要なキーワード/概念。
もちろんこれは、デバッグ/デバッガの読み間違いであるが、その読み間違
いを長期間に渡って続けている者は、プログラミングの現場から速やかに
排除されるべきである。
頻繁に「デバッグ」「debug」などの文字列を目にしているはずの現場
において、それでも「デバック」と言い続けているということは、認知
能力に極めて重大な欠陥がある可能性が高いからである。
読んだものをそのまま認識し、タイプすることが何よりも求められるプ
ログラミングという作業に、これほど不適切な人間はいない。
>>197 いや、「デバッカ」でググって、ろくな情報が無いと
ブーたれてるバカがいるから、これは大事だよ。
>>200 まあ、「>193 デバックでなくてデバッグな」ぐらいの優しさは標準装備しておこうぜ。
202 :
201 :2005/06/13(月) 19:35:09
>>196 しかし、この態度はいくらなんでもいかんですな。
やーいデバッカデバッカデバッカデーイ。
203 :
デフォルトの名無しさん :2005/06/13(月) 19:38:28
デバッカ野郎はバグメーカー。 あの野郎、iとjの識別ができないわ、Oと0をごたまぜにするわ、 テキスト書かせりゃ 「メーカ―」とか平気で書いて、チェック させても気づかないわで、川に突き落としてやりたいと本気で思った。
204 :
デフォルトの名無しさん :2005/06/13(月) 19:52:59
ここはおばかなインタネツですね De-Bug という言葉の意味も発音も知らないんだ In-Bug してろよ
ノハヽ DE BACK! BACK IN! (*´∀`) ( つ ☆ノハヽヽ ) ,ィ⌒|G|*‘ o‘リ (_(__人__,つ 、つ
ソースのメーカーで「ブルドック」なんてのもあるからな。 ラベルには、英語で Bulldog って書いてあるんだが。 栃木の「ツインリンクもてぎ」もそう。英語では TWIN RING となってる。 まぁ、一種の社会現象ってことか。
頭!頭!
逆に、「ビックカメラ」を「ビッグカメラ」と呼んで、「どう? おれ賢い?」と 悦に入っている痛いやつもときどきいるよな。 まあ、あれは恐るべき罠と評価してもいいかもしんないが。
プロバイダー -> プロバイザー ウォーニング -> ワーニング ナルポ -> ヌルポ
はいはい。ほら、ペールの話に戻って。
Perl5でOOPができたら最高なのになぁ。
212 :
デフォルトの名無しさん :2005/06/13(月) 23:23:10
素朴な質問なのですが、$_に適切なファイル名を入れた状態で $file_is_exist = 'exist' if -e; は成功するのに $file_is_exist = -e ? 'exist' : 'not exist'; の -e は括弧がないなんてケシカランと怒られ、検索パターンがどうのと怒られます。 なんでなのでしょうか??
>>205 りしゃこに変なことするのやめてください
-eのあとの?が?:演算子の?ともパターンマッチの?...?の 開始の?ともとれるわけだが、どちらにもとれる場合は 項になるほう(この場合はパターンマッチの?...?)優先 になる。よくひっかかるのでwarning対象になっていて カッコで明示しろといわれているわけだ。で、?...?の 最後の?が見つからないので検索パターンがどうこうと いうエラーもついでに出る。 Warning: Use of "-e" without parentheses is ambiguous at ~ Search pattern not terminated at ~ なおエラーについて質問するときは勝手に翻訳しないで エラーメッセージをありのまま写すのが基本なので以後 注意されたい。
215 :
212 :2005/06/14(火) 00:42:14
>>214 ん? おお!!
?PATTERN?なんて初めて知ったよ。便利そうですね。ありがとうです。
だけど
$file_is_exist = -e ? 'exist' : 'not exist' ?;
とやっても同じ警告はでてしまうだよ。(-e ?abc? でも -e /abc/でもでる)
?..?の結合度よりも -e ? の結合の方が強いのかな? (-e ? は -e $_ より強い?)
>>215 どちらの場合もカッコで明示することを推奨しているので
warningは出すということじゃないかと。
/についてもこれは割り算の2項演算子でもあるのでおなじ
あいまいさがあるしね。
同じマッチでも -e m:abc: にすればあいまいさがなくなる
ので出なくなるはずだよ。
こうすりゃいいだけじゃないのかと $file_is_exist = -e $_ ? 'exist' : 'not exist'
二つの文字列の先頭から一致する部分を取り出すスマートなやり方はないでしょうか? 以下のような文字列なら'abc'を返すような。 $a = 'abc123'; $b = 'abc345'; こんなやり方しか思いつかないです… orz $i = 1; $i++ while( substr($a, 0, $i) eq substr($b, 0, $i) ); print substr($a, 0, --$i);
219 :
デフォルトの名無しさん :2005/06/14(火) 03:47:20
スマートというよりトリッキーだがPerlらしいやり方 $a = 'abc123'; $b = 'abc456'; chop $a until $b =~ /\A\Q$a/; print $a;
>>219 おぉ、感激しますた!
先頭一致に捕らわれて、後ろから削る発想がなかったです。
エスケープされてる部分の意味が分からないのでまた調べてみます。
newbieなもんでいろいろな書き方ができるperlに戸惑ったり面白がったりです。
ありがとうございます。
先頭からの一致ならindex使ったほうが速いんじゃないかな。 $a = 'abc123'; $b = 'abc456'; chop $a until index($b, $a) >= 0; print $a;
間違えた $a = 'abc123'; $b = 'abc456'; chop $a until index($b, $a) == 0; print $a;
ActivePerl 5.8.7 Build 813 で、次のコードをデバッガ(-d オプション)で 実行しようとすると、クラッシュするんだけど…(OS=Win98SE) = = = = = use encoding 'shiftjis'; print "m9(^Д^)プギャー\n"; = = = = = ↓ 日付 06/14/2005 時刻 08:53 PERL のページ違反です。 モジュール : MSVCRT.DLL、アドレス : 0197:7801127c Registers: EAX=02dd85a0 CS=0197 EIP=7801127c EFLGS=00010297 EBX=0174c17c SS=019f ESP=0153f708 EBP=0153f710 ECX=00000001 DS=019f ESI=02dd859c FS=3b8f EDX=00000000 ES=019f EDI=0174c17c GS=0000 Bytes at CS:EIP: 8b 44 8e fc 89 44 8f fc 8d 04 8d 00 00 00 00 03 Stack dump: 0156ef74 00000004 0153f730 2806605a 0174c17c 02dd859c 00000004 0155424c 00000004 02d9d18c 0153f75c 28012870 0155424c 0156ef74 02dd859c 00000004 -d 無しなら、正常に実行される。 なんでだろう? 前のバージョンでもそうだった。 皆さんのところでも、エラーになる?
>>223 Win98SEか・・・
まずOSのアップグレードからしてみよか。
225 :
223 :2005/06/14(火) 09:24:35
226 :
223 :2005/06/14(火) 09:33:43
頭にきたので、Linux(TL10D)でもやってみました。 Shift-JIS / EUC-JP の両方で。 こっちは、全然問題なし。 ActivePerl のバグってことですかね?
>>226 報告乙。
うちはまだbuild810のまんまだ。
228 :
227 :2005/06/14(火) 09:59:15
ちなみにmsvcrt.dllの古いのを放り込んだらどうなる?
229 :
223 :2005/06/14(火) 10:17:50
>>228 98SEで、MSVCRT.DLLをインストールCDのバージョンに戻してみたけど、ダメ。
----------
PERL のページ違反です。
モジュール : MSVCRT.DLL、アドレス : 0197:78010848
Registers:
EAX=02dd80d6 CS=0197 EIP=78010848 EFLGS=00010297
EBX=0174cf7c SS=019f ESP=0153f708 EBP=0153f710
ECX=00000001 DS=019f ESI=02dd80d2 FS=461f
EDX=00000000 ES=019f EDI=0174cf7c GS=0000
Bytes at CS:EIP:
8b 44 8e fc 89 44 8f fc 8d 04 8d 00 00 00 00 03
Stack dump:
0156ef74 00000004 0153f730 2806605a 0174cf7c 02dd80d2 00000004 0155424c 00000004
02d9d39c 0153f75c 28012870 0155424c 0156ef74 02dd80d2 00000004
----------
さっきのと落ちたアドレスは違うけど、現象は同じ。
XPでは試してないけど、どうせ同じでしょうな。
230 :
227 :2005/06/14(火) 10:53:09
そういや810でも、デバッガ使うと何かの標準モジュールで転けてたなあ。
232 :
デフォルトの名無しさん :2005/06/14(火) 12:52:29
詳しい人に質問!パスワード入室管理付のBBS借りてるんだけど、 このパスワードって簡単に破れたり、BBSの中身見れたりするの? 教えて!
>>232 WebProg板へGo!
あと具体的にどの BBS かわからないと答えようがない。
232=ミスターデバッカ
236 :
デフォルトの名無しさん :2005/06/14(火) 17:55:26
Perlってインラインアセンブラあるんですか?
>>221-222 今ごろサンクスコ!!
結局こうしてみました→chop $a while index $b, $a;
嗚呼もうなんだかこの一行に惚れました気持ちえぇですたまらんです。
>>236 いろんなプラットフォームの上で走ってるから難しくないですかね?
インラインAppleScriptとかあるからあってもヘンってことはないのかな。
ある
241 :
240 :2005/06/14(火) 20:08:44
Tkじゃ無いorz Tclの間違い
2chのdatを読み込むにはどうしたらいいの?
lwp::simpleでgetしてforeachとspliteでお好きなように処理。
すいません、今までutf8で保存していたperlのスクリプトがあるんですが、 それに、「shift-jisのテキストファイルに日本語の文字列を追記する」処理をほどこすことになりました。 で、そのまま open(OUT, ">> $file"); binmode(OUT,"shift-jis"); print OUT "$_\n"; close(OUT); みたいにshift-jisへのエンコードを追加したりしたんですが、 うまくいきません…。 どなたかアドバイスのほどよろしくおねがいします。
外してるかもしれませんが。 binmode(OUT,":encoding(shiftjis)");
248 :
デフォルトの名無しさん :2005/06/15(水) 05:26:09
配列をforeachでループさせたとき、順番は必ず 番号順になりますか?例外はありますか? ちなみにハッシュは規則性はないと聞いております。
順番どおりです。仕様で決まってます。
250 :
デフォルトの名無しさん :2005/06/15(水) 16:28:29
あるディレクトリにファイルいっぱいあって、それらのファイルのおしりの空 行を取り除くにはどうすればいいですか?空行は一行とは限りません 。
>>250 成功する限り chomp しまくって失敗したら抜けるループ
>>251 ループを抜けた時、最終行の改行コードが無くなってるので、
書き出す前に復活させる必要があるね。
それなら、$data =~ s/\n+$/\n/; の方が速そうな気がするが…
もちろん $/ = ""; での話。
$/ = undef と勘違いしてないか?
>>253 どっちでも効果は同じ。
ラクダ本(第2版)のp149を見ればわかるように、$/ = ""; が本来の書き方。
それに、undef なら「undef $/;」だろ?
>>254 まー、$/ = undef; でも undef $/; でも同じなんだが、
プログラム書法の観点で言えば、後者に軍配が上がる。
つ [それには何通りもやり方があるのだ。] この辺が Perl の魅力であり、場合によっては弱点にもなり得るんだが…
>>255 オレはなんとなく他に影響でないか不安なので
{ local $/; ~ } 派だな。
>>257 > その情報は古いな。
最新の 5.8.7 でも、どっちでも全く同じに動きましたが。
>>259 え?マジで?
>"" を設定した場合には、複数の空行も 1 つの空行であるかのように扱います。
とあるように、パラグラフモードになるハズなんだけど……。
俺の Perl 5.8.6 はなったんだけどなぁ。
ActivePerl 5.8.7 Build 813 を使ってる方限定の質問です。 デバッガ(-d オプション)で起動すると、最初に実行される行が表示されたあと、 次のようなメッセージが出ます。 = = = = = = = = = = SetConsoleMode failed, LastError=|6| at C:/AP/PERL/site/lib/Term/ReadKey.pm line 265. at C:/AP/PERL/site/lib/Term/ReadLine/readline.pm line 1415 readline::readline(' DB<1> ') called at C:/AP/PERL/site/lib/Term/ReadLine/Perl.pm line 12 Term::ReadLine::Perl::readline('Term::ReadLine::Perl=ARRAY(0x27df8d0)', ' DB<1> ') called at C:\AP\PERL\LIB/perl5db.pl line 6367 DB::readline(' DB<1> ') called at C:\AP\PERL\LIB/perl5db.pl line 2203 DB::DB called at hoge.pl line 1 = = = = = = = = = = OS は Win98SE と WinXP Home SP2 を使っていますが(Perl はもちろん共有ではなく別々に インストール)、両方とも同じものが出ます。 その後は問題なく動いているようですが、どうも気になります。 皆さんの環境でも、同じでしょうか?
perl -pi.orig -e 'BEGIN {undef $/;} s/\n+$/\n/s' * -iオプションは便利だ。 ただしメモリに読み込めないくらい巨大なファイルだとこのやり方では まずい。それほどでかいとお尻から読んでtruncateしたいとこだがかなり めんどくさくなるだろうなぁ。
$/ = ""; だと 1文字単位でバラバラにされるんじゃないんですか?
>>262 undef $/; を BEGIN {} で囲むとどういう効果があるんでしょうか。
あと、s/\n+$/\n/s
これって、文中の \n+$ にはマッチしないんでしょうか?
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
を使わなきゃいけないような気がするんですが。
265 :
デフォルトの名無しさん :2005/06/15(水) 20:28:57
本日のクルクルパー大賞は、
>>254 で決まりですか?
ぐだぐだだな。
267 :
デフォルトの名無しさん :2005/06/15(水) 22:32:39
以下のようにスペースで区切られたテキスト 山田 30 20 50 佐藤 50 50 45 鈴木 45 45 40 に,別のテキスト 山田 20 佐藤 30 鈴木 30 から抽出したフィールドを追加し 山田 30 20 50 20 佐藤 50 50 45 30 鈴木 45 45 40 30 と,やりたいんですが,どうすればいいでしょうか.初歩的なコードだと思うんですが,どうしてもうまくいきません.
どうもしてなさそうだ。
>267 せめてコード晒すか、どこまで出来て何が出来ないのか、うまくいかないとはどうなるのかぐらい書いてから質問しろ、ぼけが。 my %data; open IN, 'a.txt'; # 別のテキスト while(<IN>) { my ($key, $val) = split /\s+/; $data{$key}=$val; } close IN; open IN, 'b.txt'; # 以下のようにスペースで区切られたテキスト while(<IN>) { @val = split /\s+/; push @val, $data{$val[0]} if exists $data{$val[0]}; print join ' ', @val; print "\n"; } close IN;
>>267 my($name, @points) = split / /, $line;
$data->{$name} = [];
push @{$data->{$name}}, @points;
無能になろうが恥かこうが知ったこっちゃないしー
解く問題があればあとはどうでもいいわけで。
困っている人がいるんだから、プログラムが書ける人は 代わりに書いてあげる義務があると思います。
困ってる人がいるんだから、プログラムの質問をする人は 少しは努力してまともな説明をする義務があると思います。
Perl is a write-only language.
困っている人がいたなら 一緒に困ってあげましょう
>>264 BEGIN:
これを使わないと$/をundefにするのが-pによって最初の行を読み込んだ
後になるので間に合わない。
$:
/m修飾子が指定されていないから文中にマッチする心配はない。
また\n+は最長マッチなので結果的には末尾の改行もこちらで食われて
残ることもないが、意味的には\zの方がわかりやすいか?
(最短マッチだと違いが出る。s/\n+?$/\n/とs/\n+?\z/\n/を比べてみよ)
>>273 > 解く問題があればあとはどうでもいいわけで。
仕事、ないの?
お前NEETって知らないのか
283 :
デフォルトの名無しさん :2005/06/16(木) 14:25:05
DBに格納した過去の日にち達(ただの数字16桁)を 引っ張りだして、yyyy/mm/MM/dd hh:mm:ss と表示してあげたいんですが、 どうしたらよい?
やばい「困」がゲシュタルト崩壊してきたorz
>>283 16桁というのがよく解らんが
$str = getDate(); #16桁の数字取得
$str = s/(....)(..)(..)(..)(..)(..)(..)/$1\/$2\/$3\/$4 $5:$6:$7/;
とか。取得するSQLで工夫したほうが話は早そうだがナー。
どうせなら区切り文字替えようぜ。
値は分割だけしておいてテンプレ側で区切ろうよぅ
290 :
242 :2005/06/17(金) 02:43:47
use LWP::Simple; foreach $b(split(/\n/, get($daturl))){ $i ++; my($name[$i]) = split(/<>/, $b); } こんな風にしてLWP::Simpleを使って読み込んでいたのですが、 iswebにアップロードしたら動かなくなりました。多分iswebじゃ使えないみたいです。 なので何か別の代わりになる方法を探してるんですが、ありますか?
$a $b 使うなよ……
>>283 SQLのDATE_FORMAT系の関数を使え。
なければDate::Format。
>>290 > なので何か別の代わりになる方法を探してるんですが、ありますか?
LWPの機能部分を全部自分で書く。
296 :
デフォルトの名無しさん :2005/06/17(金) 05:19:51
Perlのスキーマ認識プロセッサってあります? スキーマを読み込んで、文法が正しいか判定するやつ。
298 :
デフォルトの名無しさん :2005/06/17(金) 08:16:16
>>296 素直に「構文チェッカ」って書けよ…。
噂では、Perlをパースできるのはperlだけ、らしいぞ。
童貞なんですけど質問させてください。 ファイルを分割する関数ってありますか? 例えば40MBのファイルを15MB、15MB、10MBみたいに。 コマンドの split -b 15m hoge みたいなの。
301 :
デフォルトの名無しさん :2005/06/17(金) 09:34:58
童貞には無理
ヽ(`Д´)ノおしえてくれよ
すいません。質問があります。 20AB年C月は何日あるか って調べる関数とかないのでしょうか?
>>303 ないの?
もしやるとするなら何か方法ある?
>>305 さん
ないんですか?
もし●年×月が何日あるか調べたい時は何か方法がありますでしょうか?
>>306 さん
system 'split -b 15m hoge';
で出来るのでは?
>>306 > もしやるとするなら何か方法ある?
……もちろんある。
>>310 さん
えーっと手間をお掛けしまして申し訳ないのですが
その計算方法をお教えいただけますでしょうか?
>>311 ググれって、お前が手間を掛けろ。
あとは「西向く士」だ。
>>308 > もし●年×月が何日あるか調べたい時は何か方法がありますでしょうか?
Date::Calcでできるかも。
つまんねーやつらしかいねーな。
>>313 これだな。
$days = Days_in_Month($year,$month);
>>308 >system 'split -b 15m hoge';
>で出来るのでは?
これだとプラットホームに依存しちゃう気がして。
もうちょっと調べてまた夜来ます。
なんででもだ
>>316 sysreadで一発。
$f = "hoge";
$a = 0;
$b = 15 * 1024 * 1024; #バイト数(15MB)
open R,$f;
while (sysread(R,$line,$b)){
open W,">$f_$a";
print W $line;
$a++;
close W;
}
close R;
それがなんででもということだ
じゃあ使い続けるね。
Ruby で言うところの irb みたいなものがあれば教えてください。
>>318 $a, $bはsortが使うので勝手に使ってるとエラーになることがある。
たとえば
my($a, $b);
@list = sort {$a <=> $b} @list;
なんてやると
Can't use "my $b" in sort comparison at ~
といっておこられる。あとstrict vars下でも$a, $bはいきなり使って
怒られないとかいやらしい仕様になっている。
sort使わない場所でエラーにならなきゃ使っても問題ないといえばないが、
いちいち考えるのメンドウだし使わない習慣にしといた方がいいよ。
>>326 なるほど。ありがとうございます。やっと納得できました。
$a, $b のほかにはトラップになりそうな変数名ってあったりしますでしょうか?
英語も読めない、Perlも読めない、ちんこも剥けない俺はどうしたらいいですか?
4ね
こいつあ便利だ!
あれ?タブインデントできないのこれ?駄目じゃん doc読むのマンドクセーからねるぽ
perl版indentか。いいね。
C-x h C-M-\
コメントが揃うところいいね
338 :
デフォルトの名無しさん :2005/06/20(月) 10:57:16
道程ですが質問があります Perlで関数の配列を持たせるときに、返り血の値の種類によって異なった宣言が必要ですか?
お世話になっております。 perlでcgiを作成しているのですが URLでhoge.cgi?day=20050620 と指定しているのに -------------------------------- use CGI; my $cgi = new CGI; my $gDay = $cgi->param('day'); -------------------------------- というように取得できません、、、 Ctrl+F5で更新すると取れるのですが なんでなのでしょう? ってスレ違いならすいません、、
342 :
340 :2005/06/20(月) 17:49:06
>341さん すいません。 WEBプログラミング板というのがあったのですね、、 ご迷惑をお掛けしました。
perl で trap って使えないのでしょうか? 誰か教えてください!
345 :
デフォルトの名無しさん :2005/06/20(月) 21:52:06
http://www.amazon.co.jp/exec/obidos/ASIN/4781907954/ 高いレベルの実践書です2003/06/01
非常に高いレベルで perl について書かれてますが、じっくり読み進めると十分な知識とスキルを身に付けることができます。
参照(ポインタ)周りについて分かりにくそうなところは、絵で示してくれているので、理解を助けてくれます。
加えてしつこいくらいに、一つの式について、perl の色々な表現(書き方)を示してくれてます。
本書は何度も読み返し是非物にしてください。
他人の perl のスクリプトやハイレベルのPerlerの方のスクリプトを目にしても違和感なく理解できるでしょう。
逆にこの本が理解できないレベルでは、高度な柔軟性に富んだperlのモジュールやパッケージは書けないでしょう。
是非チャレンジしてみてください。
http://www.amazon.co.jp/exec/obidos/ASIN/4774108170/ 技術書とは言えないですが2003/06/01
技術書とはとても言えないですが、”導入書”としてはいいかもしれません。
飽きも来ず、淡々と前から順にスクリプト書きながら読み進めていくと、仕事に役立つレベルには全然物足りませんが、ナンチャッテパーラーにはなれるでしょう。
業務で使うことを目的としている人は、別の本できっちりと「参照(ポインタ)」周りや、ハッシュや構造体等について"正しく"十分な知識経験を補ってから業務に臨んでください。
エンジニアでない方ならば、お勧めの一品です。
かく言う私も、全く perl を知らない状態で本書を一通り触り、「イロハ」は把握できました。繰り返しますが、業務レベルには到底達することができませんし、技術書レベルにも達してないと思います。
347 :
デフォルトの名無しさん :2005/06/21(火) 00:42:40
任意の行にログを追加したいのです。 たとえば、100行あるログの50行と51行の間に新しい行を追加するとか。 ネット検索したんですが、やり方を見つけることが出来ません。 誰か教えてください。 コレを使ったら簡単だという関数とか無いんでしょうか?
oepn(FILE,"file.txt"); $j=0; while($line = <FILE>){ push(@log,$i); $j++; push(@log,$new) if($j==50); } テキトーに考えた。(Perl歴一ヶ月)
>>347 ファイルを配列に読み込んでから、spliceで要素を挿入後
配列出力時の区切り文字を\nに変えてprint。
区切り文字は空文字だった。。以下source。 oepn(IO, '+>file.txt') or die 'file error'; my @data = <IO>; splice(@data, 50, 0, $add); local $"; print IO "@data"; close(IO);
連投スマソ。もち、$addの末尾には改行文字付けてね。
>>347 perl -pi.orig -e 'print "hoge\n" if $. == 51' logfile
早っ。 >348 やっぱ順番に読むのが速いですかね。 >349~351 なるほど、各行を配列の要素にするんですね。 頭が固いからそういう発想が出てこなかったですよ。 spliceは使ったこと無かったですが、調べたら、やりたかったことが出来そうです。 ありがとうございます。 どちらを使ったらいいか私には判断が難しいですが、 妄想していたものに近いのが後者なので、そちらを使うと思います。 splice以外の関数を使えば「途中に挿入」以外にも出来そうですし。
354 :
347 :2005/06/21(火) 01:46:11
>352 うおっ。スゴイ。 一番スッキリしてますね。 hoge\nが新しく書き込むログで… 使いこなせるなら使いたいのですが、私にはちょっと勉強が必要かも。 いや、諦めず理解できるようにならねば。
355 :
デフォルトの名無しさん :2005/06/21(火) 06:39:49
例えばaaa.plというスクリプトを実行中、aaa.plのスクリプトの中で 他のスクリプトbbb.plを指定して実行できる関数などありますか?
do "bbb.pl";
evalで囲め
なぜeval?
コンストラクタの引数の形式にはいろいろパターンがあるかと思いますが、 こういう場合はこうするのがいい、みたいなガイドライン的なものってありますか? my $hoge = new Hoge("foo", "bar"); my $hoge = new Hoge(Foo => "foo", Bar => "bar"); my $hoge = new Hoge({ Foo => "foo", Bar => "bar" }); my $hoge = new Hoge("foo", "bar", Baz => "baz", Qux => "qux"); my $hoge = new Hoge("foo", "bar", { Baz => "baz", Qux => "qux" });
変なことがおきないように
「指定して実行」 う~む
>>361 たしかにそこが謎だけど、 system("bbb.pl"); というようなことがやりたいのかねえ?
>>359 >my $hoge = new Hoge({ Foo => "foo", Bar => "bar" });
書き捨てのコードじゃなければこれを選択するのが一番。
修正に強い。
メソッドの呼出も含めてね。
>>362 実行したファイルの STDOUT の内容が欲しいなら `bbb.pl`だな。
>>363 なるほど。継承したりしたときを考えるとそれが良さそうですね。
いや、普通はnew Hoge(Foo => "foo", Bar => "bar")だろ。
おれはnew Hoge(...)じゃなくてHoge->new(...)派なんだが 引数の話だから関係ないか
368 :
デフォルトの名無しさん :2005/06/22(水) 11:03:35
do関数で do aa.pl; do bb.pl; do cc.pl; do dd.pl; とやったところaaが終わってbb、bbが終わってcc と処理されました。 そうではなく、aa,bb,cc,ddが同時にスタートして 処理する方法はありませんか?
370 :
デフォルトの名無しさん :2005/06/22(水) 16:03:58
>>369 リンク紹介ありがとうございます。
ところで、どれもこれもモジュールを使用するようですが
使用しない方法はありますか?
371 :
デフォルトの名無しさん :2005/06/22(水) 16:10:18
俺ならML使うんだけどね
>>370 それぞれのモジュールの機能を自分で書けばいいだけ。
373 :
デフォルトの名無しさん :2005/06/22(水) 18:47:33
my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id}); my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id}); print br (), br (), "$row->{t} $row->{status}", " [", a ({-href => $edit_url}, "Edit"), "]", " [", a ({-href => $delete_url}, "Delete"), "]", br (), "\n", "$row->{content}\n"; 1行目のsprintfで文字列を指定して、出力しているのはわかります。 しかし、括弧内の意味がわかりません。変数"id"について、URLを指定しているらしい ですが、よくわかりません。 どっかに詳しく解説している、サイトとかありませんかね?
perl -e "while (<ARGV)) { $line = $_; if (!m/^S7/) { print; } } print $line; }" foo.mot bar.mot baz.mot > hoge.mot と書いたときに、foo.mot, bar.mot, baz.mot のどれかが存在しなかった場合 エラー終了させたい (すなわち exit code 非0 を返させたい) のですが、1 行で済む書き方はないでしょうか。 とあるメイクファイルのコマンド行に書いて、依存ファイルが無かった場合メイクを止めることを意図しています。 上の書き方のままだと、例えば bar.mot が見つからなかったとしても、 Can't open bar.mot: No such file or directory at -e line 1, <> line 1479. と出るだけでメイクが止まりません。
>>374 漏れなら Makefile でこうする。
hoge.mot: foo.mot bar.mot baz.mot
perl -e "..." foo.mot bar.mot baz.mot > $@
376 :
374 :2005/06/22(水) 19:34:45
すいません、一応自己解決したんですが、なんかダサい。 perl -e "foreach (@ARGV) { -e or die } while (<ARGV>) { $line = $_; if (!m/^S7/) { print } } print $line;" $(MOTS) > $@ もっと短くできないですかね _| ̄|○|||
377 :
374 :2005/06/22(水) 19:55:32
>>375 何か、それでは >374 のサンプルコードから本質的に代わってない希がします。
ひょっとして、依存関係行に依存ファイル foo.mot, bar.mot, baz.mot をきちんと書いておけば
bar.mot とかが見つからなかった (および生成もできなかった) 場合、make が勝手に止まるダロウ、
というご提案なのかもしれませんが、少なくとも今使ってる GNU Make 3.71 では
止まらないのでつ; (コマンド行が実行される。)
>>377 マジで? Makefile の該当部分見せてみ。
379 :
374 :2005/06/22(水) 20:14:26
たびたびすいません、完全に解決しました。
>>375 さんの回答は一応正しいですね。私の make の使い方 (というか makefile の配置) が変だったようです。
こんな makefile でした。(説明のため、規則は簡単にしてあります。)
MOTS = ../FOO/foo.mot ../BAR/bar.mot ../BAZ/baz.mot
hoge.mot: $(MOTS)
perl -e "while (<ARGV)) { $$line = $$_; if (!m/^S7/) { print; } } print $$line; }" $(MOTS) > hoge.mot
で、../FOO/ や ../BAR/ や ../BAZ/ にも Makefile が存在します。
このとき GNU Make は、../BAR/bar.mot が存在しなかった場合、"make.out -C ../BAR/" を実行し、その正常終了をもって
bar.mot ができたものとして、メイクを続行するようです。
bar.mot が本当に生成されたか否かは全く関知しない罠(汗
>>375 さん疑うような発言をしてすいませんでした orz
warningをつかまえてなんかしたいのなら$SIG{__WARN__}使え
質問者に童貞が多いのは気のせい?
>>381 は童貞か?何のためにそんな書き込みをするんだ?恥ずかしくないのか?
お前が童貞である原因はお前自身なんだから、
お前が行動起こさないとどうしようも無いことぐらい分かってるだろ?
くだらない書き込みをするな。
383 :
242 :2005/06/23(木) 02:01:08
384 :
デフォルトの名無しさん :2005/06/23(木) 02:01:25
387 :
デフォルトの名無しさん :2005/06/23(木) 02:40:51
勝ちたい時にはFカップ
なんで顔が真っ赤なんだ?
>>388 なっ・・・・バカッ!勘違いしないでよ!!
切り返しにワロタ
393 :
これはどうなったんですか? :2005/06/23(木) 10:07:53
466 名前: デフォルトの名無しさん 03/12/07 17:32 「Perlについての質問箱」シリーズもかなり息の長いスレになってきますた。 ここで勝手連的にこのスレのサポートページを作ろうと思っています。 いま考えているのは、 1. このシリーズの過去ログアーカイブ 2. スレッド専用ソースコードうpろだ 3. 過去ログのダイジェスト (Q&Aにまとめたもの) 4. リンク集 こんなところかな。 きながにまっててください。
396 :
デフォルトの名無しさん :2005/06/24(金) 15:52:46
require 'jcode.pl'; 使って文字化け防止したのに 文字化けたorz 「構」とか「急」とかばけらった・・・どうしたらばけないっすか?
エスパーキボンヌですか?
398 :
デフォルトの名無しさん :2005/06/24(金) 16:08:34
perlでサムネイル画像とファイル名称の管理をしたいと考えています。 諸般の事情から、imagemagik を使いたいのですが、実際のサンプル コードが転がっていません。 どなたか親切な方、PerlとImagemagikが共存したサンプルコードの 在り処を教えてくれませんか? ちなみに童貞ではありません。
>>398 > perlでサムネイル画像とファイル名称の管理をしたいと考えています。
> 諸般の事情から、imagemagik を使いたいのですが、実際のサンプル
> コードが転がっていません。
そのimagemagikとかいう、なに? パッケージ? ファイル? 商品?
の供給先に質問してください。
401 :
デフォルトの名無しさん :2005/06/24(金) 17:12:28
3つの中から1つを選んで、「正解」「おしい」「だいぶ違う」のどれかを表示sるうCGIを作ってください。 という問題で作ってみたのですが500エラーが出てしまいます。 どこが間違っているのかご教授ください。 #!/usr/bin/perl print "Content-Type: text/html\n\n"; print "<html><body>"; use CGI ':standard'; $q = new CGI; $a = $q->param("answer"); if ($a eq "") { print "<form action=toi4.cgi method=get>"; print "<input type=radio name=answer"; print " value=a>a"; print "<input type=radio name=answer"; print " value=b>b"; print "<input type=radio name=answer"; print " value=c>c"; print "<input type=submit value=push></form>"; } elsif { if ($a eq "a") { print "「正解」"; } elsif ($a eq "b") { print "「おしい」"; } else { print "「だいぶ違う」"; } } print "</body></html>\n";
>>396 君の質問を理解できるエスパーを一生待ってなさい
あるファイルの先頭とEOFの空行を取りのぞく常套手段ってどんなかんじ?
そのハンドル名は伊達ですか?
411 :
名無しさん@Vim%Chalice :2005/06/25(土) 12:49:02
全員氏ねボケッ
(笑)
今年の暮れくらいにはPerl6のスレが乱立するのだろうか。
perl6ってcvsとかでとれる?
まだ出てないワイ。
ベータテストっていつはじまりんぐ?
Perl6なぁ。頼むから早く出してくれよって感じ。
$aaa = 'aaa:bbbb :cc :ddd';から、@abc = ('aaa','bbbb','cc','ddd') みたいな配列 @abc を作りたいのですが、どうすればよいのでしょうか。 現在はとりあえず、 @abc_tmp = split(/\:/, $aaa); foreach(@abc_tmp) { if (/^(\w+)/) { push(@abc,$1); } } としていますが、もっと良い方法があると思うのですが。 よろしく御示唆お願いします。
Perl5.8~を使っているのですが、 日本語を表示するときに、文字化けしてしまう事が多々あるのですが、対処法などありませんでしょうか
>>418 ヒント: splitについて詳しく調査せよ。
>>419 ま、取りあえずプログラムの先頭に
use encoding 'shiftjis';
binmode STDERR, ':encoding(shiftjis)';
の2行を入れてみ?
あとは、ググって自分で調べるよろし。
422 :
421 :2005/06/27(月) 21:56:02
>>421 は、Windows/DOS系の場合な。
Unix系なら euc-jp
423 :
419 :2005/06/27(月) 22:23:20
>>421-422 ありがとうございます。助かりました。
もっと自分で調べてみないと駄目ですね・・・
>>418 思考か経験が足りないだけだな。
君には簡単にできる。ガンガレ
Shift_JISコードを含んだcsvファイルからperlで EUCやUTF-8に変換せずにフィールドから項目を抜き出すコードを教えて下さい。 改行,カンマ,ダブルクォートを含んだフィールドはダブルクォートでクォートされ フィールドに含まれるダブルクォートは、バックスラッシュでなくダブるクォートの 二重化でエスケープされています。 さらに下位バイトにダブルクオートとおなじコードを含む漢字も混在しています。
>>425 出力結果がsjisならいいんでしょ?
変換せずに、とか変な条件付けない方がいいんじゃないのかな。
>>426 禿同。eucかunicodeに変換して処理してからsjisに戻す方が
余計なこと考えるよりたいていは楽。
ただシフトJISの下位バイトは0x00~0x3fは避けてあるので
427も指摘しているとおり「下位バイトにダブルクオートと
おなじコードを含む漢字も混在しています。」なんてことは
ありえないんじゃなかったっけ。エスケープに逆スラッシュ
使ってると面倒なんだけど今回はそうではないようだし、
何も気にせずやっても問題ないような気がする。
>>426-428 助言ありがとうございます!
ダブルクォートは、バックスラッシュの書き間違いですすみません。
最初、PHP使っていて標準のCSV関数を使っていたら、
漢字コードのバックスラッシュを勝手に解釈されてわやくちゃになってしまいました。
Perlだと漢字変換せずにもっとすっきりした書き方ができるかなと思っていました。
>>427 のPerlメモは参考にさせていただきます。助かりました。
本を買うのに悩んでいます。 CGIで掲示板なら1から作れ、普段からちょっとしたテキスト処理にPerlを用い、OOPはできていないくらいのユーザです。 これからプログラミングPerlのvolume1と2を買おうと思いますが、他にお勧めはありませんか?
>>430 > 本を買うのに悩んでいます。
本などに頼るな。
本を頼ることにしか使えないのはお前だけ
434 :
デフォルトの名無しさん :2005/06/28(火) 19:07:52
中国語、日本語混在で扱わなければならないので、初めてUTF-8なperl/CGIにしよう と、簡単なサンプルスクリプトを書いて見ました。 がうまくいきません。 perlへのパスが不正だと怒られました。 (pcheck.cgiの出力です) 改行形式:LF (UNIX形式) Perlのパス:・ソ#!/usr/bin/perl サーバのPerlとのチェック :パスが不正のようです・ソ#!/usr/bin/perl パーミッション:実行権あり 文法チェック:../kel/catalog.cgi syntax OK EUC-JPやshift-jisでスクリプトを保存すると問題なく動いてくれるのですが 何か勘違いしてますか?
>>434 UTF-8はUTF-8でも、BOMがついてると、shebangが読めなくなって動作しない。
テキストエディタは何使ってる?
436 :
デフォルトの名無しさん :2005/06/28(火) 19:25:14
結構基本的なことだと思うのですが、なかなかできません。 どなたかよければ教えてください。 2つファイルを使うのですが、 一つは 10011 23412 32221 12123 ... というようなファイルで、 もう一つは 10011 12632 23412 32221 44432 12123 43444 ... のような感じなのですが、これを、 12632 44432 43444 ... のように、一つ目のファイルにあるものを2つめのファイルから なくして2つ目のファイルを出力するにはどうしたらよいのでしょうか?
437 :
デフォルトの名無しさん :2005/06/28(火) 19:25:58
>>435 早速お返事ありがとうございます。
エディタは Peggy Pro とterapad を使って、両方試してみました。
>>437 ぐぐってUTF-8NとUTF-8とBOMの件、探し当てました。
UTF-8N指定でうまくいきました。ありがとうございます。
BOMについてはまだ理解していませんが、勉強します。
>>431 誘導ありがとうございます。
該当スレを読んでみます。
>>432 今まで改造やネットなどから学んでいたので基礎を固めようと思ったのです。
>>436 @aa = (10011,23412,32221,12123);
@bb = (10011,12632,23412,32221,44432,12123,43444);
foreach $bb(@bb){
if (!grep{$bb == $_}@aa){
push @cc, $bb;
}
}
print "@aa \n";
print "@bb \n";
print "@cc \n";
442 :
418 :2005/06/28(火) 20:50:41
できました!
splitがヒントということで、まずはこんなものを書いてみました
@abc = split(/[^\w]/, $aaa);
完璧だと思ったのですが、結果は@abc=('aaa', 'bbbb', '', 'cc', '', 'ddd')、、、
ならば、と思って、
@abc = split(/\s*\:\s*/, $aaa); としたら、、うまく出来ました!
splitの中は , や : のような文字だけしか使えないと思っていました。
こんなことも出来るんですね。今後いろいろ使えそうです。
>>420 さん、
>>424 さん、どうもありがとうございました。
>>429 Text::CSV_XS or Text::CSV_PP あたりを使ったら?
>>442 ロクに読まずにカキコ
@abc = split(/[^\w]+/, $aaa);
445 :
418 :2005/06/29(水) 00:42:32
>>444 うわ、できました。しかも、この方法だと
$aaa='aaa:bbbb : cc:dddd ';みたいに、末尾にスペースのみが
ある時でもちゃんと取れますね。
ありがとうございます。勉強します。
>>445 あえて/[^\w]+/って書いたけど/\W+/でおk
447 :
デフォルトの名無しさん :2005/06/29(水) 01:37:57
Perlで実装したSOAPサーバに、C++で実装したクライアントでアクセスする 方法知りませんか?
>>447 近所にできたセブンイレブンに自転車で行く方法を知りませんか?
と同じような質問だな。
>>448 答えられないのにわざわざしゃしゃり出てきて書くほど
面白い比喩ではないですね ;-)
>450 しかし答えられないのは確かだ。 そのC++クライアントの実装方法を答えればいいのか、 だとしたらその仕様はどこでわかるのか。 それともそのC++クライアントの操作方法を答えればいいのか、 だとしたらその製品は何なのか。 などなど、答えるために必要な前提が揃っていない。
>>447 っていうか「Perlで実装した」って部分は言う必要なし
要は、SOAPサーバにC++で実装したクライアントからアクセスしたいって話しになる
とするとスレ違い
453 :
デフォルトの名無しさん :2005/06/29(水) 16:24:37
>>451 >>452 根本的に、SOAPとして実装したサーバ(CGIとかでも)は、異なるプログラム言語
からでもアクセスできるもの?
できるなら、C++でもC#にしても、実装方法を示したサンプルプログラム
みたいなのはないですかね?
>>453 まぢで言ってるのか(@_@; 「プロトコル」って何のために決まっているのか理解してる?
こんな質問をする人間がいったいどういう人間なのか知りたい。 嘘コンサルがプレゼン資料か何か作ってるんか?
456 :
デフォルトの名無しさん :2005/06/29(水) 16:43:46
From: [761] 名無しさん@お腹いっぱい。 <>
Date: 2005/06/20(月) 21:33:35
http://www.amazon.co.jp/exec/obidos/ASIN/4781907954/ 高いレベルの実践書です2003/06/01
非常に高いレベルで perl について書かれてますが、じっくり読み進めると十分な知識とスキルを身に付けることができます。
参照(ポインタ)周りについて分かりにくそうなところは、絵で示してくれているので、理解を助けてくれます。
加えてしつこいくらいに、一つの式について、perl の色々な表現(書き方)を示してくれてます。
本書は何度も読み返し是非物にしてください。
他人の perl のスクリプトやハイレベルのPerlerの方のスクリプトを目にしても違和感なく理解できるでしょう。
逆にこの本が理解できないレベルでは、高度な柔軟性に富んだperlのモジュールやパッケージは書けないでしょう。
是非チャレンジしてみてください。
_______________________________________
457 :
デフォルトの名無しさん :2005/06/29(水) 16:46:43
From: [762] 名無しさん@お腹いっぱい。 <>
Date: 2005/06/20(月) 21:34:06
http://www.amazon.co.jp/exec/obidos/ASIN/4774108170/ 技術書とは言えないですが2003/06/01
技術書とはとても言えないですが、”導入書”としてはいいかもしれません。
飽きも来ず、淡々と前から順にスクリプト書きながら読み進めていくと、仕事に役立つレベルには全然物足りませんが、ナンチャッテパーラーにはなれるでしょう。
業務で使うことを目的としている人は、別の本できっちりと「参照(ポインタ)」周りや、ハッシュや構造体等について"正しく"十分な知識経験を補ってから業務に臨んでください。
エンジニアでない方ならば、お勧めの一品です。
かく言う私も、全く perl を知らない状態で本書を一通り触り、「イロハ」は把握できました。繰り返しますが、業務レベルには到底達することができませんし、技術書レベルにも達してないと思います。
pixel
_______________________________________
自己紹介: ITコンサルタントです。ただの技術コンサルから、脱皮を目指してます。
perlスレでC++だのC#の質問をされてもなぁ...
461 :
デフォルトの名無しさん :2005/06/29(水) 18:44:15
print "<input type='hidden' name='no' value='$no'>"; これ、シングルクォートで囲んでるのに問題なく変数展開されるんですが、 普通の挙動ですか??
>>461 それはシングルクォートで囲んでいるのではなく、(文字としての)
シングルクォートを含むダブルクォート文字列だ。
print '<input type="hidden" name="no" value="$no">';
君の理屈だと上のは $no が展開されなければいけないが
そうならないだろ?
HTML文法エラー
何が?
>>462 なるほど。よく
print "<input type='hidden' name='no' value=\"$no\">";
なんてエスケープしたダブルクォート使って書いてるの多いので、
ダブルクォート内でもシングルクォートで囲っちゃうと変数展開しないから
わざわざこんな面倒なことしてるのかと思いました。
いろいろ調べても
「ダブルクォート内は変数展開するけど、シングルクォート内はしない」
って説明しかないもので。
どうも
>>465 ダブルクォート内のダブルクォートのエスケープは、
エスケープしないと、そこが文字列の終わりとみなされちゃうからだね。
↓これを比べればわかるかな?
print "foo\".\"bar";
print "foo"."bar";
↑と同じ効果 print qq[foo"."bar]; print qq!foobar!;
468 :
デフォルトの名無しさん :2005/06/30(木) 20:22:20
<td height="25" width="108"><a href="../soup/pub_Locus.pl?locus_id=HIX0010495" target="_self"> <img src="../images/btn_db_locusview.gif" alt="Locus view" width="106" height="25" border="0" /></a></td> <span class="locus_id"><font size="+3">HIT000036281</font></span> <span class="locus_id"><font size="+2">Oshiete kudasai 6gatu(6-30niti).</font></span> <td nowrap class="sub_title" colspan="2" width="20%">H-Inv cluster ID <a href= "pub_Locus.pl?locus_id=HIX0010495"><img src="btn_locusview.gif" width="85" height="16" border="0" title="Locus view" alt="Locus view" /></a></td> <span class="locus_id"><font size="+2">を正規表現にして、 Oshiete kudasai 6gatu(6-30niti)を取り出すことはできるのでしょうか? 複雑すぎてよくわかりません。どなたかおしえてください。
469 :
デフォルトの名無しさん :2005/06/30(木) 20:23:14
require してロードしたパッケージがあるとしますが、これをアンロードすることは できますでしょうか?
470 :
デフォルトの名無しさん :2005/06/30(木) 20:23:36
舌足らずになってしまったので、もう一度。すみません。 ....... <td height="25" width="108"><a href="../soup/pub_Locus.pl?locus_id=HIX0010495" target="_self"> <img src="../images/btn_db_locusview.gif" alt="Locus view" width="106" height="25" border="0" /></a></td> <span class="locus_id"><font size="+3">HIT000036281</font></span> <span class="locus_id"><font size="+2">Oshiete kudasai 6gatu(6-30niti).</font></span> <td nowrap class="sub_title" colspan="2" width="20%">H-Inv cluster ID <a href= "pub_Locus.pl?locus_id=HIX0010495"><img src="btn_locusview.gif" width="85" height="16" border="0" title="Locus view" alt="Locus view" /></a></td> ..... というようなファイルがあるのですが、 <span class="locus_id"><font size="+2">を正規表現にして、 Oshiete kudasai 6gatu(6-30niti)を取り出すことはできるのでしょうか? 複雑すぎてよくわかりません。どなたかおしえてください。
471 :
デフォルトの名無しさん :2005/06/30(木) 20:27:23
>468 上のコードだけならこれでとれるのでは? コード as-is でパタンマッチ。 /\<span class\=\"locus_id\"\>\<font size\=\"\+2\"\>(.*)\<\/font\>\<\/span\>
その変なエスケープは何なんだ
エスケープだらけワラタw
m|<span class="locus_id"><font size="\+2">(.+?)\.</font></span>|;
477 :
わから~ん :2005/06/30(木) 23:13:37
1行目 my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id}); 2行目 my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id}); 3行目 print br (), br (), 4行目 "$row->{t} $row->{status}", 5行目 " [", a ({-href => $edit_url}, "Edit"), "]", 6行目 " [", a ({-href => $delete_url}, "Delete"), "]", 7行目 br (), "\n", 8行目 "$row->{content}\n"; 1行目の sprinfで整形された文字列 my $edit_url変数に代入される。 2行目も同じ要領で、my $delet_url変数に代入される。 3行目は HTML表示 4行目 意味不明 5行目 1行目の変数が"edit"としてURL表示される。 6行目 2行目の変数が"delete"としてURL表示される。 7行目 HTML表示 8行目 意味不明 ご質問いたします。 (1)4行目の意味がわからない (2)5行目と6行目がなぜ、editとdeleteのURL表示となるのか? (3)8行目の意味がわからない 特に、(2)の質問を詳しく解説してください。(2)の用法について ラクダ本に記述がありますか? よろしくお願いいたします。
478 :
デフォルトの名無しさん :2005/06/30(木) 23:16:56
/test/hoge/fuga.wmv"><mfaoeaifjeofaejfoaeigaho とかいう文字列があったとして、wmv 以降を空白に置換するにはどのように 記述すればよいのでしょうか? while ( <> ) { if ( $_ =~ /wmv/ ) { $_ =~ // } } こんな感じで、ファイルから読み込んで、置換したいのです。
>>478 そういうのはindexとsubstr使ったほうが速い。
480 :
デフォルトの名無しさん :2005/06/30(木) 23:39:04
>>479 レスありがとうございます。さっそく調べてみました。
substr($_, 0, 21);
index $_, "/test/hoge/fuga.wmv\">";
とかとすれば良いのでしょうか・・・
けれど、今回取り出したいのは、/test/hoge/fuga.wmv"> だけでなく、
/test/hoge/fugaaaa.wmv">gaeafaefewfwefwe
/test/hoge/fugabbbbbbb.wmv">faefaefefa
/test/hoge/fugaccccccccccc.wmv"><faefaefaefaef
と、長さもマチマチなのです。それをこのように綺麗に
/test/hoge/fugaaaa.wmv">
/test/hoge/fugabbbbbbb.wmv">
/test/hoge/fugaccccccccccc.wmv">
したいのですが、もう少しヒントをいただけないでしょうか?
置換じゃなくて後方参照($1)じゃだめなの? $_ =~ /^.*\.wmv/; $wmv = $1; これで $wmv に「/test/hoge/fugaaaa.wmv」がはいる。 はず。確認してないけど。
入らねーよ
484 :
デフォルトの名無しさん :2005/06/30(木) 23:55:54
>>481 while( <> ) {
$_ =~ /^.*\.wmv/;
$wmv = $1;
print $wmv;
print "\n";
}
すみません。でやってみたのですが、どうしてか、何も表示されません。
後方参照ですか。ググって見ましたが、難しそうで、すぐに理解できそう
もないっす
>>479 index で wmv の位置調べて substr で切り取る。
$position = index($_, "wmv");
# wmv の長さが 3 だから +3 してる。本当は length 使って長さ取ったほうがいい。
$str = substr($_, 0, $position + 3);
こんな感じ。
486 :
481 :2005/07/01(金) 00:03:44
>>482-484 (^ω^)ごめww正規表現の書き方わすれちゃった♪
while ( <STDIN> ) {
if ( $_ =~ /^(.*)\.wmv/ ) {
print $1;
}
}
これでできるだろ!ちっきしょー
>>485 おぉ、いけました!
index の戻り値としてその長さが返って来るのでしたか。
length も一応調べたりしました。のちのちの参項にさせていただきたいっす。
ありがざいます
#
>>481 の方も、レスありがとうでした
488 :
481 :2005/07/01(金) 00:06:18
ごめん。.wmvが抜けてた。改行もしてみた。また書き直さして。 while ( <STDIN> ) { if ( $_ =~ /^(.*\.wmv)/ ) { print $1,"\n"; } } つか、本当に↓みたいなファイルしか考慮してないお(^ω^) /test/hoge/fugaaaa.wmv">gaeafaefewfwefwe /test/hoge/fugabbbbbbb.wmv">faefaefefa /test/hoge/fugaccccccccccc.wmv"><faefaefaefaef
489 :
481 :2005/07/01(金) 00:06:54
解決してる・・・(^ω^;)カナシス
ちなみにsubstrはlvalueとしても使えるらすい。 $str = '/test/hoge/fuga.wmv"><mfaoeaifjeofaejfoaeigaho'; $exp = '.wmv">'; substr( $str, index($str, $exp) + length $exp ) = ''; print $str;
ユニットテストする習慣くらいつけようや。
>>488 ちゃんと試してみました。完璧です。
インデントで、全角スペースもちゃんとこちらで削除してるんで、
問題ないっす。
>>490 そんな使い方もしりませんでした。空文字列を結合してるのですね。
本当にお勉強になりました。
493 :
デフォルトの名無しさん :2005/07/01(金) 08:03:10
$cat file.txt | perl -ne 'print if /abc/' という部分で、print if の部分を省略する方法はありますか? たしかあったと思うのですが、どういう風にやるのか忘れてしまいました。
>>493 そこは省略できない。
perl -pe "s/foo/bar/"
と混同しているのでは。
>>494 なるほど。おっしゃる通りです。ありがとうございました。
496 :
デフォルトの名無しさん :2005/07/01(金) 10:50:42
あるCGIに自動で、POSTメソッドで、値を渡すにはどうすればいいんでしょうか?
498 :
デフォルトの名無しさん :2005/07/01(金) 11:46:46
>>497 サーバサイドではないのです。詳しく言うと
http://192.168.1.1/cgi-bin/main.cgi?mbg_webname=adslreconnect に
<form action="/cgi-bin/main.cgi" method="POST">
<input type="hidden" name="mbg_webname" value="adslreconnect">
<input type="hidden" name="adsl_reconnect" value="">
<input type="submit" name="mbg_set" value="再接続">
</form>
という記述があって、「再接続」をクリックするとルータが再起動されるのです。
それを一日一回してるのですが、手動では面倒くさいので、Perlさんに自動でやってもらいたいのです。
しかし、CGIに自動で、POSTメソッドで、値を渡す方法が分からないので、無理なのです。
perlでmain.cgiにPOSTさせたいって事? 個人的にはJavaScriptで勝手に送信させたほうが楽だと思う。
500 :
デフォルトの名無しさん :2005/07/01(金) 12:09:54
>>500 perldoc LWP
perldoc LWP::UserAgent
ヒント:Socket ところで Perl にこだわる理由はなに?
ネットワーク関数はあんまり分からなくて、 ソケットつないでどうのこうのぐらいしか思いつかない。 分かる人にバトンタッチ
505 :
501 :2005/07/01(金) 12:24:59
>>502-503 最近はそーゆー低水準なところから組み上げる必要は滅多になくて、使いたいプロトコルに対応したライブラリを利用するだけで大抵のことは何とかなりまつ。
506 :
503 :2005/07/01(金) 12:40:56
低水準なんすか・・ まぁ、関数一つ一つ追っていくのが楽しいので見逃してくらはい。
>>506 > 低水準なんすか・・
> まぁ、関数一つ一つ追っていくのが楽しいので見逃してくらはい。
中途半端。サブルーチンを一つ一つ追っていくのが
楽しいのなら、socketから突っ込むべき。
おっと、ソケットもモジュールだった・・
509 :
501 :2005/07/01(金) 13:22:04
>>506 何か誤解されてるよーな気がしますが、ここで言う「低水準」は、よりプリミティブに近いもの、とゆー意味でつ。
言語で言うところの、高級(より人間に理解しやすい)⇔低級(より機械語に近い)のよーなもの。
510 :
デフォルトの名無しさん :2005/07/01(金) 14:16:08
511 :
デフォルトの名無しさん :2005/07/01(金) 14:16:30
インストールしてるモジュールをまとめてアップデートするの、 CPANでどうやるんでしたっけ?
遅れレスですまんが。
>>485 にはバグがある。入力が、例題そのままの
/test/hoge/fuga.wmv"><mfaoeaifjeofaejfoaeigaho
ならいいが、
/test/wmv/fuga.wmv"><mfaoeaifjeofaejfoaeigahowmv
とかだったらどうするつもりなのだろうか・・・
514 :
513 :2005/07/01(金) 17:55:02
せめて . や、"> という区切り部分文字列までマッチングに含めるべきじゃまいか。 いやま、どこまでも厳密な結果を求めようとすれば いずれ正規表現 (FSM による構文解析器と同等) の 手に余ることになるのは承知で言うのだけど。
515 :
デフォルトの名無しさん :2005/07/02(土) 00:10:23
超初心者なんですが。。 for($aaa=0;$aaa<1000;$aaa++) だと、aaaは0 1 2 ・・・・ 999ってなりますよね。 000 001 002 ・・・・ 999 ってするには?
sprintf("%.3d", $aaa);
>>515 for my $aaa ('000'..'999') { ... }
見当違いな質問かも知れません。 mod_perlを導入する場合、何らかの条件分けでmod_perlを用いるかどうかスクリプトごとに分けるものでしょうか? それとも導入と共にスクリプトを修正して、今後のコーディングをmod_perl仕様にするといった感じでしょうか?
519 :
デフォルトの名無しさん :2005/07/02(土) 01:01:10
>>510 use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
my $ua = LWP::UserAgent->new;
$request = POST('
http://192.168.1.1/cgi-bin/main.cgi ' , [ mbg_webname => 'adslreconnect', adsl_reconnect => '' ]);
$res = $res = $ua->request($request);
$_ = $res->content;
これは?
随分前に作ったプログラムをサルベージしたものだから、
もしかしたらうまく動かんかも知れんけど。
520 :
デフォルトの名無しさん :2005/07/02(土) 01:02:50
>>498 つーかルータ買い換えたほうがいいんじゃね?
一日一回、再起動が必要なんてヒドス
ID変えたいだけじゃね?
>>516 sprintf 使うなら、%3d じゃなく %03d
>>524 . を見落としてる。
%03d だと 3 「文字」に満たない場合は 0 でパディング。
%.3d だと 3 「桁」 に満たない場合は 0 でパディング。
少なくとも 0 ~ 999 では同じ結果になる。
printf '%03d, ' x 4 . '%.3d, ' x 4, (1, 1234, -1, -1234) x 2;
526 :
515 :2005/07/02(土) 09:44:49
解決しました。 結構あっさりなもんですね
527 :
デフォルトの名無しさん :2005/07/02(土) 11:12:50
>>519 ,520
両方試してみたけどうまくいけね。自分でがんばってみるお。
>>521 何かISPが何かしてるからか知らないけど、12時になったら繋がらなくなる。
んで再起動したらなぜか繋がる。
528 :
デフォルトの名無しさん :2005/07/02(土) 11:44:21
ヒント: Authorizationヘッダ
530 :
518 :2005/07/02(土) 16:32:48
色々調べてみたのですがFastCGIとも一長一短あって悩みますね。
>>523 どうもありがとうございました。
531 :
デフォルトの名無しさん :2005/07/02(土) 17:23:15
おそらく 192.168.1.1 がISPの何かとバッティングしてルータの挙動がおかしくなるといってみるテスツ ルータの設定で 192.168.1.100 とか 192.168.100.1 にしてみれとなんとなく言ってみるテスツ
533 :
デフォルトの名無しさん :2005/07/02(土) 17:30:43
Authorizationヘッダをどう送ったら許可されるですか。 ていうか、Perlでどう送るんですか。 よぐわがんね。
>>498 PerlさんよりWSHのほうがいいと思うよ。
スレ違いだけど、JScriptなら
var ie = WScript.CreateObject("InternetExplorer.Application");
ie.Navigate("...");
WScript.Sleep(3000);
ie.document.forms[0].submit();
こんな感じかな?
535 :
デフォルトの名無しさん :2005/07/02(土) 17:36:56
536 :
デフォルトの名無しさん :2005/07/02(土) 17:39:28
>>532 見落としてたけど、言ってることよくわがんね。
もう帰れ
538 :
デフォルトの名無しさん :2005/07/02(土) 19:15:54
お断りだ
539 :
デフォルトの名無しさん :2005/07/02(土) 19:19:49
while ( <> ) { if ( $_ =~ /test/ ) { ; } else { print $_, "\n" } } 読み込んだファイルに、testが含まれている行は出力しないって処理が したいんですけど、もっとスマートにならんものでしょか?
すいません、Perl で tar 圧縮したいんですが方法をググりましたが情報が探せませんでした。 モジュール名だけでも結構ですので、どなたか教えてください。宜しくお願いします。
541 :
デフォルトの名無しさん :2005/07/02(土) 19:25:07
while(<>){print unless /test/}
これじゃだめでしょうか
>>539
543 :
デフォルトの名無しさん :2005/07/02(土) 19:43:45
内容が重なってる行を削除したいんですけど、久しぶりだった所為か挫折した。 誰か頼む。
>>543 ソートしていいならperl使うまでもない常套句:
cat hoge | sort | uniq > fuga
があるが…
546 :
デフォルトの名無しさん :2005/07/02(土) 21:00:13
>>542 スゴすぎ・・・orz
そんな書き方があったのですか。正直初心者のわたくし驚きました
ありがとうございました。and レスちょっと遅れちゃったみたいで申し訳ないっす
547 :
デフォルトの名無しさん :2005/07/02(土) 21:00:45
>>544 これさえ出来ればプログラムは2年以上使わない予定なんだ。
>>545 Windowだから無理
548 :
デフォルトの名無しさん :2005/07/02(土) 21:04:57
open (IN,'a.txt'); @test = <IN>; $a = @test; $s = 0; TEST:for($i=0 ; $a>$i ; $i++) { for($i2=0 ; $a>$i2 ; $i2++) { if($i!=$i2){ if(index($test[$i],$test[$i2]) == -1) { goto TEST;} } } $hon[$s]=$test[$i];$s++; } print @hon; <>; なんでこれじゃ駄目なんだ。。。
>>547 Windows(DOS)で動くcat/sort/uniqなんて、腐るほど存在するが…
sort -u ファイル名
551 :
デフォルトの名無しさん :2005/07/02(土) 21:22:11
>>545 うまくいかない
cat a.txt | sort | uniq > b.txt
>>549 ほんとだ。ありがとう。
>>550 入力ファイルが 2 度指定されました。
552 :
デフォルトの名無しさん :2005/07/02(土) 21:33:42
もういいお!お前ら!
もういいお^^
555 :
510 :2005/07/03(日) 03:38:29
皆さんありがとうございました。 他所で聞いてきます
556 :
540 :2005/07/03(日) 03:53:59
>>544 ありがとうございます。
すごく参考になります♪
557 :
デフォルトの名無しさん :2005/07/03(日) 07:17:48
Perlスクリプトをコンパイルするのにperlccとperl2exe以外にないの?
>557 PAR とか?
>>577 PerlApp
perlbin ( perlbin.sf.net )
561 :
デフォルトの名無しさん :2005/07/03(日) 08:20:29
Perl5.8でnkfって完全に不要になる? まあnkfは手軽でいいんだけど。
Perl Bone on Xcode は、ちょと趣が違うか(苦笑)
563 :
デフォルトの名無しさん :2005/07/03(日) 10:58:59
パッケージ内の関数のリファレンスを取る場合は、 $ref = \&TEST::test; $ref->test(); このような形で取れますが、関数ではなくパッケージ自体(上の例だとTEST)のリファレンスを 取得して、そこから関数を実行するにはどのように行えばよいのでしょうか?
>>561 それどころかpiconvなるコマンドが添付されてる。
単純なことならNKFでいいけどね。
>>563 TESTパッケージのシンボルテーブルは%{TEST::}
こんなんか? #!/usr/bin/perl no strict; no warnings; package TEST; $global_var = 0; sub func { print "fuck\n"; } package main; # 関数だけ抽出 foreach (keys %{TEST::}) { if (ref *{${TEST::}{$_}}{CODE} eq 'CODE') { push @func, *{${TEST::}{$_}}{CODE}; } } # 実行 foreach $code (@func) { $code->(); }
568 :
デフォルトの名無しさん :2005/07/03(日) 13:50:55
>>565 ,567
単純に TEST:: でリファレンスは取れるんですね。
ありがとう御座います。助かりました。
ActivePerl 5.8.7.813のEncode::from_toってバグってない? 第4引数に何か渡すと100%失敗するんだけど。
ちなみに5.8.4では動いてたのに5.8.7にバージョンアップしたら まったく同じソースコードでも動かなくなった。
ActiveState の Bug Database に3件ほど投稿してやったのに、 半年たっても Unconfirmed のまま。 奴等、真面目にやる気あんのか!(-_-メ)
仕方ないからEncode::from_toのソース見てバグってる部分を自前で書き直して回避。 何でこんなことしなきゃならんのだ…
>>574 あちこちにマルチポストしないでね。@現在20件
文字列をUTF-8から7bitのJISに変換したいのですがどうしたらいいでしょうか?
use Encode; Encode::from_to($mojiretu, 'utf8', 'iso-2022-jp');
>>571-572 ActivePerlじゃなくてEncodeの問題?
なら、Jcodeメーリングリストに報告したら修正してくれるよ。
579 :
デフォルトの名無しさん :2005/07/03(日) 22:24:40
floatの4バイトのバイナリデータ(リトルエンディアン)をマックで正しく読み込むには、どうしたら良いでしょうか?
バイトオーダー以外が共通なら unpack('f',pack('N',unpack('V',$float))) とか。
581 :
デフォルトの名無しさん :2005/07/03(日) 23:33:23
>>580 うまくいきました。どうもありがとうございます。
582 :
デフォルトの名無しさん :2005/07/03(日) 23:41:26
>>582 cryptについてちょっとくらい自分で調べろ。
packのpとかPってどんなときに使うんですか?
Net::FTPモジュールを使い外部サーバーにFTP転送しようと思いこんな感じで書きました。 抜粋ですが $ftp = Net::FTP->new("ftp_host", Debug => 0); $ftp->login("user","pass"); $ftp->cwd("/public_html"); $ftp->binary; $ftp->put("hogehoge.tar.gz"); $ftp->quit; 転送は問題なく出来るのですが、アーカイブが壊れてしまいます。 送り側サーバーで生成したアーカイブを確認すると正常でした。 送ると壊れます。 何か対策はありますでしょうか。。 御存じの方いらっしゃいましたら教えてください。 宜しくお願いいたします。
>>585 レスが無いので、モジュールを知らないけど書いてみる。
とりあえずローカルとリモートのファイルサイズが同じかどうか見てみる。
空ファイルとかテキストファイルを送っても壊れるかどうかもみてみる。
>>585 ヒント: asciiモード/binaryモード
>>587 > ヒント: asciiモード/binaryモード
あ、ごめん。それはやったのね。マヌケだった。
>>585 ちゃんとバイナリモードにしてるしそうめったなことはないと
思うのだがな。むしろ書いてないところに問題があるとか壊れている
という認識自体間違ってるとかそういうところを疑ったほうが
いいかもしれない。
示されたコードは抜粋だとあるが、そのコードで現象は再現しているか?
壊れていると判断した根拠は? そもそもサイズが違うとかmd5等のチェック
サムが違うとかなら本当に壊れてそうだが、単に解凍できなかったとかなら
解凍方法や環境の問題かもしれない。
>>585 >>589 の言う通りやね。
送り元のtarは、gnu tarでアーカイブしていて
受け取り側は一般のtarコマンドしかないとかの話じゃないの。
何か重大で意外な見落としをしている気がする
>>591 エスパーさんあとをよろしくなのです。。
593 :
デフォルトの名無しさん :2005/07/04(月) 23:19:34
モジュールを use するのを、 my $mo = "ABC"; use $mo; とした場合、"syntax error" と怒られてしまいます。 動的にこのような形で use したいのですが、どのようにしたらできるのでしょうか?
>>593 どっかにできあいのモジュールがありそーな気もしますが……。
my $class = "File::Copy";
my $pm = $class;
$pm =~ s@::@/@g;
$pm .= ".pm";
require $pm;
$class->import;
copy($0, "test");
>>593 my $mo = "ABC";
eval "use '$mo'";
もアリ。
eval "use $mo"
597 :
585 :2005/07/05(火) 08:44:56
>>586-592 レスありがとうございます。
昨日の夜に試して見たところ正常に出来ました。
が、先ほどためしてみるとまたダメでした。
「壊れる」という表現は適切ではないかもしれません。「一部壊れる」に訂正します。
あとLinux側で解凍すると解凍の終わりかけ位に以下のエラーがでます。(Win ではエラーはでませんが一部解凍不能)
gzip: stdin: unexpected end of file
tar: 書庫中に予期せぬ EOF があります
tar: 書庫中に予期せぬ EOF があります
tar: エラーを回復できません: 直ちに終了します
tarは壊れてしまうとファイルを復活させる事が出来ないのである意味別の手段を考えた方がいいのかもしれませんね。。ファイルサイズがどうも増えたり減ったりしている様な。。
http://vartmp.net/blog/archives/cat_webtech.html の記事とかもしかしたらとか思っていますが Debug=>1 で様子を見ることも出来ないヘタレなので。。
サイズが異なるんじゃあきらかにおかしいな。うまく転送できてないか お前が引用した記事にあるように手元に用意したファイルがおかしいか (この例ではファイルをcloseしてなかったので最後まで書かれてなかった) といったことが考えられる。 うまく転送できてなければputがエラー(undef)返してるかもしれないので 確認した方がいいだろう。警告メッセージも出てるかもしれない。
>>597 tarのアーカイブ作るときにtarアーカイブの作成場所とアーカイブ対象のディレクトリが被ってるんじゃないの?
“tar cvf hoge.tar *”とか“tar cvf /hogehoge/hoge.tar /hogehoge”とかすると
アーカイブ対象に現在作成中のアーカイブファイル(自分自身)も含めるからわやくちゃになるよ。
てPerl関係ないし。
600 :
デフォルトの名無しさん :2005/07/05(火) 10:13:38
>>594-596 ありがとう御座います。そのようなやり方で出来るのですね。
>>594 のやり方は試してませんが、evalの方法が簡単でよかったのでそれで行います。
ありがとう御座いました。
eval "use $mo"は美しくないなぁ。
これってuse出来るか出来ないかをスクリプトに判断させるときのやり方だと思う。
useはコンパイル時にrequireしろってのと同じだから動的にやるなら
require "$mo.pm";
このとき、文字列の場合.pmが必要で、
名前空間はフォルダに置き換えてスラッシュにしないといけない。
つまり、
$mo = "One::Of::Module";
の場合は
$mo = "./One/Of/Module.pm";
require $mo;
とか。
ひとつのディレクトリに各モジュールが入っているなら
require "./One/Of/$mo.pm";
かな?
>>594 にあるようなimportは必要なきゃしなくてイイと思われ。
603 :
デフォルトの名無しさん :2005/07/05(火) 14:58:45
配列変数のかっこの中に人任意の不特定多数の数値をキーボードから 入力する方法がわからん 配列変数を使わなければ $A=<>; chomp $A; って感じで気力の続く限り打ち続ければいいけど データ数が決まってなければ使えないじゃん @AAA(10,20,30,40・・・・) とデータ数が予想できない場合はどうすりゃいいの?
……
>>603 my @array;
push @array, $_ while <STDIN>;
chomp @array;
606 :
デフォルトの名無しさん :2005/07/05(火) 16:10:35
↑ そのpushの中の$_はどんな働きをするの?
push @array, while <STDIN>;
chomp @array;
でも、OKだったけど。
>>605 のソースを走らせても$_の中に何も文字列は入っていなかった。
chomp(my @array = <STDIN>); じゃだめなの?
TMTOWTDI
宗教論争
てほどでもないさ
AAA="hoge" とやる所をタイプミスで AA="hoge" とやってしまい、後の方では、 $AAAを(未定義のまま)使ってしまった場合 何事もなく動いてしまう事があります。(バグに気づかない) この手の未定義変数のチェックをうまくできないでしょうか?
614 :
612 :2005/07/06(水) 00:05:58
>>613 こんなのがあったとは… ありがとうございました。
use strictなんて基本中の基本だろうが これの説明が載ってない入門書は捨てた方がいい
perl4の時代の本とか...
ネットだけで独学とか
何処のとは言わないがCGIの改造で入門して、本買わずにWebだけで独学で学んだら、 まともなPerl5コードが書けるようになるまで一年かかった俺ガイル まあ変な癖つけたく無ければ良いソースを読むかちゃんとした本買えって事だな…
>>619 > 何処のとは言わないがCGIの改造で入門して、本買わずにWebだけで独学で学んだら、
> まともなPerl5コードが書けるようになるまで一年かかった俺ガイル
なぜ最高のクオリティを誇る添付ドキュメントを見ない?
どんな書き方でも動くのがいいところではないか。
あるファイルがあります。そのファイルはヘッダとボディからなっています。 ヘッダとボディは空行で区切られています。ボディの行数を計算して、ヘッダ の最後に Lines: ボディの行数と書き込むにはどうすればよいでしょうか?
空行は1回限りか?
人をバカにした書き方だな
>>622 ボディの行数をカウントして、ヘッダの最後に"Lines: "フィールドを追加すれば
いいよ。
んじゃ空行は1回限りの場合ってことで。 怒ってる人もいるようだからあとは自分でなんとかしてくれ。 open IO, "+< hoge"; $lines = @in = <IO>; foreach (@in) { $lines--; $_ = "Lines: $lines\n\n" if (/^$/); } seek IO, 0, 0; print @in; close IN;
あら?ファイルハンドルが違うな。 まあ問題になったら自分でなんとかしてくれ。
>>623 空行は一回以上ある場合もあります。複数の空行がある場合、最初のものが区
切になります。
>>624 すみません。馬鹿にするつもりはありませんでした。
どの部分が気にさわられのでしょうか。
以後気を付けますので、おしえていただけませんでしょうか。
>>625 行入力演算子を while でまわして、body の行数を数えることができたんです
が、その後でつまっています。
>>626 ありがとうございます。参考にして、ちょっと考えてみます。
空行が複数でも
>>626 をチョチョイといじれば完成だ。
参考とかそういうレベルではないだろう。
631 :
デフォルトの名無しさん :2005/07/06(水) 18:00:16
>>601 モジュールの読み込みってrequire でも出来るんですね。
evalではなく、requireでする方法に変更しました。
そうなってくると分からなくなるのですが、use と require の違いって
何なのでしょうか?
>>628 =622
こんなんでどう?
open IO, "+< hoge";
read IO, $buf, -s IO;
seek IO, 0, 0;
($head, $body) = split /\n\n/, $buf, 2;
print IO $head, sprintf("\nLines: %d\n\n", $body =~ tr/\n//), $body;
close IO;
633 :
632 :2005/07/06(水) 18:27:54
printのとこ、ちと無駄だったんで差し替え printf IO "$head\nLines: %d\n\n$body", $body =~ tr/\n//;
>>631 マニュアルにuseはModuleにbarewordしか許されないことを
除けば
BEGIN { require Module; import Module LIST; }
と同じとあるので、違いは
実行されるタイミング
import
Moduleの指定のしかた
ということになるだろうな
635 :
デフォルトの名無しさん :2005/07/06(水) 20:03:14
>>634 そうなんだ。ほとんど同じ、っていうか全く同じですね。
初めて知りました。有難う御座いました。
636 :
601 :2005/07/06(水) 20:12:04
>>634 そうなのよ。
モジュールのimportなんて作り方によっては必要ない。
だいたいの場合は単純にrequireでいいはず。
該当モジュールがuse Exporterしていて、
かつ関数を呼び出し元の名前空間にimportしたい場合のみ等価なコードを書けばよい。
まじめに質問! どうやったらプログラム書けるようになりますか? C、Perlとか「プログラミング言語」そのものは、市販されてる本よんで サンプルプログラムとか打ち込んで、練習問題を解答できます。 しかし、Cで簡単なゲームとかPerlで掲示板とかチャットとか、1から 自作しようとなると、さっぱりわからん。 プログラミング言語を学ぶ以外に、どんなこと勉強すればよいのでしょうか? 絶対にPerlで掲示板とかチャットとか、人が書いたソースコードが読める ようになりたい。
英語を辞書無しで読めるようになればあとは楽勝
>>637 まず大文字の英数字を気持ち悪いと思う感覚を育もう。
個人的には口語中の一桁数字なら大文字でもいいけど。
とりあえず経験積めば誰だってある程度できるようになるんでは。
>>639 大文字と全角文字の区別をつけるところから始めよう。
643 :
637 :2005/07/06(水) 22:17:24
>>642 お前エスパーかよ。どうして才能が皆無なんて、ソースコードも見てないのに
言えるんだ? ばっかジャネェの?
諦めなさい。君には才能が皆無。
諦めなさい。君には才能が皆無。
諦めなさい。君には才能が皆無。
プログラムが組めないどころか、
練習問題もこなせそうにないヤツに言われたよ~。・゚・(ノД‘)・゚・。
ちょっと下手に出て質問したら、すぐこれだからな(汗
バグ出してエラー出して、苦労して自力で修正して・・・
頭で思い描いた通りに、プログラム組めるようになれば一人前ダヨネ!がんばろ
これ以上、アホに構ってられないや じゃね! もう見ないから
そんなに悔しかったのかww
おーデブが喜ぶ喜ぶ
646 :
637 :2005/07/06(水) 23:05:44
>>643 あなたは誰ですか?
>>637 構成する能力が皆無っていう人なのかな。
いるんだよね、こういう人。
ある程度以上の複雑さのものを構築することがまったくできないの。
648 :
デフォルトの名無しさん :2005/07/06(水) 23:45:59
>>637 データフロー図を描いて、データがどういう風に流れて、どういう風に処理されるかとか、
UMLのユースケース図を描いて、どんな機能があるのかとか、
もう少し大きな視点で考えてる訓練をする
ある程度の機能をもったアプリケーション(掲示板とか)の作りかた
を解説してある本を読んで見るとか
情報処理技術者試験のソフ開とか勉強してみるのもいいんじゃない?
>>648 小生、Perlに入れ込んでいる理由は、単純にとっつき易いからです。
プログラム経験はまったくありません。
プログラムといっても所詮、定型処理だから、どんな機能があるのか
フロー図を描いて整理して、それをプログラムすればよく(構造化
プログラミングというらしい)サブルーチンを繰り返すような構造に
なっている。
しかし
世間一般のプロレベル>>中間レベル>>小生の下手の横好きレベル
中間レベルに成長するための方法がわからない。
やはり、KENTさん(嫌悪感を持っている人も居るようですが…)とかの
解説本を読むとか、Web上のオープンプログラムを読んで、改造してみる
とか、地道な努力が必要なのでしょうか?
KENTのは絶対やめた方が良い。 この前もセキュリティホール見つけたし、汚いソースだし。
>>650 プログラム言語も自然言語も同じ言語。
あんたの質問は、
英語の入門文法書はわかる。
でも英作文はできない。どうしたら作文ができるようになるのか?
とほぼ同義。
すっかり厨が居ついてしまったな
>>650 掲示板は結構多くのプログラミングエッセンスが入っていて
学習には最適だ。
変に他人のコードなんか読んだり演習問題なんかやってないで
100行ぐらいの規模の掲示板でもイチから組んでみると良い。
で、出きなかったら、行き詰まったら、ここに質問に来い。
まじめに取り組んでで、手前勝手な解釈の上に立った質問でなく
実際のコード晒すような奴なら、まあ誰かが導いてくれるだろう。
厳しい指摘や罵倒も受けるだろうがそれも勉強だわな。
現場で戦力になる早道は他人のプログラム修正だが、プログラミングを
覚える早道はなんでもいいからフルスクラッチのプログラムを書いて見る
ことだと、俺は思う。
>>650 >>654 の言う通り。
ただしKENTはやめておけ。
嫌悪感とかそういうくだらない理由ではなくて、本当に技術向上の妨げになってしまうから初心者には尚更お勧めできない。
ある程度Perlが身についてから反面教師として見るなら良し。
KENTってなんだい?
確かにKENTのコードは健康を害するな。
肺気腫になる恐れもある。。。 ・・・のか(滂沱)@小粋(刻みタバコ)
逆に、このソースは読んどけってのはある?
661 :
デフォルトの名無しさん :2005/07/07(木) 01:43:22
>>661 > Acme::MorningMusume
何だこれ
テラワロスwww
使い道ナサスwwww
664 :
デフォルトの名無しさん :2005/07/07(木) 05:39:55
perlでWMPやwordファイルを起動させることはできますか? できるとすればどうやればいいのでしょうか。
CPANで検索すれ
666 :
661 :2005/07/07(木) 07:35:38
おお、こんこんもあるのか素晴らしい
>>Acme::MorningMusume これはこれで、Perlのモジュールの規則に則り 真面目にclass化されているので読む価値はある! …とかいって見る。
アクメ・モーニング・ミユージューム・モジュール?
>>661 Author : KENTARO
ってなってるけどもしかして噂のKENT?
いや奴がOOPを理解してるとは思えない。
671 :
デフォルトの名無しさん :2005/07/07(木) 18:15:46
>>637 学校の勉強はできるからテストの点も取れて自分で賢いと思ってるけど
頭の切れが悪くて自分からはなにも生み出せない典型的なアホの図
受け流してよそへ飛ばしちゃうことおぼえようよ。
>>668 いや、わりと真面目にそう思った。PerlでOOPはどうやるのがセオリー?って人には
参考になりそう。
Perl のモジュールの規則を破り、真面目に class 化されず、OOP のセオリー無視で、 参考になりそうもないようなモジュールが CPAN にはそんなに多いものなの?
別にプログラミング==OOPじゃないわけだが…
676 :
デフォルトの名無しさん :2005/07/08(金) 04:14:27
[link.txt] 1 3 1 9 1 10 2 1 3 1 3 7 3 8 というファイルがあるときに左側を基準として 1が参照しているのは3と9と10 2が参照しているのは1 3が参照しているのは1と7と8 このように表示させるにはどうすればいいでしょうか
空白で区切られてて数字しか出てこないのか? 自分ではどこまでできた?
>>676 open LIST,"list.txt";
push(@{$hash{(split)[0]}},(split)[1]) while <LIST>;
print "$_が参照しているのは",join('と',@{$hash{$_}}),"\n" for sort keys %hash;
むむむ
>>676 他に込み入った処理が無いのであれば、自分の場合はファイルの行番号で処理させるかな。ソートとか無駄な処理だし。
[link.txt]
0行目:
1行目:3,9,10
2行目:1
3行目:1,7,8
直接行番号から値をもってきて、区切り文字で分割して~、でダメ?
>>674 いや、そういうことではなくて、
Acme::MorningMusume はとても読み易いんだよ。
落としてみたかい?
コードだけでなく埋め込みPODやMANIFESTもまるでお手本のよう。
Acme::MorningMusume これサブクラスだけutf8なんだけど何で?
RubyやScheme(Gauche)に食指が動いているオレに、 Perlの魅力を叩きつけてくれる者はおらぬか?
Schemeやっておきなよ。Rubyはどうでもいいけど。
>>584 syscallの引数にポインタを渡さなきゃならない時とか。
686 :
デフォルトの名無しさん :2005/07/08(金) 16:54:27
毎度おなじみのhtml用の文字列の変換なのですが、スピードを早くする方法はないでしょうか? ----------------------- #!/usr/bin/perl -w use Time::HiRes; use strict; my $str; my $time = Time::HiRes::time; for(my $i=0; $i<99999; $i++){ $str = q{&"'<>\n_test_&"'<>\n}; $str =~ s/&/&/g; $str =~ s/"/"/g; $str =~ s/'/'/g; $str =~ s/</</g; $str =~ s/>/>/g; $str =~ s/\n/<br>/g; # print $str, "\n"; } printf("%f \n", Time::HiRes::time - $time); ----------------------- 私の環境で大体これで2秒ジャストぐらいです。 「その速さで必要十分じゃないのか」と一瞬 自問してしまいましたが、 なにかスピードアップの方法はありますでしょうか?
687 :
デフォルトの名無しさん :2005/07/08(金) 17:01:29
ん..。エスケープシーケンスが変換されてしまってますね。適時読み替えて頂いて..
%hash = ( "&" => "&" ..... ); s/[&"'<>\n]/$hash"\1"/;
%hash = ( "&" => "&" ..... ); s/([&"'<>\n])/$hash"\1"/g; 適当に読み変えて、
690 :
デフォルトの名無しさん :2005/07/08(金) 17:17:31
メールの返信プログラムで、何通返信したか把握したいと思い カウントのプログラムをくっつけてみましたが動きません。 返信プログラムも、カウントプログラムもそれぞれ単品だと動きます。 何か根本的に間違っているのでしょうか?教えてください。 ちなみにperl初心者です。 $sendmail="/usr/sbin/sendmail"; $info="/usr/home/ml/info.txt"; while(<>) { if (/^From: *(.+) */i) { $to = $1; if (/<(.+)>/) { $adrs = $1; } elsif (/([a-z0-9\.]+@[a-z0-9\.]+)/i) { $adrs = $1; } else { exit(1); } system("(echo \"To: $to\" ; cat $info) | $sendmail $adrs"); } } open(IN,"count.txt"); $count = <IN>; close(IN); $count++; open(OUT,">count.txt"); print OUT $count; close(OUT);
692 :
デフォルトの名無しさん :2005/07/08(金) 17:23:35
>>691 リャマ本・・めっちゃ避けてました。
よみまふ。。
>>686 %map = ('<' => '<', ...);
$str =~ s/([&\"\'<>\n])/$map{$1}/egos;
などとやってみましたが、6~7%しか速度向上しませんでした……。
ちなみに変換しない空ループ, オリジナル, 上記でこんなとこ。
noconv: 0.044489
origin: 2.727860
new: 2.533643
new/origin = 92.880244%
695 :
デフォルトの名無しさん :2005/07/08(金) 18:40:37
>>684 tr/&/&/;
s/\n/<br>/go;
などで速くなると聞いているがベンチマークしたことはないな。
696 :
686 :2005/07/08(金) 20:00:10
>>688-689 , 693-695
ありがとうございます。
一度配列に入れてやる方法も /go も試してみましたが、ほとんど変わりません。
単純な置換の場合は、なかなか速くする方法というのは無いんですね。
>>690 初心者がこのまま続けたらものすごくセキュリティ
ホールを作り込みそうなコードだな
おまけにアドレス(宛先)の判定はダメダメだな。
699 :
デフォルトの名無しさん :2005/07/08(金) 21:34:10
$test = "aiueo"; print $test[1]; で i が表示されるかと思ったんですが、駄目でした。 perlには i を表示させる手段はないのですか?
@test = split //, $test;
>>699 PHPやCじゃないんだから、こうやってくれ。
$test = "aiueo";
print +(split//,$test)[1];
または
$test = "aiueo";
print substr $test,1,1;
>699 >700 のように split して配列にしてしまうか、substr を使え。
>>700-702 レスありがとうございます。スルーされたかと思って四苦八苦してました。
$test = "aiueo";
$result = substr( $test,0,1 );
print " mae:", $test, " ato:", $result;
こうしてたんですが、() も無くせるんですね。勉強になりますた
あ、あれ?? 連レスうざいかもしれんけど、どうかお許し・・・ >print +(split//,$test)[1]; のような表記、僕の教科書でみた覚えがありません。 配列を直す裏技みたいな split のやり方も、今知りました・・・ print + の + は戻り値が配列だった場合、スカラー変数に直してくれる やり方であってますでしょうか? print (split//,$test)+[1]; とかやってみたけど、 正常に動いてくれます。と・・・ちょっと頭がこんがらがってきました・・・
違う
>>701 たしかにこの+はなんだ(・∀・)?
print(~)だとprintの関数としての括弧になってしまうから+をつけたとか?
なるほど、じゃ print ((split//,$test)[1]); でよさげですかね。いくらググっても出てきませんので諦めますた
>>707 +は次にくるものが「式である」ということを示す演算子。スカラー/リストは無関係。
スカラー扱いにするのはそのものズバリscalar()。
まぁ、カッコをつければいいわけだが、+のほうが一文字だから入力しやすいだろ?だからだよ。
+ ってナニ?って言ってる奴らは、 PERLOP(1) の Named Unary Operators の所を熟読すべきだな。
perl-5.8.7 の info(texinfo) ってありませんか?
>>712 Emacs の M-x info-lookup-symbol で使えるものが欲しかったんです。でも、
これはフィルターなので、単純に perl 付属の pod を変換すると複数のファイ
ルにわかれちゃいますね。どうしたもんだか。
714 :
706 :2005/07/09(土) 02:14:28
>>710 printの括弧は一度ハマッた経験があるので注意深くなってた。
そのときの解決方法は print "", (split//,$test)[1]; とか空文字出力してた。
そっか+か。すごいの思いつくなぁ。
これは思いつくもんじゃないと思うぞ
そのために用意された演算子なので使うほうは知ってりゃいいだけだが、 その問題を解決するために+という演算子を用意しようと思いつくのは たしかにすごいかも。
脱線してしまうが "," の代わり "=>" を実装したといのもすごいよね。 左辺値がシンボルを構成する文字列の場合、文字列と解釈するってやつ。 print time,'s'; ってやるとその時のシステム時間と "s" が表示されるけど print time=>'s'; ってやれば "time" と "s" が表示されるもんね。
$perl -e'(print "a",print "b")' ba1 これの訳を教えてください
>>718 聞く前にいろいろと調べてみなよな。って気持ちでいます。
$perl -e'(print "a",print "b")[0]'
とか、
$perl -e'print "a",print "b"'
とか、
$perl -e'(print "a",print "b", 10,9,8,7,6,5,4,3,2,1,0)'
とかとか。。。
>>718 shでperl実行。
perl実行時のオプションスイッチは-e。
-e のオプションは、引き数の文字列をPerlスクリプトコードと解釈して実行する。
渡された引き数は、'(print "a",print "b")'。
最初のカッコは優先順を示すためのものであるが、この場合なくてもいい。
一番左のprint の右辺値は、"a",print "b"の結果になる。
この場合、printの右辺値は右辺リストと解釈されるため、printの評価は一番最後となる。
"a"が評価されて"a"がリストの最初の値にある。
次に2番目のprint "b"が評価されるが、これも右辺リストを持っているので先にそれが評価される。
"b"が評価されて"b"がリストの最初の値として、2番目のprintに渡される。
2番目のprintは、"b"を標準出力に出力する。
最後にprintが評価されると出力が成功した場合は1、失敗した場合はヌル文字列を戻値として返すので
1番目のリストの2番目の値が,"1"になる。
1番目のprintは"a"と"1"を受取って標準出力に受取った順番で出力する。
1番目のprintの評価結果は"1"になるが、どこにも渡されていないので捨てられる。
print ("a", print "b"); こう書いてあれば分かるんでない?
>>719-721 サンクスです。
'(print("a"), print("b"))'
こういう風に評価されるものだと思ってました。
>>720 分りやすい解説サンクスコ
=>以外にも、qw()とかも便利。 requireとかuseでもベアワードが使えるし。 不要なクォートを入力しなくて良いのは、さすが不精な人向け言語だと思ったよ。
724 :
デフォルトの名無しさん :2005/07/09(土) 23:49:28
質問です。 Perlで整数を使うと、内部的には何ビットで処理されるのでしょうか? 自分のWindows上の環境では、符号付き64ビットで扱われる(または内部で自動的に拡張される)ようなのですが、 正式な仕様としてはどうなっているんでしょうか?
>>724 ほんとかよ?
>自分のWindows上の環境では、符号付き64ビットで扱われる
どうやって確認したん?
>>724 ビルド済みPerlの整数の型を知りたいなら
perl "-V:iv.*" で見れる。
文字列をUTF16LEでファイルに書きたいのですが、 以下のコードだとBOMがついてくれません。 use Encode; $data = "123"; Encode::from_to($data, "iso-8859-1", "utf16le"); open(F, "> aaa"); print F $data; close(F); どうやってBOMをつければよいのでしょうか? Win2000+cygwin+perl5,8.6です。 おねがいします。
print "\xfe\xff" すれば?
utf16を指定すればBOM は 憑く
733 :
デフォルトの名無しさん :2005/07/11(月) 16:04:45
質問です。 配列(@array)の最大の添字は $#array で取れますが、これが配列のリファレンス(@$array)の場合はどう記述すればいいでしょうか?
↑ >配列のリファレンス(@$array) すいません、配列のリファレンス($array)でした。
$#$array
>>737 > 知らなかった・・・
これは知っていたり知らなかったりするものではない。
思いつくものだ。
全然話題は変わるが、 リファレンスカウンタループを警告してくれれば良いのに。 と思う。 最近全くPerl触ってないから、今の実装知らないんだけどムズイの?
ごく基本的なことかもしれませんが何時間も考えて全くわからなかったので質問します。 >入力「<>」を while(<>) のように使うと、特殊変数 $_ に読み込んだ行が入るようになっています。 某講座サイトからの転載なのですが open( DAT, "test.dat" ); while ( <DAT> ) { print $_, "\n"; # ←ここのライン } close( DAT ); $_のところで必ずエラーが起こります。 手打ちのミスではありません。 複数の講座サイトから同様の内容のサンプルをコピペしてもエラーになります。 #!C:/perl/bin/perlやprint "Content-type: text/html\n\n"; の打ち忘れでもありません。他の文ならきちんと動きます。 全く原因がわからず本当に困っているのでどなたか回答をお願いします。 Apacheでの出来事です。
>>740 おそらく
print $_, "\n"; # ←ここのライン
↑の’,’を指しておられるのでしょうが
転載記事なので手を加えない方がよいとおもっただけで
print $_; #
と打ち直してもエラーになるのを確認してます。
エラーログみれ
つか、直接コマンドラインから叩いたときはどういうメッセージが出るのよ?
Unrecognized character \x81 at C:\Program Files\Apache Group\Apache\copal271[1]\copal.tmp line 9. エラーログはこちらです。
つ[全角スペース]
今日は全角厨をよく見る
>>746 どうもありがとうございました。起動しました。
何時間も検索したり本を読んだりした結果、ごくつまらないミスだったというのは経験済みですが、
何度やってもなれないです。吐き気がしてきた。
頭悪いと大変だな。
全角スペースと半角スペースが判別出来るテキストエディタは必須
メモ帳でやってたんだろ
Unrecognized characterがあるとエラーが出ているのに、 Unrecognized characterを考えないのはどういう理由なのか説明してほしい。
おまえらそこまで言うなよ
学ぶ意志さえあれば 非常に示唆に富んだ反応に見えるはず。
ユーザにYかNかを問い合わせて、10秒間反応が ない場合は、Yとして続行するコードを書こうと思った んですが、私の知識じゃどうにもならないです。 ヒントを教えてください。
>>739 たしかそれを調べるモジュールがあるよ。
CPANで調べてみそ。
>>755 $SIG{ALRM}使えば?
>>756 ありがとうございます。 SIG{ALRM}とevalでできました。イイ!!
>>752 単にUnrecognized characterという英文字列の並びが何を意味するか
理解できなかっただけだろ。
>>748 「ごくつまらないミス」は誰でもやってしまうもの。
問題はミスをすることではなくて、
>>750 のような工夫をおそらくしていないことや
Unrecognized characterというごく簡単な英語も理解できない知能であり
プログラム以前の問題。
760 :
739 :2005/07/12(火) 11:04:28
英文のエラーメッセージがいやなのか。 日本語に変えたら喜ばれる?
文字化けして云々とか言い出しそう。
>>748 おまいさんプログラマには向いてないな。
発生するバグの99%はつまらないミスだぞ。
# if文の真偽を逆にするとか境界条件をしくるとか演算子の優先順位を勘違いするとか。
>>759 > Unrecognized characterというごく簡単な英語も理解できない知能であり
> プログラム以前の問題。
理解できないし、理解しようともしなかったし、
質問で真っ先に提示しようともしなかった。
この心理っていったいなんなんかを知りたいわけだよ。
とかなんとか書いてるやつらでも、自分がハマったときは同じ行動をすることが多い。
脳味噌腐ってるな
>>765 Are you Kusakabe-san?
>>764 心理も何もない。
ただ考える道筋すらわからないほどの初心者というだけだろ。
そんなもんが流せない君の心理のほうが不思議だよ。
この手が嫌なら質問スレなんかこなきゃいいと思うんだが。
言葉尻を論って流れも読まずに独り言するのはカンベンして欲しいんだがなぁ
>>764-768
>>765 2chに質問なんか書かないだろ、そういう時はフツー
>>764 知能だけの問題じゃなくて、傲慢、あるいは自己中心性の
結果だと思う。
>>764 細かいミスなんてのは自分の知識になって今後注意深くなるからいいじゃねーの?
くだらないミスほど、自分の知識となって蓄積されていく。
細かいミスはいっぱいしてるだろうけど、同じミスを繰り返したこたぁ、あまりないだろ。
気づけばくだらない問題だったなんてことは、誰でもいっぱい経験することだよ。
>>771 > 知能だけの問題じゃなくて、傲慢、あるいは自己中心性の
> 結果だと思う。
はいはい。
たしかにああいう輩は、知的な面で問題があり、自己中心性が強く、
自分と他人の違いが分かってないことが多いね。
でもスレ違いだから、ほか行ってね。
Perlについての質問箱 17箱目 Perlについての質問箱 17箱目 Perlについての質問箱 17箱目 Perlについての質問箱 17箱目 Perlについての質問箱 17箱目
↓はい、次の質問のひとどうぞー
sub String_new{ my $self; $self = { value => $_[0], length => sub{length $self->{value}}, substr => sub{substr $self->{value}, $_[0], $_[1]}, concat => sub{$self->{value}.join'',@_}, join => sub{join$_[0],$self->{value},@_[1..$#_]}, replace => sub{(my $str = $self->{value})=~s/$_[0]/$_[1]/g;$str}, match => sub{scalar($self->{value}=~/$_[0]/)}, cmp => sub{$self->{value} cmp $_[0]}, index => sub{index $self->{value}, $_[0]}, rindex => sub{rindex $self->{value}, $_[0]}, reverse => sub{reverse $self->{value}}, repeet => sub{$self->{value} x $_[0]}, split => sub{split/$_[0]/,$self->{value}}, exstrac => sub{@{[$self->{value}=~/$_[0]/]}}, }; }
>>777 の使用方法はこんなかんじみたいです。
$x = String_new("abcdefg");
$y = String_new("cdefg");
$z = $x->{replace}('c.','xyz');
$w = $y->{concat}('xyz');
これはどういう仕組みなのか説明できる方お願いいたします。
ちなみに sub String_new{ my $self; $self = { の部分を sub String_new{ my $self = { としたり sub String_new{ return { としたりすると動かなくなります。
>>779 > sub String_new{
> my $self = {
>
> としたり
返り値がmyの評価結果になるからな。
> sub String_new{
> return {
意味不明。
>>778 サブルーチンに文字列を渡すと、ハッシュのリファレンスが得られる。
デリファレンスされたハッシュにキーを渡すと関数が得られる。
その関数に変数を与えると目的の結果が得られる。
>>777 クラス定義せずに、文字列オブジェクト(ぽいもの)を実装したいだけでしょう。
Cで構造体に関数ポインタ持たせるのと同じ。
別言語と実装を合わせるために作ったんじゃないでしょうか。
クラスじゃないから、String_new() で作った文字列同士の演算はスマートに出来ないよね。
>>780-781 レスありがとうございます。
>>780 > 返り値がmyの評価結果になるからな。
myの評価結果は、myされた変数の代入結果と同じになるじゃないですか。
てことは、後でmyしようがその場でmyしようが関数の戻り値は同じハッシュリファレンスですよね。
>意味不明。
無名のハッシュリファレンスを変数を介在せずに直接戻り値にしているだけです。
>>781 はい、その通りですね。ちょっと説明不足で申し訳ございませんでした。
自分が聞きたかったのは、$xと$yが独立した情報を個別に操作しているように見えるのですが
Perlのどういう仕組みよる振る舞いなのでしょうということです。
>>777-778 を実際試していただけると分かると思います。
>>782 なるほど!
ちなみに、"my $self;" と "$self = {"を別けなければならないか分かります?
>>783 どういう動作をする代物なのかは既に理解しているようなので、
何故my $self = { やreturn {ではダメなのか、だけ。
#わかりやすくするため、簡略化する
my $var;
my $self = 'global self';
{
my $self = sub{ return \$self }
$var = $self;
}
print ${$var->()};
# => レキシカル変数$selfの値、無名サブルーチン"CODE(...)"が印字される
{
my $self = sub{ return \$self }
$var = $self;
}
print ${$var->()};
# => my .. ; の時点では、その変数のスコープは存在しない。
# よって*グローバル変数* $selfの値 "global self"が印字される
{
$var = sub{ return \$self };
}
print ${$var->()};
# 上と同じく、"global self"が印字される
785 :
783 :2005/07/12(火) 21:15:54
>>784 の一番上の例間違えた
{
my $self;
$self = sub{ return \$self };
$var = $self;
}
だった。
786 :
782 :2005/07/12(火) 21:28:16
>>783 ええとだから、780さんが言っている通りです。
sub hoge {
return my $foo = 3;
}
と書けるかどうか。
それと、無名ハッシュリファレンスをそのままreturnしても、
無名ハッシュの中で $self 使ってるから動きません。
無名サブルーチンを定義した際、$selfは各無名サブルーチン内でグローバルスコープを持ちます。
$x, $y が独立した値を扱えるようにする為にも、
String_new() 内では、$selfを毎回新規作成する必要があります。
だから、my $self; してから、$self = { (略) };
こんなんで合ってるかな。
まぁ、あんまり効率的でもないし、あまりオススメもできないコードです。
無名サブルーチン定義時のスコープについてよく分からなければ「黒豹本(Advanced Perl Programming, 日本語名忘れた…)」を読んでください。
なんやかんや言って良スレじゃのー おまいら偉いわ
言うまでもなく、最後に return $self; を追加するなら my $self = { と書いても問題は無いわけだが、777はもうこの辺理解できたかな。
>>760 weakrefはいちおう動くよ。
イマイチ使いにくいけど。
>>784-788 うひゃー、みなさんレスありがとうございます。
ちょっと頭を整理しながらみなさんのレスを理解している最中です。
>>784-785 ,
>>786 スコープの問題があるということですね。
>my $self = sub{ return \$self }
だと、左辺がmyされた$selfと、右辺の$selfは変数名が同じでもスコープが違うので
別の変数とみなされるという理解でよろしいですか?
だから
>my $self;
>$self = sub{ return \$self };
こうすると左辺と右辺の$selfが同じスコープになると理解しました。
なので、
>>779 で
>sub String_new{
>my $self = {
とやると、無名サブルーチンの中で使われている$selfがグローバル変数とみなされるわけですね。
>>788 >>784-786 のレスを上記のように解釈すると最後にreturn $self;を付けると大丈夫ということが
理解できなくなりました。もう少し考えてみます。
791 :
782 :2005/07/12(火) 22:30:22
すまぬ。間違った。
>>786 sub hoge { return my $foo = 3; }
て書けるわ。
>>788 無名サブルーチン内に $self 書いてあるから、
my $self = { ... };
return $self;
じゃなくて、一度、ローカルなスコープに入れるためにも
my $self;
$self = { ... };
の順じゃないとマズイという事はない?
>>789 なるほど。
5.8.x からは参照カウンタのリークってフィックスされたとか
なんとかっていう情報をどこかで見たような気がする。
>>788 いや、駄目だって。
myと同じ場所に書いたら、右辺値を評価してる時の$selfと左辺値を評価する時の$selfが
別の実体を参照しちまう。
{my $a=$a;...} と {my $a;$a=$a;...}が違うのと同じ。
my $n = new test::test(); my @list = $nc ->alllist(); print @list; これを実行すると test::test=HASH(0x89dbd58)test::test=HASH(0x89dbf38)test::test=HASH(0x89deb74)test::test=HASH(0x89dfa08)test::test=HASH(0x89e3528)test::test=HASH(0x89e3690) 実際にはこの値が入っているはずなのですが ただしい取り出し方がわかりません。 どなたかご教授いただけないでしょうか。
794 :
793 :2005/07/13(水) 00:35:12
>実際にはこの値が入っているはずなのですが 実際にはこの値ではない値が入っているはずなのですが の間違いです。すみません。
>>782 >クラスじゃないから、String_new() で作った文字列同士の演算はスマートに出来ないよね。
こんなん作ってみました。
$x = String("abcdefg");
$y = String($x);
$z = String("");
print $x->{replace}('c.',String('xxxxx')),"\n";
print $y->{concat}("xyz\n");
print $z->{concat}($x,"uvw",$y,"\n");
sub String{ my $class = (caller(0))[3]; my $self; $self = bless { length => sub{length $self->{value}}, substr => sub{substr $self->{value}, $_[0], $_[1]}, concat => sub{$self->{value}.join'',map{$self->{string}($_)}@_}, join => sub{join$self->{string}($_[0]),$self->{value},map{$self->{string}($_)}@_[1..$#_]}, replace => sub{(my $str = $self->{value})=~s/${\$self->{string}($_[0])}/${\$self->{string}($_[1])}/g;$str}, match => sub{scalar($self->{value}=~/$\{$self->{string}($_[0])}/)}, cmp => sub{$self->{value} cmp $self->{string}($_[0])}, index => sub{index $self->{value}, $self->{string}($_[0])}, rindex => sub{rindex $self->{value}, $self->{string}($_[0])}, reverse => sub{reverse $self->{value}}, repeet => sub{$self->{value} x $self->{string}($_[0])}, split => sub{split/${\$self->{string}($_[0])}/,$self->{value}}, exstrac => sub{@{[$self->{value}=~/${\$self->{string}($_[0])}/]}}, string => sub{ref $_[0] eq $class ? $_[0]->{value} : ref $_[0] eq '' ? $_[0] : ''}, }, $class; $self->{value} = $self->{string}($_[0]); $self; }
Perlでクロージャやって何が楽しいのやら
798 :
795 :2005/07/13(水) 00:48:07
ただのクロージャじゃないよ、クラスもどきだよ。
素直にクラス作ってメソッドにしようよ。 演算子オーバーライドできるし、いちいちハッシュ引かなくても良い。 というか、Perlの文字列をわざわざ文字列オブジェクトにする必要が無い。 普通のスカラー変数で、すでに十分ラッパがかかってる状態なんだから。 どうしても文字列オブジェクトにしたいなら、他言語に行った方が…。
800 :
795 :2005/07/13(水) 01:07:24
そんな目くじらたてなくても…。
>>777 のコード見て思い付いただけだから。
こんな風に自分で継承構造とか作れるから面白いなと思っただけ。
てか逆にpackageを使わなくてもクラスっぽいものを実装できちゃうPerlの奥深さを認識したわけだが。
sub StringX{
my $class = (caller(0))[3];
my $self;
$self = bless {
%{String($_[0])},
print => sub{print $self->{$_[0]}(@_[1..$#_])},
substr => sub{substr $self->{value}, $_[0]-1, $_[1]},
}, $class;
$self->{value} = $self->{string}($_[0]);
$self;
}
$x = StringX("xyz");
$x->{print}("substr",1,2);
>>793 print map{%$_}@list;
802 :
デフォルトの名無しさん :2005/07/13(水) 13:40:35
宣言だけした $hash を以下のようにしてもwarningすら出ません。 -------------------------- #!/usr/bin/perl use warnings; use diagnostics; use strict; my $hash; # $hash = {}; ※ これをしなくて何も言われない。 $$hash{"test"} = "aiueo"; -------------------------- こういった場合でも警告などを出させる方法は無いでしょうか? (perl v5.8.3)
>802 リファレンスの自動生成はPerlの仕様だったと思う
>>802 値が未定義値のスカラー変数に対するリファレンスの自動生成はPerlの仕様だからエラーや警告はでません。
use strictしているから、間違って$hashに配列リファレンスや文字列を代入してしまえば
ハッシュのデリファレンス構文や間接参照構文(%$hash,$hash->{})でエラーになります。
逆に質問なんですが未定義値のスカラー変数にリファレンスの自動生成が適用されて困る場面ってどんなときでしょう?
>>804 変数名を取り違えたときはそこでエラーなり警告なり出てくれれば
早いうちに間違いを発見できるかもしれんのでautovivificationが
適用されない方がありがたい。
806 :
802 :2005/07/13(水) 17:02:39
>>803 ,804
有難う御座います。エラーや警告は出ないのですね。
> リファレンスの自動生成が適用されて困る場面ってどんなときでしょう
これは
>>805 の方と同じ意見ですが、use warnings; や use strict; と同じよう
に、バグを未然に防ぎたくチェックをしたい場合にはあったほうが良いのではな
いかと思います。
リファレンスはよく利用しますから、最初のスカラ変数だけは自動生成のチェックが
あったほうがありがたいですね。
807 :
804 :2005/07/13(水) 17:25:56
>>805-806 ありがとうがざいます。
このような場合、バグが見つけにくいわけですね。
use warnings;
use diagnostics;
use strict;
my $str; #文字列を代入したい。
my $hstr; #ハッシュリファレンス
$$str{key} = "value1"; #本当は $$hstr{key}
$$hstr{key} .= "value2"; #"value1value2"としたかった。
print $$hstr{key}; #"value2"しか表示されない。エラーも警告もでない。
そゆときのためのモジュールがあったような気がするなぁ。 CPAN探してみそ。
そういうためのモジュールは無いみたいだな。作るのも難しそう。 my $s; $s->{foo} = 'bar'; これは、実質的にこう解釈される my $s; $s = {}; $s->{foo} = 'bar'; だから、例えばtieで監視しようとしても、$s = {}と区別できない。
最初の my $s; で、SVの頭だけが出来る。 $s->{foo} の段階で「あ、ハッシュリファレンスですか」となって SvRV に。 無名ハッシュが作られて初期化。 であってる? PerlのXSとか、5.005以降見てないんで動作も忘れちゃってるけど。 懐かしいなぁ。
う、、、すいません split関数の事で質問があります。 my $str="auaua\t\t\t\t\t\tsyobo-n"; とある場合に my @data = split(/\t/,$str); とやって $data[0]にauaua $data[1]にsyobo-n と入れたいのですが \tがいくつあるか不定の時はどのように 表記すればよいのでしょうか?
my @data = split(/\t+/,$str);
813 :
811 :2005/07/14(木) 10:56:39
あう こんな素人の質問に答えていただき ありがとうございますっ
814 :
804 :2005/07/14(木) 11:09:57
815 :
804 :2005/07/14(木) 11:15:36
自分もまた質問です。 substrみたいに自分で作成した関数をlvalueにして、代入した内容で振る舞いを返る方法はないでしょうか? 現在実装されているlvalueは、関数の最後に指定した代入可能な変数に代入できるだけですよね。
816 :
804 :2005/07/14(木) 11:22:21
あっ、普通に変数のリファレンスと振る舞いを変えさせたい値を 関数の引き数で受取ればすむだけというのは分っています。 substrみたいな動きを自分で定義できるか知りたいだけです。
>>816 lvalue+tieで実質なんでもできる
sub set($) : lvalue{}なんてすると、
set $var = 1; # set($var) = 1
などとして、特定のsetステートメントのときのみ特定の値の代入を認める、
などという構文を拡張できたりする。
818 :
804 :2005/07/14(木) 11:45:44
>>817 ありがとうがざいます。
ちなみに
>>817 のコードでは、set関数に1を代入して$varに1が代入されますよね。
代入した値に+1して$varに代入させるようにそのset関数を改良するには
具体的にはどうのように記述したらいいですか?
ダブルクォーテーション内でリファレンスの変数展開ってどうしたらいいんでしょうか? print "$obj->prop"; ↑というようなことがしたいのですが…。
820 :
デフォルトの名無しさん :2005/07/14(木) 16:59:09
Windows xpです。 perlをバックグランドで走らせるにはどうすればいいのですか?
821 :
デフォルトの名無しさん :2005/07/14(木) 17:15:20
御世話になります。 関数へのパラメータを渡す際、以下の様に ① 第1引数を配列 第2引数をスカラ変数 とする場合、呼ばれる関数側で@listの内容を見ると、 "12345678test"といった具合にスカラ変数も代入されてしまいます。 第1引数を配列 第2引数をスカラ変数 といったI/Fは,perlでは不可能なのでしょうか? 以下、サンプル ------------------------------------------------- sub func(\@\$) { ( @list , $data ) = @_; } $data = "test"; @arr = ("1234" , "5678"); func( @arr , $data ); -------------------------------------------------
>>819 "@{[$obj->prop]}" または "${\($obj->prop)}"
オレはクックブックで知ったが、その場でリファレンス作って
デリファレンスするというかなり強引な技です。
あらかじめ$obj->propを適当な変数に突っ込んどいた方が
見やすいといわれているがお好みで。
>>821 配列のリファレンスを受け取るなら可能。
sub func(\@$) {
my($list, $data) = @_;
print "list=@$list\n";
print "data=$data\n";
}
$data = "test";
@arr = ("1234", "5678");
func(@arr, $data);
824 :
デフォルトの名無しさん :2005/07/14(木) 20:09:41
↑sub funcを違うファイルに置くと出来ないんですが・・。 なぜ・・。
825 :
820 :2005/07/14(木) 21:11:42
他所で聞いてきます
>>824 たぶん、requireでソースを取り込んでいますよね。
以下、BEGINブロックで囲まれていないrequireを想定して説明します。
プロトタイプは、サブルーチンを使用する文がコンパイルされる前に
先行宣言されていなければ有効になりません。
requireは、実行段階で1回だけソースファイルを読み込みますので
プロトタイプ付サブルーチンの定義を別ファイルにすると
サブルーチンを使用する文がコンパイルされる段階では
まだプロトタイプが宣言されていないことになります。
その為、別ファイルで宣言しているfuncのプロトタイプが無効になってしまいます。
それを回避するためには、requireの文をBEGINブロックで囲んでください。
BEGINブロックで囲んだ範囲は、全てがコンパイルされる前に
先行してコンパイル及び実行が行われるので
別ファイルのプロトタイプ宣言が有効になります。
例:
BEGIN{require 'hoge.pl'}
$data = "test";
@arr = ("1234", "5678");
func(@arr, $data);
つかuseを使え
>>818 #!perl -w
package Setter;
sub TIESCALAR{
my($class, $ref) = @_;
bless \$ref, $class;
}
sub FETCH{
my $self = shift;
$$$self;
}
sub STORE{
my($self, $value) = @_;
$$$self = $value;
# あとは煮るなり焼くなり
$$$self += 1;
}
# 続き package main; sub set($) : lvalue{ my $var; tie $var, 'Setter', \$_[0]; $var; } set my $i = 10; print $i, "\n"; __END__ set()の中でのみ$iをtieされた変数にバインドし、set()から戻ると$i自体には何の細工されていない。 とはいえ、値をチェックしたり変更したりしつつ代入したいなら my $i = plus_one(10); # 10+1を代入 set_and_plus_one(my $i, 10); # $iに10を代入して+1 などとすればいいので、tieとlvalueを使ってわざわざこんなことをする意味は無い。 「こんな構文もできるぜイエイ」つーくらいなものだな。
830 :
804 :2005/07/14(木) 22:03:29
>>828-829 ありがとうございます!
まさしく、「こんな構文もできるぜイエイ」ってやりたいだけだったりします。
いやあ、質問する前に
>>813 にツッコミいれたんで
(
>>813 の「あう」にときめいた自分が許せなかったんです)
アラシと勘違いされてスルーされたかと一時は思ってしまいました。
本当にありがとうございます。
831 :
デフォルトの名無しさん :2005/07/14(木) 23:44:13
変数に入っている文字列の長さを返すlengthがありますが、 変数に文字列とは限らない値が入っている場合でも (ex. readでファイルから読んだデータをいくつかくっつけた) このlengthで入っているデータのバイト数が確実に返されると考えていいのでしょうか。 偶然(?)にマルチバイト文字にあってしまってその文字数を返される可能性があるかもと 心配しています。
>>831 ユニコード文字列でなければlengthは文字列のバイト数だから
余計な変換レイヤ入れたりしてなければ問題ないはず。
833 :
831 :2005/07/15(金) 00:03:52
変数内のデータが「偶然すべて」ユニコードにあわない限り大丈夫ってことでしょうか。 過剰な心配かもしれませんが、万一、ユニコードにバッチリあってしまっててても 大丈夫な方法ってないんでしょうか? あれば教えていただけるとうれしいです。
>>833 use bytes;
# ここに length の処理など
no bytes;
かな。
835 :
831 :2005/07/15(金) 00:18:44
あぁ、ありがとうございます。 まだまだ修行が足りないことを実感しています。 精進せねば。
>>833 ユニコード文字列っていうのはUTF-8 flagが立った文字列
のことを言っているのだと思いますが、勝手に立つことは
ありません。たまたまutf8として解釈できそうなバイト列で
あっても、decodeなり入力レイヤなりで変換しなければ
ただのバイト列です。
834の言うようにbytesプラグマ下ならそれが何であれ
バイト数返しますが、そもそも外から取り込んだものが
ユニコード文字列になっていたらそれはどこかで変換
された結果なので、その変換で長さが保存されている
ことは期待できません。
この辺ややこしいので気になるのなら
ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html あたり参考にして勉強しましょう。
838 :
837 :2005/07/15(金) 06:44:42
839 :
デフォルトの名無しさん :2005/07/15(金) 14:36:26
お世話になっております。 perlでファイルハンドルを引数とするにはどうすれば良いのでしょうか? ---------------- main(); sub main{ open(FILE,">$gOutputHtml"); writeFile(FILE); close(FILE); } sub writeFile{ my $filehandle = shift; print $filehandle "test\n"; } ---------------- 以上のようにしたいのですが # perl test.pl Bareword "FILE" not allowed while "strict subs" in use at test.pl line 7. Execution of test.pl aborted due to compilation errors. とエラーがでてしまいます。 解決方法等 何か情報がありましたら お教え頂けますとありがたいです。
>>839 use FileHandle;
sub main {
$fh = new FileHanle($gOutputHtml, 'w') or die "Can't open $gOutputHtml ($!)";
writeFile($fh);
$fh->close;
}
sub writeFile {
my $fh = shift;
$fh->print("test\n");
}
842 :
839 :2005/07/15(金) 15:38:54
>840さん 841さん RESありがとうございます。 : writeFile(*FILE); : でやってみました。 どうもですっ
>>841 いまどきFileHandleなんて勧めるなよ。
IO::Fileにしとけ。
Perl5.6以上であれば、これがいいかもよ。 main(); sub main{ open my $file,">$gOutputHtml"; writeFile($file); close $file; } sub writeFile{ my $filehandle = shift; print $filehandle "test\n"; }
>>839 もう他の方ので解決してますが、
質問の書き方だとエラーの通り bareword に引っかかります。
perlが、関数に渡されたbareword をファイルハンドルと仮定して使用するのは、
内部的にちょっと無理があって、C側で書いててもチョット不安です。
「渡されてきたこれ、文字列にも見えるよなぁ。
まぁ、ファイルハンドルなんだろうけど、良いのか?」という感じ
(perlインタプリタの気持ちを代弁)。
なのでエラーになるんだと思います。
グロブ渡しもアリですが、ちょっと古いし、直接的すぎるかも。
グロブ使うなら、local() を忘れずに。
いや、グロブでもlocal()とか必要ないから。 直接変数に入れて平気だから。
perlって金になるの?
金取りづらい
>>847 > perlって金になるの?
僕が書いたPerlのプログラムを、見も知らずの人が金にしていたことは
ありました。
報告人だか削除人だか案内人だかのために書き捨てたことがあったなぁ
自分の仕事のちょっとした自動処理スクリプトとして使ってるから、 給料の一部になってると言えなくもない。
つーか金になるかどうかは営業の腕次第だな。
ここ6年ほど、perlでご飯食べてまつ。
3年前ならPerl/CGIで飯食えたけど今は無理っぽくない? Webに限ればPHPかJavaしか仕事無いよ。 いやいやPHP覚えたら副産物でOOPとデザパタ覚えてスキルアップしちゃった。
PHPでOOPを覚えるのはPerlで覚えるより問題があると思うけど……。 まあそれはそれとしてPerlで稼ぐのは問題なしですよ。 10年近くそれで食べてますし、今後も特に不安はないです。 ウェブ系だとmod_perlで動くコードが書けないと問題かもしれませんが。 CGI/Perlをやってた素人に毛が生えた連中はPHPに流れたみたいですけどね。
858 :
デフォルトの名無しさん :2005/07/16(土) 14:34:13
$arrayref != undef ? return $arrayref ? exit; これは何が間違っているんでしょうか?
3項演算子の使い方
全て
たしかに使い方はちょっとあれだけど、でも 1==2 ? print"a" : print"b"; これはちゃんと動くんですよね。なんでexitはだめなのか。
exitのせいじゃないっつってんだろ。859が。
858はタイプミスしました。あとexitは関係なかったです。 ($arrayref != undef) ? return $arrayref : exit; これなら動くんですよね。なんでカッコがないとダメなんでしょうか? エラーメッセージはこうです。 ”Use of "undef" without parentheses is ambiguous” undef ? というのがいけないみたいですね。なんででしょうか?
気の毒すぎて何も言えない…
>>864 何も言えないなら、何も言う気がないなら
何も言わなくていいですよ^^;
>>866 私の言いたいのは、なんで構文解析があいまいな結果になってしまうのか
その原因を分る人に聞いてるわけです。
ところで?は三項演算子以外に何に使われてましたっけ?
869 :
デフォルトの名無しさん :2005/07/16(土) 15:40:16
>>867 > 私の言いたいのは、なんで構文解析があいまいな結果になってしまうのか
そんなわけないだろ。演算子の優先順位とか勉強しなおしてこいよ。
ってか、このスレ内に答え出てたし。
HINT:結合性・優先順位・undefは引数を取る。
>>869 エキサイトにつっこんでみたよww
「Use of "undef" without parentheses is ambiguous」
↓
「括弧のない"undef"の使用はあいまいです。」
だって。文面通り謙虚に受け取ればよかったものを余計な知識が邪魔して
「構文解析があいまいな結果になってしまう」と脳内変換してしまった
に300undef。
>>872 なるほど、確かにそのとおりです。
カッコとは三項演算子の条件式のことだと思ってました。
undef()こうしろってことですね。なるほど。
引数を取らない他の関数でも同様のメッセージが出ました。
ところで三項演算子の優先順位は低いし、undef ? これがなんで
問題になるんでしょうか?
>>868 正規表現ですか?正規表現はスラッシュで囲ったものだけじゃないんですか?
まあ素直に defined $arrayref ? ... ってしとけってこった。
>>876 うむ、その通り。
$arrayref != undef()
の書き方は、undef()により undef値を生成した後、$arrayrefと比較する。
defined $arrayref
は、単に$arrayrefが undef値かどうか調べるだけ。
後者のほうが良い。
そもそも 0 == undef や 'foo' == undefは真だしな。
$arrayref が、ほんとに配列リファレンスなら、 $arrayref ? return $arrayref : exit; で良くない? しかし、何故いきなり exit() なのかは気になるところ。まぁ良いか。
なんだかんだいってみんなやさしいな。
ラリーがPerlコミュニティが「病的にやさしい」というだけはあるね。
なんかぐだぐだ続いてるからテストしてみた。
>>873 >undef ? これがなんで問題になるんでしょうか?
エラーは全部報告しようぜー。そもそも元々のスクリプトで
Warning: Use of "undef" without parentheses is ambiguous at line XXX.
Search pattern not terminated at line XXX.
って怒られると思う。上だけ問題にしてるべ?
前者は
・$arrayrefをundef()と比較
・$arrayrefを(undef EXPR)と比較
のどっちにしたいんだかよく解んね~ぞと言って警告してる。
下のがundef ? に対する回答だ。
・よくわからんとか文句垂れながらもパーサはコンテキストからundef(EXPR)に打ってでた。
・だもんで?以降をundefの引数と判断して解析しようとした。
・?なんちゃらだからマッチングだろうな。
・あれ??PATTERN?が閉じてないぞ
・んじゃエラーだな
って流れかと。
俺はperlの実装をCのコードレベルで見てはいないがエラーメッセージからは
そう読みとれる。(違ったらツッコんでエロい人)
881 :
880 :2005/07/16(土) 19:11:34
改行大杉で怒られたんで続き。。 テストコードと結果ね。 $ cat test.pl use strict; test(); exit; sub test{ my $a = \(1,2,3); # undef $a; $a != undef ? return $arrayref : exit; } $ perl test.pl Warning: Use of "undef" without parentheses is ambiguous at test.pl line 9. Search pattern not terminated at test.pl line 9.
>>880 多分、それで合ってる。
別にCで読まなくても良いよ。昔、追ってみたけど頭おかしくなりそうだった。
読んだ感想は「これ書いたりメンテしてる奴らは尋常じゃねぇ」。
なんというかカオス。
その後、rubyの中身読んで「助かった」と思った。
まぁ、perlの場合は逐次実行がコードを難しくしてるんだろうけど。
883 :
デフォルトの名無しさん :2005/07/16(土) 19:56:43
初心者でうまく説明できないんですけど、 クラスの色んな属性を順番に取り出していく方法ってどうやるんでしょうか? ハッシュにforeach関数を使う時みたいな感じです。 よろしくお願いします。
>>883 > クラスの色んな属性を順番に取り出していく方法ってどうやるんでしょうか?
属性を入れているハッシュにforeachを(関数じゃないぞ)使えばいいです。
>>884 ありがとうございます。
具体的にどう書けばいいんでしょうか?
すみません;;
いらいら
>>883 887の言うように、まずはチュートリアルも読みましょう。
# $obj にオブジェクトが入っているとすれば、
use Data::Dumper;
print Dumper($obj);
ハッシュリファレンスと分っているなら、Data::Dumper使わずにハッシュの時と同様に書いても良い。
while (my($attr, $val) = %$obj) {
print $attr, " => ", $val, "\n";
}
皆様どうもありがとうございます。 逝ってきます。。
ところで今はどのバージョンのPerlをメインに語ったら良いのかね。 ここで紹介されてる解決策も バージョンによって動いたり警告でたりエラーになったりするはず。 妥当な所って5.6くらい? それとも5.8系まで行って良いのかな 仕事でperl使う場合には入ってるのが5.005だったりするだろうし (安定動作してる、ちょっと古い鯖のプログラム修整・追加とか)。
とりあえず基本は最新の安定版5.8系で、仕事・借りてるサーバの 都合でそれ以外の場合は最初に明記ってのが無難じゃないかな?
>>858-881 なにこの流れ
式全体が値を返す場合以外は三項演算子を使うべきじゃないだろ
ifを使えよ…
>>893 >使うべきじゃないだろ
ソス-キボンヌ
>>893 >使うべきじゃないだろ
Perlで三項演算子を制御構造として使うのは、人の好きずきだからみんなあえてスルーしてるんだよ。
&&(論理積演算子)や ||(論理和演算子) を制御構造に使ったりするでしょ。
ただ、undef(名前付単行演算子)や !=(比較演算子)の使い方については、ツッコミどころ満載なので
みんな一言いいたいんだけど、順を追って説明すると
>>880-881 みたいになっちゃうから
そんなの面倒なのでだれかが返答したら不足分をフォローしちゃえばいいかと思っていたのかと。
んで、新しい質問もないことなので、ここを覗いている人が一言づつ小出しに突っ込み&フォローをして
>>858-881 の流れになったのだと思う。
結局、
>>880 でまとめが入って、
>>883 で新しい質問が来たので流れ終了。
てか、自分も流れに参加したかった。 ちっ!
896 :
デフォルトの名無しさん :2005/07/17(日) 12:40:10
Perl6をWindowsで試そうと思ったのですが、 これを使うにはまず > perl Configure.pl を実行する必要がある、みたいなことが書いているようですが 必要でしょうか? これを実行するためにperl.exeを実行するために 今cygwinをフルインストールしているところです。 それとも、もっと簡単な方法でPerl6を試すことができるでしょうか?
897 :
896 :2005/07/17(日) 13:48:22
cygwinの(途中、dllがダウンロードできないなどのエラーがでましたが)インストールが完了したので 早速、Parrotがインストールされているディレクトリで以下を実行してみました。 C:\usr\local\apps\perl\6-parrot\parrot-0.2.2>C:\usr\local\cygwin\bin\perl Config ure.pl Parrot Version 0.2.2 Configure 2.0 Copyright (C) 2001-2005 The Perl Foundation. All Rights Reserved. Hello, I'm Configure. My job is to poke and prod your system to figure out how to build Parrot. The process is completely automated, unless you passed in the `--ask' flag on the command line, in which case it'll prompt you for a few pieces of info. Since you're running this script, you obviously have Perl 5--I'll be pulling some defaults from its configuration. Checking MANIFEST.....................................................done. Setting up Configure's data structures................................done. Tweaking settings for miniparrot......................................done. Loading platform and local hints files................................done. Determining nongenerated header files.................................done. Determining what C compiler and linker to use.........................done. Determining if your C compiler is actually gcc......C compiler failed (see test. cco) at lib/Parrot/Configure/Step.pm line 346 Parrot::Configure::Step::cc_build() called at config/auto/gcc.pl line 30 Configure::Step::runstep('undef', 'undef') called at lib/Parrot/Configur e/RunSteps.pm line 121 Parrot::Configure::RunSteps::runsteps('Parrot::Configure::RunSteps', 'de bugging', 1) called at Configure.pl line 397 ところが、Cコンパイラエラー? ? ? CPANから該当する何かをダウンロードしてからでないといけないという意味でしょうか・・・・。
>>896 Perl6はまだリリースされていませんよ?
899 :
デフォルトの名無しさん :2005/07/17(日) 14:44:24
されていないみたいですが 試すことができると思いまして どんなものか実際に動かしてみたいんです。
perl6との違いを見抜けない人は(parrotを使うのは)難しい。
んじゃ、Perl6::Pugs
Perlでプログラミングする際につけるべきプラグマって strict以外に何かありますか?
print "abc" って打つと、コマンドプロンプトで実行すると一瞬で文字が表示されるけど これをゆっくりなめらかに表示させる方法ないですかね?
>>904 > って打つと、コマンドプロンプトで実行すると一瞬で文字が表示されるけど
> これをゆっくりなめらかに表示させる方法ないですかね?
1文字ごとにwait入れろよ。
>>905 $|=1; も必要だ、と書いてやれよ。
907 :
デフォルトの名無しさん :2005/07/18(月) 07:17:29
GNU dateコマンドみたいに、日付操作に関する万能モジュールってありますか?