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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
"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
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873110378/

[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
5デフォルトの名無しさん:2005/06/04(土) 17:45:21
     /                        /
     |      ./`ー _         ,ヘ  /
     |     /::     ─ _    / ヽ/     静粛に・・・・!
     |    ./::::          ─ _/   ヽ   今>>1はPerlでプログラムを書いた・・・・・!
     |   /:::::::::ミ_ ─ _            /'〃  
     |   \::::::::::  ─ _ ─ _      /::/ヽ
     |    \::::      ─ _|||    ||:::/   ヽ    最初に言ったはずだ 
     |  /⌒l ━┳━━━━━━━━━━━━┓  そういったことは一切認めていないと・・・・・・!
     |   |:i⌒|::|:::::|   :::illlllllllllllllll|━━|   ::illllllllll|
     |  |:l⌒| |::::: |  :::iillllllllllllllll/  ::::::| :::iillllllllllノ
     |  |::「]| |::::: \::iillllllllllllllノ/   :::::| :iillllllllノ
     |.  \_.l |:::::::   ̄ ̄ ̄ ::/    :::::|  ̄ ./
.   ./|     N::::::::::       (_  ::::_:丿  /
  ./::: |    /: :|:::::::::          ー    /
 / :::::: |.  ./:: ::|:::::::    ( ̄ ̄ ̄ ̄ ̄ ̄) /
/:::::::::::::|  ./::::  ::|:::::      ̄ ̄ ̄ ̄ ̄ ̄ /
: : :::::::::::::|.../:::    ::|::::        __   /
: : :::::::::::::|/::      ::l::        ::::::::   /\
::::::::::::::::::|\       ::\           /:::::::::\
:::::::::::::::::|  \       ::::\______/:::::::::::::::::
::::::::::::::::|    \      ::::::::::::/ |::::::::::::::::::::
6デフォルトの名無しさん:2005/06/04(土) 23:08:00

Perl信者がキリスト教徒みたいに必死に宣伝しマンセーするので、非常に迷惑しています。



早く死んで欲しいですね。

7 ◆TWARamEjuA :2005/06/05(日) 12:42:11 BE:1524672-#
>>6
どいつもこいつもほっときゃいずれ死ぬよん♪
漏れもなー
8デフォルトの名無しさん:2005/06/05(日) 13:06:51
>>7
ああ、「早」という漢字が読めなかったんですね ;-)
9デフォルトの名無しさん:2005/06/05(日) 14:52:37
10デフォルトの名無しさん:2005/06/05(日) 16:04:55
11デフォルトの名無しさん:2005/06/06(月) 00:40:03
http://bulknews.net/lib/doc-ja/etoys.ja.html
で、Error.pmの弊害、以下のようなクロージャがメモリリークを起こすと書いてありました。

my $foo;
$subref1 = sub {
$subref2 = sub {
$foo++;
};
};

よーわからんのですが、myを指定してもクロージャブロックは勝手に変数のコピーを持ちつづけるからってことでしょうか?
そしてそれを回避するには?クロージャの中でundefしたら後でクロージャを実行できなくなるだろうし、わからん。
12デフォルトの名無しさん:2005/06/06(月) 01:18:22
>>11
私も良くわからない。

for (;;) {
my $foo;
$subref1 = sub {
$subref2 = sub {
$foo++;
};
}
}

みたいにしてみたがいくら待ってもperlのプロセス太らなかった。
こういう意味ではないのだろうか?

13デフォルトの名無しさん:2005/06/06(月) 04:31:03
mod_perl上ではリークするって事じゃね?
14デフォルトの名無しさん:2005/06/06(月) 15:28:30
だれがリークしやがったんだ!ちくしょう!
15デフォルトの名無しさん:2005/06/06(月) 17:21:09
そんなことするのはきっと 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";
17デフォルトの名無しさん:2005/06/06(月) 19:07:34
mkdir -p 相当 (必要に応じて途中のディレクトリを作成する) を
やってくれるモジュールがあれば教えてください。
18デフォルトの名無しさん:2005/06/06(月) 19:19:08
>>17
use File::Path;
mkpath("./h/e/l/l/o/w/o/r/l/d", 0, 0777);
19デフォルトの名無しさん:2005/06/06(月) 19:44:47
>>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";
20デフォルトの名無しさん:2005/06/06(月) 19:57:47
>>18
ありがとうございます。 File::Path を使ってうまくいきました。
21デフォルトの名無しさん:2005/06/06(月) 21:10:49
>>13
そんな気もするけど>>11の文書って結構古いよね。
今に至るまでのperlかmod_perlのバージョンアップで解消されてるってことはないの?
2216: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', '.');
}

とかでいけない?
24デフォルトの名無しさん:2005/06/06(月) 23:09:43
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;
2522:2005/06/07(火) 11:13:32
>>23
ガビーソ! (゚Д゚;)
そうか、our 宣言って、local 宣言と組み合わせた場合は安全なんですね(汗
@Hoge::x (への|からの) 値の変更が筒抜けになる危険なものだとばかり思い込んでました。
それで逝きます。重ね重ねすいません on_
26デフォルトの名無しさん:2005/06/07(火) 12:37:27
>>25
ourってuse strict "vars"で怒られなくするという以上の意味は
ないよ。

筒抜けとかなんとかって考えがどこから出てきたのかはわからんが
なんか激しく誤解しているようなので、いい機会だからきちんと
理解しといた方がいいんじゃないかな。
2722: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は解放されずに残っている)なのでしょうか?
それとも参照方法を失った変数はその都度解放されているのでしょうか?
29デフォルトの名無しさん:2005/06/07(火) 13:10:47
古い $value への参照が @hoge に保持されている限り、古い $value の実体 (参照先) も保持される
・・・と思う。
もちろんループ回数分の個数 (この場合 10 個) が、別々の実体として。
処理系のソース見たわけではないけど、
普通ガベージコレクタの仕事とはそういうものだよね・・・
3029:2005/06/07(火) 13:27:21
 受け答えになってなかった・・・_| ̄|○
 仮にループ内で push( @hoge, \$value ); をやらなかった場合、レキシカル変数
$value がスコープから外れた瞬間 (つまりループ 1 回回る毎に) $value の実体は
削除される。
 上の例のような単純変数の $value だと確かめようがないが、bless されたオブジェクトなら
そのタイミングで DESTROY メソッドが呼ばれる・・・はず (未確認)。
31デフォルトの名無しさん:2005/06/07(火) 13:39:26
>>28
ソースをしっかり読むのがいちばんなんだろうが、とりあえずおおざっぱに
知りたいのならばオライリーの「実用Perlプログラミング」の20章「Perlの
内部構造」を読むといい。
32デフォルトの名無しさん:2005/06/07(火) 13:42:15
>>27
パッケージ変数はパッケージ名明示すればどこからでもいじれるので、
いやならレキシカル変数を使うしかない。ourに文句をいうのは筋違い。
そのためのmyだろ?

localは変数自体はそのままで、単に値の退避と復旧を自動的にやるだけ
のものだしな。
3322:2005/06/07(火) 14:20:20
>>32
> すればどこからでもいじれるので、いやならレキシカル変数を使うしかない。
これは正論だと思いますが、最初の質問 >16 のような、変数の別名を作る場合はそうはいかないのです。
(パッケージ変数 (ていうかシンボル) の型グロブは '*' で参照できて、名前とは独立に付け替えができるのに対し、
レキシカル変数への参照は名前と一体であって書き換えられない。)

まあ、our $x; のあと local*x = \$z; とすることによって $x が $z の別名になって (配列のときも同様)、
しかも「筒抜け」の危険も生じないことがわかったので私めは満足でございますv
3428: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が呼ばれました。
35デフォルトの名無しさん:2005/06/07(火) 18:28:28
>>34
あの〜、、、
for ループの最後で明示的に undef $hoge; するから $hoge の DESTROY が呼ばれてる、
と思うのは勘繰りすぎでしょうか
3634:2005/06/07(火) 18:49:59
>>35
試しに「undef $hoge;」を外して実行しましたが同じ結果でした。
37デフォルトの名無しさん:2005/06/07(火) 19:12:20
オレの手元のperlでは

ループ開始
newしました。
DESTROYが呼ばれました。
ループ終端

の順番になり、undefをやめると

ループ開始
newしました。
ループ終端
DESTROYが呼ばれました。

になる。どっちにしても

ループ開始
DESTROYが呼ばれました。
newしました。
ループ終端

にはならんがなぁ。
3836: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回目以降突入後)に消される仕様なのかと
#そんなわけなのに変な納得の仕方をしてました(汗
39デフォルトの名無しさん:2005/06/07(火) 23:54:23
>>38
$selfがグローバルになってるので、次にnewが呼ばれて
上書きされるまではこっちからの参照が残ってるので
DESTROYされなかったわけですな。それならばあの結果
になるだろう。納得。
40デフォルトの名無しさん:2005/06/08(水) 01:18:24
>>31

へぇ、あの本、そんな面白そうなことが載ってるんだ。
「実用」というタイトルで何となく敬遠してた本だけど・・・
41デフォルトの名無しさん:2005/06/08(水) 01:57:31
>>40
そうやって決めつけて見聞の範囲を制限するから、お前はいつまで
も負け組なんだ。
42デフォルトの名無しさん:2005/06/08(水) 03:53:25
>>41
そんな絡むことか? ちなみに、英語版(原書)はAdvanced Perl Programming。
中身も、「実用」よりPerlの内部構造を意識した発展的内容。

Perlはもう役目を終えるべき言語なので、真面目に勉強すべきではないと思うが。。
43デフォルトの名無しさん:2005/06/08(水) 04:04:52
つ〜か、何の脈絡もなくあちこちに出現してる罵倒師に構うなよ。
44デフォルトの名無しさん:2005/06/08(水) 14:57:29
>>42
Perlは終わっちゃうのん?
45デフォルトの名無しさん:2005/06/08(水) 15:06:02
なんでPerlすぐ死んでしまうん?
46デフォルトの名無しさん:2005/06/08(水) 15:08:23
>>44
>>43

ちょっとしたツールとしては
使いたい人間は使い続けるだろうから死滅はしないだろ。
47デフォルトの名無しさん:2005/06/08(水) 15:31:32
>>42
> Perlはもう役目を終えるべき言語なので、真面目に勉強すべきではないと思うが。。

何に移るべきだと思う?
48デフォルトの名無しさん:2005/06/08(水) 16:04:33
そう思って考えるとなんかこれだっていうのがないんだよな...
なので今日もperlを使いつづけているのだった。
49デフォルトの名無しさん:2005/06/08(水) 16:15:28
UNIXやx86(IA32)、生C、COBOLなんかも死んだ死んだ言われて今でも元気だ。

基盤業務のスクリプトなんかまだまだsh系とかだし。
sedまでで、awkはもうだめとかざらだし。

枯れてるってことはそれはそれで強いんだよね。
perl5も誕生10年、これからこれから。
50デフォルトの名無しさん:2005/06/08(水) 16:50:23
>>49
それら被死亡宣告事象は、使ってない人、第三者が死亡宣告したもの。

Perlにとっとと氏ねと言っている連中は、中毒級のコテコテのすご腕のPerlian
だったりする。

要するに、転したいんだよね、Perlを。だけどもっと良いものが作れなかったり、
なかったり、あるいはなかなか移れなかったりして七転八倒してる。

しして、この進化の袋小路で転げまわってるんだ。いつまでもいつまでも(哀)。
51デフォルトの名無しさん:2005/06/08(水) 17:33:50
キチガイの多いスレですね
52デフォルトの名無しさん:2005/06/08(水) 18:06:41
>>51
お前も含めてというのなら禿同
53デフォルトの名無しさん:2005/06/08(水) 20:47:02
俺も含めろ!
54デフォルトの名無しさん:2005/06/08(水) 20:50:51
55デフォルトの名無しさん:2005/06/08(水) 21:15:57
>>50
> それら被死亡宣告事象は、使ってない人、第三者が死亡宣告したもの。
それでいざ自分たちが当事者になるとMac板の祭りのような
面白すぎることになるわけですね
56デフォルトの名無しさん:2005/06/08(水) 21:53:47
ruby
57デフォルトの名無しさん:2005/06/08(水) 22:10:50
rubyはドキュメントシステムが整備されていないのがフラストレーションたまる所。
58デフォルトの名無しさん:2005/06/08(水) 22:34:18
そういやようやくモジュールをネットワークからインストールできるようになったらしいね>ruby
なんで最初から作ってなかったんだろ?
言語仕様は嫌いじゃなかったんだけど、ライブラリの未整備でrubyは速攻で捨てたんだよなぁ。。。

CPANやppmがなければ速攻で捨ててたのに>Perl

59デフォルトの名無しさん:2005/06/08(水) 22:47:06
最近Perl始めた人はそんなもんかね?
Perlは基本機能だけで十分便利なんだがね。awkやsedに比べて
60デフォルトの名無しさん:2005/06/08(水) 23:30:42
最近何故かawkの仕事が増えた
61デフォルトの名無しさん:2005/06/09(木) 00:08:58
Perlは使わせてくれないの? awkでヤル程度なら、Perlを使った方が良いと
思うけど。 で、Perlで30行以上になるなら、Javaとか真面目に設計された
言語を使うべきだな。
62デフォルトの名無しさん:2005/06/09(木) 03:24:49
「Perlクックブックソースコードリンク集」
http://www.sarinaga.com/progtoy/perlcookbooklink.html

> ここでは、Perlクックブック―Perlの鉄人が贈るレシピ集
>(urn:isbn:4-87311-037-8)のソースコードへのアクセスがし
>やすいように、ネットワーク上[http://www.unix.org.ua/orelly/perl/cookbook/]
>にあるリソースについて、私が作成したリンク集です。

というしろもの。
63デフォルトの名無しさん:2005/06/09(木) 05:36:27
・awkってなんかUNIXごとに別々に実装してて動いたり動かなかったりしそうで嫌。
・Perlの正規表現がデファクトスタンダードになって、その他のものが微妙に使いにくく
感じること多い。
・なんだかんだ言いつつも、Cライクなシンタックスをベースにしてるので、
SHやPython,Ruby,Lispより馴染みやすい(これは本当に大きい)。
・なんだかんだ言いつつもUNIX的なアイディアが素直に実装されている。
(そのせいでWindowsプログラマが馴染み難く感じるという不利な点もあるかも)
64デフォルトの名無しさん:2005/06/09(木) 09:34:34
たとえばshなら
マン頁をgroff -man -t psで
man 1 sh(FreeBSDのがいい)
をいんさつしても10頁ぐらいなので

カンのいい人なら半日
筋の悪い人でも1週間ぐらい
でたぶん覚えられるけど

ちゃんとしたPerlの教科書は500頁超とかだし、
それに加えてライブラリのつかいかたとかあるし、

あと
優先順位が、低い
C++とかJavaなどのほうが先にくる
65デフォルトの名無しさん:2005/06/09(木) 10:04:53
>>63

>・なんだかんだ言いつつも、Cライクなシンタックスをベースにしてるので、
>SHやPython,Ruby,Lispより馴染みやすい(これは本当に大きい)。

大嘘こくなやボケ
66デフォルトの名無しさん:2005/06/09(木) 10:09:56
オレはPythonのインデントとRubyのendは嫌いだがLispのカッコは好きだな。
67デフォルトの名無しさん:2005/06/09(木) 10:45:56
折れはPerlのsub, shift, my, blessを見ると、オツムガおかしくなりそうになる。

Perlは関数の実装で既に道を踏み外した。
68デフォルトの名無しさん:2005/06/09(木) 11:59:19
>>67
その程度でおかしくなるなよ
69デフォルトの名無しさん:2005/06/09(木) 12:13:30
どういうオツムやねん

っと煽り抜きに思うよな
70デフォルトの名無しさん:2005/06/09(木) 12:14:55
>>61
perlで30行で出来ることはJavaへ持っていくと300行ぐらいになることがザラ。
単機能物ならshやperlが強いな。すぐ作れるし。
で、手順書(スクリプト)なのがshで、プログラムなのがperlってところか。

多機能でコアと機能ごとにソース分割して実装し、多人数でメンテする
ようなものこそJavaは強い。コーダの実力を言語仕様がカバーしてくれる。
Java人気の秘密はまさにそこだと思う。
71デフォルトの名無しさん:2005/06/09(木) 12:30:37
5.8になって頭がおかしくなったことはある
72デフォルトの名無しさん:2005/06/09(木) 13:11:07
>>67
> Perlは関数の実装で既に道を踏み外した。

その評価は酷と言うもの。Perlはもともと、室内を歩くスリッパでしかない。

それを勝手に道路に出たり、カバーをつけてぬかるみを歩こうとしたり、
フローターをつけて太平洋を渡ろうとしたり、翼をつけて空を飛ぼうという
連中がいるからいけない。
73デフォルトの名無しさん:2005/06/09(木) 14:45:29
おまえら日本語分かってないだろ

「オツムがおかしくなりそう」

っていうのは実際に「オツムがおかしくなってしまう」ことを言っているのではないのは明白

74デフォルトの名無しさん:2005/06/09(木) 15:20:09
オツムがおかしくなったこともなりそうになったことも無いので
両者にどれだけ開きがあるのか具体的には分かりません。
自分の状況から比べればどちらもそれほど違うものでは無いだろうと考えました。
75デフォルトの名無しさん:2005/06/09(木) 15:26:54
プログラミング言語は馬鹿には扱えないという
ただそれだけのことだと思いますが。
76デフォルトの名無しさん:2005/06/09(木) 15:31:42
だから「なりそうになった」は事実じゃないんだってば
婉曲表現というものを知らんのか?
77デフォルトの名無しさん:2005/06/09(木) 17:32:37
なりそうになる時点で馬鹿だと言っているのです。
なったと言っていると思い込んでる人間は一人もいませんよ。
馬鹿ですね。
78デフォルトの名無しさん:2005/06/09(木) 18:17:55

Perlの言語仕様は


      腐    っ    て    る


79デフォルトの名無しさん:2005/06/09(木) 18:20:16
4.主観で決め付ける
80デフォルトの名無しさん:2005/06/09(木) 18:49:57
>>78
その腐り具合がちょうど良いから、みんな鼻をつまみなが
らスプーンを突っ込んでるんですよ。
81デフォルトの名無しさん:2005/06/09(木) 18:53:31
納豆みたいなもんか。。
82デフォルトの名無しさん:2005/06/09(木) 19:34:07
生みの親がアニヲタらしいからな
83デフォルトの名無しさん:2005/06/09(木) 19:34:12
なにこの流れ?

面白いからいいけど。
84デフォルトの名無しさん:2005/06/09(木) 19:57:07
>>82
> 生みの親がアニヲタらしいからな

生みの親は「指輪物語」ヲタでつ。
85デフォルトの名無しさん:2005/06/09(木) 20:11:31
でも、ドット・コムブームが弾けて会社首になって、奥さんにも捨てられたんでしょ。
今、何しているのかな?
86デフォルトの名無しさん:2005/06/09(木) 20:36:43
CPANでモジュールインスコでなやんどります。

testは内部コマンド、または
perl -MCPAN -e shell

外部コマンド、操作可能な
プログラムまたはバッチファイルとして認識されておりません

と出ます。どんなもんすかね?win2000です
87デフォルトの名無しさん:2005/06/09(木) 20:39:17
漏れも確かに 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 が腐ってるとかなんだとかいう香具師らは、腐ってない何かを生み出したことがあるんかい?
88デフォルトの名無しさん:2005/06/09(木) 20:41:25
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の本質語るとか、他の言語と比べてとか、みんなすげーよな。
オイラモジュールインスコだけで手一杯だ(´・ω・`)。
93デフォルトの名無しさん:2005/06/09(木) 21:01:49
>>86
Active Perlだよね?
ならばcpanよりもppmの方が良いと思う

まあ、その前に起動しないと話しにならんか・・・
とりあえず、DOSプロンプト開いて、
C:\hoge> cpan
とやってみたらどうなる?
94デフォルトの名無しさん:2005/06/09(木) 21:03:38
>>93
アリガト。やってみる。
95デフォルトの名無しさん:2005/06/09(木) 21:07:59
'CPAN' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

(´・ω・`)。ス万。。悪いから一人でやってみるよ。アリガトね
9693:2005/06/09(木) 21:11:43
>>95
あれ・・・おかしいねぇ
>>88-90からしてちゃんとパス通ってるのに・・・
ちょっと再起動して見れ。これでも駄目なら私にはわからん・・
97デフォルトの名無しさん:2005/06/09(木) 21:15:16
>>96
色々アリガト。ほいじゃー
98デフォルトの名無しさん:2005/06/09(木) 21:21:06
>>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⇒気になったことはありません:-)
99デフォルトの名無しさん:2005/06/09(木) 21:35:50
Perlから入ったんで、理屈で納得できる箇所は幾つかあるけど
感覚的にはどれも大した問題ではないというのが俺の本音。
100デフォルトの名無しさん:2005/06/09(木) 21:51:25
折れもPerlから入ったクチだが、確かにファイルハンドル関係の設計だけは
どうしようもないほどイカレてると思うね。

最近(5.6.0から)は無名のファイルハンドルを作れるようになったのでまだマシだが…。

$aと$bやl、構造体がないためocaltime()/stat()がリストを返すというのも、まあ気になるっちゃ気になる。
他は大して気にならないね。
101デフォルトの名無しさん:2005/06/09(木) 22:20:36
おまいらみんなPerl愛しすぎ。
102デフォルトの名無しさん:2005/06/09(木) 22:20:42
『Perl脳の恐怖』
103デフォルトの名無しさん:2005/06/09(木) 22:24:10
質問です。
Perl6 はどこに行ってしまったのでしょうか。
また、テンプレートは今度こそ実装されますか
104デフォルトの名無しさん:2005/06/09(木) 22:38:22
Perlが生み出した有益な何かがあると言う人もいるが、
それはPerlなしでも実現可能なことばかりだと、僕自身は
思っている。むしろ、Perlに自由を奪われていると僕は思う。
Perlなしではプログラムが書けないなんて・・・あまりにも悲しい。
105デフォルトの名無しさん:2005/06/09(木) 23:00:56
>>104
今現在のこの宇宙よりあちらの並行宇宙の方が良かった、なんて感想を述べられても困る。
106デフォルトの名無しさん:2005/06/09(木) 23:01:10
今時書けない言語がある奴なんてお前ぐらいだよ(ガハハ
107デフォルトの名無しさん:2005/06/09(木) 23:19:00
>>103
> Perl6 はどこに行ってしまったのでしょうか。
ていうか来てません
108デフォルトの名無しさん:2005/06/10(金) 00:05:35
Perl詩のネタになりそうな流れだな
109デフォルトの名無しさん:2005/06/10(金) 00:10:16
                          全・
                        て・

                      計・
                      画・
                      通・
                        り・
                     だ・
                      :
                      :
110デフォルトの名無しさん:2005/06/10(金) 00:26:39
http://digit.que.ne.jp/work/index.cgi?Perl%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%2F%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB(CPAN)

このページを参考にしながらWindowsでのCPANの設定をしてたのですが、
モジュールをインストールしようとすると、make testまではうまくいき
ますが、make installで、

Use of uninitialized value in <HANDLE> at C:/Perl/lib/CPAN.pm line 4856.
readline() on unopened filehandle at C:/Perl/lib/CPAN.pm line 4856.
Can't call method "close" on an undefined value at C:/Perl/lib/CPAN.pm line 4860
.

というエラーがでてうまくいきません。

なにが原因か分かりませんか?
111デフォルトの名無しさん:2005/06/10(金) 00:28:11


最初のURLですが、(CPAN)までURLです。
すみません。
112デフォルトの名無しさん:2005/06/10(金) 00:28:11
>>110
理由はもう書いてある。
113デフォルトの名無しさん:2005/06/10(金) 00:36:44
ppmにしとけ
114デフォルトの名無しさん:2005/06/10(金) 01:47:38
構造体なんて所詮配列ですよ?
Perlがリストで表現することがおかしいと思う人は、
構造体を誤って認識してる人です。
115デフォルトの名無しさん:2005/06/10(金) 02:00:40
>>114
やれやれ。あなたにとってはファイルシステムも木構造である必要はなくて、「所詮配列」 なのでしょうね。
116デフォルトの名無しさん:2005/06/10(金) 02:15:12
関連の強いメンバ同士を一まとまりにして扱う、というのが構造体のポリシーなはずだが、
仮に 「構造体 A と構造体 B をメンバとする構造体 C」 をプレーンな配列で表現するとそれが破綻してしまう。
117デフォルトの名無しさん:2005/06/10(金) 02:30:37
>>115
そうですよ。配列ですよ?
118デフォルトの名無しさん:2005/06/10(金) 02:32:20
>>116
奇数と偶数をメンバとする自然数は破綻していますか?
119デフォルトの名無しさん:2005/06/10(金) 03:28:21
すいません、perlでアプリケーションを起動する時は、
system ('C:\Program Files\hoge.exe');
とかで出来ると思うんですが、逆に終了させたいときはどのように書けばいいんでしょうか。
なんか引数にどうにかして終了を表すコマンドをくっつければいいのかと思ったんですが、
よくわかりませんでした…。

どなたかアドバイスのほど、よろしくおねがいします。
120デフォルトの名無しさん:2005/06/10(金) 04:10:36
Win32::Process
121デフォルトの名無しさん:2005/06/10(金) 04:18:23
forkとexecを使って説明しようと思ったけどうまくいかね
122デフォルトの名無しさん:2005/06/10(金) 05:12:03
>>119
別プロセスが立ち上がってるわけで、
強引なコトしないと終了させれないってのはちゃんと頭にあってか?
もしhoge.exeが自作のもんならプロセス間通信でもしてて下さい。
123デフォルトの名無しさん:2005/06/10(金) 08:50:17
>>103

perl6は古い。すでにperl6.5まで進んでいるよ。
http://page7.auctions.yahoo.co.jp/jp/auction/g30089957
124デフォルトの名無しさん:2005/06/10(金) 09:17:07
>>122
> 強引なコトしないと終了させれないってのはちゃんと頭にあってか?

頭になかったです。
なんか起動は出来るから終了も簡単に出来るものと思ってました…
もちろん自作のもんでもなんでもないです。
すいません…。
125デフォルトの名無しさん:2005/06/10(金) 09:19:15
ああ、なんか必要以上に卑屈になってしまた…
126デフォルトの名無しさん:2005/06/10(金) 12:25:14
せっかくEncodeに乗り換えたのにJcode2.0ってなによ
便利じゃないのかぁ!
127デフォルトの名無しさん:2005/06/10(金) 12:26:51
まあ落ち着け
128デフォルトの名無しさん:2005/06/10(金) 14:30:09
>>126
そうか?
Encodeは環境。Jcodeは変換メソッドのあるオブジェクト、jcode.plは変換関数の集合体。
比較するもんじゃないと思うし、Encodeに"苦労して"乗り換えてJcodeのほうが便利に
みえるなら、Encodeの理解が足りないと思われ。
129デフォルトの名無しさん:2005/06/10(金) 15:18:04
>>128
知ったかすんな。嘘つき野郎
130デフォルトの名無しさん:2005/06/10(金) 15:22:14
Jcodeの方が速い
131デフォルトの名無しさん:2005/06/10(金) 15:28:30
>>130
Jcode 2.0はEncodeのラッパー。しかも多くの場合、Encodeのほうが旧Jcodeより早い。

速度だけで言うならUnicode::Japaneseが最速だが。
132デフォルトの名無しさん:2005/06/10(金) 16:20:42
なんで旧Jcodeと比べてるんだ?
133デフォルトの名無しさん:2005/06/10(金) 17:27:39
>>132
ラッパーの意味がわからんのか池沼。
134デフォルトの名無しさん:2005/06/10(金) 19:23:02
>>132
「ラッパーでもない旧 Jcode ですら Encode より遅い。
 だから (速度をとるなら) Encode 使え。」
という文脈なのでは?
135デフォルトの名無しさん:2005/06/10(金) 21:08:37
でEncode2.10になって何が変わったの?
136デフォルトの名無しさん:2005/06/10(金) 22:11:59
>>123
びっくりした! 5.6 の typo やんけ ヽ(`Д´)ノ-3
137デフォルトの名無しさん:2005/06/10(金) 22:33:36
perl で行入力演算子で読みこんでいるとき現在の行が何行目か知る方法はあ
りますか?
138デフォルトの名無しさん:2005/06/10(金) 22:47:10
139デフォルトの名無しさん:2005/06/10(金) 22:48:39
>>137
特殊変数 $. を使う。
140デフォルトの名無しさん:2005/06/10(金) 23:47:39
>>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 氏は未だ人類の理解が到達していない深遠な何かを言わんとしているのではないかと期待しつつ、とりあえず常識的な線で反応してみた。
141デフォルトの名無しさん:2005/06/11(土) 00:51:42
あるファイルの中身を変数につっこむ方法はありますか?
$var = `cat hoge`;
これだと外部コマンドが必要なので、もっとスマートなやつおねがいします。
142デフォルトの名無しさん:2005/06/11(土) 00:57:23
>>141
> あるファイルの中身を変数につっこむ方法はありますか?

あるよ。
143デフォルトの名無しさん:2005/06/11(土) 01:04:43
>>141
open FH, "<hoge" or die; $var = <FH>; close FH;

、、、って無理やり一行にしただけやん ヽ(`Д´)ノ-3

なんか質問者にスゲー試されてる気がする・・・
144デフォルトの名無しさん:2005/06/11(土) 01:16:02
>>143
一行しか取れてない時点で負けっぽいが。
{ local undef $/; open FH, "<hoge" or die; $var = <FH>; close FH }
145デフォルトの名無しさん:2005/06/11(土) 01:20:42
>>143
行入力演算子だと一行しか読みこめませんよ。
>>144
なるほど、そんな変数があるのですね。
$/ The input record separator, newline by default.
この場合 local は my におきかえちゃだめなんでしょうか?
146デフォルトの名無しさん:2005/06/11(土) 01:27:59
>>145
今のところダメ
147デフォルトの名無しさん:2005/06/11(土) 01:28:30
$var = do { open my $fh, '< test.pl'; join '', <$fh> };
148143:2005/06/11(土) 01:37:30
ガーソ!
> 一行しか取れてない時点で負
死にたい・・・_| ̄|○|||
149デフォルトの名無しさん:2005/06/11(土) 02:00:19
File::Slurpは便利。
150デフォルトの名無しさん:2005/06/11(土) 02:28:49
>>141
open FH, '<' . './hoge' or die $!;
read FH, my $var, -s FH;
print $var;
151デフォルトの名無しさん:2005/06/11(土) 05:46:58
>>147
これの場合、 my $fh がブロックのスコープを抜けたときに暗黙に $fh は close されるの?
152デフォルトの名無しさん:2005/06/11(土) 08:43:47
ラリーっていまどうしてるの?
153デフォルトの名無しさん:2005/06/11(土) 10:39:39
>>151
される。
154デフォルトの名無しさん:2005/06/11(土) 10:45:17
>>145
これは?
@nullpo = <GATT>;
155デフォルトの名無しさん:2005/06/11(土) 11:03:54
>>152
折れも尻たーい。 バブルが弾けて、会社クビになって、奥さんに捨てられて。。ってとこまで
知ってるけど、彼程度の腕なら再就職先を見つけるのは困難ではないし。。

でも、Perl 6は5年くらい出る出ると言われていた気がするけど、未だ出る気配すらないね。
156デフォルトの名無しさん:2005/06/11(土) 13:26:41
>>153
なるほど。これは close し忘れにくくなって良いっすね。
157デフォルトの名無しさん:2005/06/11(土) 14:15:58
WindowsXPでActivePerl5.8.4を使っています。5.8.7が出たので更新しようと思ったのですが、
XSを使ったモジュール(Cコンパイラを使うやつ)は再インストールしないといけないでしょうか。
158デフォルトの名無しさん:2005/06/11(土) 16:24:13
>>147
>>151
>>153
>>156
そこで Ruby ですよ
159デフォルトの名無しさん:2005/06/11(土) 17:41:13
まあ、Perl のプロセスが終了すれば全ハンドルは閉じられるわけだが。
全然関係ないけど。
160デフォルトの名無しさん:2005/06/11(土) 19:10:03
ああ、確かに関係ないな
161デフォルトの名無しさん:2005/06/11(土) 20:40:43
( ´_ゝ`)フーン
162デフォルトの名無しさん:2005/06/12(日) 02:19:11
rubyやpythonが仕事で使えない(言語能力ではなく嫌がられるってこと)ので
しぶしぶperlに戻ってきました。っつても以前はperl4の機能しか使ってなかったんで
もう一度お勉強しなおしたらスゲー面白くて最近ハマってきた。
いい言語かどーかは置いといて、オモレーよperl
163デフォルトの名無しさん:2005/06/12(日) 02:32:04
おもしろくねーよ。

おもりろりんな言語って言うのは、C++やLispのことを言うのだ。
164デフォルトの名無しさん:2005/06/12(日) 04:01:44
perlでへんな癖付くと他の言語に戻ったときにそれを取り除くのが大変
165デフォルトの名無しさん:2005/06/12(日) 04:56:48
あなたのeval使ったバリバリの変態コードを見せてください
166デフォルトの名無しさん:2005/06/12(日) 08:00:03
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;
167デフォルトの名無しさん:2005/06/12(日) 10:44:33
暇人
168デフォルトの名無しさん:2005/06/12(日) 10:56:49
Shift_jisにおいて半角全角の数字を正規表現マッチさせるにはどうすればいいでしょうか?
[\d(\x82[\x4f-\x58])]
というクラス内においてクラスを使おうとするとエラーになります。
何か上手い方法ってありますか?
169デフォルトの名無しさん:2005/06/12(日) 11:05:42
変換すれば
170デフォルトの名無しさん:2005/06/12(日) 11:08:43
>>168
/((?:\d|\x82[\x4f-\x58])+)/
171デフォルトの名無しさん:2005/06/12(日) 11:09:24
[\d(\x82\x4f)(\x82\x50)(\x82\x51)(\x82\x52)(\x82\x53)(\x82\x54)(\x82\x55)(\x82\x56)(\x82\x57)(\x82\x5\
8)]{10}
やっぱりこうするしかないのかな。カッコ悪いけど。
172デフォルトの名無しさん:2005/06/12(日) 11:13:10
>>170
ありがとうございます。カッコがなぜ二重に必要なのか分りませんが、それ使わせてもらいます。
173デフォルトの名無しさん:2005/06/12(日) 11:20:09
あ、っていうか普通にこれでいいんすね。
(\d|\x82[\x4f-\x58]){10}
{}←これってクラスにしか使えないのかと勝手に思い込んでました。すみません。
174デフォルトの名無しさん:2005/06/12(日) 12:12:09
>>172
いや、matchした連続した数字部分を参照したいかな、と思ったから。
175デフォルトの名無しさん:2005/06/12(日) 12:27:52
>>174
どもです、OKです。
/((?:\d|\x82[\x4f-\x58]){10})/
(?:.....)というのはマッチした部分的文字列をを
$1というのに保存しないでしないという意味っすね。

こうすることで全体の10文字が手に入ると。"+"なら一文字以上の
任意の長さの結果が手に入ると。うーん、Perl素晴らしい。
176デフォルトの名無しさん:2005/06/12(日) 16:13:31
(゚Д゚) 宇宙語だ!宇宙からの交信が届いた!!
177162:2005/06/12(日) 17:49:31
>>163
Lisp。クロージャ、遅延評価、ストリームなどキーワードはオモロそうだなーと思うが
lisp自体が アホなのでさっぱりわからん。
perl使いに分かるように lispの面白さを広告してみてくれ。
178162:2005/06/12(日) 17:51:10
>>177
まぁ、自分で書かないとわからんとか言われるんだろうな・・・。
179デフォルトの名無しさん:2005/06/12(日) 18:22:48
>>178
> まぁ、自分で書かないとわからんとか言われるんだろうな・・・。

大学でやらされましたよ。人間インタープリタ。
180デフォルトの名無しさん:2005/06/12(日) 22:56:49
UTF-8なら2バイト文字のマッチングも大丈夫?
それともEUCにするべき?
181デフォルトの名無しさん:2005/06/13(月) 00:13:59
use encoding
182デフォルトの名無しさん:2005/06/13(月) 00:39:06
>>180
UTF-8 なのに 2バイト文字とはこれいかに!?
183デフォルトの名無しさん:2005/06/13(月) 00:41:00
質問箱じゃなくて雑談スレみたいなのないの?
184180:2005/06/13(月) 01:00:29
>>181
それは怖いから許して

>>182
それもそうね。日本語という意味です。
185デフォルトの名無しさん:2005/06/13(月) 01:32:14
>>183
伝統的に「質問箱」となっているだけで、雑談もかまわないとおも
雑談スレは過去何度か経ったが、雑談だけじゃ話が続かないからな

WebProg板に行けばPerl6スレ等もう少し雑談よりのスレも沢山あるがな
186デフォルトの名無しさん:2005/06/13(月) 02:16:40
Perl6なんてもう消えたも同然だろ
187デフォルトの名無しさん:2005/06/13(月) 10:13:13
use encodingの何が怖いのかわからない
188デフォルトの名無しさん:2005/06/13(月) 10:20:05
こわがりすぎー
189デフォルトの名無しさん:2005/06/13(月) 10:31:04
怖がり杉
190デフォルトの名無しさん:2005/06/13(月) 10:38:45
動いてたコードにuse encoding "...";
って入れただけで動かなくなった。
191デフォルトの名無しさん:2005/06/13(月) 11:06:26
DBMにしまってるデータをhtmlに一覧表示(例;アドレス一覧)したいんですが、
上手く1データ(日付・名前・アドで1行)ずつでんのです。
プログラム初心者でよくわからんのです。
拾い方教えてください。
192デフォルトの名無しさん:2005/06/13(月) 11:35:42
193デフォルトの名無しさん:2005/06/13(月) 18:53:50
現在Perl勉強中の初心者です。

TKモジュールを使って日本語混じりデータの処理をしているのですが、
使えそうな、デバッカーを教えてください。

しばらく前に perl -d:?????? perl.pl でデバッカが使える
とあるWebで目にしました。しかしそのページをブックマーク
し忘れてしまいました。

OSはWindows XP で、Perlは 5.8.6 です
194デフォルトの名無しさん:2005/06/13(月) 18:59:06
>>193
デバッカって何?
195デフォルトの名無しさん:2005/06/13(月) 19:00:03
>>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
>>194
> デバッカって何?

意地悪い
198デフォルトの名無しさん:2005/06/13(月) 19:19:25
>>193
> デバッカーを教えてください。

>>194
> >>193
> デバッカって何?

>>195
> # CUIデバッガ 標準添付
         ^^


>>196よ、見てるこっちの方が恥ずかしいので勘弁してください。(*ノノ)
199デフォルトの名無しさん:2005/06/13(月) 19:26:37
>>194
> デバッカって何?

デバック、デバッカ ――
能力に欠けるプログラマを検出する上で重要なキーワード/概念。
もちろんこれは、デバッグ/デバッガの読み間違いであるが、その読み間違
いを長期間に渡って続けている者は、プログラミングの現場から速やかに
排除されるべきである。
頻繁に「デバッグ」「debug」などの文字列を目にしているはずの現場
において、それでも「デバック」と言い続けているということは、認知
能力に極めて重大な欠陥がある可能性が高いからである。
読んだものをそのまま認識し、タイプすることが何よりも求められるプ
ログラミングという作業に、これほど不適切な人間はいない。
200デフォルトの名無しさん:2005/06/13(月) 19:28:22
>>197
いや、「デバッカ」でググって、ろくな情報が無いと
ブーたれてるバカがいるから、これは大事だよ。
201デフォルトの名無しさん:2005/06/13(月) 19:30:26
>>200
まあ、「>193 デバックでなくてデバッグな」ぐらいの優しさは標準装備しておこうぜ。
202201: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 してろよ
205デフォルトの名無しさん:2005/06/13(月) 19:55:32
ノハヽ   DE BACK! BACK IN!
   (*´∀`)   
   (  つ ☆ノハヽヽ
    ) ,ィ⌒|G|*‘ o‘リ
   (_(__人__,つ 、つ
206デフォルトの名無しさん:2005/06/13(月) 19:59:57
ソースのメーカーで「ブルドック」なんてのもあるからな。
ラベルには、英語で Bulldog って書いてあるんだが。
栃木の「ツインリンクもてぎ」もそう。英語では TWIN RING となってる。
まぁ、一種の社会現象ってことか。
207デフォルトの名無しさん:2005/06/13(月) 21:12:50
頭!頭!
208デフォルトの名無しさん:2005/06/13(月) 22:20:50
逆に、「ビックカメラ」を「ビッグカメラ」と呼んで、「どう? おれ賢い?」と
悦に入っている痛いやつもときどきいるよな。

まあ、あれは恐るべき罠と評価してもいいかもしんないが。
209デフォルトの名無しさん:2005/06/13(月) 22:34:25
プロバイダー -> プロバイザー
ウォーニング -> ワーニング
ナルポ -> ヌルポ
210デフォルトの名無しさん:2005/06/13(月) 23:05:35
はいはい。ほら、ペールの話に戻って。
211デフォルトの名無しさん:2005/06/13(月) 23:21:49
Perl5でOOPができたら最高なのになぁ。
212デフォルトの名無しさん:2005/06/13(月) 23:23:10
素朴な質問なのですが、$_に適切なファイル名を入れた状態で
$file_is_exist = 'exist' if -e;
は成功するのに
$file_is_exist = -e ? 'exist' : 'not exist';
の -e は括弧がないなんてケシカランと怒られ、検索パターンがどうのと怒られます。
なんでなのでしょうか??
213デフォルトの名無しさん:2005/06/14(火) 00:13:30
>>205
りしゃこに変なことするのやめてください
214デフォルトの名無しさん:2005/06/14(火) 00:16:29
-eのあとの?が?:演算子の?ともパターンマッチの?...?の
開始の?ともとれるわけだが、どちらにもとれる場合は
項になるほう(この場合はパターンマッチの?...?)優先
になる。よくひっかかるのでwarning対象になっていて
カッコで明示しろといわれているわけだ。で、?...?の
最後の?が見つからないので検索パターンがどうこうと
いうエラーもついでに出る。

Warning: Use of "-e" without parentheses is ambiguous at 〜
Search pattern not terminated at 〜

なおエラーについて質問するときは勝手に翻訳しないで
エラーメッセージをありのまま写すのが基本なので以後
注意されたい。


215212:2005/06/14(火) 00:42:14
>>214
ん? おお!!
?PATTERN?なんて初めて知ったよ。便利そうですね。ありがとうです。
だけど
$file_is_exist = -e ? 'exist' : 'not exist' ?;
とやっても同じ警告はでてしまうだよ。(-e ?abc? でも -e /abc/でもでる)
?..?の結合度よりも -e ? の結合の方が強いのかな? (-e ? は -e $_ より強い?)
216デフォルトの名無しさん:2005/06/14(火) 01:28:40
>>215
どちらの場合もカッコで明示することを推奨しているので
warningは出すということじゃないかと。

/についてもこれは割り算の2項演算子でもあるのでおなじ
あいまいさがあるしね。

同じマッチでも -e m:abc: にすればあいまいさがなくなる
ので出なくなるはずだよ。
217デフォルトの名無しさん:2005/06/14(火) 01:57:07
こうすりゃいいだけじゃないのかと

$file_is_exist = -e $_ ? 'exist' : 'not exist'
218デフォルトの名無しさん:2005/06/14(火) 02:06:17
二つの文字列の先頭から一致する部分を取り出すスマートなやり方はないでしょうか?
以下のような文字列なら'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;
220デフォルトの名無しさん:2005/06/14(火) 04:05:19
>>219
おぉ、感激しますた!
先頭一致に捕らわれて、後ろから削る発想がなかったです。
エスケープされてる部分の意味が分からないのでまた調べてみます。

newbieなもんでいろいろな書き方ができるperlに戸惑ったり面白がったりです。
ありがとうございます。
221デフォルトの名無しさん:2005/06/14(火) 07:25:23
先頭からの一致ならindex使ったほうが速いんじゃないかな。
$a = 'abc123'; $b = 'abc456';
chop $a until index($b, $a) >= 0;
print $a;
222デフォルトの名無しさん:2005/06/14(火) 07:26:33
間違えた
$a = 'abc123'; $b = 'abc456';
chop $a until index($b, $a) == 0;
print $a;
223デフォルトの名無しさん:2005/06/14(火) 08:56:12
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 無しなら、正常に実行される。
なんでだろう? 前のバージョンでもそうだった。
皆さんのところでも、エラーになる?
224デフォルトの名無しさん:2005/06/14(火) 09:05:19
>>223
Win98SEか・・・
まずOSのアップグレードからしてみよか。
225223:2005/06/14(火) 09:24:35
>>224
ダメです。WinXP でも、全く同じように落ちました。
http://49uper.com:8080/html/img-s/62461.gif
226223:2005/06/14(火) 09:33:43
頭にきたので、Linux(TL10D)でもやってみました。
Shift-JIS / EUC-JP の両方で。
こっちは、全然問題なし。
ActivePerl のバグってことですかね?
227デフォルトの名無しさん:2005/06/14(火) 09:48:52
>>226
報告乙。
うちはまだbuild810のまんまだ。
228227:2005/06/14(火) 09:59:15
ちなみにmsvcrt.dllの古いのを放り込んだらどうなる?
229223: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では試してないけど、どうせ同じでしょうな。
230227:2005/06/14(火) 10:53:09
そういや810でも、デバッガ使うと何かの標準モジュールで転けてたなあ。
231デフォルトの名無しさん:2005/06/14(火) 11:01:19
既にBUG DBにあるね。日付からいってここ見てる人かな。登録乙でした。

ttp://bugs.activestate.com/show_bug.cgi?id=39261
232デフォルトの名無しさん:2005/06/14(火) 12:52:29
詳しい人に質問!パスワード入室管理付のBBS借りてるんだけど、
このパスワードって簡単に破れたり、BBSの中身見れたりするの?

教えて!
233デフォルトの名無しさん:2005/06/14(火) 13:21:27
>>232
激しく板違い。
234デフォルトの名無しさん:2005/06/14(火) 13:24:58
>>232
WebProg板へGo!
あと具体的にどの BBS かわからないと答えようがない。
235デフォルトの名無しさん:2005/06/14(火) 15:58:09
232=ミスターデバッカ
236デフォルトの名無しさん:2005/06/14(火) 17:55:26
Perlってインラインアセンブラあるんですか?
237デフォルトの名無しさん:2005/06/14(火) 19:34:29
>>221-222
今ごろサンクスコ!!
結局こうしてみました→chop $a while index $b, $a;
嗚呼もうなんだかこの一行に惚れました気持ちえぇですたまらんです。

>>236
いろんなプラットフォームの上で走ってるから難しくないですかね?
インラインAppleScriptとかあるからあってもヘンってことはないのかな。
238デフォルトの名無しさん:2005/06/14(火) 19:46:07
ある
239デフォルトの名無しさん:2005/06/14(火) 19:53:32
>>237
その気持ちよさ加減がPerlの魔力。
240デフォルトの名無しさん:2005/06/14(火) 20:05:46
>>236
無い事も無い
ttp://search.cpan.org/~neilw/Inline-ASM-0.03/ASM.pod

Inline系のモジュールにはCとかTkとかBefungeなんてのまであるから、
調べてみると結構楽しいよ
241240:2005/06/14(火) 20:08:44
Tkじゃ無いorz
Tclの間違い
242デフォルトの名無しさん:2005/06/14(火) 20:56:45
2chのdatを読み込むにはどうしたらいいの?
243デフォルトの名無しさん:2005/06/14(火) 21:08:20
lwp::simpleでgetしてforeachとspliteでお好きなように処理。
244デフォルトの名無しさん:2005/06/14(火) 22:19:32
>>243
激しくありがとう。
245デフォルトの名無しさん:2005/06/14(火) 22:26:30
すいません、今までutf8で保存していたperlのスクリプトがあるんですが、
それに、「shift-jisのテキストファイルに日本語の文字列を追記する」処理をほどこすことになりました。

で、そのまま
open(OUT, ">> $file");
 binmode(OUT,"shift-jis");
 print OUT "$_\n";
close(OUT);

みたいにshift-jisへのエンコードを追加したりしたんですが、
うまくいきません…。

どなたかアドバイスのほどよろしくおねがいします。
246デフォルトの名無しさん:2005/06/14(火) 22:57:40
外してるかもしれませんが。

binmode(OUT,":encoding(shiftjis)");
247デフォルトの名無しさん:2005/06/14(火) 23:32:31
>>246
直りました!ありがとうございます
248デフォルトの名無しさん:2005/06/15(水) 05:26:09
配列をforeachでループさせたとき、順番は必ず
番号順になりますか?例外はありますか?
ちなみにハッシュは規則性はないと聞いております。
249デフォルトの名無しさん:2005/06/15(水) 08:08:51
順番どおりです。仕様で決まってます。
250デフォルトの名無しさん:2005/06/15(水) 16:28:29
あるディレクトリにファイルいっぱいあって、それらのファイルのおしりの空
行を取り除くにはどうすればいいですか?空行は一行とは限りません 。
251デフォルトの名無しさん:2005/06/15(水) 16:42:24
>>250
成功する限り chomp しまくって失敗したら抜けるループ
252デフォルトの名無しさん:2005/06/15(水) 17:17:05
>>251
ループを抜けた時、最終行の改行コードが無くなってるので、
書き出す前に復活させる必要があるね。
それなら、$data =~ s/\n+$/\n/; の方が速そうな気がするが…
もちろん $/ = ""; での話。
253デフォルトの名無しさん:2005/06/15(水) 19:19:07
$/ = undef と勘違いしてないか?
254デフォルトの名無しさん:2005/06/15(水) 19:26:06
>>253
どっちでも効果は同じ。
ラクダ本(第2版)のp149を見ればわかるように、$/ = ""; が本来の書き方。
それに、undef なら「undef $/;」だろ?
255デフォルトの名無しさん:2005/06/15(水) 19:38:02
>>254
まー、$/ = undef; でも undef $/; でも同じなんだが、
プログラム書法の観点で言えば、後者に軍配が上がる。
256デフォルトの名無しさん:2005/06/15(水) 19:45:28
つ [それには何通りもやり方があるのだ。]
この辺が Perl の魅力であり、場合によっては弱点にもなり得るんだが…
257デフォルトの名無しさん:2005/06/15(水) 19:46:01
>>254
>どっちでも効果は同じ。

第2版っていつの時代だか知らんが少なくともその情報は古いな。
自分で確かめろ。

--test.pl--
$file = do { local $/ = ""; open my $fh, 'test.pl'; <$fh> };


print $file;


# ほげほげ
----

perlvar - Perl で定義済みの変数
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod#item__INPUT_RECORD_SEPARATOR
258デフォルトの名無しさん:2005/06/15(水) 19:47:16
>>255
オレはなんとなく他に影響でないか不安なので
{ local $/; 〜 } 派だな。
259デフォルトの名無しさん:2005/06/15(水) 19:51:26
>>257
> その情報は古いな。
最新の 5.8.7 でも、どっちでも全く同じに動きましたが。
260デフォルトの名無しさん:2005/06/15(水) 20:01:40
>>259
え?マジで?

>"" を設定した場合には、複数の空行も 1 つの空行であるかのように扱います。

とあるように、パラグラフモードになるハズなんだけど……。
俺の Perl 5.8.6 はなったんだけどなぁ。
261デフォルトの名無しさん:2005/06/15(水) 20:07:36
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 はもちろん共有ではなく別々に
インストール)、両方とも同じものが出ます。

その後は問題なく動いているようですが、どうも気になります。
皆さんの環境でも、同じでしょうか?
262デフォルトの名無しさん:2005/06/15(水) 20:09:52
perl -pi.orig -e 'BEGIN {undef $/;} s/\n+$/\n/s' *

-iオプションは便利だ。

ただしメモリに読み込めないくらい巨大なファイルだとこのやり方では
まずい。それほどでかいとお尻から読んでtruncateしたいとこだがかなり
めんどくさくなるだろうなぁ。

263デフォルトの名無しさん:2005/06/15(水) 20:17:59
$/ = ""; だと
1文字単位でバラバラにされるんじゃないんですか?
264デフォルトの名無しさん:2005/06/15(水) 20:22:01
>>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で決まりですか?

266デフォルトの名無しさん:2005/06/15(水) 20:50:31
ぐだぐだだな。
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

と,やりたいんですが,どうすればいいでしょうか.初歩的なコードだと思うんですが,どうしてもうまくいきません.
268デフォルトの名無しさん:2005/06/15(水) 22:38:34
どうもしてなさそうだ。
269デフォルトの名無しさん:2005/06/15(水) 22:44:45
>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;
270デフォルトの名無しさん:2005/06/15(水) 22:49:04
>>267
my($name, @points) = split / /, $line;
$data->{$name} = [];
push @{$data->{$name}}, @points;

271デフォルトの名無しさん:2005/06/16(木) 00:08:33
>>269-270
そうやって答え出すからそいつらが付け上がるんだろうがヴォケ
272デフォルトの名無しさん:2005/06/16(木) 00:13:06
無能になろうが恥かこうが知ったこっちゃないしー
273デフォルトの名無しさん:2005/06/16(木) 00:14:14
解く問題があればあとはどうでもいいわけで。
274デフォルトの名無しさん:2005/06/16(木) 03:00:33
困っている人がいるんだから、プログラムが書ける人は
代わりに書いてあげる義務があると思います。
275デフォルトの名無しさん:2005/06/16(木) 05:12:11
困ってる人がいるんだから、プログラムの質問をする人は
少しは努力してまともな説明をする義務があると思います。
276デフォルトの名無しさん:2005/06/16(木) 08:32:11
Perl is a write-only language.
277デフォルトの名無しさん:2005/06/16(木) 09:36:06
>>274



>>275



>>277
困っている人がいたなら
心を開いて接してあげればいいと思います。
278デフォルトの名無しさん:2005/06/16(木) 09:41:28
困っている人がいたなら
一緒に困ってあげましょう
279デフォルトの名無しさん:2005/06/16(木) 09:42:46
>>273
暇なら何かモジュール作っておくれ
280デフォルトの名無しさん:2005/06/16(木) 10:10:35
>>264
BEGIN:
これを使わないと$/をundefにするのが-pによって最初の行を読み込んだ
後になるので間に合わない。

$:
/m修飾子が指定されていないから文中にマッチする心配はない。
また\n+は最長マッチなので結果的には末尾の改行もこちらで食われて
残ることもないが、意味的には\zの方がわかりやすいか?
(最短マッチだと違いが出る。s/\n+?$/\n/とs/\n+?\z/\n/を比べてみよ)
281デフォルトの名無しさん:2005/06/16(木) 11:04:18
>>273
> 解く問題があればあとはどうでもいいわけで。

仕事、ないの?
282デフォルトの名無しさん:2005/06/16(木) 14:20:25
お前NEETって知らないのか
283デフォルトの名無しさん:2005/06/16(木) 14:25:05
DBに格納した過去の日にち達(ただの数字16桁)を 
引っ張りだして、yyyy/mm/MM/dd hh:mm:ss と表示してあげたいんですが、
どうしたらよい?
284デフォルトの名無しさん:2005/06/16(木) 15:50:40
>>283
質問に偽装した嫌がらせが来ましたよ。
285デフォルトの名無しさん:2005/06/16(木) 16:30:14
やばい「困」がゲシュタルト崩壊してきたorz
286デフォルトの名無しさん:2005/06/16(木) 16:57:51
>>283
16桁というのがよく解らんが
$str = getDate(); #16桁の数字取得
$str = s/(....)(..)(..)(..)(..)(..)(..)/$1\/$2\/$3\/$4 $5:$6:$7/;

とか。取得するSQLで工夫したほうが話は早そうだがナー。
287デフォルトの名無しさん:2005/06/16(木) 19:20:56
どうせなら区切り文字替えようぜ。
288デフォルトの名無しさん:2005/06/16(木) 22:27:31
>>286
個人的にはunpackをおすすめ。
289デフォルトの名無しさん:2005/06/16(木) 23:55:33
値は分割だけしておいてテンプレ側で区切ろうよぅ
290242: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じゃ使えないみたいです。

なので何か別の代わりになる方法を探してるんですが、ありますか?
291デフォルトの名無しさん:2005/06/17(金) 02:48:44
>>290
キチガイ!!
292デフォルトの名無しさん:2005/06/17(金) 03:04:37
$a $b 使うなよ……
293デフォルトの名無しさん:2005/06/17(金) 03:40:09
>>283
SQLのDATE_FORMAT系の関数を使え。
なければDate::Format。
294デフォルトの名無しさん:2005/06/17(金) 03:40:58
>>290
> なので何か別の代わりになる方法を探してるんですが、ありますか?
LWPの機能部分を全部自分で書く。
295デフォルトの名無しさん:2005/06/17(金) 03:42:23
296デフォルトの名無しさん:2005/06/17(金) 05:19:51
Perlのスキーマ認識プロセッサってあります?
スキーマを読み込んで、文法が正しいか判定するやつ。
297デフォルトの名無しさん:2005/06/17(金) 08:00:50
>>296
スキーマってなんだよ
298デフォルトの名無しさん:2005/06/17(金) 08:16:16
>>296 素直に「構文チェッカ」って書けよ…。



噂では、Perlをパースできるのはperlだけ、らしいぞ。
299デフォルトの名無しさん:2005/06/17(金) 09:08:04
>>296
スキーマって、なんのスキーマだよ。
300デフォルトの名無しさん:2005/06/17(金) 09:33:13
童貞なんですけど質問させてください。

ファイルを分割する関数ってありますか?
例えば40MBのファイルを15MB、15MB、10MBみたいに。
コマンドの split -b 15m hoge みたいなの。
301デフォルトの名無しさん:2005/06/17(金) 09:34:58
童貞には無理
302デフォルトの名無しさん:2005/06/17(金) 09:47:43
ヽ(`Д´)ノおしえてくれよ
303デフォルトの名無しさん:2005/06/17(金) 10:03:14
>>300
ないよ。
304デフォルトの名無しさん:2005/06/17(金) 10:20:04
すいません。質問があります。

20AB年C月は何日あるか
って調べる関数とかないのでしょうか?
305デフォルトの名無しさん:2005/06/17(金) 10:20:21
>>304
ないよ。
306デフォルトの名無しさん:2005/06/17(金) 10:20:37
>>303
ないの?

もしやるとするなら何か方法ある?
307デフォルトの名無しさん:2005/06/17(金) 10:24:45
>>306
閏年の計算は確立されてるやん・・・
308デフォルトの名無しさん:2005/06/17(金) 10:25:07
>>305さん
ないんですか?

もし●年×月が何日あるか調べたい時は何か方法がありますでしょうか?

>>306さん
system 'split -b 15m hoge';
で出来るのでは?
309デフォルトの名無しさん:2005/06/17(金) 10:26:45
>>306
> もしやるとするなら何か方法ある?

……もちろんある。
310デフォルトの名無しさん:2005/06/17(金) 10:27:22
>>307
ミス

>>304へのレスです。
311デフォルトの名無しさん:2005/06/17(金) 10:30:36
>>310さん
えーっと手間をお掛けしまして申し訳ないのですが
その計算方法をお教えいただけますでしょうか?
312デフォルトの名無しさん:2005/06/17(金) 10:31:33
>>311
ググれって、お前が手間を掛けろ。

あとは「西向く士」だ。
313デフォルトの名無しさん:2005/06/17(金) 10:32:28
>>308
> もし●年×月が何日あるか調べたい時は何か方法がありますでしょうか?

Date::Calcでできるかも。
314デフォルトの名無しさん:2005/06/17(金) 10:34:17
つまんねーやつらしかいねーな。
315デフォルトの名無しさん:2005/06/17(金) 10:34:41
>>313
これだな。
$days = Days_in_Month($year,$month);
316デフォルトの名無しさん:2005/06/17(金) 10:43:17
>>308
>system 'split -b 15m hoge';
>で出来るのでは?
これだとプラットホームに依存しちゃう気がして。

もうちょっと調べてまた夜来ます。
317デフォルトの名無しさん:2005/06/17(金) 11:00:24
>>316
File::Splitだな。
318デフォルトの名無しさん:2005/06/17(金) 12:56:19
>>292
なんで?
319デフォルトの名無しさん:2005/06/17(金) 12:58:21
なんででもだ
320デフォルトの名無しさん:2005/06/17(金) 13:22:13
>>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;
321デフォルトの名無しさん:2005/06/17(金) 13:42:18
>>319
なんで?
322デフォルトの名無しさん:2005/06/17(金) 13:45:54
それがなんででもということだ
323デフォルトの名無しさん:2005/06/17(金) 13:55:46
じゃあ使い続けるね。
324デフォルトの名無しさん:2005/06/17(金) 14:08:55
Ruby で言うところの irb みたいなものがあれば教えてください。
325デフォルトの名無しさん:2005/06/17(金) 14:53:27
>>324
Ruby使えよ
326デフォルトの名無しさん:2005/06/17(金) 14:54:32
>>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使わない場所でエラーにならなきゃ使っても問題ないといえばないが、
いちいち考えるのメンドウだし使わない習慣にしといた方がいいよ。

327デフォルトの名無しさん:2005/06/17(金) 14:56:17
>>326
なるほど。ありがとうございます。やっと納得できました。

$a, $b のほかにはトラップになりそうな変数名ってあったりしますでしょうか?
328デフォルトの名無しさん:2005/06/17(金) 16:42:05
>>327
http://perldoc.jp/docs/perl/5.6.1/perlvar.pod
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod

大文字のみの識別子や小文字のみのパッケージ名は避けた方が無難。
329デフォルトの名無しさん:2005/06/17(金) 21:23:02
>>324
つ[Inline::Ruby]
330デフォルトの名無しさん:2005/06/18(土) 02:48:02
おまえらこれ使え。便利だぞ
http://perltidy.sourceforge.net/
331デフォルトの名無しさん:2005/06/18(土) 03:57:09
英語も読めない、Perlも読めない、ちんこも剥けない俺はどうしたらいいですか?
332デフォルトの名無しさん:2005/06/18(土) 04:29:12
4ね
333デフォルトの名無しさん:2005/06/18(土) 04:45:32
こいつあ便利だ!
334デフォルトの名無しさん:2005/06/18(土) 04:50:36
あれ?タブインデントできないのこれ?駄目じゃん
doc読むのマンドクセーからねるぽ
335デフォルトの名無しさん:2005/06/18(土) 12:51:35
perl版indentか。いいね。
336デフォルトの名無しさん:2005/06/18(土) 13:41:59
C-x h C-M-\
337デフォルトの名無しさん:2005/06/19(日) 10:22:44
コメントが揃うところいいね
338デフォルトの名無しさん:2005/06/20(月) 10:57:16
道程ですが質問があります
Perlで関数の配列を持たせるときに、返り血の値の種類によって異なった宣言が必要ですか?
339デフォルトの名無しさん:2005/06/20(月) 13:08:46
>>338
君はまず基本的な用語の意味を正しく理解し、話相手と意思の疎通が
できるようになるべきだと思う。>>4 や下記スレを参考に、まともな
入門書を一冊手に入れて読んでみてはどうか。

【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/
340デフォルトの名無しさん:2005/06/20(月) 16:59:20
お世話になっております。

perlでcgiを作成しているのですが
URLでhoge.cgi?day=20050620
と指定しているのに
--------------------------------
use CGI;
my $cgi = new CGI;
my $gDay = $cgi->param('day');
--------------------------------
というように取得できません、、、
Ctrl+F5で更新すると取れるのですが
なんでなのでしょう?

ってスレ違いならすいません、、
341デフォルトの名無しさん:2005/06/20(月) 17:08:50
>>340
だから1嫁と。釣り?
342340:2005/06/20(月) 17:49:06
>341さん
すいません。
WEBプログラミング板というのがあったのですね、、
ご迷惑をお掛けしました。
343デフォルトの名無しさん:2005/06/20(月) 20:21:54
perl で trap って使えないのでしょうか?
誰か教えてください!
344デフォルトの名無しさん:2005/06/20(月) 20:40:34
>>343
perldoc -q 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 を知らない状態で本書を一通り触り、「イロハ」は把握できました。繰り返しますが、業務レベルには到底達することができませんし、技術書レベルにも達してないと思います。
346デフォルトの名無しさん:2005/06/20(月) 22:17:06
>>344
間違ってないが意地悪かもしれない。
>>343
普通にsignalで調べろ
347デフォルトの名無しさん:2005/06/21(火) 00:42:40
任意の行にログを追加したいのです。
たとえば、100行あるログの50行と51行の間に新しい行を追加するとか。
ネット検索したんですが、やり方を見つけることが出来ません。
誰か教えてください。
コレを使ったら簡単だという関数とか無いんでしょうか?
348デフォルトの名無しさん:2005/06/21(火) 00:52:27
oepn(FILE,"file.txt");
$j=0;
while($line = <FILE>){
push(@log,$i);
$j++;
push(@log,$new) if($j==50);
}

テキトーに考えた。(Perl歴一ヶ月)
349デフォルトの名無しさん:2005/06/21(火) 01:01:36
>>347
ファイルを配列に読み込んでから、spliceで要素を挿入後
配列出力時の区切り文字を\nに変えてprint。
350デフォルトの名無しさん:2005/06/21(火) 01:10:01
区切り文字は空文字だった。。以下source。

oepn(IO, '+>file.txt') or die 'file error';
my @data = <IO>;
splice(@data, 50, 0, $add);
local $";
print IO "@data";
close(IO);
351デフォルトの名無しさん:2005/06/21(火) 01:10:40
連投スマソ。もち、$addの末尾には改行文字付けてね。
352デフォルトの名無しさん:2005/06/21(火) 01:32:34
>>347
perl -pi.orig -e 'print "hoge\n" if $. == 51' logfile
353347(Perl歴二週間) :2005/06/21(火) 01:37:26
早っ。
>348
やっぱ順番に読むのが速いですかね。
>349〜351
なるほど、各行を配列の要素にするんですね。
頭が固いからそういう発想が出てこなかったですよ。
spliceは使ったこと無かったですが、調べたら、やりたかったことが出来そうです。

ありがとうございます。
どちらを使ったらいいか私には判断が難しいですが、
妄想していたものに近いのが後者なので、そちらを使うと思います。
splice以外の関数を使えば「途中に挿入」以外にも出来そうですし。
354347:2005/06/21(火) 01:46:11
>352
うおっ。スゴイ。
一番スッキリしてますね。
hoge\nが新しく書き込むログで…
使いこなせるなら使いたいのですが、私にはちょっと勉強が必要かも。
いや、諦めず理解できるようにならねば。
355デフォルトの名無しさん:2005/06/21(火) 06:39:49
例えばaaa.plというスクリプトを実行中、aaa.plのスクリプトの中で
他のスクリプトbbb.plを指定して実行できる関数などありますか?
356デフォルトの名無しさん:2005/06/21(火) 06:43:21
do "bbb.pl";
357デフォルトの名無しさん:2005/06/21(火) 07:04:48
evalで囲め
358デフォルトの名無しさん:2005/06/21(火) 12:12:06
なぜeval?
359デフォルトの名無しさん:2005/06/21(火) 13:11:10
コンストラクタの引数の形式にはいろいろパターンがあるかと思いますが、
こういう場合はこうするのがいい、みたいなガイドライン的なものってありますか?
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" });
360デフォルトの名無しさん:2005/06/21(火) 13:11:56
変なことがおきないように
361デフォルトの名無しさん:2005/06/21(火) 13:27:55
「指定して実行」

う〜む
362デフォルトの名無しさん:2005/06/21(火) 13:55:45
>>361
たしかにそこが謎だけど、 system("bbb.pl"); というようなことがやりたいのかねえ?
363デフォルトの名無しさん:2005/06/21(火) 16:57:55
>>359
>my $hoge = new Hoge({ Foo => "foo", Bar => "bar" });
書き捨てのコードじゃなければこれを選択するのが一番。
修正に強い。
メソッドの呼出も含めてね。
364デフォルトの名無しさん:2005/06/21(火) 21:42:08
>>362
実行したファイルの STDOUT の内容が欲しいなら `bbb.pl`だな。
365デフォルトの名無しさん:2005/06/21(火) 21:46:07
>>363
なるほど。継承したりしたときを考えるとそれが良さそうですね。
366デフォルトの名無しさん:2005/06/22(水) 02:28:22
いや、普通はnew Hoge(Foo => "foo", Bar => "bar")だろ。
367デフォルトの名無しさん:2005/06/22(水) 09:57:19
おれは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が同時にスタートして
処理する方法はありませんか?
369デフォルトの名無しさん:2005/06/22(水) 11:33:18
370デフォルトの名無しさん:2005/06/22(水) 16:03:58
>>369
リンク紹介ありがとうございます。
ところで、どれもこれもモジュールを使用するようですが
使用しない方法はありますか?
371デフォルトの名無しさん:2005/06/22(水) 16:10:18
俺ならML使うんだけどね
372デフォルトの名無しさん:2005/06/22(水) 16:23:23
>>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を指定しているらしい
ですが、よくわかりません。
どっかに詳しく解説している、サイトとかありませんかね?
374デフォルトの名無しさん:2005/06/22(水) 19:02:47
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.
と出るだけでメイクが止まりません。
375デフォルトの名無しさん:2005/06/22(水) 19:32:29
>>374
漏れなら Makefile でこうする。

hoge.mot: foo.mot bar.mot baz.mot
    perl -e "..." foo.mot bar.mot baz.mot > $@
376374:2005/06/22(水) 19:34:45
すいません、一応自己解決したんですが、なんかダサい。
perl -e "foreach (@ARGV) { -e or die } while (<ARGV>) { $line = $_; if (!m/^S7/) { print } } print $line;" $(MOTS) > $@
もっと短くできないですかね _| ̄|○|||
377374:2005/06/22(水) 19:55:32
>>375
何か、それでは >374 のサンプルコードから本質的に代わってない希がします。
ひょっとして、依存関係行に依存ファイル foo.mot, bar.mot, baz.mot をきちんと書いておけば
bar.mot とかが見つからなかった (および生成もできなかった) 場合、make が勝手に止まるダロウ、
というご提案なのかもしれませんが、少なくとも今使ってる GNU Make 3.71 では
止まらないのでつ; (コマンド行が実行される。)
378デフォルトの名無しさん:2005/06/22(水) 20:01:36
>>377
マジで? Makefile の該当部分見せてみ。
379374: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
380デフォルトの名無しさん:2005/06/22(水) 21:51:28
warningをつかまえてなんかしたいのなら$SIG{__WARN__}使え
381デフォルトの名無しさん:2005/06/23(木) 01:52:14
質問者に童貞が多いのは気のせい?
382デフォルトの名無しさん:2005/06/23(木) 01:58:05
>>381 は童貞か?何のためにそんな書き込みをするんだ?恥ずかしくないのか?
お前が童貞である原因はお前自身なんだから、
お前が行動起こさないとどうしようも無いことぐらい分かってるだろ?
くだらない書き込みをするな。
383242:2005/06/23(木) 02:01:08
>>381も質問してるから
>>381は自分で自分が童貞だと認めたわけだ。
384デフォルトの名無しさん:2005/06/23(木) 02:01:25
>>382が童貞であることはわかった
385デフォルトの名無しさん:2005/06/23(木) 02:02:43
>>383
名前欄は何だ?
386デフォルトの名無しさん:2005/06/23(木) 02:03:23
>>384
なんでそこでageたんだ?
387デフォルトの名無しさん:2005/06/23(木) 02:40:51
勝ちたい時にはFカップ
388デフォルトの名無しさん:2005/06/23(木) 02:41:32
なんで顔が真っ赤なんだ?
389デフォルトの名無しさん:2005/06/23(木) 02:42:39
>>388
なっ・・・・バカッ!勘違いしないでよ!!
390デフォルトの名無しさん:2005/06/23(木) 02:44:51
切り返しにワロタ
391デフォルトの名無しさん:2005/06/23(木) 02:51:34
>>389
もっとくやしく
392デフォルトの名無しさん:2005/06/23(木) 08:17:25
>>389
もっとはじらいを込めて
393これはどうなったんですか?:2005/06/23(木) 10:07:53

466 名前: デフォルトの名無しさん 03/12/07 17:32
「Perlについての質問箱」シリーズもかなり息の長いスレになってきますた。
ここで勝手連的にこのスレのサポートページを作ろうと思っています。
いま考えているのは、
1. このシリーズの過去ログアーカイブ
2. スレッド専用ソースコードうpろだ
3. 過去ログのダイジェスト (Q&Aにまとめたもの)
4. リンク集
こんなところかな。
きながにまっててください。
394デフォルトの名無しさん:2005/06/23(木) 14:21:29
>>391-392

し・・・知らない! 放っといてよ!!
395デフォルトの名無しさん:2005/06/23(木) 16:05:33
>>373
わからないのはsprintfの構文か?
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
ttp://www.rfs.jp/sitebuilder/perl/05/func/printf.html

my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id});
をsprintfを使わずに書けば
my $edit_url = url () . "?choice=edit;id=" . $row->{id};
でほぼ同じ
396デフォルトの名無しさん:2005/06/24(金) 15:52:46
require 'jcode.pl';
使って文字化け防止したのに 文字化けたorz
「構」とか「急」とかばけらった・・・どうしたらばけないっすか?
397デフォルトの名無しさん:2005/06/24(金) 15:57:58
エスパーキボンヌですか?
398デフォルトの名無しさん:2005/06/24(金) 16:08:34
perlでサムネイル画像とファイル名称の管理をしたいと考えています。
諸般の事情から、imagemagik を使いたいのですが、実際のサンプル
コードが転がっていません。

どなたか親切な方、PerlとImagemagikが共存したサンプルコードの
在り処を教えてくれませんか?

ちなみに童貞ではありません。
399デフォルトの名無しさん:2005/06/24(金) 16:11:14
>>398
> perlでサムネイル画像とファイル名称の管理をしたいと考えています。
> 諸般の事情から、imagemagik を使いたいのですが、実際のサンプル
> コードが転がっていません。

そのimagemagikとかいう、なに? パッケージ? ファイル? 商品?
の供給先に質問してください。
400login:Penguin:2005/06/24(金) 16:19:48
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";
402デフォルトの名無しさん:2005/06/24(金) 17:34:28
403デフォルトの名無しさん:2005/06/24(金) 17:40:39
>>401
} elsif {
404デフォルトの名無しさん:2005/06/24(金) 21:22:30
>>401
下から2行目の"}"
405デフォルトの名無しさん:2005/06/25(土) 00:43:25
>>404
良く見れ。
406デフォルトの名無しさん:2005/06/25(土) 00:55:09
>>396
君の質問を理解できるエスパーを一生待ってなさい
407デフォルトの名無しさん:2005/06/25(土) 02:02:18
>>405
スマソ
408名無しさん@Vim%Chalice:2005/06/25(土) 02:29:24
あるファイルの先頭とEOFの空行を取りのぞく常套手段ってどんなかんじ?
409デフォルトの名無しさん:2005/06/25(土) 08:40:55
そのハンドル名は伊達ですか?
410デフォルトの名無しさん:2005/06/25(土) 10:52:44
>>408
このスレの過去ログを読んでごらん。
411名無しさん@Vim%Chalice:2005/06/25(土) 12:49:02
全員氏ねボケッ
412デフォルトの名無しさん:2005/06/25(土) 14:56:28
(笑)
413デフォルトの名無しさん:2005/06/27(月) 15:17:44
今年の暮れくらいにはPerl6のスレが乱立するのだろうか。
414デフォルトの名無しさん:2005/06/27(月) 16:00:30
perl6ってcvsとかでとれる?
415デフォルトの名無しさん:2005/06/27(月) 18:31:51
まだ出てないワイ。
416デフォルトの名無しさん:2005/06/27(月) 18:42:02
ベータテストっていつはじまりんぐ?
417デフォルトの名無しさん:2005/06/27(月) 20:56:57
Perl6なぁ。頼むから早く出してくれよって感じ。
418デフォルトの名無しさん:2005/06/27(月) 21:35:22
$aaa = 'aaa:bbbb :cc :ddd';から、@abc = ('aaa','bbbb','cc','ddd')
みたいな配列 @abc を作りたいのですが、どうすればよいのでしょうか。
現在はとりあえず、
@abc_tmp = split(/\:/, $aaa);
foreach(@abc_tmp) {
if (/^(\w+)/) {
push(@abc,$1);
}
} としていますが、もっと良い方法があると思うのですが。
よろしく御示唆お願いします。
419デフォルトの名無しさん:2005/06/27(月) 21:41:33
Perl5.8〜を使っているのですが、
日本語を表示するときに、文字化けしてしまう事が多々あるのですが、対処法などありませんでしょうか
420デフォルトの名無しさん:2005/06/27(月) 21:47:13
>>418
ヒント: splitについて詳しく調査せよ。
421デフォルトの名無しさん:2005/06/27(月) 21:50:49
>>419
ま、取りあえずプログラムの先頭に
use encoding 'shiftjis';
binmode STDERR, ':encoding(shiftjis)';
の2行を入れてみ?
あとは、ググって自分で調べるよろし。
422421:2005/06/27(月) 21:56:02
>>421は、Windows/DOS系の場合な。
Unix系なら euc-jp
423419:2005/06/27(月) 22:23:20
>>421-422
ありがとうございます。助かりました。
もっと自分で調べてみないと駄目ですね・・・
424デフォルトの名無しさん:2005/06/28(火) 00:49:25
>>418
思考か経験が足りないだけだな。
君には簡単にできる。ガンガレ
425デフォルトの名無しさん:2005/06/28(火) 01:23:13
Shift_JISコードを含んだcsvファイルからperlで
EUCやUTF-8に変換せずにフィールドから項目を抜き出すコードを教えて下さい。
改行,カンマ,ダブルクォートを含んだフィールドはダブルクォートでクォートされ
フィールドに含まれるダブルクォートは、バックスラッシュでなくダブるクォートの
二重化でエスケープされています。
さらに下位バイトにダブルクオートとおなじコードを含む漢字も混在しています。
426デフォルトの名無しさん:2005/06/28(火) 03:59:19
>>425
出力結果がsjisならいいんでしょ?
変換せずに、とか変な条件付けない方がいいんじゃないのかな。
427デフォルトの名無しさん:2005/06/28(火) 04:48:49
>>425
> さらに下位バイトにダブルクオートとおなじコードを含む漢字も混在しています
それは本当に Shift_JIS なのか?
Shift_JIS 以外に UCS2 も混在していますとか言い出さないでくれよ?

http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
428デフォルトの名無しさん:2005/06/28(火) 10:17:43
>>426
禿同。eucかunicodeに変換して処理してからsjisに戻す方が
余計なこと考えるよりたいていは楽。

ただシフトJISの下位バイトは0x00〜0x3fは避けてあるので
427も指摘しているとおり「下位バイトにダブルクオートと
おなじコードを含む漢字も混在しています。」なんてことは
ありえないんじゃなかったっけ。エスケープに逆スラッシュ
使ってると面倒なんだけど今回はそうではないようだし、
何も気にせずやっても問題ないような気がする。

429デフォルトの名無しさん:2005/06/28(火) 12:53:05
>>426-428
助言ありがとうございます!
ダブルクォートは、バックスラッシュの書き間違いですすみません。
最初、PHP使っていて標準のCSV関数を使っていたら、
漢字コードのバックスラッシュを勝手に解釈されてわやくちゃになってしまいました。

Perlだと漢字変換せずにもっとすっきりした書き方ができるかなと思っていました。
>>427のPerlメモは参考にさせていただきます。助かりました。
430デフォルトの名無しさん:2005/06/28(火) 18:30:56
本を買うのに悩んでいます。
CGIで掲示板なら1から作れ、普段からちょっとしたテキスト処理にPerlを用い、OOPはできていないくらいのユーザです。
これからプログラミングPerlのvolume1と2を買おうと思いますが、他にお勧めはありませんか?
431デフォルトの名無しさん:2005/06/28(火) 18:35:32
>>430
【Perl,CGI】参考書籍 第三版
http://pc8.2ch.net/test/read.cgi/php/1030209573/
432デフォルトの名無しさん:2005/06/28(火) 18:59:20
>>430
> 本を買うのに悩んでいます。

本などに頼るな。
433デフォルトの名無しさん:2005/06/28(火) 19:06:45
本を頼ることにしか使えないのはお前だけ
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でスクリプトを保存すると問題なく動いてくれるのですが
何か勘違いしてますか?

435デフォルトの名無しさん:2005/06/28(火) 19:15:30
>>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 を使って、両方試してみました。
438デフォルトの名無しさん:2005/06/28(火) 19:34:20
>>437
ぐぐってUTF-8NとUTF-8とBOMの件、探し当てました。
UTF-8N指定でうまくいきました。ありがとうございます。
BOMについてはまだ理解していませんが、勉強します。
439430:本:2005/06/28(火) 19:40:30
>>431
誘導ありがとうございます。
該当スレを読んでみます。

>>432
今まで改造やネットなどから学んでいたので基礎を固めようと思ったのです。
440デフォルトの名無しさん:2005/06/28(火) 19:55:49
>>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";
441デフォルトの名無しさん:2005/06/28(火) 19:59:24
442418:2005/06/28(火) 20:50:41
できました!
splitがヒントということで、まずはこんなものを書いてみました
@abc = split(/[^\w]/, $aaa);
完璧だと思ったのですが、結果は@abc=('aaa', 'bbbb', '', 'cc', '', 'ddd')、、、

ならば、と思って、
@abc = split(/\s*\:\s*/, $aaa); としたら、、うまく出来ました!
splitの中は , や : のような文字だけしか使えないと思っていました。
こんなことも出来るんですね。今後いろいろ使えそうです。
>>420さん、 >>424 さん、どうもありがとうございました。
443デフォルトの名無しさん:2005/06/28(火) 22:23:12
>>429
Text::CSV_XS or Text::CSV_PP あたりを使ったら?
444デフォルトの名無しさん:2005/06/28(火) 22:27:05
>>442
ロクに読まずにカキコ
@abc = split(/[^\w]+/, $aaa);
445418:2005/06/29(水) 00:42:32
>>444
うわ、できました。しかも、この方法だと
$aaa='aaa:bbbb : cc:dddd ';みたいに、末尾にスペースのみが
ある時でもちゃんと取れますね。
ありがとうございます。勉強します。
446デフォルトの名無しさん:2005/06/29(水) 00:49:23
>>445
あえて/[^\w]+/って書いたけど/\W+/でおk
447デフォルトの名無しさん:2005/06/29(水) 01:37:57
Perlで実装したSOAPサーバに、C++で実装したクライアントでアクセスする
方法知りませんか?
448デフォルトの名無しさん:2005/06/29(水) 02:49:34
>>447
近所にできたセブンイレブンに自転車で行く方法を知りませんか?

と同じような質問だな。
449デフォルトの名無しさん:2005/06/29(水) 04:05:23
>>447
Inline::C++
450デフォルトの名無しさん:2005/06/29(水) 06:44:24
>>448
答えられないのにわざわざしゃしゃり出てきて書くほど
面白い比喩ではないですね ;-)
451デフォルトの名無しさん:2005/06/29(水) 08:25:45
>450
しかし答えられないのは確かだ。
そのC++クライアントの実装方法を答えればいいのか、
だとしたらその仕様はどこでわかるのか。
それともそのC++クライアントの操作方法を答えればいいのか、
だとしたらその製品は何なのか。
などなど、答えるために必要な前提が揃っていない。
452デフォルトの名無しさん:2005/06/29(水) 12:29:34
>>447
っていうか「Perlで実装した」って部分は言う必要なし
要は、SOAPサーバにC++で実装したクライアントからアクセスしたいって話しになる
とするとスレ違い
453デフォルトの名無しさん:2005/06/29(水) 16:24:37
>>451
>>452

根本的に、SOAPとして実装したサーバ(CGIとかでも)は、異なるプログラム言語
からでもアクセスできるもの?

できるなら、C++でもC#にしても、実装方法を示したサンプルプログラム
みたいなのはないですかね?
454デフォルトの名無しさん:2005/06/29(水) 16:35:41
>>453
まぢで言ってるのか(@_@; 「プロトコル」って何のために決まっているのか理解してる?
455デフォルトの名無しさん:2005/06/29(水) 16:39:19
こんな質問をする人間がいったいどういう人間なのか知りたい。
嘘コンサルがプレゼン資料か何か作ってるんか?
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
_______________________________________

458デフォルトの名無しさん:2005/06/29(水) 16:47:39
自己紹介: ITコンサルタントです。ただの技術コンサルから、脱皮を目指してます。
459デフォルトの名無しさん:2005/06/29(水) 18:00:51
>>453
http://www.xmethods.org/ を穴が開くほど眺めたらあとはどっかいってくれ。
460デフォルトの名無しさん:2005/06/29(水) 18:22:35
perlスレでC++だのC#の質問をされてもなぁ...
461デフォルトの名無しさん:2005/06/29(水) 18:44:15
print "<input type='hidden' name='no' value='$no'>";

これ、シングルクォートで囲んでるのに問題なく変数展開されるんですが、
普通の挙動ですか??
462デフォルトの名無しさん:2005/06/29(水) 18:50:32
>>461
それはシングルクォートで囲んでいるのではなく、(文字としての)
シングルクォートを含むダブルクォート文字列だ。

print '<input type="hidden" name="no" value="$no">';

君の理屈だと上のは $no が展開されなければいけないが
そうならないだろ?
463デフォルトの名無しさん:2005/06/29(水) 21:56:03
HTML文法エラー
464デフォルトの名無しさん:2005/06/30(木) 06:15:44
何が?
465デフォルトの名無しさん:2005/06/30(木) 12:15:36
>>462
なるほど。よく
print "<input type='hidden' name='no' value=\"$no\">";
なんてエスケープしたダブルクォート使って書いてるの多いので、
ダブルクォート内でもシングルクォートで囲っちゃうと変数展開しないから
わざわざこんな面倒なことしてるのかと思いました。

いろいろ調べても
「ダブルクォート内は変数展開するけど、シングルクォート内はしない」
って説明しかないもので。

どうも
466デフォルトの名無しさん:2005/06/30(木) 12:49:48
>>465
ダブルクォート内のダブルクォートのエスケープは、
エスケープしないと、そこが文字列の終わりとみなされちゃうからだね。

↓これを比べればわかるかな?

print "foo\".\"bar";
print "foo"."bar";
467デフォルトの名無しさん:2005/06/30(木) 16:46:34
↑と同じ効果

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\>
472デフォルトの名無しさん:2005/06/30(木) 21:20:08
その変なエスケープは何なんだ
473デフォルトの名無しさん:2005/06/30(木) 21:21:24
エスケープだらけワラタw
474デフォルトの名無しさん:2005/06/30(木) 21:32:43
m|<span class="locus_id"><font size="\+2">(.+?)\.</font></span>|;
475デフォルトの名無しさん:2005/06/30(木) 21:38:48
>>469
できない。
476デフォルトの名無しさん:2005/06/30(木) 23:05:40
>>474
\.ワラタ
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/ ) {
$_ =~ //
}
}

こんな感じで、ファイルから読み込んで、置換したいのです。
479デフォルトの名無しさん:2005/06/30(木) 23:20:19
>>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">

したいのですが、もう少しヒントをいただけないでしょうか?
481デフォルトの名無しさん:2005/06/30(木) 23:46:40
置換じゃなくて後方参照($1)じゃだめなの?

$_ =~ /^.*\.wmv/;
$wmv = $1;

これで $wmv に「/test/hoge/fugaaaa.wmv」がはいる。
はず。確認してないけど。
482デフォルトの名無しさん:2005/06/30(木) 23:53:25
入らねーよ
483 ◆TWARamEjuA :2005/06/30(木) 23:55:10 BE:1307243-#
>>481
確認しましょうね♪
484デフォルトの名無しさん:2005/06/30(木) 23:55:54
>>481
while( <> ) {
$_ =~ /^.*\.wmv/;
$wmv = $1;
print $wmv;
print "\n";
}

すみません。でやってみたのですが、どうしてか、何も表示されません。
後方参照ですか。ググって見ましたが、難しそうで、すぐに理解できそう
もないっす
485デフォルトの名無しさん:2005/06/30(木) 23:58:28
>>479
index で wmv の位置調べて substr で切り取る。

$position = index($_, "wmv");
# wmv の長さが 3 だから +3 してる。本当は length 使って長さ取ったほうがいい。
$str = substr($_, 0, $position + 3);

こんな感じ。
486481:2005/07/01(金) 00:03:44
>>482-484
(^ω^)ごめww正規表現の書き方わすれちゃった♪
while ( <STDIN> ) {
  if ( $_ =~ /^(.*)\.wmv/ ) {
    print $1;
  }
}

これでできるだろ!ちっきしょー
487デフォルトの名無しさん:2005/07/01(金) 00:06:16
>>485
おぉ、いけました!
index の戻り値としてその長さが返って来るのでしたか。
length も一応調べたりしました。のちのちの参項にさせていただきたいっす。
ありがざいます

# >>481 の方も、レスありがとうでした
488481: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
489481:2005/07/01(金) 00:06:54
解決してる・・・(^ω^;)カナシス
490デフォルトの名無しさん:2005/07/01(金) 00:08:57
ちなみにsubstrはlvalueとしても使えるらすい。

$str = '/test/hoge/fuga.wmv"><mfaoeaifjeofaejfoaeigaho';
$exp = '.wmv">';

substr( $str, index($str, $exp) + length $exp ) = '';

print $str;
491デフォルトの名無しさん:2005/07/01(金) 00:11:55
ユニットテストする習慣くらいつけようや。
492デフォルトの名無しさん:2005/07/01(金) 00:16:17
>>488
ちゃんと試してみました。完璧です。
インデントで、全角スペースもちゃんとこちらで削除してるんで、
問題ないっす。
>>490 そんな使い方もしりませんでした。空文字列を結合してるのですね。

本当にお勉強になりました。
493デフォルトの名無しさん:2005/07/01(金) 08:03:10
$cat file.txt | perl -ne 'print if /abc/'

という部分で、print if の部分を省略する方法はありますか?
たしかあったと思うのですが、どういう風にやるのか忘れてしまいました。
494デフォルトの名無しさん:2005/07/01(金) 09:02:49
>>493
そこは省略できない。

perl -pe "s/foo/bar/"

と混同しているのでは。
495デフォルトの名無しさん:2005/07/01(金) 09:32:12
>>494
なるほど。おっしゃる通りです。ありがとうございました。
496デフォルトの名無しさん:2005/07/01(金) 10:50:42
あるCGIに自動で、POSTメソッドで、値を渡すにはどうすればいいんでしょうか?
497デフォルトの名無しさん:2005/07/01(金) 11:13:32
>>496
スレ違いというか板違いというか、とりあえずPerlの質問ですらないな。

WebProg にでもいきなされ。
http://pc8.2ch.net/php/
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メソッドで、値を渡す方法が分からないので、無理なのです。
499デフォルトの名無しさん:2005/07/01(金) 11:55:10
perlでmain.cgiにPOSTさせたいって事?
個人的にはJavaScriptで勝手に送信させたほうが楽だと思う。
500デフォルトの名無しさん:2005/07/01(金) 12:09:54
>>499
そうです。Perlがいいんです。
501デフォルトの名無しさん:2005/07/01(金) 12:14:51
>>500
perldoc LWP
perldoc LWP::UserAgent
502デフォルトの名無しさん:2005/07/01(金) 12:16:20
ヒント:Socket

ところで Perl にこだわる理由はなに?
503デフォルトの名無しさん:2005/07/01(金) 12:17:48
ネットワーク関数はあんまり分からなくて、
ソケットつないでどうのこうのぐらいしか思いつかない。
分かる人にバトンタッチ
504デフォルトの名無しさん:2005/07/01(金) 12:19:55
505501:2005/07/01(金) 12:24:59
>>502-503
最近はそーゆー低水準なところから組み上げる必要は滅多になくて、使いたいプロトコルに対応したライブラリを利用するだけで大抵のことは何とかなりまつ。
506503:2005/07/01(金) 12:40:56
低水準なんすか・・
まぁ、関数一つ一つ追っていくのが楽しいので見逃してくらはい。
507デフォルトの名無しさん:2005/07/01(金) 12:44:41
>>506
> 低水準なんすか・・
> まぁ、関数一つ一つ追っていくのが楽しいので見逃してくらはい。

中途半端。サブルーチンを一つ一つ追っていくのが
楽しいのなら、socketから突っ込むべき。
508デフォルトの名無しさん:2005/07/01(金) 12:51:24
おっと、ソケットもモジュールだった・・
509501:2005/07/01(金) 13:22:04
>>506
何か誤解されてるよーな気がしますが、ここで言う「低水準」は、よりプリミティブに近いもの、とゆー意味でつ。
言語で言うところの、高級(より人間に理解しやすい)⇔低級(より機械語に近い)のよーなもの。
510デフォルトの名無しさん:2005/07/01(金) 14:16:08
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

$ua = LWP::UserAgent->new();
my $req = POST 'http://192.168.1.1/cgi-bin/main.cgi',
[ mbg_webname => 'adslreconnect', adsl_reconnect => '' ];
$content = $ua->request($req)->as_string;

これで駄目だった
はじめたばかりだからよぐわがんね
511デフォルトの名無しさん:2005/07/01(金) 14:16:30
>>499
最近Perlはじめたからです
512デフォルトの名無しさん:2005/07/01(金) 14:55:29
インストールしてるモジュールをまとめてアップデートするの、
CPANでどうやるんでしたっけ?
513デフォルトの名無しさん:2005/07/01(金) 17:37:40
遅れレスですまんが。
>>485 にはバグがある。入力が、例題そのままの
/test/hoge/fuga.wmv"><mfaoeaifjeofaejfoaeigaho
ならいいが、
/test/wmv/fuga.wmv"><mfaoeaifjeofaejfoaeigahowmv
とかだったらどうするつもりなのだろうか・・・
514513: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 ってするには?
516デフォルトの名無しさん:2005/07/02(土) 00:15:29
sprintf("%.3d", $aaa);
517デフォルトの名無しさん:2005/07/02(土) 00:26:16
>>515
for my $aaa ('000'..'999') { ... }
518デフォルトの名無しさん:2005/07/02(土) 00:32:41
見当違いな質問かも知れません。
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
すまん、コピペミスったのでちょっち修正。

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

$ua = LWP::UserAgent->new;
$request = POST('http://192.168.1.1/cgi-bin/main.cgi' , [ mbg_webname => 'adslreconnect', adsl_reconnect => '' ]);
$res = $ua->request($request);
$_ = $res->content;
521デフォルトの名無しさん:2005/07/02(土) 01:12:39
>>498
つーかルータ買い換えたほうがいいんじゃね?
一日一回、再起動が必要なんてヒドス
522デフォルトの名無しさん:2005/07/02(土) 01:13:58
ID変えたいだけじゃね?
523デフォルトの名無しさん:2005/07/02(土) 02:21:05
524デフォルトの名無しさん:2005/07/02(土) 04:50:59
>>516
sprintf 使うなら、%3d じゃなく %03d
525デフォルトの名無しさん:2005/07/02(土) 06:05:52
>>524
. を見落としてる。
%03d だと 3 「文字」に満たない場合は 0 でパディング。
%.3d だと 3 「桁」 に満たない場合は 0 でパディング。
少なくとも 0 〜 999 では同じ結果になる。

printf '%03d, ' x 4 . '%.3d, ' x 4, (1, 1234, -1, -1234) x 2;
526515: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
あ、すいません。
192.168.1.1
にアクセスするには
http://aploda.org/dat1/upload43321.gif
↑こんなんでログインしないといけないようです。
だから無理だったようです。
自分だけでがんばってもどうにもならないようです。
529デフォルトの名無しさん:2005/07/02(土) 11:56:51
ヒント: Authorizationヘッダ
530518:2005/07/02(土) 16:32:48
色々調べてみたのですがFastCGIとも一長一短あって悩みますね。
>>523
どうもありがとうございました。
531デフォルトの名無しさん:2005/07/02(土) 17:23:15
>>529
よぐわがんね。
532デフォルトの名無しさん:2005/07/02(土) 17:23:17
おそらく 192.168.1.1 がISPの何かとバッティングしてルータの挙動がおかしくなるといってみるテスツ
ルータの設定で 192.168.1.100 とか 192.168.100.1 にしてみれとなんとなく言ってみるテスツ
533デフォルトの名無しさん:2005/07/02(土) 17:30:43
Authorizationヘッダをどう送ったら許可されるですか。
ていうか、Perlでどう送るんですか。

よぐわがんね。
534T女の竹田:2005/07/02(土) 17:34:47
>>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
>>534
JSとかわがんね。
536デフォルトの名無しさん:2005/07/02(土) 17:39:28
>>532
見落としてたけど、言ってることよくわがんね。
537デフォルトの名無しさん:2005/07/02(土) 19:15:30
もう帰れ
538デフォルトの名無しさん:2005/07/02(土) 19:15:54
お断りだ
539デフォルトの名無しさん:2005/07/02(土) 19:19:49
while ( <> ) {
if ( $_ =~ /test/ ) {
;
}
else {
print $_, "\n"
}
}

読み込んだファイルに、testが含まれている行は出力しないって処理が
したいんですけど、もっとスマートにならんものでしょか?
540デフォルトの名無しさん:2005/07/02(土) 19:20:31
すいません、Perl で tar 圧縮したいんですが方法をググりましたが情報が探せませんでした。

モジュール名だけでも結構ですので、どなたか教えてください。宜しくお願いします。
541デフォルトの名無しさん:2005/07/02(土) 19:25:07
542デフォルトの名無しさん:2005/07/02(土) 19:30:23
while(<>){print unless /test/}
これじゃだめでしょうか>>539
543デフォルトの名無しさん:2005/07/02(土) 19:43:45
内容が重なってる行を削除したいんですけど、久しぶりだった所為か挫折した。
誰か頼む。
544デフォルトの名無しさん:2005/07/02(土) 20:03:16
545デフォルトの名無しさん:2005/07/02(土) 20:13:16
>>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;
<>;

なんでこれじゃ駄目なんだ。。。
549デフォルトの名無しさん:2005/07/02(土) 21:08:29
>>547
Windows(DOS)で動くcat/sort/uniqなんて、腐るほど存在するが…
550デフォルトの名無しさん:2005/07/02(土) 21:15:13
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
もういいお!お前ら!
553デフォルトの名無しさん:2005/07/02(土) 21:35:42
>543
:英語だけど ウェブからも読める Cookbook 初版から
http://www.sarinaga.com/progtoy/perlcookbooklink.html
の、レシピ 4.6 が詳しい。(内容は 544 と同じだけど)
554デフォルトの名無しさん:2005/07/02(土) 22:37:30
もういいお^^
555510:2005/07/03(日) 03:38:29
皆さんありがとうございました。
他所で聞いてきます
556540:2005/07/03(日) 03:53:59
>>544
ありがとうございます。
すごく参考になります♪
557デフォルトの名無しさん:2005/07/03(日) 07:17:48
Perlスクリプトをコンパイルするのにperlccとperl2exe以外にないの?
558デフォルトの名無しさん:2005/07/03(日) 07:47:28
>557
PAR とか?
559デフォルトの名無しさん:2005/07/03(日) 07:48:14
560デフォルトの名無しさん:2005/07/03(日) 07:55:27
>>577
PerlApp
perlbin ( perlbin.sf.net )
561デフォルトの名無しさん:2005/07/03(日) 08:20:29
Perl5.8でnkfって完全に不要になる?
まあnkfは手軽でいいんだけど。
562 ◆TWARamEjuA :2005/07/03(日) 09:31:53 BE:5336677-#
Perl Bone on Xcode

は、ちょと趣が違うか(苦笑)
563デフォルトの名無しさん:2005/07/03(日) 10:58:59
パッケージ内の関数のリファレンスを取る場合は、

$ref = \&TEST::test;
$ref->test();

このような形で取れますが、関数ではなくパッケージ自体(上の例だとTEST)のリファレンスを
取得して、そこから関数を実行するにはどのように行えばよいのでしょうか?
564デフォルトの名無しさん:2005/07/03(日) 12:44:42
>>561
それどころかpiconvなるコマンドが添付されてる。
単純なことならNKFでいいけどね。
565デフォルトの名無しさん:2005/07/03(日) 12:50:40
>>563
TESTパッケージのシンボルテーブルは%{TEST::}
566デフォルトの名無しさん:2005/07/03(日) 13:18:09
>>564
おお、ほんとだ。知らなかった。
567デフォルトの名無しさん:2005/07/03(日) 13:18:26
こんなんか?
#!/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:: でリファレンスは取れるんですね。
ありがとう御座います。助かりました。
569デフォルトの名無しさん:2005/07/03(日) 16:50:12
ActivePerl 5.8.7.813のEncode::from_toってバグってない?
第4引数に何か渡すと100%失敗するんだけど。
570デフォルトの名無しさん:2005/07/03(日) 16:50:47
ちなみに5.8.4では動いてたのに5.8.7にバージョンアップしたら
まったく同じソースコードでも動かなくなった。
571デフォルトの名無しさん:2005/07/03(日) 16:55:13
ActiveState の Bug Database に3件ほど投稿してやったのに、
半年たっても Unconfirmed のまま。
奴等、真面目にやる気あんのか!(-_-メ)
572デフォルトの名無しさん:2005/07/03(日) 18:30:51
仕方ないからEncode::from_toのソース見てバグってる部分を自前で書き直して回避。
何でこんなことしなきゃならんのだ…
573デフォルトの名無しさん:2005/07/03(日) 18:39:59
>>569-572
よく分からないけど乙。
そのうち報われるさ。
574デフォルトの名無しさん:2005/07/03(日) 18:42:08
プログラム板が荒れているため、IDを導入するか検討中です。
賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。

プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/

理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
575 ◆TWARamEjuA :2005/07/03(日) 19:24:58 BE:1960463-#
>>574
あちこちにマルチポストしないでね。@現在20件
576デフォルトの名無しさん:2005/07/03(日) 19:51:48
文字列をUTF-8から7bitのJISに変換したいのですがどうしたらいいでしょうか?
577デフォルトの名無しさん:2005/07/03(日) 19:54:13
use Encode;
Encode::from_to($mojiretu, 'utf8', 'iso-2022-jp');
578デフォルトの名無しさん:2005/07/03(日) 20:22:27
>>571-572
ActivePerlじゃなくてEncodeの問題?
なら、Jcodeメーリングリストに報告したら修正してくれるよ。

579デフォルトの名無しさん:2005/07/03(日) 22:24:40
floatの4バイトのバイナリデータ(リトルエンディアン)をマックで正しく読み込むには、どうしたら良いでしょうか?
580デフォルトの名無しさん:2005/07/03(日) 22:40:44
バイトオーダー以外が共通なら unpack('f',pack('N',unpack('V',$float))) とか。
581デフォルトの名無しさん:2005/07/03(日) 23:33:23
>>580
うまくいきました。どうもありがとうございます。
582デフォルトの名無しさん:2005/07/03(日) 23:41:26
cryptで暗号化された文字を解読出来ないかと思い
http://www6.wind.ne.jp/mode/downPage/Random.htm
の物を拾いました。
saltが固定(既知)だったら、どこを書き換えれば宜しいですか?
583デフォルトの名無しさん:2005/07/04(月) 00:11:35
>>582
cryptについてちょっとくらい自分で調べろ。
584デフォルトの名無しさん:2005/07/04(月) 06:48:31
packのpとかPってどんなときに使うんですか?
585デフォルトの名無しさん:2005/07/04(月) 13:04:54

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;

転送は問題なく出来るのですが、アーカイブが壊れてしまいます。
送り側サーバーで生成したアーカイブを確認すると正常でした。
送ると壊れます。
何か対策はありますでしょうか。。

御存じの方いらっしゃいましたら教えてください。
宜しくお願いいたします。
586デフォルトの名無しさん:2005/07/04(月) 15:08:02
>>585
レスが無いので、モジュールを知らないけど書いてみる。
とりあえずローカルとリモートのファイルサイズが同じかどうか見てみる。
空ファイルとかテキストファイルを送っても壊れるかどうかもみてみる。
587デフォルトの名無しさん:2005/07/04(月) 15:26:04
>>585
ヒント: asciiモード/binaryモード
588デフォルトの名無しさん:2005/07/04(月) 15:27:19
>>587
> ヒント: asciiモード/binaryモード

あ、ごめん。それはやったのね。マヌケだった。
589デフォルトの名無しさん:2005/07/04(月) 16:01:27
>>585
ちゃんとバイナリモードにしてるしそうめったなことはないと
思うのだがな。むしろ書いてないところに問題があるとか壊れている
という認識自体間違ってるとかそういうところを疑ったほうが
いいかもしれない。

示されたコードは抜粋だとあるが、そのコードで現象は再現しているか?

壊れていると判断した根拠は? そもそもサイズが違うとかmd5等のチェック
サムが違うとかなら本当に壊れてそうだが、単に解凍できなかったとかなら
解凍方法や環境の問題かもしれない。


590デフォルトの名無しさん:2005/07/04(月) 20:45:24
>>585
>>589の言う通りやね。
送り元のtarは、gnu tarでアーカイブしていて
受け取り側は一般のtarコマンドしかないとかの話じゃないの。
591デフォルトの名無しさん:2005/07/04(月) 22:00:23
何か重大で意外な見落としをしている気がする
592デフォルトの名無しさん:2005/07/04(月) 22:32:01 BE:6861479-#
>>591
エスパーさんあとをよろしくなのです。。
593デフォルトの名無しさん:2005/07/04(月) 23:19:34
モジュールを use するのを、

my $mo = "ABC";
use $mo;

とした場合、"syntax error" と怒られてしまいます。
動的にこのような形で use したいのですが、どのようにしたらできるのでしょうか?
594デフォルトの名無しさん:2005/07/04(月) 23:35:56
>>593
どっかにできあいのモジュールがありそーな気もしますが……。
my $class = "File::Copy";
my $pm = $class;
$pm =~ s@::@/@g;
$pm .= ".pm";
require $pm;
$class->import;
copy($0, "test");
595デフォルトの名無しさん:2005/07/04(月) 23:43:56
>>593
my $mo = "ABC";
eval "use '$mo'";
もアリ。
596デフォルトの名無しさん:2005/07/04(月) 23:44:41
eval "use $mo"
597585: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 で様子を見ることも出来ないヘタレなので。。
598デフォルトの名無しさん:2005/07/05(火) 10:07:33
サイズが異なるんじゃあきらかにおかしいな。うまく転送できてないか
お前が引用した記事にあるように手元に用意したファイルがおかしいか
(この例ではファイルをcloseしてなかったので最後まで書かれてなかった)
といったことが考えられる。

うまく転送できてなければputがエラー(undef)返してるかもしれないので
確認した方がいいだろう。警告メッセージも出てるかもしれない。
599デフォルトの名無しさん:2005/07/05(火) 10:10:41
>>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の方法が簡単でよかったのでそれで行います。

ありがとう御座いました。
601デフォルトの名無しさん:2005/07/05(火) 13:23:02
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は必要なきゃしなくてイイと思われ。
602デフォルトの名無しさん:2005/07/05(火) 14:10:00
603デフォルトの名無しさん:2005/07/05(火) 14:58:45
配列変数のかっこの中に人任意の不特定多数の数値をキーボードから
入力する方法がわからん

配列変数を使わなければ
$A=<>;
chomp $A;
って感じで気力の続く限り打ち続ければいいけど
データ数が決まってなければ使えないじゃん
@AAA(10,20,30,40・・・・)
とデータ数が予想できない場合はどうすりゃいいの?
604デフォルトの名無しさん:2005/07/05(火) 15:22:59
……
605デフォルトの名無しさん:2005/07/05(火) 15:26:31
>>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のソースを走らせても$_の中に何も文字列は入っていなかった。
607デフォルトの名無しさん:2005/07/05(火) 16:35:22
>>606
君の飼っている駱駝は病気のようだ。

$_ については
http://perldoc.jp/docs/perl/5.6.1/perlop.pod
の「I/O Operators」でも読んでくれ。
608デフォルトの名無しさん:2005/07/05(火) 16:46:58
chomp(my @array = <STDIN>);
じゃだめなの?
609デフォルトの名無しさん:2005/07/05(火) 20:30:22
TMTOWTDI
610デフォルトの名無しさん:2005/07/05(火) 20:58:46
宗教論争
611デフォルトの名無しさん:2005/07/05(火) 22:35:24
てほどでもないさ
612デフォルトの名無しさん:2005/07/05(火) 23:45:10

AAA="hoge"

とやる所をタイプミスで

AA="hoge"

とやってしまい、後の方では、
$AAAを(未定義のまま)使ってしまった場合
何事もなく動いてしまう事があります。(バグに気づかない)

この手の未定義変数のチェックをうまくできないでしょうか?
613デフォルトの名無しさん:2005/07/05(火) 23:46:42
>>612
use strict
614612:2005/07/06(水) 00:05:58
>>613
こんなのがあったとは… ありがとうございました。
615デフォルトの名無しさん:2005/07/06(水) 00:43:01
>>614
どうやって perl おぼえたの?
616デフォルトの名無しさん:2005/07/06(水) 00:56:35
use strictなんて基本中の基本だろうが
これの説明が載ってない入門書は捨てた方がいい
617デフォルトの名無しさん:2005/07/06(水) 01:29:22
perl4の時代の本とか...
618デフォルトの名無しさん:2005/07/06(水) 01:56:39
ネットだけで独学とか
619デフォルトの名無しさん:2005/07/06(水) 02:24:28
何処のとは言わないがCGIの改造で入門して、本買わずにWebだけで独学で学んだら、
まともなPerl5コードが書けるようになるまで一年かかった俺ガイル

まあ変な癖つけたく無ければ良いソースを読むかちゃんとした本買えって事だな…
620デフォルトの名無しさん:2005/07/06(水) 02:54:34
>>619
> 何処のとは言わないがCGIの改造で入門して、本買わずにWebだけで独学で学んだら、
> まともなPerl5コードが書けるようになるまで一年かかった俺ガイル

なぜ最高のクオリティを誇る添付ドキュメントを見ない?
621デフォルトの名無しさん:2005/07/06(水) 03:10:01
どんな書き方でも動くのがいいところではないか。
622デフォルトの名無しさん:2005/07/06(水) 05:27:18
あるファイルがあります。そのファイルはヘッダとボディからなっています。
ヘッダとボディは空行で区切られています。ボディの行数を計算して、ヘッダ
の最後に Lines: ボディの行数と書き込むにはどうすればよいでしょうか?
623デフォルトの名無しさん:2005/07/06(水) 06:29:16
空行は1回限りか?
624デフォルトの名無しさん:2005/07/06(水) 06:29:38
人をバカにした書き方だな
625デフォルトの名無しさん:2005/07/06(水) 06:40:23
>>622
ボディの行数をカウントして、ヘッダの最後に"Lines: "フィールドを追加すれば
いいよ。

626デフォルトの名無しさん:2005/07/06(水) 06:42:49
んじゃ空行は1回限りの場合ってことで。
怒ってる人もいるようだからあとは自分でなんとかしてくれ。

open IO, "+< hoge";
$lines = @in = <IO>;
foreach (@in) {
$lines--;
$_ = "Lines: $lines\n\n" if (/^$/);
}
seek IO, 0, 0;
print @in;
close IN;
627デフォルトの名無しさん:2005/07/06(水) 06:44:32
あら?ファイルハンドルが違うな。
まあ問題になったら自分でなんとかしてくれ。
628デフォルトの名無しさん:2005/07/06(水) 07:50:10
>>623
空行は一回以上ある場合もあります。複数の空行がある場合、最初のものが区
切になります。
>>624
すみません。馬鹿にするつもりはありませんでした。
どの部分が気にさわられのでしょうか。
以後気を付けますので、おしえていただけませんでしょうか。
>>625
行入力演算子を while でまわして、body の行数を数えることができたんです
が、その後でつまっています。
>>626
ありがとうございます。参考にして、ちょっと考えてみます。
629デフォルトの名無しさん:2005/07/06(水) 07:56:16
空行が複数でも>>626をチョチョイといじれば完成だ。
参考とかそういうレベルではないだろう。
630デフォルトの名無しさん:2005/07/06(水) 12:25:17
>>628
>>624は妄想基地外だから、気にする必要はなし。
あんたの書き方で、何の問題もない。
631デフォルトの名無しさん:2005/07/06(水) 18:00:16
>>601
モジュールの読み込みってrequire でも出来るんですね。
evalではなく、requireでする方法に変更しました。

そうなってくると分からなくなるのですが、use と require の違いって
何なのでしょうか?
632デフォルトの名無しさん:2005/07/06(水) 18:25:23
>>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;
633632:2005/07/06(水) 18:27:54
printのとこ、ちと無駄だったんで差し替え
printf IO "$head\nLines: %d\n\n$body", $body =~ tr/\n//;
634デフォルトの名無しさん:2005/07/06(水) 18:54:20
>>631
マニュアルにuseはModuleにbarewordしか許されないことを
除けば

BEGIN { require Module; import Module LIST; }

と同じとあるので、違いは

実行されるタイミング
import
Moduleの指定のしかた

ということになるだろうな
635デフォルトの名無しさん:2005/07/06(水) 20:03:14
>>634
そうなんだ。ほとんど同じ、っていうか全く同じですね。
初めて知りました。有難う御座いました。
636601:2005/07/06(水) 20:12:04
>>634
そうなのよ。
モジュールのimportなんて作り方によっては必要ない。
だいたいの場合は単純にrequireでいいはず。

該当モジュールがuse Exporterしていて、
かつ関数を呼び出し元の名前空間にimportしたい場合のみ等価なコードを書けばよい。
637デフォルトの名無しさん:2005/07/06(水) 20:43:57
まじめに質問!
どうやったらプログラム書けるようになりますか?
C、Perlとか「プログラミング言語」そのものは、市販されてる本よんで
サンプルプログラムとか打ち込んで、練習問題を解答できます。

しかし、Cで簡単なゲームとかPerlで掲示板とかチャットとか、1から
自作しようとなると、さっぱりわからん。

プログラミング言語を学ぶ以外に、どんなこと勉強すればよいのでしょうか?

絶対にPerlで掲示板とかチャットとか、人が書いたソースコードが読める
ようになりたい。
638デフォルトの名無しさん:2005/07/06(水) 20:58:37
英語を辞書無しで読めるようになればあとは楽勝
639デフォルトの名無しさん:2005/07/06(水) 21:13:09
>>637
まず大文字の英数字を気持ち悪いと思う感覚を育もう。
個人的には口語中の一桁数字なら大文字でもいいけど。
とりあえず経験積めば誰だってある程度できるようになるんでは。
640デフォルトの名無しさん:2005/07/06(水) 21:21:29
>>639
大文字と全角文字の区別をつけるところから始めよう。
641デフォルトの名無しさん:2005/07/06(水) 21:29:13
>>640
たぶん自分ツッコミですね。乙です。
642デフォルトの名無しさん:2005/07/06(水) 22:06:20
>>637
諦めなさい。君には才能が皆無。
643637:2005/07/06(水) 22:17:24
>>642
お前エスパーかよ。どうして才能が皆無なんて、ソースコードも見てないのに
言えるんだ? ばっかジャネェの?

諦めなさい。君には才能が皆無。
諦めなさい。君には才能が皆無。
諦めなさい。君には才能が皆無。

プログラムが組めないどころか、
練習問題もこなせそうにないヤツに言われたよ〜。・゚・(ノД‘)・゚・。
ちょっと下手に出て質問したら、すぐこれだからな(汗

バグ出してエラー出して、苦労して自力で修正して・・・
頭で思い描いた通りに、プログラム組めるようになれば一人前ダヨネ!がんばろ
これ以上、アホに構ってられないや じゃね! もう見ないから
644デフォルトの名無しさん:2005/07/06(水) 22:24:39
そんなに悔しかったのかww
645デフォルトの名無しさん:2005/07/06(水) 22:26:23
おーデブが喜ぶ喜ぶ
646637:2005/07/06(水) 23:05:44
>>643
あなたは誰ですか?
647デフォルトの名無しさん:2005/07/06(水) 23:26:31
>>637
構成する能力が皆無っていう人なのかな。
いるんだよね、こういう人。
ある程度以上の複雑さのものを構築することがまったくできないの。
648デフォルトの名無しさん:2005/07/06(水) 23:45:59
>>637

データフロー図を描いて、データがどういう風に流れて、どういう風に処理されるかとか、
UMLのユースケース図を描いて、どんな機能があるのかとか、
もう少し大きな視点で考えてる訓練をする

ある程度の機能をもったアプリケーション(掲示板とか)の作りかた
を解説してある本を読んで見るとか

情報処理技術者試験のソフ開とか勉強してみるのもいいんじゃない?
649デフォルトの名無しさん:2005/07/07(木) 00:01:08
>>640
スマン、マジで。
650デフォルトの名無しさん:2005/07/07(木) 00:58:50
>>648
小生、Perlに入れ込んでいる理由は、単純にとっつき易いからです。
プログラム経験はまったくありません。

プログラムといっても所詮、定型処理だから、どんな機能があるのか
フロー図を描いて整理して、それをプログラムすればよく(構造化
プログラミングというらしい)サブルーチンを繰り返すような構造に
なっている。

しかし
世間一般のプロレベル>>中間レベル>>小生の下手の横好きレベル

中間レベルに成長するための方法がわからない。

やはり、KENTさん(嫌悪感を持っている人も居るようですが…)とかの
解説本を読むとか、Web上のオープンプログラムを読んで、改造してみる
とか、地道な努力が必要なのでしょうか?
651デフォルトの名無しさん:2005/07/07(木) 01:03:47
KENTのは絶対やめた方が良い。
この前もセキュリティホール見つけたし、汚いソースだし。
652デフォルトの名無しさん:2005/07/07(木) 01:09:07
>>650
プログラム言語も自然言語も同じ言語。

あんたの質問は、
英語の入門文法書はわかる。
でも英作文はできない。どうしたら作文ができるようになるのか?
とほぼ同義。

653デフォルトの名無しさん:2005/07/07(木) 01:16:14
すっかり厨が居ついてしまったな
654デフォルトの名無しさん:2005/07/07(木) 01:16:32
>>650
掲示板は結構多くのプログラミングエッセンスが入っていて
学習には最適だ。

変に他人のコードなんか読んだり演習問題なんかやってないで
100行ぐらいの規模の掲示板でもイチから組んでみると良い。

で、出きなかったら、行き詰まったら、ここに質問に来い。
まじめに取り組んでで、手前勝手な解釈の上に立った質問でなく
実際のコード晒すような奴なら、まあ誰かが導いてくれるだろう。

厳しい指摘や罵倒も受けるだろうがそれも勉強だわな。

現場で戦力になる早道は他人のプログラム修正だが、プログラミングを
覚える早道はなんでもいいからフルスクラッチのプログラムを書いて見る
ことだと、俺は思う。
655デフォルトの名無しさん:2005/07/07(木) 01:19:45
>>650
>>654の言う通り。
ただしKENTはやめておけ。
嫌悪感とかそういうくだらない理由ではなくて、本当に技術向上の妨げになってしまうから初心者には尚更お勧めできない。
ある程度Perlが身についてから反面教師として見るなら良し。
656デフォルトの名無しさん:2005/07/07(木) 01:21:44
KENTってなんだい?
657デフォルトの名無しさん:2005/07/07(木) 01:22:17
>>656
タバコ
658デフォルトの名無しさん:2005/07/07(木) 01:25:05
確かにKENTのコードは健康を害するな。
659 ◆TWARamEjuA :2005/07/07(木) 01:27:14 BE:3812257-#
肺気腫になる恐れもある。。。

・・・のか(滂沱)@小粋(刻みタバコ)
660デフォルトの名無しさん:2005/07/07(木) 01:36:41
逆に、このソースは読んどけってのはある?
661デフォルトの名無しさん:2005/07/07(木) 01:43:22
>>650
文法が分かるならやりたいことを表現するだけ。
実装方法を分解的に考えて規定の文法で文章化して行くというのがプログラミングだと思うぞ。

>>660
Acme::MorningMusume
http://cpan.uwinnipeg.ca/dist/Acme-MorningMusume
662デフォルトの名無しさん:2005/07/07(木) 01:48:16
>>661
> Acme::MorningMusume

何だこれ
テラワロスwww
663デフォルトの名無しさん:2005/07/07(木) 05:25:34
使い道ナサスwwww
664デフォルトの名無しさん:2005/07/07(木) 05:39:55
perlでWMPやwordファイルを起動させることはできますか?
できるとすればどうやればいいのでしょうか。
665デフォルトの名無しさん:2005/07/07(木) 06:07:09
CPANで検索すれ
666661:2005/07/07(木) 07:35:38
気に入って貰えた?
AcmeでCPAN探すと使えないモジュール一覧出てくるよ。
おまいらも検索しる

ちなみにAcme::MorningMusumeはメンバー分のサブクラスがあるぞ
Acme::MorningMusume::YoshizawaHitomi
http://cpan.uwinnipeg.ca/htdocs/Acme-MorningMusume/Acme/MorningMusume/YoshizawaHitomi.pm.html
667デフォルトの名無しさん:2005/07/07(木) 11:42:56
おお、こんこんもあるのか素晴らしい
668デフォルトの名無しさん:2005/07/07(木) 15:13:59
>>Acme::MorningMusume
これはこれで、Perlのモジュールの規則に則り
真面目にclass化されているので読む価値はある!


…とかいって見る。
669デフォルトの名無しさん:2005/07/07(木) 15:58:36
アクメ・モーニング・ミユージューム・モジュール?
670デフォルトの名無しさん:2005/07/07(木) 16:00:15
>>661
Author : KENTARO
ってなってるけどもしかして噂のKENT?
いや奴がOOPを理解してるとは思えない。
671デフォルトの名無しさん:2005/07/07(木) 18:15:46
>>637
学校の勉強はできるからテストの点も取れて自分で賢いと思ってるけど
頭の切れが悪くて自分からはなにも生み出せない典型的なアホの図
672デフォルトの名無しさん:2005/07/07(木) 18:52:17
受け流してよそへ飛ばしちゃうことおぼえようよ。
673デフォルトの名無しさん:2005/07/07(木) 21:55:53
>>668
いや、わりと真面目にそう思った。PerlでOOPはどうやるのがセオリー?って人には
参考になりそう。
674デフォルトの名無しさん:2005/07/07(木) 22:24:17
Perl のモジュールの規則を破り、真面目に class 化されず、OOP のセオリー無視で、
参考になりそうもないようなモジュールが CPAN にはそんなに多いものなの?
675デフォルトの名無しさん:2005/07/07(木) 22:47:49
別にプログラミング==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
このように表示させるにはどうすればいいでしょうか
677デフォルトの名無しさん:2005/07/08(金) 04:31:06
空白で区切られてて数字しか出てこないのか?
自分ではどこまでできた?
678デフォルトの名無しさん:2005/07/08(金) 04:54:40
>>676
open LIST,"list.txt";
push(@{$hash{(split)[0]}},(split)[1]) while <LIST>;
print "$_が参照しているのは",join('と',@{$hash{$_}}),"\n" for sort keys %hash;
679デフォルトの名無しさん:2005/07/08(金) 05:15:59
むむむ
680デフォルトの名無しさん:2005/07/08(金) 09:00:51
>>676
他に込み入った処理が無いのであれば、自分の場合はファイルの行番号で処理させるかな。ソートとか無駄な処理だし。

[link.txt]
0行目:
1行目:3,9,10
2行目:1
3行目:1,7,8

直接行番号から値をもってきて、区切り文字で分割して〜、でダメ?
681デフォルトの名無しさん:2005/07/08(金) 10:45:47
>>674
いや、そういうことではなくて、
Acme::MorningMusume はとても読み易いんだよ。
落としてみたかい?
コードだけでなく埋め込みPODやMANIFESTもまるでお手本のよう。
682デフォルトの名無しさん:2005/07/08(金) 11:05:45
Acme::MorningMusume
これサブクラスだけutf8なんだけど何で?
683デフォルトの名無しさん:2005/07/08(金) 11:17:48
RubyやScheme(Gauche)に食指が動いているオレに、
Perlの魅力を叩きつけてくれる者はおらぬか?
684デフォルトの名無しさん:2005/07/08(金) 11:18:52
Schemeやっておきなよ。Rubyはどうでもいいけど。
685デフォルトの名無しさん:2005/07/08(金) 15:55:12
>>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
ん..。エスケープシーケンスが変換されてしまってますね。適時読み替えて頂いて..
688デフォルトの名無しさん:2005/07/08(金) 17:09:20
%hash = ( "&" => "&"
..... );
s/[&"'<>\n]/$hash"\1"/;
689デフォルトの名無しさん:2005/07/08(金) 17:09:56
%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);
691デフォルトの名無しさん:2005/07/08(金) 17:22:17
>>690
リャマ本読んだようがいいと思うよ。
692デフォルトの名無しさん:2005/07/08(金) 17:23:35
>>691
リャマ本・・めっちゃ避けてました。
よみまふ。。
693デフォルトの名無しさん:2005/07/08(金) 17:27:52
>>686
%map = ('<' => '&lt;', ...);
$str =~ s/([&\"\'<>\n])/$map{$1}/egos;
などとやってみましたが、6〜7%しか速度向上しませんでした……。
ちなみに変換しない空ループ, オリジナル, 上記でこんなとこ。
noconv: 0.044489
origin: 2.727860
new: 2.533643
new/origin = 92.880244%
694デフォルトの名無しさん:2005/07/08(金) 17:48:45
>>686
http://search.cpan.org/~nwclark/perl-5.8.7/lib/Benchmark.pm

色々な長さの $str に対し思いつく限り多様な処理方法を試した
ベンチを取って統計してくれ。その過程が Perl への理解を深める
いい勉強になるし、結果が多くの人の役に立つだろう。
695デフォルトの名無しさん:2005/07/08(金) 18:40:37
>>684
tr/&amp;/&/;
s/\n/<br>/go;
などで速くなると聞いているがベンチマークしたことはないな。

696686:2005/07/08(金) 20:00:10
>>688-689, 693-695

ありがとうございます。
一度配列に入れてやる方法も /go も試してみましたが、ほとんど変わりません。
単純な置換の場合は、なかなか速くする方法というのは無いんですね。
697デフォルトの名無しさん:2005/07/08(金) 21:00:19
>>690
初心者がこのまま続けたらものすごくセキュリティ
ホールを作り込みそうなコードだな
698デフォルトの名無しさん:2005/07/08(金) 21:27:13
おまけにアドレス(宛先)の判定はダメダメだな。
699デフォルトの名無しさん:2005/07/08(金) 21:34:10
$test = "aiueo";
print $test[1];

で i が表示されるかと思ったんですが、駄目でした。
perlには i を表示させる手段はないのですか?
700デフォルトの名無しさん:2005/07/08(金) 21:55:37
@test = split //, $test;
701デフォルトの名無しさん:2005/07/08(金) 21:57:02
>>699
PHPやCじゃないんだから、こうやってくれ。

$test = "aiueo";
print +(split//,$test)[1];

または

$test = "aiueo";
print substr $test,1,1;
702デフォルトの名無しさん:2005/07/08(金) 21:57:06
>699
>700 のように split して配列にしてしまうか、substr を使え。
703デフォルトの名無しさん:2005/07/08(金) 22:17:09
>>700-702
レスありがとうございます。スルーされたかと思って四苦八苦してました。
$test = "aiueo";
$result = substr( $test,0,1 );
print " mae:", $test, " ato:", $result;

こうしてたんですが、() も無くせるんですね。勉強になりますた
704デフォルトの名無しさん:2005/07/08(金) 22:28:20
あ、あれ?? 連レスうざいかもしれんけど、どうかお許し・・・
>print +(split//,$test)[1];
のような表記、僕の教科書でみた覚えがありません。
配列を直す裏技みたいな split のやり方も、今知りました・・・

print + の + は戻り値が配列だった場合、スカラー変数に直してくれる
やり方であってますでしょうか?
print (split//,$test)+[1]; とかやってみたけど、
正常に動いてくれます。と・・・ちょっと頭がこんがらがってきました・・・
705デフォルトの名無しさん:2005/07/08(金) 22:40:41
違う
706通りすがり:2005/07/08(金) 22:43:39
>>701
たしかにこの+はなんだ(・∀・)?
print(〜)だとprintの関数としての括弧になってしまうから+をつけたとか?
707デフォルトの名無しさん:2005/07/08(金) 22:57:57
なるほど、じゃ
print ((split//,$test)[1]);
でよさげですかね。いくらググっても出てきませんので諦めますた
708デフォルトの名無しさん:2005/07/08(金) 23:18:30
>>707
+は次にくるものが「式である」ということを示す演算子。スカラー/リストは無関係。
スカラー扱いにするのはそのものズバリscalar()。

まぁ、カッコをつければいいわけだが、+のほうが一文字だから入力しやすいだろ?だからだよ。
709デフォルトの名無しさん:2005/07/08(金) 23:30:03
+ ってナニ?って言ってる奴らは、
PERLOP(1) の Named Unary Operators の所を熟読すべきだな。
710デフォルトの名無しさん:2005/07/08(金) 23:32:05
>>706
そう。
mapの時とか便利っすよ。
711デフォルトの名無しさん:2005/07/09(土) 00:31:53
perl-5.8.7 の info(texinfo) ってありませんか?
712デフォルトの名無しさん:2005/07/09(土) 00:47:07
>>711
http://search.cpan.org/~randym/pod2texinfo-1.0/
man (perldoc) や HTML や plaintext では駄目な理由がよく分からんけど。
713デフォルトの名無しさん:2005/07/09(土) 01:15:49
>>712
Emacs の M-x info-lookup-symbol で使えるものが欲しかったんです。でも、
これはフィルターなので、単純に perl 付属の pod を変換すると複数のファイ
ルにわかれちゃいますね。どうしたもんだか。
714706:2005/07/09(土) 02:14:28
>>710
printの括弧は一度ハマッた経験があるので注意深くなってた。
そのときの解決方法は print "", (split//,$test)[1]; とか空文字出力してた。
そっか+か。すごいの思いつくなぁ。
715デフォルトの名無しさん:2005/07/09(土) 04:19:04
これは思いつくもんじゃないと思うぞ
716デフォルトの名無しさん:2005/07/09(土) 09:23:41
そのために用意された演算子なので使うほうは知ってりゃいいだけだが、
その問題を解決するために+という演算子を用意しようと思いつくのは
たしかにすごいかも。
717デフォルトの名無しさん:2005/07/09(土) 12:17:29
脱線してしまうが "," の代わり "=>" を実装したといのもすごいよね。
左辺値がシンボルを構成する文字列の場合、文字列と解釈するってやつ。

print time,'s';

ってやるとその時のシステム時間と "s" が表示されるけど

print time=>'s';

ってやれば "time" と "s" が表示されるもんね。
718デフォルトの名無しさん:2005/07/09(土) 12:49:15
$perl -e'(print "a",print "b")'
ba1
これの訳を教えてください
719 ◆TWARamEjuA :2005/07/09(土) 13:20:26 BE:1634235-#
>>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)'
とかとか。。。
720デフォルトの名無しさん:2005/07/09(土) 13:27:13
>>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"になるが、どこにも渡されていないので捨てられる。
721デフォルトの名無しさん:2005/07/09(土) 14:24:14
print ("a", print "b");

こう書いてあれば分かるんでない?
722デフォルトの名無しさん:2005/07/09(土) 15:29:19
>>719-721
サンクスです。
'(print("a"), print("b"))'
こういう風に評価されるものだと思ってました。
>>720分りやすい解説サンクスコ
723デフォルトの名無しさん:2005/07/09(土) 23:34:12
=>以外にも、qw()とかも便利。
requireとかuseでもベアワードが使えるし。

不要なクォートを入力しなくて良いのは、さすが不精な人向け言語だと思ったよ。
724デフォルトの名無しさん:2005/07/09(土) 23:49:28
質問です。

Perlで整数を使うと、内部的には何ビットで処理されるのでしょうか?

自分のWindows上の環境では、符号付き64ビットで扱われる(または内部で自動的に拡張される)ようなのですが、
正式な仕様としてはどうなっているんでしょうか?
725デフォルトの名無しさん:2005/07/09(土) 23:59:05
>>724
perl -V とするとでてくるよ。
726デフォルトの名無しさん:2005/07/10(日) 00:05:45
727デフォルトの名無しさん:2005/07/10(日) 01:14:09
>>724
ほんとかよ?
>自分のWindows上の環境では、符号付き64ビットで扱われる
どうやって確認したん?
728デフォルトの名無しさん:2005/07/10(日) 09:47:48
>>724
ビルド済みPerlの整数の型を知りたいなら
perl "-V:iv.*" で見れる。
729デフォルトの名無しさん:2005/07/11(月) 07:24:01
文字列を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です。

おねがいします。
730デフォルトの名無しさん:2005/07/11(月) 08:06:35
print "\xfe\xff" すれば?
731デフォルトの名無しさん:2005/07/11(月) 08:09:34
utf16を指定すればBOM は 憑く
732デフォルトの名無しさん:2005/07/11(月) 09:03:49
>>731
ありがとう。できました。
733デフォルトの名無しさん:2005/07/11(月) 16:04:45
質問です。
配列(@array)の最大の添字は
$#array
で取れますが、これが配列のリファレンス(@$array)の場合はどう記述すればいいでしょうか?
734デフォルトの名無しさん:2005/07/11(月) 16:05:56

>配列のリファレンス(@$array)
すいません、配列のリファレンス($array)でした。
735デフォルトの名無しさん:2005/07/11(月) 16:10:43
$#$array
736デフォルトの名無しさん:2005/07/11(月) 17:02:24
>>735
取れました!!ありがとうございます
737デフォルトの名無しさん:2005/07/11(月) 21:35:53
>>735
知らなかった・・・
738デフォルトの名無しさん:2005/07/11(月) 21:45:51
>>737
> 知らなかった・・・

これは知っていたり知らなかったりするものではない。
思いつくものだ。
739デフォルトの名無しさん:2005/07/12(火) 01:19:45
全然話題は変わるが、
リファレンスカウンタループを警告してくれれば良いのに。
と思う。

最近全くPerl触ってないから、今の実装知らないんだけどムズイの?
740デフォルトの名無しさん:2005/07/12(火) 02:09:56
ごく基本的なことかもしれませんが何時間も考えて全くわからなかったので質問します。
>入力「<>」を while(<>) のように使うと、特殊変数 $_ に読み込んだ行が入るようになっています。
某講座サイトからの転載なのですが

open( DAT, "test.dat" );
while ( <DAT> ) {
    print $_, "\n";   # ←ここのライン
}
close( DAT );

$_のところで必ずエラーが起こります。
手打ちのミスではありません。
複数の講座サイトから同様の内容のサンプルをコピペしてもエラーになります。
#!C:/perl/bin/perlやprint "Content-type: text/html\n\n";
の打ち忘れでもありません。他の文ならきちんと動きます。
全く原因がわからず本当に困っているのでどなたか回答をお願いします。
Apacheでの出来事です。
741デフォルトの名無しさん:2005/07/12(火) 02:15:13
>>740
, は何を意味するの?
742デフォルトの名無しさん:2005/07/12(火) 02:22:33
>>740
おそらく
print $_, "\n";   # ←ここのライン
    ↑の’,’を指しておられるのでしょうが
転載記事なので手を加えない方がよいとおもっただけで
print $_;   #
と打ち直してもエラーになるのを確認してます。
743デフォルトの名無しさん:2005/07/12(火) 02:37:13
エラーログみれ
744デフォルトの名無しさん:2005/07/12(火) 02:51:11
つか、直接コマンドラインから叩いたときはどういうメッセージが出るのよ?
745デフォルトの名無しさん:2005/07/12(火) 02:56:53
Unrecognized character \x81 at C:\Program Files\Apache Group\Apache\copal271[1]\copal.tmp line 9.
エラーログはこちらです。
746デフォルトの名無しさん:2005/07/12(火) 03:01:46
つ[全角スペース]
747デフォルトの名無しさん:2005/07/12(火) 03:10:52
今日は全角厨をよく見る
748デフォルトの名無しさん:2005/07/12(火) 03:10:55
>>746
どうもありがとうございました。起動しました。
何時間も検索したり本を読んだりした結果、ごくつまらないミスだったというのは経験済みですが、
何度やってもなれないです。吐き気がしてきた。
749デフォルトの名無しさん:2005/07/12(火) 03:38:44
頭悪いと大変だな。
750デフォルトの名無しさん:2005/07/12(火) 03:40:07
全角スペースと半角スペースが判別出来るテキストエディタは必須
751デフォルトの名無しさん:2005/07/12(火) 03:49:17
メモ帳でやってたんだろ
752デフォルトの名無しさん:2005/07/12(火) 04:04:56
Unrecognized characterがあるとエラーが出ているのに、
Unrecognized characterを考えないのはどういう理由なのか説明してほしい。
753デフォルトの名無しさん:2005/07/12(火) 04:29:45
おまえらそこまで言うなよ
754デフォルトの名無しさん:2005/07/12(火) 04:45:35
学ぶ意志さえあれば
非常に示唆に富んだ反応に見えるはず。
755デフォルトの名無しさん:2005/07/12(火) 08:23:49
ユーザにYかNかを問い合わせて、10秒間反応が
ない場合は、Yとして続行するコードを書こうと思った
んですが、私の知識じゃどうにもならないです。

ヒントを教えてください。
756デフォルトの名無しさん:2005/07/12(火) 08:45:25
>>739
たしかそれを調べるモジュールがあるよ。
CPANで調べてみそ。

>>755
$SIG{ALRM}使えば?
757デフォルトの名無しさん:2005/07/12(火) 09:04:36
>>756
ありがとうございます。

SIG{ALRM}とevalでできました。イイ!!
758デフォルトの名無しさん:2005/07/12(火) 09:38:56
>>752
単にUnrecognized characterという英文字列の並びが何を意味するか
理解できなかっただけだろ。
759デフォルトの名無しさん:2005/07/12(火) 10:37:24
>>748
「ごくつまらないミス」は誰でもやってしまうもの。
問題はミスをすることではなくて、>>750のような工夫をおそらくしていないことや
Unrecognized characterというごく簡単な英語も理解できない知能であり
プログラム以前の問題。
760739:2005/07/12(火) 11:04:28
>>756
おぉ、サンクス。CPANちょっと見てみた。
Devel-LeakTrace
これかな?

Perl News Letter
ttp://books-support.softbank.co.jp/pn/special05-1.html
によると、Perl5.6以降で、
reference counter loop が起こる事が分かっているなら
Devel-WeakRef なんかも使えそうだけど、全然モジュール更新されてないのね。

以前、Compositeパターン書いた時にこの問題でハマッたので
ずっと気になってた。
761デフォルトの名無しさん:2005/07/12(火) 12:27:05
英文のエラーメッセージがいやなのか。
日本語に変えたら喜ばれる?
762デフォルトの名無しさん:2005/07/12(火) 12:36:05
文字化けして云々とか言い出しそう。
763デフォルトの名無しさん:2005/07/12(火) 12:39:45
>>748
おまいさんプログラマには向いてないな。
発生するバグの99%はつまらないミスだぞ。
# if文の真偽を逆にするとか境界条件をしくるとか演算子の優先順位を勘違いするとか。
764デフォルトの名無しさん:2005/07/12(火) 13:45:47
>>759
> Unrecognized characterというごく簡単な英語も理解できない知能であり
> プログラム以前の問題。

理解できないし、理解しようともしなかったし、
質問で真っ先に提示しようともしなかった。
この心理っていったいなんなんかを知りたいわけだよ。
765デフォルトの名無しさん:2005/07/12(火) 14:31:00
とかなんとか書いてるやつらでも、自分がハマったときは同じ行動をすることが多い。
766デフォルトの名無しさん:2005/07/12(火) 14:43:37
脳味噌腐ってるな
767デフォルトの名無しさん:2005/07/12(火) 14:48:43
>>765
Are you Kusakabe-san?
768デフォルトの名無しさん:2005/07/12(火) 14:57:29
>>764
心理も何もない。
ただ考える道筋すらわからないほどの初心者というだけだろ。
そんなもんが流せない君の心理のほうが不思議だよ。
この手が嫌なら質問スレなんかこなきゃいいと思うんだが。
769デフォルトの名無しさん:2005/07/12(火) 15:03:40
言葉尻を論って流れも読まずに独り言するのはカンベンして欲しいんだがなぁ
>>764-768
770デフォルトの名無しさん:2005/07/12(火) 15:04:36
>>765
2chに質問なんか書かないだろ、そういう時はフツー
771デフォルトの名無しさん:2005/07/12(火) 15:06:19
>>764
知能だけの問題じゃなくて、傲慢、あるいは自己中心性の
結果だと思う。
772デフォルトの名無しさん:2005/07/12(火) 15:15:39
>>764
細かいミスなんてのは自分の知識になって今後注意深くなるからいいじゃねーの?
くだらないミスほど、自分の知識となって蓄積されていく。
細かいミスはいっぱいしてるだろうけど、同じミスを繰り返したこたぁ、あまりないだろ。

気づけばくだらない問題だったなんてことは、誰でもいっぱい経験することだよ。
773デフォルトの名無しさん:2005/07/12(火) 15:21:52
774デフォルトの名無しさん:2005/07/12(火) 15:29:29
>>771
> 知能だけの問題じゃなくて、傲慢、あるいは自己中心性の
> 結果だと思う。

はいはい。

たしかにああいう輩は、知的な面で問題があり、自己中心性が強く、
自分と他人の違いが分かってないことが多いね。

でもスレ違いだから、ほか行ってね。
775デフォルトの名無しさん:2005/07/12(火) 15:30:21
Perlについての質問箱 17箱目
Perlについての質問箱 17箱目
Perlについての質問箱 17箱目
Perlについての質問箱 17箱目
Perlについての質問箱 17箱目
776デフォルトの名無しさん:2005/07/12(火) 17:55:03
↓はい、次の質問のひとどうぞー
777デフォルトの名無しさん:2005/07/12(火) 19:20:00
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]/]}},
};
}
778デフォルトの名無しさん:2005/07/12(火) 19:23:34
>>777の使用方法はこんなかんじみたいです。

$x = String_new("abcdefg");
$y = String_new("cdefg");

$z = $x->{replace}('c.','xyz');
$w = $y->{concat}('xyz');

これはどういう仕組みなのか説明できる方お願いいたします。
779デフォルトの名無しさん:2005/07/12(火) 19:31:51
ちなみに

sub String_new{
my $self;
$self = {

の部分を

sub String_new{
my $self = {

としたり

sub String_new{
return {

としたりすると動かなくなります。
780デフォルトの名無しさん:2005/07/12(火) 19:51:13
>>779
> sub String_new{
> my $self = {
>
> としたり
返り値がmyの評価結果になるからな。

> sub String_new{
> return {

意味不明。
781デフォルトの名無しさん:2005/07/12(火) 20:00:44
>>778
サブルーチンに文字列を渡すと、ハッシュのリファレンスが得られる。
デリファレンスされたハッシュにキーを渡すと関数が得られる。
その関数に変数を与えると目的の結果が得られる。
782デフォルトの名無しさん:2005/07/12(火) 20:29:33
>>777
クラス定義せずに、文字列オブジェクト(ぽいもの)を実装したいだけでしょう。
Cで構造体に関数ポインタ持たせるのと同じ。
別言語と実装を合わせるために作ったんじゃないでしょうか。

クラスじゃないから、String_new() で作った文字列同士の演算はスマートに出来ないよね。
783777-779:2005/07/12(火) 20:58:04
>>780-781
レスありがとうございます。

>>780
> 返り値がmyの評価結果になるからな。
myの評価結果は、myされた変数の代入結果と同じになるじゃないですか。
てことは、後でmyしようがその場でmyしようが関数の戻り値は同じハッシュリファレンスですよね。

>意味不明。
無名のハッシュリファレンスを変数を介在せずに直接戻り値にしているだけです。

>>781
はい、その通りですね。ちょっと説明不足で申し訳ございませんでした。
自分が聞きたかったのは、$xと$yが独立した情報を個別に操作しているように見えるのですが
Perlのどういう仕組みよる振る舞いなのでしょうということです。
>>777-778を実際試していただけると分かると思います。

>>782
なるほど!
ちなみに、"my $self;" と "$self = {"を別けなければならないか分かります?
784デフォルトの名無しさん:2005/07/12(火) 21:14:47
>>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"が印字される
785783:2005/07/12(火) 21:15:54
>>784の一番上の例間違えた
{
my $self;
$self = sub{ return \$self };
$var = $self;
}
だった。
786782: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, 日本語名忘れた…)」を読んでください。
787デフォルトの名無しさん:2005/07/12(火) 21:33:46
なんやかんや言って良スレじゃのー
おまいら偉いわ
788デフォルトの名無しさん:2005/07/12(火) 21:46:16
言うまでもなく、最後に return $self; を追加するなら
my $self = {
と書いても問題は無いわけだが、777はもうこの辺理解できたかな。
789デフォルトの名無しさん:2005/07/12(火) 22:13:37
>>760
weakrefはいちおう動くよ。
イマイチ使いにくいけど。
790777-779:2005/07/12(火) 22:28:28
>>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;を付けると大丈夫ということが
理解できなくなりました。もう少し考えてみます。
791782: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 からは参照カウンタのリークってフィックスされたとか
なんとかっていう情報をどこかで見たような気がする。
792デフォルトの名無しさん:2005/07/12(火) 22:55:08
>>788
いや、駄目だって。
myと同じ場所に書いたら、右辺値を評価してる時の$selfと左辺値を評価する時の$selfが
別の実体を参照しちまう。
{my $a=$a;...} と {my $a;$a=$a;...}が違うのと同じ。
793デフォルトの名無しさん:2005/07/13(水) 00:34:21
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)

実際にはこの値が入っているはずなのですが
ただしい取り出し方がわかりません。
どなたかご教授いただけないでしょうか。
794793:2005/07/13(水) 00:35:12
>実際にはこの値が入っているはずなのですが
実際にはこの値ではない値が入っているはずなのですが

の間違いです。すみません。
795デフォルトの名無しさん:2005/07/13(水) 00:36:04
>>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");
796デフォルトの名無しさん:2005/07/13(水) 00:36:32
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;
}
797デフォルトの名無しさん:2005/07/13(水) 00:38:21
Perlでクロージャやって何が楽しいのやら
798795:2005/07/13(水) 00:48:07
ただのクロージャじゃないよ、クラスもどきだよ。
799デフォルトの名無しさん:2005/07/13(水) 00:59:18
素直にクラス作ってメソッドにしようよ。
演算子オーバーライドできるし、いちいちハッシュ引かなくても良い。

というか、Perlの文字列をわざわざ文字列オブジェクトにする必要が無い。
普通のスカラー変数で、すでに十分ラッパがかかってる状態なんだから。
どうしても文字列オブジェクトにしたいなら、他言語に行った方が…。
800795: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);
801デフォルトの名無しさん:2005/07/13(水) 01:53:15
>>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)
803デフォルトの名無しさん:2005/07/13(水) 14:01:48
>802
リファレンスの自動生成はPerlの仕様だったと思う
804デフォルトの名無しさん:2005/07/13(水) 14:27:58
>>802
値が未定義値のスカラー変数に対するリファレンスの自動生成はPerlの仕様だからエラーや警告はでません。

use strictしているから、間違って$hashに配列リファレンスや文字列を代入してしまえば
ハッシュのデリファレンス構文や間接参照構文(%$hash,$hash->{})でエラーになります。

逆に質問なんですが未定義値のスカラー変数にリファレンスの自動生成が適用されて困る場面ってどんなときでしょう?
805デフォルトの名無しさん:2005/07/13(水) 16:25:53
>>804
変数名を取り違えたときはそこでエラーなり警告なり出てくれれば
早いうちに間違いを発見できるかもしれんのでautovivificationが
適用されない方がありがたい。
806802:2005/07/13(水) 17:02:39
>>803,804
有難う御座います。エラーや警告は出ないのですね。

> リファレンスの自動生成が適用されて困る場面ってどんなときでしょう

これは>>805の方と同じ意見ですが、use warnings; や use strict; と同じよう
に、バグを未然に防ぎたくチェックをしたい場合にはあったほうが良いのではな
いかと思います。

リファレンスはよく利用しますから、最初のスカラ変数だけは自動生成のチェックが
あったほうがありがたいですね。
807804: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"しか表示されない。エラーも警告もでない。
808デフォルトの名無しさん:2005/07/14(木) 00:14:02
そゆときのためのモジュールがあったような気がするなぁ。
CPAN探してみそ。
809デフォルトの名無しさん:2005/07/14(木) 00:30:17
そういうためのモジュールは無いみたいだな。作るのも難しそう。

my $s;
$s->{foo} = 'bar';

これは、実質的にこう解釈される

my $s;
$s = {};
$s->{foo} = 'bar';

だから、例えばtieで監視しようとしても、$s = {}と区別できない。
810デフォルトの名無しさん:2005/07/14(木) 01:06:50
最初の my $s; で、SVの頭だけが出来る。
$s->{foo} の段階で「あ、ハッシュリファレンスですか」となって SvRV に。
無名ハッシュが作られて初期化。

であってる?
PerlのXSとか、5.005以降見てないんで動作も忘れちゃってるけど。
懐かしいなぁ。
811デフォルトの名無しさん:2005/07/14(木) 10:26:35
う、、、すいません
split関数の事で質問があります。

my $str="auaua\t\t\t\t\t\tsyobo-n";
とある場合に
my @data = split(/\t/,$str);
とやって
$data[0]にauaua
$data[1]にsyobo-n
と入れたいのですが
\tがいくつあるか不定の時はどのように
表記すればよいのでしょうか?
812デフォルトの名無しさん:2005/07/14(木) 10:29:01
my @data = split(/\t+/,$str);
813811:2005/07/14(木) 10:56:39
あう
こんな素人の質問に答えていただき
ありがとうございますっ
814804:2005/07/14(木) 11:09:57
>>813
あう、いうな!萌えるじゃねえか!
815804:2005/07/14(木) 11:15:36
自分もまた質問です。

substrみたいに自分で作成した関数をlvalueにして、代入した内容で振る舞いを返る方法はないでしょうか?
現在実装されているlvalueは、関数の最後に指定した代入可能な変数に代入できるだけですよね。
816804:2005/07/14(木) 11:22:21
あっ、普通に変数のリファレンスと振る舞いを変えさせたい値を
関数の引き数で受取ればすむだけというのは分っています。
substrみたいな動きを自分で定義できるか知りたいだけです。
817デフォルトの名無しさん:2005/07/14(木) 11:25:53
>>816
lvalue+tieで実質なんでもできる

sub set($) : lvalue{}なんてすると、

set $var = 1; # set($var) = 1

などとして、特定のsetステートメントのときのみ特定の値の代入を認める、
などという構文を拡張できたりする。
818804:2005/07/14(木) 11:45:44
>>817
ありがとうがざいます。

ちなみに>>817のコードでは、set関数に1を代入して$varに1が代入されますよね。
代入した値に+1して$varに代入させるようにそのset関数を改良するには
具体的にはどうのように記述したらいいですか?
819デフォルトの名無しさん:2005/07/14(木) 16:48:24
ダブルクォーテーション内でリファレンスの変数展開ってどうしたらいいんでしょうか?

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 );

-------------------------------------------------
822デフォルトの名無しさん:2005/07/14(木) 18:04:30
>>819
"@{[$obj->prop]}" または "${\($obj->prop)}"

オレはクックブックで知ったが、その場でリファレンス作って
デリファレンスするというかなり強引な技です。

あらかじめ$obj->propを適当な変数に突っ込んどいた方が
見やすいといわれているがお好みで。
823デフォルトの名無しさん:2005/07/14(木) 18:10:28
>>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を違うファイルに置くと出来ないんですが・・。
なぜ・・。
825820:2005/07/14(木) 21:11:42
他所で聞いてきます
826デフォルトの名無しさん:2005/07/14(木) 21:23:34
>>824
たぶん、requireでソースを取り込んでいますよね。
以下、BEGINブロックで囲まれていないrequireを想定して説明します。

プロトタイプは、サブルーチンを使用する文がコンパイルされる前に
先行宣言されていなければ有効になりません。

requireは、実行段階で1回だけソースファイルを読み込みますので
プロトタイプ付サブルーチンの定義を別ファイルにすると
サブルーチンを使用する文がコンパイルされる段階では
まだプロトタイプが宣言されていないことになります。

その為、別ファイルで宣言しているfuncのプロトタイプが無効になってしまいます。

それを回避するためには、requireの文をBEGINブロックで囲んでください。
BEGINブロックで囲んだ範囲は、全てがコンパイルされる前に
先行してコンパイル及び実行が行われるので
別ファイルのプロトタイプ宣言が有効になります。

例:

BEGIN{require 'hoge.pl'}
$data = "test";
@arr = ("1234", "5678");
func(@arr, $data);
827デフォルトの名無しさん:2005/07/14(木) 21:42:14
つかuseを使え
828デフォルトの名無しさん:2005/07/14(木) 21:48:54
>>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;
}
829デフォルトの名無しさん:2005/07/14(木) 21:49:59
# 続き
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を使ってわざわざこんなことをする意味は無い。
「こんな構文もできるぜイエイ」つーくらいなものだな。
830804:2005/07/14(木) 22:03:29
>>828-829
ありがとうございます!

まさしく、「こんな構文もできるぜイエイ」ってやりたいだけだったりします。

いやあ、質問する前に>>813にツッコミいれたんで
>>813の「あう」にときめいた自分が許せなかったんです)
アラシと勘違いされてスルーされたかと一時は思ってしまいました。

本当にありがとうございます。
831デフォルトの名無しさん:2005/07/14(木) 23:44:13
変数に入っている文字列の長さを返すlengthがありますが、
変数に文字列とは限らない値が入っている場合でも
(ex. readでファイルから読んだデータをいくつかくっつけた)
このlengthで入っているデータのバイト数が確実に返されると考えていいのでしょうか。
偶然(?)にマルチバイト文字にあってしまってその文字数を返される可能性があるかもと
心配しています。
832デフォルトの名無しさん:2005/07/14(木) 23:51:33
>>831
ユニコード文字列でなければlengthは文字列のバイト数だから
余計な変換レイヤ入れたりしてなければ問題ないはず。
833831:2005/07/15(金) 00:03:52
変数内のデータが「偶然すべて」ユニコードにあわない限り大丈夫ってことでしょうか。

過剰な心配かもしれませんが、万一、ユニコードにバッチリあってしまっててても
大丈夫な方法ってないんでしょうか?
あれば教えていただけるとうれしいです。
834デフォルトの名無しさん:2005/07/15(金) 00:12:43
>>833
use bytes;
# ここに length の処理など
no bytes;
かな。
835831:2005/07/15(金) 00:18:44
あぁ、ありがとうございます。
まだまだ修行が足りないことを実感しています。
精進せねば。
836デフォルトの名無しさん:2005/07/15(金) 00:45:16
>>833
ユニコード文字列っていうのはUTF-8 flagが立った文字列
のことを言っているのだと思いますが、勝手に立つことは
ありません。たまたまutf8として解釈できそうなバイト列で
あっても、decodeなり入力レイヤなりで変換しなければ
ただのバイト列です。

834の言うようにbytesプラグマ下ならそれが何であれ
バイト数返しますが、そもそも外から取り込んだものが
ユニコード文字列になっていたらそれはどこかで変換
された結果なので、その変換で長さが保存されている
ことは期待できません。

この辺ややこしいので気になるのなら

ttp://www.pure.ne.jp/~learner/program/Perl_unicode.html

あたり参考にして勉強しましょう。

837デフォルトの名無しさん:2005/07/15(金) 06:42:54
http://pc8.2ch.net/test/read.cgi/tech/1120720976/120
で質問したブロックの使いかたがわかりません。
このスレのだれか教えてください。
838837:2005/07/15(金) 06:44:42
http://pc8.2ch.net/test/read.cgi/tech/1120720976/160 の方が解答してくれてました。
お騒がせしました。
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.
とエラーがでてしまいます。

解決方法等 何か情報がありましたら
お教え頂けますとありがたいです。
840デフォルトの名無しさん:2005/07/15(金) 14:47:08
841デフォルトの名無しさん:2005/07/15(金) 15:33:09
>>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");
}
842839:2005/07/15(金) 15:38:54
>840さん 841さん
RESありがとうございます。

writeFile(*FILE);

でやってみました。
どうもですっ
843デフォルトの名無しさん:2005/07/15(金) 16:47:54
>>841
いまどきFileHandleなんて勧めるなよ。
IO::Fileにしとけ。
844デフォルトの名無しさん:2005/07/15(金) 17:02:49
Perl5.6以上であれば、これがいいかもよ。

main();

sub main{
open my $file,">$gOutputHtml";
writeFile($file);
close $file;
}

sub writeFile{
my $filehandle = shift;
print $filehandle "test\n";
}
845デフォルトの名無しさん:2005/07/15(金) 18:12:04
>>839
もう他の方ので解決してますが、
質問の書き方だとエラーの通り bareword に引っかかります。

perlが、関数に渡されたbareword をファイルハンドルと仮定して使用するのは、
内部的にちょっと無理があって、C側で書いててもチョット不安です。
「渡されてきたこれ、文字列にも見えるよなぁ。
 まぁ、ファイルハンドルなんだろうけど、良いのか?」という感じ
(perlインタプリタの気持ちを代弁)。

なのでエラーになるんだと思います。

グロブ渡しもアリですが、ちょっと古いし、直接的すぎるかも。
グロブ使うなら、local() を忘れずに。
846デフォルトの名無しさん:2005/07/15(金) 21:58:29
いや、グロブでもlocal()とか必要ないから。
直接変数に入れて平気だから。
847デフォルトの名無しさん:2005/07/16(土) 00:03:40
perlって金になるの?
848デフォルトの名無しさん:2005/07/16(土) 00:32:44
金取りづらい
849デフォルトの名無しさん:2005/07/16(土) 01:36:39
>>847
> perlって金になるの?

僕が書いたPerlのプログラムを、見も知らずの人が金にしていたことは
ありました。
850デフォルトの名無しさん:2005/07/16(土) 02:13:08
報告人だか削除人だか案内人だかのために書き捨てたことがあったなぁ
851デフォルトの名無しさん:2005/07/16(土) 03:09:23
自分の仕事のちょっとした自動処理スクリプトとして使ってるから、
給料の一部になってると言えなくもない。
852デフォルトの名無しさん:2005/07/16(土) 04:39:53
つーか金になるかどうかは営業の腕次第だな。
853デフォルトの名無しさん:2005/07/16(土) 04:55:27
ここ6年ほど、perlでご飯食べてまつ。
854デフォルトの名無しさん:2005/07/16(土) 05:12:01
3年前ならPerl/CGIで飯食えたけど今は無理っぽくない?
Webに限ればPHPかJavaしか仕事無いよ。
いやいやPHP覚えたら副産物でOOPとデザパタ覚えてスキルアップしちゃった。
855デフォルトの名無しさん:2005/07/16(土) 06:10:42
>>853
pearlなゴハンとか言わないよね…

>>854
そうでもないと思うけど。
856デフォルトの名無しさん:2005/07/16(土) 06:18:02
>>855
ちょっとだけ悩んでしまった。
857デフォルトの名無しさん:2005/07/16(土) 09:45:51
PHPでOOPを覚えるのはPerlで覚えるより問題があると思うけど……。
まあそれはそれとしてPerlで稼ぐのは問題なしですよ。
10年近くそれで食べてますし、今後も特に不安はないです。
ウェブ系だとmod_perlで動くコードが書けないと問題かもしれませんが。

CGI/Perlをやってた素人に毛が生えた連中はPHPに流れたみたいですけどね。
858デフォルトの名無しさん:2005/07/16(土) 14:34:13
$arrayref != undef ? return $arrayref ? exit;

これは何が間違っているんでしょうか?
859デフォルトの名無しさん:2005/07/16(土) 14:37:52
3項演算子の使い方
860デフォルトの名無しさん:2005/07/16(土) 14:38:16
全て
861デフォルトの名無しさん:2005/07/16(土) 14:45:00
たしかに使い方はちょっとあれだけど、でも
1==2 ? print"a" : print"b";
これはちゃんと動くんですよね。なんでexitはだめなのか。
862デフォルトの名無しさん:2005/07/16(土) 14:46:05
exitのせいじゃないっつってんだろ。859が。
863デフォルトの名無しさん:2005/07/16(土) 14:54:49
858はタイプミスしました。あとexitは関係なかったです。

($arrayref != undef) ? return $arrayref : exit;

これなら動くんですよね。なんでカッコがないとダメなんでしょうか?
エラーメッセージはこうです。
”Use of "undef" without parentheses is ambiguous”

undef ? というのがいけないみたいですね。なんででしょうか?
864デフォルトの名無しさん:2005/07/16(土) 15:01:19
気の毒すぎて何も言えない…
865デフォルトの名無しさん:2005/07/16(土) 15:04:25
>>864
何も言えないなら、何も言う気がないなら
何も言わなくていいですよ^^;
866デフォルトの名無しさん:2005/07/16(土) 15:05:04
>>863
書いてある通りだ。もし英語が読めないのなら
なぜそのメッセージをExciteテキスト翻訳(http://www.excite.co.jp/world/english/)
などにつっこんでみようと思わないのか。
867デフォルトの名無しさん:2005/07/16(土) 15:07:45
>>866
私の言いたいのは、なんで構文解析があいまいな結果になってしまうのか
その原因を分る人に聞いてるわけです。
ところで?は三項演算子以外に何に使われてましたっけ?
868デフォルトの名無しさん:2005/07/16(土) 15:25:35
>>867
パターンマッチングの最短一致
869デフォルトの名無しさん:2005/07/16(土) 15:40:16
>>867
> 私の言いたいのは、なんで構文解析があいまいな結果になってしまうのか

そんなわけないだろ。演算子の優先順位とか勉強しなおしてこいよ。
870デフォルトの名無しさん:2005/07/16(土) 15:41:15
ってか、このスレ内に答え出てたし。
871デフォルトの名無しさん:2005/07/16(土) 15:43:45
HINT:結合性・優先順位・undefは引数を取る。
872デフォルトの名無しさん:2005/07/16(土) 16:08:00
>>869
エキサイトにつっこんでみたよww
「Use of "undef" without parentheses is ambiguous」
       ↓
「括弧のない"undef"の使用はあいまいです。」

だって。文面通り謙虚に受け取ればよかったものを余計な知識が邪魔して
「構文解析があいまいな結果になってしまう」と脳内変換してしまった

に300undef。
873デフォルトの名無しさん:2005/07/16(土) 16:23:26
>>872
なるほど、確かにそのとおりです。
カッコとは三項演算子の条件式のことだと思ってました。
undef()こうしろってことですね。なるほど。
引数を取らない他の関数でも同様のメッセージが出ました。

ところで三項演算子の優先順位は低いし、undef ? これがなんで
問題になるんでしょうか?

>>868
正規表現ですか?正規表現はスラッシュで囲ったものだけじゃないんですか?
874デフォルトの名無しさん:2005/07/16(土) 16:31:55
>>867
?PATTERN?
875デフォルトの名無しさん:2005/07/16(土) 16:35:31
>>874
なるほどこんなのあったんですね。
876デフォルトの名無しさん:2005/07/16(土) 16:36:48
まあ素直に defined $arrayref ? ... ってしとけってこった。
877デフォルトの名無しさん:2005/07/16(土) 17:39:53
>>876
うむ、その通り。

$arrayref != undef()
の書き方は、undef()により undef値を生成した後、$arrayrefと比較する。

defined $arrayref
は、単に$arrayrefが undef値かどうか調べるだけ。

後者のほうが良い。
878デフォルトの名無しさん:2005/07/16(土) 17:48:38
そもそも 0 == undef や 'foo' == undefは真だしな。
879デフォルトの名無しさん:2005/07/16(土) 18:03:30
$arrayref が、ほんとに配列リファレンスなら、
$arrayref ? return $arrayref : exit;
で良くない?

しかし、何故いきなり exit() なのかは気になるところ。まぁ良いか。
880デフォルトの名無しさん:2005/07/16(土) 19:09:30
なんだかんだいってみんなやさしいな。
ラリーが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のコードレベルで見てはいないがエラーメッセージからは
そう読みとれる。(違ったらツッコんでエロい人)
881880: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.
882デフォルトの名無しさん:2005/07/16(土) 19:31:08
>>880
多分、それで合ってる。

別にCで読まなくても良いよ。昔、追ってみたけど頭おかしくなりそうだった。
読んだ感想は「これ書いたりメンテしてる奴らは尋常じゃねぇ」。
なんというかカオス。

その後、rubyの中身読んで「助かった」と思った。
まぁ、perlの場合は逐次実行がコードを難しくしてるんだろうけど。
883デフォルトの名無しさん:2005/07/16(土) 19:56:43
初心者でうまく説明できないんですけど、
クラスの色んな属性を順番に取り出していく方法ってどうやるんでしょうか?
ハッシュにforeach関数を使う時みたいな感じです。
よろしくお願いします。
884デフォルトの名無しさん:2005/07/16(土) 20:44:27
>>883
> クラスの色んな属性を順番に取り出していく方法ってどうやるんでしょうか?

属性を入れているハッシュにforeachを(関数じゃないぞ)使えばいいです。
885デフォルトの名無しさん:2005/07/16(土) 20:55:39
>>884
ありがとうございます。

具体的にどう書けばいいんでしょうか?
すみません;;
886デフォルトの名無しさん:2005/07/16(土) 21:00:12
いらいら
887デフォルトの名無しさん:2005/07/16(土) 21:08:28
>>883-885
Perl のクラスはそのオブジェクトの属性をどのように実装するかまでは
言語レベルで取り決めていない。よってオブジェクトの全属性を順番に
読み出す一般的な方法は無い。

とは言え、多くの場合はハッシュリファレンスとして実装されているので、
この辺全部読め。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html
888デフォルトの名無しさん:2005/07/16(土) 21:25:09
>>883
887の言うように、まずはチュートリアルも読みましょう。

# $obj にオブジェクトが入っているとすれば、
use Data::Dumper;
print Dumper($obj);

ハッシュリファレンスと分っているなら、Data::Dumper使わずにハッシュの時と同様に書いても良い。
while (my($attr, $val) = %$obj) {
print $attr, " => ", $val, "\n";
}
889 ◆TWARamEjuA :2005/07/16(土) 21:26:43 BE:2614346-#
>>887
5.005なのね('・c_・` )
890デフォルトの名無しさん:2005/07/16(土) 21:41:26
皆様どうもありがとうございます。
逝ってきます。。
891デフォルトの名無しさん:2005/07/17(日) 00:31:29
ところで今はどのバージョンのPerlをメインに語ったら良いのかね。
ここで紹介されてる解決策も
バージョンによって動いたり警告でたりエラーになったりするはず。
妥当な所って5.6くらい?
それとも5.8系まで行って良いのかな

仕事でperl使う場合には入ってるのが5.005だったりするだろうし
(安定動作してる、ちょっと古い鯖のプログラム修整・追加とか)。
892デフォルトの名無しさん:2005/07/17(日) 00:56:05
とりあえず基本は最新の安定版5.8系で、仕事・借りてるサーバの
都合でそれ以外の場合は最初に明記ってのが無難じゃないかな?
893デフォルトの名無しさん:2005/07/17(日) 07:34:09
>>858-881
なにこの流れ

式全体が値を返す場合以外は三項演算子を使うべきじゃないだろ
ifを使えよ…
894デフォルトの名無しさん:2005/07/17(日) 08:40:58
>>893
>使うべきじゃないだろ
ソス-キボンヌ
895デフォルトの名無しさん:2005/07/17(日) 09:06:15
>>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を試すことができるでしょうか?
897896: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から該当する何かをダウンロードしてからでないといけないという意味でしょうか・・・・。
898デフォルトの名無しさん:2005/07/17(日) 14:09:11
>>896
Perl6はまだリリースされていませんよ?
899デフォルトの名無しさん:2005/07/17(日) 14:44:24
されていないみたいですが
試すことができると思いまして
どんなものか実際に動かしてみたいんです。
900デフォルトの名無しさん:2005/07/17(日) 15:39:29
perl6との違いを見抜けない人は(parrotを使うのは)難しい。
901デフォルトの名無しさん:2005/07/17(日) 23:02:53
んじゃ、Perl6::Pugs
902デフォルトの名無しさん:2005/07/17(日) 23:49:25
Perlでプログラミングする際につけるべきプラグマって
strict以外に何かありますか?

903デフォルトの名無しさん:2005/07/18(月) 00:37:19
>>902
warnings
904デフォルトの名無しさん:2005/07/18(月) 05:52:49
print "abc"

って打つと、コマンドプロンプトで実行すると一瞬で文字が表示されるけど
これをゆっくりなめらかに表示させる方法ないですかね?
905デフォルトの名無しさん:2005/07/18(月) 05:57:58
>>904
> って打つと、コマンドプロンプトで実行すると一瞬で文字が表示されるけど
> これをゆっくりなめらかに表示させる方法ないですかね?
1文字ごとにwait入れろよ。
906デフォルトの名無しさん:2005/07/18(月) 06:45:05
>>905
$|=1; も必要だ、と書いてやれよ。
907デフォルトの名無しさん:2005/07/18(月) 07:17:29
GNU dateコマンドみたいに、日付操作に関する万能モジュールってありますか?
908デフォルトの名無しさん
>>907
あります。