Perlについての質問箱 ..
[2ch|▼Menu]
363:デフォルトの名無しさん
07/04/26 22:17:39
>>346
CGI言語と来たか・・・。

本当に作ってしまって混乱させるというのはどうか?
もちろんその言語はクライアントマシンの限られた
中でしか使えず、 Web の CGI になんて使えないのだ。


364:デフォルトの名無しさん
07/04/26 22:18:42
Common Graphics Interface とかいう紛らわしいグラフィック操作用言語を新たに作る。


365:デフォルトの名無しさん
07/04/26 23:07:10
parrot上で走らせたらもっと混乱の元に。

366:デフォルトの名無しさん
07/04/26 23:15:11
コモン グラフィックス インタープリター

池袋で乗車してきた女の子がハロプロエッグの子とかたかまりこ

367:デフォルトの名無しさん
07/04/27 11:39:27
ついでだ。IT言語というのも作ってしまえ。


368:デフォルトの名無しさん
07/04/27 11:57:03
そろそろここは質問箱だということを思いだそう。

369:デフォルトの名無しさん
07/04/27 15:28:36
そういえば Perl の質問がないなあ・・・。


370:デフォルトの名無しさん
07/04/27 15:34:31
Chanto Gugure Internet de


371:デフォルトの名無しさん
07/04/27 17:29:18
perlってグーグル八分されてるんだってね

372:デフォルトの名無しさん
07/04/27 18:13:20
WindowsでDOSコマンドの結果を取り込むには、
どうすればよろしいでしょうか?例えば、
dir c:\trash
の結果を取り込もうとしても、次のスクリプトではうまくいきません。

$files = `dir c:\\trash`;
print "The files are $files\n";


373:デフォルトの名無しさん
07/04/27 18:43:53
GW前に出された宿題で質問が増えるから大丈夫w

374:デフォルトの名無しさん
07/04/27 18:53:55
>372
手元だとそれでうまくいってるけど。

375:372
07/04/27 20:04:12
>>374
すみません。書き忘れていました。>>10にある先頭の5行を入れていました。
use utf8;
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)";

「use open IO => ":encoding(cp932)"; 」の行を削除して
次のように修正すると動きました。
use Encode;
$orgfiles = `dir c:\\trash`;
$files = decode('cp932', $orgfiles);
print "The files are $files\n";


376:デフォルトの名無しさん
07/04/27 21:23:44
>>372

例によって cmd.exe /c dir ... じゃない?


377:デフォルトの名無しさん
07/04/27 21:24:53
失礼、関係なかったのね。


378:デフォルトの名無しさん
07/04/27 21:35:08
>371
記号が多いから、とか?

379:デフォルトの名無しさん
07/04/27 22:21:10
>>378
うんにゃ、LWPのUAがはじかれる件でしょ?


380:デフォルトの名無しさん
07/04/27 22:23:19
>>378
Perlで書かれたボットの多くがLWPのデフォルトUser-Agentをそのまま名乗って
おり、403を食らうようになった。当然だがUAを変えれば通れる。


381:デフォルトの名無しさん
07/04/27 22:24:27
Google八分ってのは、Googleの検索結果に出なくなる話だから、
今回のそれとは違うよな。


382:デフォルトの名無しさん
07/04/27 22:30:29
新しく覚えた言葉を使ってみたかっただけだろ
そう責めるな

383:デフォルトの名無しさん
07/04/28 00:19:39
perlのモジュールって一気にアップデートできないの?
それとも使う奴だけ手動でアップデートさせるしか方法ない?

384:デフォルトの名無しさん
07/04/28 00:39:19
>383
cpanシェルでupgrade

385:378
07/04/28 01:18:47
Perlに限らないけど、プログラミング言語の仕様として存在する演算子や記号は検索しづらいよなあ。

386:デフォルトの名無しさん
07/04/28 03:22:17
不満を抱えるものが改善する。それが基本である。

387:デフォルトの名無しさん
07/04/28 05:09:49
でもそれを誰かが改善したらPythonっぽい何かになるからPythonでいいよねw

388:デフォルトの名無しさん
07/04/28 17:56:47
比較演算子は記号じゃなくて文字列にすりぁいいんだよな
Pealのeqとかみたいにさ

389:デフォルトの名無しさん
07/04/28 19:26:07
>>380
なったと言っても数年前からだよ。
今頃騒いでるやつらはアンテナが低すぎると思ったのだった。

390:デフォルトの名無しさん
07/04/29 01:57:47
struct {
 char len1;
 char word1[len1];
 char len2;
 char word2[len1];
 char len3;
 char word3[len1];
}

みたいな構造の可変長のバイナリなデータがあるんですが、
これをperlで綺麗でかっこよく展開する方法ってないですか?

今は下のようなことをしてるのですが、なんか見辛いし汚いので…

$data = "\4ABCD\3EFG\7HIJKLMN";

($len1,$data) = unpack("Ca*",$data);
($word1,$data) = unpack("a${len1}a*",$data);
($len2,$data) = unpack("Ca*",$data);
($word2,$data) = unpack("a${len2}a*",$data);
($len3,$data) = unpack("Ca*",$data);
($word3,$data) = unpack("a${len3}a*",$data);

print "$word1\n$word2\n$word3\n";

391:デフォルトの名無しさん
07/04/29 03:40:49
少なくともループ構造にするべきだと思う

392:デフォルトの名無しさん
07/04/29 04:06:37
>>390
perldoc -f pack して目を皿のようにして熟読せい。

The "/" template character allows packing and unpacking
of strings where the packed structure contains a byte
count followed by the string itself. You write
*length-item*"/"*string-item*.



393:デフォルトの名無しさん
07/04/29 05:12:56
>>392
あああああ、そんなテンプレートがあったんですね。
日本語の5.6ベースのman見てたので気づきませんでした…
ありがとうございます。

394:デフォルトの名無しさん
07/04/30 02:59:39
>>393
あ、すまん。
5.6からの拡張だと思ってたが、違ったか(393には問題ないみたいでよかった)。

395:デフォルトの名無しさん
07/05/01 17:38:05
ファイル内の文字列を置換するスクリプトを書いているところなのですが、
「置換する」「置換しない」(飛ばす)「残り全て置換」「キャンセル」という
処理を行うにあたって、見つけた文字列を置換せずに飛ばして次を置換する
方法が思いつきません。置換しないテキストは適当な文字列に置換しておいて
最後に戻すという方法も考えたのですが、あまりスマートではないと思いまし
た。何かよい方法があったら、お知恵をお貸しください。

while($text =~ /($regexp)/) {
if($all == 0) {
$before = $1;
$after = $1;
$after =~ s/$regexp/$replace/m;
print "置換前:\n$before\n置換後:\n$after\n";
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>;
chomp($key);
} while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g");
if($key eq "y"){
$text =~ s/$regexp/$replace/m;
}elsif($key eq "n"){
# ここをどうする?
}elsif($key eq "a"){
$text =~ s/$regexp/$replace/gm;
$all = 1;
}else{ exit; }
}elsif($all == 1) {
$text =~ s/$regexp/$replace/gm;
}
}


396:395
07/05/01 17:39:43
補足です。$textはファイルの内容、$regexpは置換前の文字列、$replaceは
置換後の文字列です。

397:デフォルトの名無しさん
07/05/01 17:51:02
>>395
ヒント: posと\G

perl -e '$x = "aaaaaa"; pos($x) = 2; $x =~ s/\Ga/x/; print $x,"\n";'
aaxaaa


398:395
07/05/01 21:09:08
ありがとうございます、無事できました。コードはこのようになりました。(たぶん問題ないはず…)
$p = 0;
while($text =~ /\G(?:.*\n)*?.*?($regexp)/gm) {
$p = pos($text) - length($1);
pos($text) = $p;
if($all == 0) {
$before = $1;
$after = $1;
$after =~ s/$regexp/$replace/m;
print "置換前:\n$before\n置換後:\n$after\n";
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>; chomp($key);
} while ($key ne "y" and $key ne "n" and $key ne "a" and $key ne "g");
if($key eq "y"){
$text =~ s/\G$regexp/$replace/m;
pos($text) = $p + length($after);
}elsif($key eq "n"){
pos($text) = $p + length($before);
}elsif($key eq "a"){
$text =~ s/\G$regexp/$replace/gm;
$all = 1;
}else{
exit;
}
}elsif($all == 1) {
$text =~ s/\G$regexp/$replace/gm;
}
}


399:デフォルトの名無しさん
07/05/01 21:31:38
\Gの使い方がおかしいような
最後の全置換は絶対うまくいかんだろ

400:デフォルトの名無しさん
07/05/01 22:01:18
せっかく書いたんだからたぶんとかいってないで動かしてみるべきだな。

401:395
07/05/01 22:02:38
すみません、やっぱ問題がありました。置換位置\Gが正規表現に含まれている
と、置換される文字列に改行が含まれている際に、オプション"g"をつけても
複数置換してくれなくなってしまうのですが、どうすればいいんでしょうか。

perl -e '$text = "a\na\na"; $text =~ s/\Ga/b/gm; print "$text\n";'
結果:
b
a
a

perl -e '$text = "aaa"; $text =~ s/\Ga/b/gm; print "$text\n";'
結果:
bbb

perl -e '$text = "a\na\na"; $text =~ s/a/b/gm; print "$text\n";'
結果:
b
b
b

402:デフォルトの名無しさん
07/05/01 22:23:56
\Gは置換文では使わないほうがいいよ。代入されるとposがリセットされてしまうから
あとを置換しながらposを保持することはできないのでコピーを作ることを考えてみては
自分ならこう書く

my $replaced_text;
pos $text = 0;

while (pos $text < length $text) {
 if ($text =~ m/\G $regexp/gcsx) {
  # ここで入力による分岐処理を行う



 }
 elsif ($text =~ m/\G(.+?) (?=$regexp)/gcsx) {
  $replaced_text .= $1;
 }
 else {
  $text =~ m/\G (.*)/gcsx;
  $replaced_text .= $1;
 }
 





403:デフォルトの名無しさん
07/05/01 22:28:17
s///gが一種のループなのでこんな手もある。
my $mode;
$text =~ s{($regexp)}{
my $r;
if (!defined $mode) {
my $key;
do {
print "置換する? [y]es [n]o [a]残り全て [g]キャンセル ";
$key = <STDIN>;
chomp($key);
} while ( $key ne "y"
and $key ne "n"
and $key ne "a"
and $key ne "g" );
if ($key eq 'y') {
$r = $replace;
} elsif ($key eq 'n') {
$r = $1;
} elsif ($key eq 'a') {
$mode = 'a';
} else {
$mode = 'g';
}
}
if ($mode eq 'a') {
$r = $replace;
} elsif ($mode eq 'g') {
$r = $1;
}
$r;
}gme;

404:395
07/05/01 23:34:11
>>402-403
おお、これはすごい、正規表現でループができるんですね。
>>403の方法できれいなスクリプトになりました。ありがとうございます。

405:デフォルトの名無しさん
07/05/02 03:13:40
CPANシェルについてなんですが、
インストールするごとに[1]とか[2]とか増えるのはなんなんでしょうか?


406:デフォルトの名無しさん
07/05/02 03:44:02
>>405
現在実行したコマンドを識別するIDみたいなもの。
何に使ってるかまでは見てないけど。
ちなみに↓とやるとIDを変えてしまうこともできる。特に意味はない。
cpan[1]> ! $CPAN::CurrentCommandId = 100;

407:デフォルトの名無しさん
07/05/02 05:56:50
>>406
レスありがとうございます。
そうなんですか。

なんか Bundle::CPAN をインストールしてからそうなったような気がしたので、
間違えたかと思いました。
そのような情報ってどこで得ているのでしょうか?

408:デフォルトの名無しさん
07/05/02 09:35:32
モジュール(lib/CPAN.pm)のコードを読む。

409:デフォルトの名無しさん
07/05/02 14:03:43
>>406
知らないけど、ヒストリ用では?

よくUNIX用のシェルであるんだけど、 ! の直後にその番号入れて
実行するとその番号のコマンドが動くんだよ。全く同じなら再入力
する必要がないの。(更に後ろに :s/// のようなのを付けて文字列
置換できたりもする。 !30:s/aa/bb/ みたいな。全てのシェルが
同じこと出来るかどうかは知らないが)。


410:デフォルトの名無しさん
07/05/02 21:18:49
cpanpのメリットがイマイチわからん

411:デフォルトの名無しさん
07/05/02 21:20:37
最近CPAN.pmがだいぶ進化したからCPANPLUS.pmの意義が相対的に薄くなったしねー

412:デフォルトの名無しさん
07/05/03 06:35:39
awkは多少かじったのですが、perlはまるっきりの初心者です。どなたかお知恵を貸して下さい。
2つのファイル a.txt と b.txt を比較して、条件にあった行を抽出、出力するスクリプトを作りたいのです。

具体的には、
[a.txt]
ID, field1, field2
1, 5.8, 7.3
2, 6.3, 8.2
3, 3.2, 4.1
4, 4.8, 4.0
5, 8.3, 10.2

[b.txt]
ID, field1, field2
1, 6.8, 7.7
3, 4.3, 5.5
4, 5.9, 4.9

というファイルがあったとき、b.txt のIDに数値が存在する行だけを a.txt から抽出して a2.txt として保存したいのです。

[a2.txt]
ID, field1, field2
1, 5.8, 7.3
3, 3.2, 4.1
4, 4.8, 4.0

と言った具合にです。よろしくお願いします。

413:デフォルトの名無しさん
07/05/03 07:47:00
#!/usr/bin/perl
use strict;
use warnings;
open my $a, '<', 'a.txt' or die;
open my $b, '<', 'b.txt' or die;
my %ids = map { $_ => 1 } map { (split /,/)[0] } <$b>;
while (<$a>) {
    my $id = (split /,/)[0];
    print if $ids{$id};
}

414:412
07/05/03 08:00:05
>>413さま
 早速のレス、ありがとうございます。助かりました。
 こんなに簡単にできちゃうんですね。しかし、私にはスクリプトの内容は不明...。解読して勉強させていただきます。

415:デフォルトの名無しさん
07/05/03 13:36:22
use IO::File;

sub func {
my $file = shift(@_);
my $input = IO::File->new($file,"r") or die;
ごにょごにょ
  ・
  ・
}

$filename = (ディレクトリからファイルネームをとるロジック);
&func($filename);

みたいに書くと、一番最初にいきなりファイルオープンのエラーが出ます。
その後、ファイルネームをとるロジックが走ってる模様…。
何故か解らないのですが原因解りますでしょうか。

416:デフォルトの名無しさん
07/05/03 13:48:01
>>415
原因はわかりますよ。
あんたが、そう動くようにプログラムを作ったから。

417:415
07/05/03 13:53:53
>>416
早い回答ありがとうございます。
やっぱり自分が悪いんですね。
調べてみます。

418:415
07/05/03 14:26:25
うーんやっぱり解らない…。
サブルーチンが先に実行される事なんてあるのか…?

419:デフォルトの名無しさん
07/05/03 14:50:10
>>415
まあエラーメッセージでも貼ってみ

420:415
07/05/03 15:05:12
>>419
そのようなファイルやディレクトリはありません at (何行目)
としか出ないんですが…。

421:デフォルトの名無しさん
07/05/03 15:08:03
>>420
訳したりせずにそのまま貼れ

422:415
07/05/03 15:16:54
そのようなファイルやディレクトリはありません at test.pl line 32.

だけです。
CentOS4.4、perl5.8.5です。

423:415
07/05/03 15:30:01
フルパス指定してなかった…。

>>422さん、親身になってくれてありがとうございます。
くだらないミスで申し訳ありません。
本当にすみませんでした。

424:デフォルトの名無しさん
07/05/03 15:40:40
>>423
s/422/421/g;

425:デフォルトの名無しさん
07/05/03 15:47:38
突っ込みどころはいろいろあるけど、エラーメッセージは自分のためにも他人のためにもわかりやすくすべし。

my $fp_in = IO::File->new($filename, "<") or die qq(cannot open '$filename': $!);


426:415
07/05/03 16:07:57
>>425
了解です。ただ or die $!;だけしてました。
連休中にコメントありがとうございました。

427:デフォルトの名無しさん
07/05/05 14:17:50
chompって何の略ですか?


428:デフォルトの名無しさん
07/05/05 14:26:54
>>427
略じゃないよ。
噛み切るとかそんな感じ。


429:デフォルトの名無しさん
07/05/05 14:41:24
chomp 【自動】 〜をムシャムシャ食う◆【同】champ

430:デフォルトの名無しさん
07/05/05 14:43:41
へー。ありがとうございました。

431:デフォルトの名無しさん
07/05/05 15:30:31
オブジェクト指向で書いていないので、巨大モジュールの分割がうまいこといかんのです><
具体的には、親パッケージが子パッケージをuseしているとき、
子パッケージから親パッケージのサブルーチンを呼べません。

Giko.pm
[-------
 package Giko;
 use Giko::Mona;
 (omaemonaサブルーチンをEXPORTしている)
 sub omaemona { .... }
-------]

Giko/Mona.pm
[-------
package Giko::Mona;
-------]

となっていた場合、
Giko::Monaの中でomaemonaを呼ぶ方法は、Giko::omaemonaしかないでしょうか?
Giko::Monaでuse Gikoはできないし、use base 'Giko';は違うみたいですし。

432:デフォルトの名無しさん
07/05/05 17:12:46
Encodeモジュールのfrom_toを用いて
「@」「A」や「T」「U」などを
sjis <-> euc-jp 変換すると文字化けしてしまいます。

回避するにはどうすればいいでしょうか?


433:デフォルトの名無しさん
07/05/05 19:33:33
>>432
つEncode::EUCJPMSのcp51932


434:デフォルトの名無しさん
07/05/05 20:32:56
それは拡張文字なので、 sjis じゃなく cp932 を指定。

435:デフォルトの名無しさん
07/05/05 20:40:22
単純に分割するなら、全部同じ名前空間に展開すればいいんじゃない

Giko/Mona.pm
[-------
package Giko::Mona;
package Giko;
-------]


436:431
07/05/06 01:14:39
遅レスで申し訳ないです。
>>435
なるほど。
まとめると巨大ファイルになりがちで不安だったのですが、
今のところはまだなんとか1ファイルにまとめられそうなので、
同じファイルスコープで仲良く共存してみます。
ありがとうございました。

437:デフォルトの名無しさん
07/05/06 17:12:14

    ( split /\//, $x )[0 .. bar];

リストの末尾要素を除いたリストを返す方法、知りませんか?
barをどう記述すりゃいいのやら。

Perl ならできそうな気がするんですが。思い当たりません。
検索してみたものの、それらしいものも見つけられません。

438:デフォルトの名無しさん
07/05/06 17:31:22
( @hoge, undef ) = split //, $foo ;
じゃダメなの?

439:デフォルトの名無しさん
07/05/06 17:43:01
>>437
尻尾だけ消すのじゃだめなの?

440:デフォルトの名無しさん
07/05/06 17:44:40
最後から2番目の要素をひとつ抜き出すだけなら (〜)[-1]
でいいんだけど、範囲演算子で(〜)[0..-1]とは書けないんだよな。

配列変数なら@x[0..$#x-1]という書き方もあるが、リストでは$#xに
相当するものが書けない。

とりあえずおもいついたのはこれ。

sub{@_[0..$#_-1]}->(〜)


441:デフォルトの名無しさん
07/05/06 18:03:14
>>437
@list = split(/\/(?=.+\/)|\/.+$/, $x)

とかやってないで、全部入れてから$#list--すればいいんじゃね?

442:デフォルトの名無しさん
07/05/06 18:31:19
>>429
首チョンパの略と思ってた

443:デフォルトの名無しさん
07/05/06 18:38:52
まずchopありき。
やがてより安全なchomp生まれり。

444:デフォルトの名無しさん
07/05/06 18:52:28
え…普通にpop関数じゃだめなの

445:デフォルトの名無しさん
07/05/06 19:51:31
popの第1引数は左辺値つーかARRAYじゃないと×じゃ?


446:デフォルトの名無しさん
07/05/06 20:19:01
splice @{[split /\//, $x]}, 0, -1 というのはどうだ


447:デフォルトの名無しさん
07/05/06 20:35:56
ちょんぱ

448:デフォルトの名無しさん
07/05/06 21:07:48
# 悪い例
(split /\//, $x)[0..(split /\//, $x)-2]

449:デフォルトの名無しさん
07/05/06 21:21:14
>>448
scalar contextのsplitは@_を上書きしちゃうからねぇ。


450:デフォルトの名無しさん
07/05/06 22:19:22
(split m{/})[0..(s{/}{/}g)-1]

451:デフォルトの名無しさん
07/05/07 00:17:23
みんなよく頑張ったな。先生感心したぞ。

my $str = 'foo/bar/baz/quux';
sub p { printf ">>%d:[%s]\n", shift, join ',', @_ }

p(438, (my @arr, undef) = split m{/}, $str);
p(439, do { @arr = split m{/}, $str; pop @arr; join ',', @arr }); # & >>444-445
p(440, sub { @_[ 0 .. $#_ - 1 ] }->(split m{/}, $str));
p(441, split m{/(?=.+/)|/.+$}, $str);
p(446, splice @{[ split m{/}, $str ]}, 0, -1);
p(448, (split m{/}, $str)[ 0 .. (split m{/}, $str) - 2 ]);
p(450, (split m{/}, $str)[ 0 .. $str =~ tr|/|/| - 1 ]);
p(451, $str =~ m{(.+?)/}g);

452:デフォルトの名無しさん
07/05/07 00:52:33
>>451
my $str = 'foo/bar/baz/quux';

my $str = '/foo/bar/baz/quux/';

にすると、いろいろ違いが出てくるね。


453:デフォルトの名無しさん
07/05/07 00:58:21
>>451
重箱の隅つつき。

p(451 の行の正規表現。(.+?) ではなく(.*?) でなければ
split を用いた他の例と挙動が違うぞ。
$str = q{/foo/bar/baz/quux} で確かめろ。


454:437
07/05/07 01:10:11
多くのお返事ありがとうございました。

>440
単純な範囲演算子で記述できそうに思った私が考え足らずだったようです。
sub { @_[0 .. $#_ - 1] }->(split /\//, $x) は見た目にわかり易いですね。
いろいろ応用できそうだし。しかし、私は露とも思い至りませんでした。

>441
まぁ、そうなんですよね。

$file = "/usr/local/bin/bar"; # ファイル名が与えられて。。。
$fold = join "/", 〜split /\//, $file を使った記述〜; # フォルダ名を得る。

ここで余分に変数を使わず、可読性も損なわない方法がありそな気がしたもので。

>446
splice の第一引数はARRAYしかダメだと諦めてしまったのです。
リファレンスについて熟知すると、こんなやり方に気付くんですね。

自分の頭の硬さとリファレンスに対する理解の浅さを恥じて
精進したいと思います。
まず、>440 さんと >446 さんの方法、どっちを使うか悩みます。

455:デフォルトの名無しさん
07/05/07 01:17:53
>>454
いいからFile::Specを使え。

456:デフォルトの名無しさん
07/05/07 01:19:48
>>454
いや、可読性が低下するから、いったん配列に入れてからスライスした方がいいと思うぞ
上のは遊びなんだから

457:デフォルトの名無しさん
07/05/07 02:28:37
こういうよくありそうな処理が案外スラっとかけないもんなんだね。
Dだと [0 .. $ - 1] でいけるんだが。

458:デフォルトの名無しさん
07/05/07 05:57:16
>>456
しかし落ち着いて俯瞰すればこういう雑用の可読性を気にする時点でそのソース全体が残飯ですね。

459:デフォルトの名無しさん
07/05/07 08:33:53
超初心者でふが良いですか?

標準のキーボードから入力を受け取ってどうやれば入力を反映させれるかわからないです・・・

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ"};
};

↑これでは3を入力するたびに、これはこねこって出てくるんですが、

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while(<>){
if($_=m/3/){print"これはこねこ";$kyara=3}
elsif($_=m/2/){print"これはゴーレム";$kyara=2};
};

これのelsif文が実行されないぽいんですがなんででふか?

頭硬くてすみません・・・

460:デフォルトの名無しさん
07/05/07 09:30:09
> $_=m/3/
でなにをやっているのか良く考えてみ。


461:デフォルトの名無しさん
07/05/07 11:52:54
>>460さん>
$_=m/3/ の部分を$_==3 にすると、うまく行きました!

最初$_==3でエラーが出て、良くわからなくて正規表現にすればうまくいくかなとか思って$_=m/3/に直して、(他の部分も少し直して、)それで3の時うまくいったのでてっきり正解かと思いこんでました。

$_=m/3/を$_==3と同じ意味で使ったつもりだったけど、動作は違うんですね。
もうちょっと調べてきます。
ありがとうございました。

462:デフォルトの名無しさん
07/05/07 12:40:19
うまくいきました!
正規表現、はじめてで意味もよく知らずに=m/3/とかしてたけど、=~/3/とするのが正しかったんですね(汗
==3にすると数字以外の時の入力で(変数は数字ではありませんみたいな)無駄なエラーが出たけど=~/3/ならそういう変なエラーも出ないみたいなので=~/3/を使うことにしました!


$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3/){print"これはこねこ";$kyara=3}
elsif($_=~/2/){print"これはゴーレム";$kyara=2}
elsif($_=~/1/){print"これはドラゴン";$kyara=1};
};

もうちょっとがんばってきます!

463:連カキスマソ
07/05/07 13:11:33
もうちょっとがんばってきました(滝汗
if($_=~/3/){処理1}
elsif($_=~/2/){処理2}
とすると、3でも23でも32でも先に$_=~/3/にマッチしてしまう(32なんかは$_=~/2/にマッチさせたい)ので、ちょっと修正しました。


#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
$kyara=4;
while($kyara==4){
$_=<STDIN>;
if($_=~/3$/){print"あなたはお昼ね好きのこねこを選びました☆";$kyara=3}
elsif($_=~/2$/){print"あなたはお人よしのゴーレムを選びました☆";$kyara=2}
elsif($_=~/1$/){print"あなたは気の強いドラゴンを選びました☆";$kyara=1};
};
print "(番号=)$kyara";


これなら33111とかって入力でも3ではなく1のドラゴンとして判断してくれます☆

正規表現って便利ですね☆

>>460さん、アドバイスdクスでした!

464:デフォルトの名無しさん
07/05/07 13:18:31
一つ攻略おめ
そこで更に便利な連想配列をどうぞ

465:デフォルトの名無しさん
07/05/07 13:19:13
あっ、この場合だったら配列だけでいいのか

466:460
07/05/07 16:10:24
462

なんか前向きなやつだなw
どっかの知恵袋のとは大違いだ。

ちょっと補足しておくと、Perlの場合処理対象の
変数を省略できることが多い。
たとえば $_ =~ /1/ なら /1/とか。
$_ = m/1/ と書いちゃうと、マッチの結果を
$_ に代入と解釈されて前の値を壊しちゃう。
ほかにもいろいろあるが長くなるので書かない。
まあがんばれ。



467:デフォルトの名無しさん
07/05/07 16:18:01
>>459のチラ裏日記は、他人が見ても役に立ちそうだな。続けてくれ。

468:デフォルトの名無しさん
07/05/07 17:04:17
てか
$inkey = <STDIN>;
これで読み取ったときって改行コード入ってない?
そこらへんも気をつけたほうがいいかな

469:デフォルトの名無しさん
07/05/07 17:27:02
XML::Parser::PerlSAX のエラーハンドリングについて、どなたかご存知でしたら教えてください。
Parse対象のXMLにエラーがあった場合に、ユーザー関数をコールバックさせようと考えています。

デフォルトだと
mismatched tag at line **, column **, byte ***, at
/user/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/XML/Parser.pm
line 187

のように出力されてdieします。



470:デフォルトの名無しさん
07/05/07 17:27:31
URLリンク(search.cpan.org)

をみると、ParserがnewされるところでErrorHandlerに自分で作ったもの(例えばMyErrorHandler等)を指定すればよさそうなのですが、具体的になんという名前の関数を用意し、どのタイミングで呼び出されるかなど、よくわかりませんした。

すみませんが、どなたかお分かりでしたらアドバイスをください。


471:デフォルトの名無しさん
07/05/07 18:14:52
使ったことないので分からんけど
ErrorHandlerに無名サブルーチンを渡しておけばパースに失敗したときにコールバックしてくれるんじゃないの?

472:デフォルトの名無しさん
07/05/07 18:37:28
>>470
俺も使ったことないけど、フツーに考えて
$parser->{ErrorHandler}で例外をキャッチできるってことなんじゃなないの?

473:デフォルトの名無しさん
07/05/07 18:59:18
>>466さん&>>468さん>
dクスです!参考にして少し書き換えました!

#!/usr/local/bin/perl -w
require 'jcode.pl';
print"あなたはどれを使いますか?<br/>\n1:ドラゴン<br/>\n2:ゴーレム<br/>\n3:こねこ<br/>\n";
while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

if($kyara==1){print"あなたはお昼寝好きのこねこを選びました☆"}
elsif($kyara==2){print"あなたはお人好しのゴーレムを選びました☆"}
elsif($kyara==3){print"あなたは強気なドラゴンを選びました☆"};

while (<>){};

こんな感じに☆

>>464さん>
必要になってからがんがります☆(コラ

474:デフォルトの名無しさん
07/05/07 19:00:38
あ、よく見たら、ドラゴンとこねこが逆(汗

475:デフォルトの名無しさん
07/05/07 19:10:56
キメラは?キメラはいないの?

476:デフォルトの名無しさん
07/05/07 19:14:49
1しか押さないだろこれは・・・

477:デフォルトの名無しさん
07/05/07 19:27:33
>>475が「イサキは?」に見えた。
配列や printf を覚えて欲しくなるけど、楽しみながらコツコツやってそうでいいな。

478:デフォルトの名無しさん
07/05/07 19:38:06
>>475
ああ、大きなキメラが入るよ。 今年一番の大幅改良だ。

479:デフォルトの名無しさん
07/05/07 21:43:44
たった今Perlにprintfやsprintfがあることを知った。
俺は車輪を10も20も発明していたらしい。すばらしい!

480:デフォルトの名無しさん
07/05/07 23:31:32
むしろ、どういうルートで習得していけば
そいつらと鉢合わせずに済むか、を考えるのが難しいかも。

481:473
07/05/07 23:32:46
質問してもいいでしょうか。。

print system("cls");
と書くと、PCではちゃんと画面クリアしてくれるんですが、サーバにアップしたら画面クリアしてくれませんでした。
ブラウザの画面をクリアする方法って無いんでしょうか・・?

あと、サーバにアップしたら、

while (<>){
if (/[1-3]$/) {chop;$kyara=chop;last;}
};

という部分も全て無視されました。
たぶん、while(<>)の部分がサーバでは無視されてしまってるんだと思うんですが、
どうすれば良いですか?
HTMLでフォームを表示させてそこから入力させるしか無いのでしょうか?

482:デフォルトの名無しさん
07/05/08 00:03:55
clsはWinのコマンドだし (一応リンクは張ってはあるらしいが・・・)、
そもそも 「コンソールとブラウザの挙動を勉強してください」 としかいえない


ブラウザに対して print ""; でえぇんとちゃうのんかと


STDIN になんもデータ無いからあたりまえです

483:デフォルトの名無しさん
07/05/08 01:16:20
これはどう見ても新手の荒らし

484:デフォルトの名無しさん
07/05/08 02:59:42
>>481
荒らし以前に板違い。>>1

485:デフォルトの名無しさん
07/05/08 05:32:43
すみません。
CGI以外の純粋なperlのみって書いてありますね。
気をつけます。

>>482
なんとなく理解しました。
clsをclearとしても無理だったので普通にフォームからの入力にします。

ご迷惑かけてすみませんでしたm(__)m

486:デフォルトの名無しさん
07/05/08 09:09:04
>>478
「大幅改良っ!!キメラぁぁ!!おにいちゃんかっこいいいいぃぃぃい ぃくううううう!」

487:デフォルトの名無しさん
07/05/09 14:52:59
>>481
JavaScript 埋め込んでクリアすれば良いんじゃない?


488:デフォルトの名無しさん
07/05/10 13:07:53
すみません、
・ローカル変数の一覧を取得する方法
・ハッシュの内容をローカル変数に一括して設定する機能(PHPのextract()関数に相当する機能)
があれば教えてください。

489:デフォルトの名無しさん
07/05/10 13:32:01
>>488
use Dumpvalue とか。

hashの展開はこんなんでいけるだろ。
while (($key, $value) = each %hash) {
eval("\$$key = \$value");
}
ただし任意のキーが使われる場合はexploitになるんで別の方法で。

490:デフォルトの名無しさん
07/05/10 13:56:22
デバッガでも作ろうというのでなければハッシュのまま使ったほうが
いいと思うよ。たぶんろくなことにならない。


491:デフォルトの名無しさん
07/05/10 14:20:02
cpanなしでHTML::Entitiesをインストールする方法を教えていただけませんか。
「Perl "HTML::Entities" インストール」でぐぐってもヒットせず困ってます。

492:デフォルトの名無しさん
07/05/10 14:58:35
>>491
OSは?

493:デフォルトの名無しさん
07/05/10 15:06:48
ActivePerl(Win)だと初めから入ってるし、Unix系で「CPANなしで」ってのも
ピンと来ないし何だろう。「レン鯖で使いたい」なのかな。

494:491
07/05/10 15:50:52
>>492
Linuxです。Perl5.8。
>>493
その通り、海外のレンタルサーバーです。
ただ今はロ−カルのMacでやってるんで、CPANにトライしてみたんですが、最初にいろいろ英語できいてきて、適当に答えてたら設定がおかしくなったのか、
cpan install HTML::Entities
がfetchできないとかでインストールできませんでした。
CPANむずい・・・

495:デフォルトの名無しさん
07/05/10 16:01:10
>>494
要するに、ロ−カルのMacにインストールできずに
> CPANむずい・・・
と言ってるわけだ。

こんなこと言っている人がCPANなしでレンタルサーバにインストール
しようってわけね。考えるだけ時間の無駄というものでしょう。

496:デフォルトの名無しさん
07/05/10 16:04:37
>>491
READMEに書いてあるじゃん

497:デフォルトの名無しさん
07/05/10 16:18:17
HTML-Parser-*.tar.gz ひろってきて展開して
perl Makefile.PL && make && make install
だけどcpanの英語がわからんとか言ってるレベルじゃもっと無理じゃね?

498:491
07/05/10 18:34:51
>>497
HTML::EntitiesはHTML::Parserの一部ということでしょうか。
試しにHTML::Parserをインストールしてみると・・・たしかにHTML::Entitiesも印ストールされました。
貴重なヒントをありがとうございました。
#こんな情報どこにあるんですか。URLリンク(www.xav.com) とか見ても書いてないし。

ちなみにHTML::ParserはMacPortsをつかって
sudo port install p5-html-parser
でいけました。CPANは難しくて分からなかった人でもMacPortsなら楽勝!MacPorts万歳!


499:デフォルトの名無しさん
07/05/10 18:37:45
そ、それはよかった

500:デフォルトの名無しさん
07/05/10 19:02:37
>>498
URLリンク(search.cpan.org)

501:デフォルトの名無しさん
07/05/10 19:08:36
>>498
URLリンク(search.cpan.org) をブックマークしておくといいね。

502:デフォルトの名無しさん
07/05/10 19:08:43
>>498
cpanモジュールなんだからcpanで調べろよ。

search.cpan.orgでHTML::Entitiesをサーチすれば一番上に出てくる

URLリンク(search.cpan.org)

を見れば一発でわかるだろ。


503:デフォルトの名無しさん
07/05/10 22:17:13
Tkを使用して、GUIアプリを作成しています。

大きく二つのフレームから構成しています。
1.左フレーム
2.右フレーム

この二つのフレームにそれぞれScrollbarを設けたいのですが、
Frameウィジェットには何故か-yscrollbarオプション等が無く
Scrollbarウィジェットを動作させることができません。
Scrolledで強引に取り付けると、レイアウトがおかしくなります。
どうおかしくなるかというと、

1.Frame内部のウィジェットの配置が決まらない
(HTMLでいう、alignやvalignが効かない)
2.そもそも、実行時にワーニングのような表示が出る(実行はできる)

1.に関しては、スクロールバーを外せば正常に(期待通りに)配置されます。


Tkを使用される方は、こういうフレーム分けしたレイアウトで、
かつ各フレームにスクロールバーを表示させたい場合、どのような
ウィジェットの使い方をされるのか、教えていただけないでしょうか。

504:デフォルトの名無しさん
07/05/10 22:51:49
Paneというものを見つけました。
Tk::Pane provides a scrollable frame widget.
Once created it can be treated as a frame, except it is scrollable.

自己解決です。
スレ汚し申し訳ありません。

505:デフォルトの名無しさん
07/05/10 23:08:52
Tkのことは分からんけど、そういうときはコンテナにしたフレームの中に
それぞれウィジェットを作って、その中で更にスクロールバーを設けるんでないかい

506:デフォルトの名無しさん
07/05/10 23:09:22
ずこー
リロードしときゃよかった

507:デフォルトの名無しさん
07/05/11 02:34:36
($1, $2, $3, $4 ...)
に相当するような配列の表現はありますか?

508:デフォルトの名無しさん
07/05/11 02:56:54
もっと詳しく
できるならやろうと思ってることも

509:デフォルトの名無しさん
07/05/11 03:40:44
($name, $age, $sex) = ($1, $2, $3);
みたいな部分を、
($name, $age, $sex) = @foo;
とかで済ませられないかと

510:デフォルトの名無しさん
07/05/11 05:02:32
これじゃ駄目?

my $str = 'name=名前,age=年齢,sex=性別';
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/;

正規表現がアホなのは見逃して。

511:デフォルトの名無しさん
07/05/11 08:22:51
おお
パターンマッチってリストで評価するとそれが返ってくるんだ
よくできてるなあ

でも、
my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ || next;
という使い方はさすがに無理だった

512:デフォルトの名無しさん
07/05/11 09:18:49
>>511
ヒントは演算子の優先順位

(my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/) || next;

または

my ($name, $age, $sex) = $str =~ /name=(.*),age=(.*),sex=(.*)/ or next;

513:デフォルトの名無しさん
07/05/11 09:34:40
括弧の方にします

普通にパターンマッチをスカラーで評価した時は、
マッチしたかどうかを返すのに対して、
パターンマッチのリストでの評価の代入の評価は、
リストの要素数だから、動作は同じでも意味は違いますよね

514:デフォルトの名無しさん
07/05/11 09:47:23
从*・ 。.・)<SEXよりかはGENDERまたはGENの方がいいかなと思うの

515:デフォルトの名無しさん
07/05/11 11:34:00
ふつう、sex。

516:デフォルトの名無しさん
07/05/11 11:37:09
>>514
入会申込書とかの該当欄に「週2回」って書いたたちか?

517:デフォルトの名無しさん
07/05/11 11:54:30
なにそのゆとりんぐ回答


518:Aransk
07/05/11 13:09:15
>509
何かこちらが勘違いしていたら、ゴメン。
でも、
my @foo=qw(joe 25 male);
my ($name, $age, $sex) = @foo;
print $name,"\n";
print $age,"\n";
print $sex,"\n";
って普通に出来るけど?


519:デフォルトの名無しさん
07/05/11 13:12:30
じゃなくて、マッチングの結果のリストの表現方法のことです

520:デフォルトの名無しさん
07/05/11 13:19:37
ここまで回答出て勘違いするってどういうことだよw

521:デフォルトの名無しさん
07/05/11 17:13:50
>>511
木の実の問題だが、next / last を絡めると途端に可読性が低くなる
気がする。next を絡める予定なら普通に

next if $str !~ /name=(.*),age=(.*),sex=(.*)/ ;
my ($name, $age, $sex) = ( $1, $2, $3 );

でいいじゃんと遅レス。


522:デフォルトの名無しさん
07/05/11 17:41:10
質問です。
Webで拾った以下の数値切り上げ関数を使用しています。
----------------------------------------
$one = ceil(19.1); # $one = 20

sub ceil {
my $var = shift;
my $a = 0;
$a = 1 if($var > 0 and $var != int($var));
return int($var + $a);
}
----------------------------------------

しかし、このceil関数に、(4.4 * 6000)という数値(26400)を引数として計算すると、26401が帰ってきます。
perl -e 'print sprintf("%.50f", (4.4 * 6000));';
を実行すると、
26400.00000000000363797880709171295166015625000000000000
という結果が返ってきました。

これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?


523:デフォルトの名無しさん
07/05/11 17:54:28
なにを期待してるんだ?
そのceil関数は整数じゃなければ1足すってだけだろ

524:デフォルトの名無しさん
07/05/11 17:56:06
>>522
丸め誤差でググっとけ。

perl -e 'print sprintf("%.50f", int((4.4 * 6000) * 1e6) / 1e6);'

525:デフォルトの名無しさん
07/05/11 18:02:20
丸めには銀行方式が絡むか絡まないかがあるから気をつけろ
銀行の丸めは1桁が偶数のときに小数点以下があれば繰り上げだったっけ?
詳細忘れた

526:デフォルトの名無しさん
07/05/11 18:05:36
銀行は四捨六入で0.5のときは一の位を見て切上げか切捨てを行う。
今回は全く関係ない。

527:デフォルトの名無しさん
07/05/11 18:27:48
まず「期待したとおりの切り上げ結果」ってのがわからんのだが。

528:デフォルトの名無しさん
07/05/11 18:34:21
>>522
> これを回避して、期待したとおりの切り上げ結果を返すにはどうすればいいでしょうか?

そんなどこの馬の骨ともわからないサブルーチンを使わずに、CPANで
Math-RoundとかMath-Round-Varとか拾ってきて見てみる。

実地の科学技術計算で使われている、充分な仕様のものがあるはず。

529:デフォルトの名無しさん
07/05/11 19:10:59
付け焼刃的だが
$a = 1 if($var > 0 and $var != int($var));
ここの後半の比較式を
int($var) != int($var+0.9999・・・)
にするとか


530:デフォルトの名無しさん
07/05/11 20:54:42
CPANに落ちてるのも作者が有名人なのを除くと
どこの馬の骨かわからないきがしなくもない



531:デフォルトの名無しさん
07/05/11 21:10:46
>>530
有名な馬の骨もいるから気をつけな。

532:デフォルトの名無しさん
07/05/11 21:20:42
麻雀の丸めは四捨六入

533:デフォルトの名無しさん
07/05/11 21:24:12
>>521
現状はまさにそんな感じなんだけど、
($1, $2, $3) っていちいち書くのがなんか気持ち悪くて
どうせ内部で持ってそうなデータなのに
というのが質問の発端

534:デフォルトの名無しさん
07/05/11 21:25:39
そういえばINT関数って、負の数について、
数直線の右に丸めるか左に丸めるかが
言語によって違うよね

535:デフォルトの名無しさん
07/05/11 21:26:44
それで?

536:デフォルトの名無しさん
07/05/11 22:07:13
あるフォルダ内のファイル(個数や名前は分からない)を一つずつ読んでいくにはどうしたいいでしょうか?

537:デフォルトの名無しさん
07/05/11 22:10:48
ディレクトリを読んで、ファイル名を配列に入れて、
ループで回したら?

538:デフォルトの名無しさん
07/05/11 22:13:24
>>536
use File::Slurp;

してread_dir

539:デフォルトの名無しさん
07/05/11 22:13:51
opendir して、リストに対して readdir するか、readdir を while の中でぶん回して下さい
で、処理後は closedir で後始末を。

サブディレクトリも探したいなら再帰でググればヒントは見つかるかと思います

540:デフォルトの名無しさん
07/05/11 22:16:59
実は glob で>>537の1行めまで片づく要件なのかもしれない。

541:デフォルトの名無しさん
07/05/11 22:25:07
リストに入れないで済むならぶん回した方がいい

542:536
07/05/11 23:47:01
皆さんありがとうございました。
readdirをwhileでぶん回す方法でやってみます

543:デフォルトの名無しさん
07/05/12 00:51:52
サブディレクトリまで検索するならFile::Findを使うのが簡単。
Unixのfindを使ったことがあるならfind2perlでPerlのコードを生成できるよ。

File::Find
URLリンク(search.cpan.org)

544:デフォルトの名無しさん
07/05/12 02:54:05
深さのある配列を左から順番に呼んでフラットな配列を作りたいんですが、
よい方法ご存知の方いませんか
@a = ([1,2,3], [4,5,6], [[7,8],[9,0]]);
@b = flatten(@a); # 1,2,3,4,5,6,7,8,9,0

545:デフォルトの名無しさん
07/05/12 02:58:46
nkfと似たような動作するプログラムってPerlについてなかったっけ?

546:デフォルトの名無しさん
07/05/12 03:16:52
>>544
sub flatten(@) { map { ref $_ eq "ARRAY" ? flatten(@$_) : $_ } @_ }

こんなんどうよ。

547:デフォルトの名無しさん
07/05/12 03:25:10
回答しようとして>>546とほぼ同じ定義を書いていたが、
うごかなくて悩んでた。

eqじゃなくて==を使っていたぜorz


548:544
07/05/12 03:50:18
>>546-547
おお、ありがとうございます。
再帰を使うと意外とすっきり書けるもんですね。
頭が硬直化して思いつきませんでした。
ありがたく使わせていただきます。

549:デフォルトの名無しさん
07/05/12 04:16:20
ActivePerlの時は、File::Findは使わずに自前で書いた方がいいよ。
パスのダメ文字が不完全だから、想定外の動作をする。

550:デフォルトの名無しさん
07/05/12 04:17:18
×パスのダメ文字が不完全だから
○パスのダメ文字への対応が不完全だから

551:デフォルトの名無しさん
07/05/13 02:20:04
例えば「__LINE__ ってどういう意味だったかな?」とかと思ったとき
それをperldocで調べようとすると、どういう風にコマンド叩けばいい?
そういう調べものにはperldocは向かない?

552:デフォルトの名無しさん
07/05/13 03:04:18
podのディレクトリに移動してgrep

553:デフォルトの名無しさん
07/05/13 12:02:01
$perldoc perl
して
Reference Manualのカテゴリーからあたりを見つけられるぐらいには慣れておいても損はないかも

554:デフォルトの名無しさん
07/05/13 14:26:50
my $obj = new Foo::Bar::Baz($arg);
というコードで、クラス名を動的に指定するにはどうしたらいいですか。
$klass = 'Foo::Bar::Baz';
my $obj = eval "new $klass(¥$arg)";
$@ and die($@);
のようにevalを使うしかないのでしょうか。なんかもっとスマートな方法があるような気がします。

555:デフォルトの名無しさん
07/05/13 16:22:37 BE:264938764-PLT(13092)
newする時にevalしなくてもおk
むしろパッケージが別ファイルならロード時にevalしる

my $class = "Foo::Bar";
eval "require $class;"
die $@ if $@;
$class->new;

イマドキはUNIVERSAL::requireなんでしょうけど


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5369日前に更新/220 KB
担当:undef