[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 02/17 02:25 / Filesize : 157 KB / Number-of Response : 572
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 16:47:06 ]
"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。

CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板: pc11.2ch.net/php/)

CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

www.perl.org/get.html
● 2010/02/19 現在の最新版: 5.10.1

▼ 前スレ
Perlについての質問箱 42箱目
pc12.2ch.net/test/read.cgi/tech/1257139591/
リンク集は >>2-3
Perl 日本語処理の基礎の基礎 >>4
過去スレは >>5-7 あたり

411 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:15:49 ]
え?

俺は生粋のマカーだけど、厄介さが全然分からん。
何かトラブるっけ? "〜"って。
Mac<=>Winのデータ交換とかの話し?


412 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:21:41 ]
Macで〜と書き込んだら
Winだと逆向きの波線に見えたり
最近は大丈夫な気はするが

413 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:31:53 ]
〜が厄介なんて、OS9時代の話だろ。
昔から機種依存文字問題とか、今はUTF8-macとUTF-8とか
もっと厄介なモンがあるから。


414 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 16:54:16 ]
OSXでの話だが

415 名前:405 mailto:sage [2010/05/22(土) 17:06:03 ]
皆さんレスありがとうございます。

>>405はmeadowから打ち込んだ〜は\x{301c}となり、
notepad等から打ち込んだ〜は\x{ff5e}になる事が原因で表示に失敗していました。
\x{301c}はshift_jisでは表示に成功しcp932では失敗しました。
\x{ff5e}はcp932では表示に成功しshift_jisでは失敗しました。

どうやらeucとsjisの〜はutf8の\x{301c}に対応していて
cp932の〜はutf8の\x{ff5e}に対応しているようでした。
なので例えばeucの〜をutf8に変換し、それをcp932に変換すると失敗するようです。

挙動がおかしいと思った元のプログラムではネット上にあるeucのページを取ってきて
utf8に変換し出力時にcp932に変換していたので上記の理由で文字化けしていた様です。
そこでeucをutf8に変換した際に\x{301c}を\x{ff5e}に変換するようにしました。
$utf8data =~ tr/\x{301c}/\x{ff5e}/;
そうしたところprintした際に"\x{301c}" does not map to cp932というエラーも出ず、無事〜が表示されるようになりました。

416 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 17:10:30 ]
意味不明

417 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:23:59 ]
>>405
use utf8は「フツーは使うな」とCPANに書いてあった気がする。
Windowsを呪いながらEncode使え。

#!perl
use Encode;

my $msg = "昨日は10時〜6時まで寝た。\n";
Encode::from_to($msg, 'utf8', 'cp932');

print $msg;

418 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 19:39:43 ]
>use utf8は「フツーは使うな」
理由は?

419 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 20:34:20 ]
>>417
>use utf8は「フツーは使うな」とCPANに書いてあった気がする。
どこに書いてあったの?聞いたことない



420 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:01:51 ]
> Do not use this pragma for anything else than telling Perl that your script is written in UTF-8.
もしかしてこれの事か?

421 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 21:08:00 ]
>>417
そのEncodeの作者が
>スクリプトはUTF-8で書き、use utf8;するのがモダンPerlのあり方です。
って言ってるけどな。
ttp://blog.livedoor.jp/dankogai/archives/51221731.html

422 名前:デフォルトの名無しさん [2010/05/22(土) 22:19:22 ]
文字列の切り取りに関して質問があります。
$a="aho";
$b="baka";
$str="ahomanukebaka";
$strには$aと$bで"manuke"という文字が挟まれています。
このとき$strからmanukeだけを切り抜くにはどうすればよいでしょうか?

423 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:24:54 ]
 substr($str, length($a), length($str)-length($a.$b));

424 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 22:48:06 ]
>>422
my $a1 = "aho";
my $b1 = "baka";
my $str = "ahomanukebaka";

$str =~ s/$a1(.*)$b1/$a1$b1/;

warn $str; # ahobaka
warn $1; # manuke

425 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:01:54 ]
失敗してるのに前の$1を読んでしまう

426 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:16:31 ]
>>425
あぁ、ごめん。本当はifとかやるけどmanukeが必要なのかどうなのかわからなくて
とりあえず$1に入ってるよって言いたかった

427 名前:デフォルトの名無しさん mailto:sage [2010/05/22(土) 23:22:02 ]
>>424
できましたありがとうございます!

428 名前:417 mailto:sage [2010/05/23(日) 01:13:47 ]
>>420
それだ。
WWW::Mechanizeでcp932受け付けんからEncode::decode_utf8($massage)とかやってたのに、
use utf8だけで済んだのか・・・・クソアホみたいだわorz


429 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:00:16 ]
正規表現のグルーピングについて質問です
繰り返し表れる対象をグループ化したいのですが良いやり方ありますか?
gオプション付けたら行けるかと思ったらダメだった。

my $str = << 'END';
aba

aca

ada

END

$str =~ m{(a[^a]a)\n\n}g; # これだと初めの対象にしかマッチしない



430 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:23:18 ]
>>429
g(global?)オプションだけでなく
m(multi line?)オプションもいるんじゃなかったっけ

431 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:27:20 ]
>>429
こう?

my @matches = $str =~ m{(a[^a]a)\n\n}g;

432 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:32:54 ]
>>430
$str =~ m{(a[^a]a)\n\n}mg;
これも試したけどダメだったんだよね

>>431
おぉ。いけました。
ちなみに=と=~を一緒に書くとわかりにくいので別にする方法ってありますか?
普通のマッチの場合、下みたいに分けたりしてるのだけどそういう方法があれば教えてください
warn $1 if $str =~ m{(a[^a]a)\n\n}g;

433 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:41:44 ]
>>432
ifをwhileに変えるだけ

warn $1 while $str =~ m{(a[^a]a)\n\n}g;

434 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 13:59:57 ]
gオプションが付いても付かなくても
正規表現に括弧がひとつしかないから、$2と$3は未定義。
ループを回すたびに$1の内容が変わる。

435 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:09:01 ]
my @matches;
push @matches, $1 while $str =~ m{(a[^a]a)\n\n}g;

436 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:25:05 ]
while m//g とか while each %hash って気持ち悪いな

437 名前:429 mailto:sage [2010/05/23(日) 14:34:43 ]
>>433-435
なるほど!ありがとうございます。while使うのかぁ。知らなかった。
perldoc perlreに書いてあるのかなぁって探してみたら書いてあった。勉強になりました。
@matches = ( 'foo' =~ m{ o? }xg );

or

print "match: <$&>\n" while 'foo' =~ m{ o? }xg;
せっかくなのでついでにもう一つ質問ですが、>>430みたいにm付けた場合もやり方がありますか?

438 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 14:59:38 ]
>>437
ないと思う
mは^と$の意味が変わるだけだった気がする

439 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 15:51:17 ]
なんか改行コードだけ特別扱いなんだよな



440 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:00:35 ]
Perlのif文で質問があります。とあるデータ文書からPerlを使って情報を抜き出しているのですが、
情報1、情報2というのが存在して、情報1にヒットしたときは、情報1と情報2を出力、
情報1にヒットしないときは、無視というような判定をするにはどうすればよいのでしょうか?

441 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:09:09 ]
perlに関係ないような気がするけど、こういう意味じゃないの?
if (情報1にヒット) {
  print 情報1;
  print 情報2;
}

442 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:12:57 ]
>>441
データ文書の情報1と情報2が別々のところに記載されていてそれができないのです。
元データ文書を晒すので少々お待ちください。

443 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:24:18 ]
両方揃ってから判断するのだ

444 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:32:12 ]
このデータ文書ファイルです。
uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2067 パス:perl

内容として作家情報と執筆した作品の情報が記載されています。
このファイルでは3名しか載っていませんが、実ファイルは世界中の作家情報が載っているので、
数万単位で同じような情報が載っています。
この中から、SCHOOLの行にUOFTOKYOと書いてある作家の作品だけを抜き出して出力できるようにしたいです。

445 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:35:10 ]
DB_FileとかDBI使えばいいのに……Plain/textとはまた面倒な

446 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:53:34 ]
>>444
schoolがuoftokyoの作家の名前を抜き出し、
その名前から違う場所にあるデータを抜き出して出力したいってこと?
大して>>441とやること変わらない気がするな
if (情報1にヒット) {
  作家名から情報2を取得;
  print 情報1;
  print 情報2;
}
こうなるだけじゃない?

447 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 22:57:06 ]
>>446
仰る通りです。
コードを書いているのですが、情報1にヒットした後、
情報2を書き出してやると、UOFTOKYO以外の作家作品情報も出力されてしまい、
どうしていいのか分からない状態です。

448 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:13:39 ]
>>447
情報2のデータの取得方法がおかしいんじゃいの?
そっちはどういうデータなの?

449 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:14:43 ]
>>448
情報2はWORKSとENDの間の情報です。



450 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:33:20 ]
現在書いているコードも載せておきます。

uploader.moe.hm/cgi-bin/upload.cgi?mode=dl&file=2085 パス:perl

451 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:41:07 ]
while (<IN>){
$line = $_;
なんだこれ

452 名前:デフォルトの名無しさん mailto:sage [2010/05/23(日) 23:48:02 ]
ああー、そんなこと書いたこともあった

453 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:19:55 ]
テキストファイルだと>>444のようにやるのは無理なのでしょうか?

454 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:22:31 ]
>>449
こんな感じかな。ネストがちょっと気持ち悪くてどうにかしたいけど
codepad.org/I7NaSAPC

>>450にソース上がってたのね。見てなかったわ

455 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:37:05 ]
綺麗なコード書くなぁ
人の書いたコードは難しくて読めないことが多い俺にはちょうど良い読み易さだった

456 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:53:43 ]
my $name ;
while(<>){
 $name = $_ if /^NAME/ ;
 next if ! ( /UOFTOKYO/ .. /^ID/ || eof );
 print $name and undef $name if defined $name ;
 next if !(/^WORKS/ .. /^END/ ) ;
 print ;
}
細かい所は知らん。


457 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 00:57:51 ]
× /UOFTOKYO/ .. /^ID/ || eof
◯ /UOFTOKYO/ .. /^END/


458 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 01:01:27 ]
>>456
おぉ。..ってそういう時も使えるのか。フラグ要らなかったな

459 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 02:00:33 ]
へぇ、こんな使い方が出来るんだ。
30分位調べてようやく意味が理解出来た。

参考にした物
ttp://ja.wikibooks.org/wiki/Perl/%E6%BC%94%E7%AE%97%E5%AD%90#.E7.AF.84.E5.9B.B2.E6.BC.94.E7.AE.97.E5.AD.90
ttp://books.google.co.jp/books?id=BpdX333gbjkC&lpg=PR4&dq=oreilly%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%80perl&as_brr=3&pg=PA120#v=onepage&q&f=false



460 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 07:33:10 ]
正規表現に必ずxmsつける人ははじめて見たけど流行ってんの?
個々の意味はわかるけどこうしとくといい理由とかあるんだろうか??

461 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 07:38:13 ]
>>460
Perlベストプラクティスに書いてあった癖で書いちゃう
普通は気にしなくていいと思う

462 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 10:06:39 ]
>>461
気になるのでどういう理由でそう書いてあったか憶えてたら教えてください。
本屋に行くにせよ尼かなんかでポチるにせよ週末になっちゃうので待てないw

463 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 17:45:34 ]
googleのアカウント持ってるなら、
ttp://books.google.co.jp/books?id=0dRPNtVvoqUC&printsec=frontcover&dq=perl+best+practice&as_brr=3&cd=2#v=onepage&q=正規表現&f=false
で、255ページから読め


464 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 17:47:37 ]
あ、URLエスケープ忘れてた。
ttp://books.google.co.jp/books?id=0dRPNtVvoqUC&printsec=frontcover&dq=perl+best+practice&as_brr=3&cd=2#v=onepage&q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE&f=false

465 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:06:38 ]
これ全ページ無料で読めるんだね、すごい。
売上が下がるかもしれないのにオライリージャパンは許容してるの?

466 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:11:40 ]
多分許容してない>オライリー・ジャパン
アメリカでは既に訴えられて裁判になり和解まで行ってるようだけど日本は分からん。
訴えられるまでやりますって感じかもね。
本は実際に手にとって読みたい人がいるからこれは良い宣伝になり売上が伸びる。
ってのもあるだろうけど、これだけで済ます人も多そうだ。

467 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:15:03 ]
よく見るとわかるけどたまに表示されないページがあるよ。

468 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 19:15:18 ]
って左下に「O'Reilly Japanの許可を受けてページを表示しています. 」って書いてあるじゃねーかw

469 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 22:51:55 ]
少なくともおれの場合は中身が見られることで洋書を買う量が増えたよ。
見るのはgoogleより米amaの方が多いけど。



470 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:12:24 ]
おおー
こんなのが只で読めるとは

471 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:34:58 ]
レイアウト解説本に載ってるのって、俺からすると読みづらいことばっか書いてるんだ
コメントが行区切りの役果たしてるんだから空白行いらんだろ、かえって関数が盾に間延びする

よく考えたらほとんどの環境でPerlの場合コメント着色されないんだっけ・・・区切りの機能果たさないなw

472 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 23:51:08 ]
これ買うかどうか迷ってたけど欲しくなったわ

473 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 00:52:16 ]
>>467
たまにどころか途中から全部仏陀義理じゃねーかw

474 名前:デフォルトの名無しさん mailto:sage [2010/05/25(火) 23:02:04 ]
そうなのか
まだ頭の方だからたまに飛ぶくらいでかなり役立ってる

475 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 13:48:27 ]
Perlに匹敵するモジュールがそろった言語って他にありますか?
具体的には
・ActiveDirectoryの操作(Net::LDAP)
・FTPs
・WWW::Mechanize
・DBI
・Net::DNS
・GD
・関数のpack
このくらいはせめて欲しいのですが・・・

476 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 14:06:24 ]
定番的なものはrubyにもpythonにも(そして多分schemeやHaskellにも)たいてい
相当するようなものはあるので好きなの使えばいいとおもうけど、そんなのは
それぞれのスレに行って聞けよ。でもわざわざ他の言語使わんでもperlでいい
んじゃね?

477 名前:475 mailto:sage [2010/05/26(水) 14:27:29 ]
>>476
ありがとう。
Perlしか分からないので、Perlで書いたものを他に移植することで
勉強はじめようかと思いまして。
とりあえずスクリプト言語はPerlを嫁にして、
C/C++、Javaあたり覗いてきます。


478 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 17:00:41 ]
usamimi.info/~pochi/perl/pochitate01.html
にあるような感じで縦書きテキストビューワーを作っています。
引き数として与えられるファイルが、
テキストファイルなのかバイナリファイルなのか判定したいのですが、
-T でのテキストファイル判定はその判定方法から
UTF-8以外の日本語文字コードでは上手く機能しないらしくて困ってしまいました。
テキストファイルかバイナリファイルかを判定する良い方法は無いでしょうか?


479 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 19:28:28 ]
Encode::guessで判定して、decodeするときにFB_CROAKを指定して
エラーにならなきゃOKとか?



480 名前:デフォルトの名無しさん [2010/05/26(水) 19:29:25 ]
guess_encoding()使ってるみたいだから、guessに失敗したら中断(現行コードのまま)でえーんでないの?
そもそも -T の精度も疑わしいし、ましてやWindows環境だとマジックナンバー照合による判定は無理なんでは?

判定精度を上げたいなら
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp/;
  ↓
use Encode::Guess qw/euc-jp shiftjis iso-2022-jp cp932/;

481 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 20:21:46 ]
全走査して\0が無ければテキストファイル。でもutf16/32は勘弁な。

482 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:11:04 ]
>>478
テキストビューワなら、常にテキストと仮定しちゃえばいいんじゃないの?

483 名前:デフォルトの名無しさん mailto:sage [2010/05/26(水) 21:55:51 ]
>>482
まあ普通はそうだよなぁ
判定するようなエディタは少ない

484 名前:478 mailto:sage [2010/05/26(水) 23:48:34 ]
>>479-483
レスありがとうございます。

guess しに行く前にどうにか判定出来ないかと
都合の良い事を考えていたのですけども、
>>482さんや>>483さんの仰るように常に対象はテキストファイルだと仮定して、
>>480さんのご指摘の通り現行コードのままにする事にしましす。

>>480
cp932 の事をうっかり忘れていました。
寧ろ shiftjis より cp932 の方が重要なのに…。
ご指摘ありがとうございます。


485 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 09:17:39 ]
shiftjisとcp932の両方を候補に入れるとほとんどの場合区別がつかなくて
Encode::Guess->guessがエラー返すと思うのだが。

おおざっぱにいうとEncode::Guessの判定アルゴリズムは

1行ずつ候補のencodingでdecodeしていって、候補が1つになったら
それを返す。候補がなくなったり複数残ったらエラー(ただしasciiが
最終候補に含まれていたらascii)

だからね。

486 名前:478 mailto:sage [2010/05/27(木) 09:36:54 ]
>>485
その通りなのです。
事実上、shiftjis よりも cp932 のテキストファイルを扱う方が圧倒的に多いと思って、
より現実に即して、判別候補の shiftjis を cp932 に変更しました。


487 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 09:49:56 ]
どっちを扱うのが多いかより「〜」などのunicodeへのマッピングが異なる文字を
どうしたいかの方が重要なきがする。

488 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 12:31:50 ]
俺も縦書きやったことあるけど
unicodeに縦書き用のものがマッピングされてない約物({}…〜など)は
回転するしかなくて、そのなかでも波ダッシュは鬼門だったな。

ちなみに《》()「」『』【】〔〕の約物については縦書き用の文字が用意されてる。

489 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 14:39:56 ]
日本語フォントには縦書き用のグリフが含まれるからそれを使えばいいんだよ



490 名前:デフォルトの名無しさん mailto:sage [2010/05/27(木) 19:23:42 ]
EncodeでUTF-8にして扱うなら波ダッシュは全角チルダになっちゃうんじゃないの?


491 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 10:03:55 ]
>>490
いやそれはおかしい。


492 名前:デフォルトの名無しさん mailto:sage [2010/05/28(金) 19:01:24 ]
上の方に出てたけどeucとsjisの〜をutf-8に変換するとWAVE DASH (301C)になり
cp932の〜をutf-8に変換するとFULLWIDTH TILDE (FF5E)になるみたいだね。

493 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 16:35:35 ]
20年前に少しかじったBasic言語しか知らないおらが、突然Perlを学ぶことに目覚めました。
たぶん初めてのPerlという良書のおかげです。
C言語とかJavaとかPythonとか色々学ぼうとして挫折を繰り返していました。

いきなりですが、質問があります。お教えください。

#!/usr/bin/perl
print "Please enter a number \n";
chop($number=<STDIN>);
while($number=~/|\D/){print "Please enter only a number! \n";chop($number=<STDIN>);}
以下数字が入力された場合に続く。

上記のように、何も入力されなかった(改行のみ)り、数字以外が入力されたときに
エラーメッセージを出す方法を教えてください。

上記ではおそらくwhile($number=~/|\D/)の正規表現が間違っていると思います。
また、上記目的を叶えるためのエレガントな方法があればお教えください。

494 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 17:09:38 ]
$number!~/^\d+$/
かねえ

#!/usr/bin/perl
print "Please enter a number \n";
while(1){
chop($number=<STDIN>);
last if $number=~/^\d+$/;
print STDERR "Please enter only a number! \n";
}
とか…?

495 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 17:42:19 ]
>>493
繰り返しループ処理のやりかたがわからないワケだな。
プログラミングの基礎が備わってないな。perl以前の問題。
フローチャートから勉強しなおしなさい。

496 名前:デフォルトの名無しさん [2010/05/31(月) 19:29:57 ]
この時代にフローチャートかよw

497 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 19:34:20 ]
オブジェクト指向とかカプセル化とか言っても訳わかんない気がする

498 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:08:51 ]
>>494
ありがとうございます!
上手く動きました!!
空文字列のみを見つける正規表現があるのかと考えていましたが、
数字以外はダメという表記で良かったんですね。

ネットで探しても空文字列のみを見つける方法がよくわからなかったので悩んでいました。

>>497
自信を持って分かりますとは言えませんが、
サブルーチンなどで、プログラムの部品(パッケージ化とかカプセル化というのでしょうか)を
作って、プログラムを汎用性が高く、分かりやすく作ることかと理解しています。

初めてのPerlには、変数の扱いがCとは異なり、グローバル変数として扱われてしまう
と書かれていたので、Perlはオブジェクト指向としては、少し扱いにくい言語ということ
なんでしょうか?

499 名前:デフォルトの名無しさん [2010/05/31(月) 20:18:17 ]
>>498
Perlはオブジェクト指向もサポートしている。
変数については、myを使えばローカルな変数になる。
my $hensu;



500 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:18:17 ]
>>498
20点くらいだな、その理解は

501 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 20:47:35 ]
>>495,500
こういうのが癌

502 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:07:18 ]
「いじめられる側にもいじめの原因がある」
「死刑には抑止力がある」
「何か言われて不快になったらその原因は発言者にある」


これまで当たり前だと思って、深く考えなかったこと・・・
周りに言われるままに、何の疑問も抱かなかったこと・・・
それらが本当に正しいのか、ちょっと立ち止まって考えてみませんか


虐めに関するよくある勘違い
jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273655633/1-7

死刑制度に関するよくある勘違い
jbbs.livedoor.jp/bbs/read.cgi/game/46573/1273498488/1-7

外界は内界を映し出す鏡だって言ってたよ裏庭の鶏も
academy6.2ch.net/test/read.cgi/philo/1273156931/1-3

503 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:27:52 ]
>>498
>空文字列のみを見つける正規表現

"\n"にもマッチしていいなら/^$/

504 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 21:43:52 ]
>>498が何版目の「初めてのPerl」を読んだのかが気になる。
まさか 1995年刊行の Perl4時代のソフトバンク版じゃあるまいな?


505 名前:デフォルトの名無しさん mailto:sage [2010/05/31(月) 23:25:06 ]
手元の第三版にはchopは索引に載ってなかった。
chompの頁に「古いperlではchop演算子が使われていることがあります。」ってちょろっと書かれてるくらい。

506 名前:デフォルトの名無しさん [2010/05/31(月) 23:45:07 ]
誤解されそうなコメがあるから、おいらが補足。
ラクダ本第三版の索引にはchopは普通に載ってるし、それ以前にこんなの最新版Perlでちょろっと確認すれば済む話。
chopが何故か忌避されるのは、鋏の使い方を知らない馬鹿が多すぎたってことかな。
現在主流の馬鹿御用達言語PHPで、文字列末尾1文字を無条件に削除したい場合、使えねーsubstr()とか、preg_replace('/.$/u','',$hoge)とか使ってると、頭に蛆湧いてくるぜ。

507 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:08:25 ]
おおー。ここ勉強になりますね!
>>499
知りませんでした。
手元にあるPerl本は古本屋で買ったので
初めてのPerl 1995年6月16日 初版
Perlプログラミング1995年6月5日 第7版
でした。

>>500
後の80点はどの辺が足りないのかお教えください。
パッケージ化することで、グローバル変数が氾濫しプログラムが読みにくくなったり、
エラーが起きやすくなることを防ぐ。ということも(あっていれば)知っています。

>>503
正規表現面白いッス!
while($answer!~/^\d+$/)
while($answer=~/^$|\D/)
この二つはほぼ同じと考えて良いんでしょうね!

>>504
まさかの初版でした!!

これからもよろしくお願いしマース!
なにせ、読み始めたのが昨日からなんです。



508 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:09:28 ]
連続投稿すみません
自分の勉強のために
汚いコードでスレ汚しになりますが、Chap2の私の回答も載せますね。
#!/usr/bin/perl
$pai=3.141592654;
while($pronum!=5){
print "Chose program # (1-4 or to quit 5).\n";
chop($pronum=<STDIN>);
if ($pronum==1){
$pro1result=12.5*2*$pai; print "The result is $pro1result \n";}
elsif($pronum==2){
print 'Enter the radius'."\n";
chop( $radius=<stdin>);$radius *= $pai *2;
print "The result is $radius\n";}
elsif($pronum==3){print 'Plese enter 2 variables'."\n";
$first=<stdin>; $second=<stdin>; $first *=$second;
print "The result is $first \n";}
elsif($pronum==4){print "Please enter num and character \n";
chop($num=<stdin>);chop($char=<stdin>);$char=$char x $num;
print "The result is $char \n";}
elsif($pronum==5){print "Thank you for playing! \n";}
else{ print "Try again!\n";}
}

509 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:15:04 ]
>>507
どうしても「初めてのPerl」を参考にして勉強したいというなら、
悪い事は言わないから第5版にした方が良い。
今、Perl4時代の本で勉強しても百害あって一利無しだと思うぞ?
いくらなんでも時代遅れ過ぎる。
>>507 が使ってる Perl まで Perl4 というわでもあるまいに。




510 名前:デフォルトの名無しさん mailto:sage [2010/06/01(火) 00:22:42 ]
>>507に必要なのは perldoc で perlintro を読む事

511 名前:507 mailto:sage [2010/06/01(火) 06:24:42 ]
>>509
そうですか。うーん。
正規表現とか、考え方とかはそんなに変わらないかと思ったんですが、
有害なんですね。
できれば、オンラインで学習できるのが一番なんですが、まとまったサイトってありますか?

>>510
ありがとうございます。
でも読むコマンドがわかりませんでした。
私は、Macなので、ターミナルを起動して
>perldoc perlintroとコマンドを入力してみましたが、
perlintroというドキュメントはないというようなエラーが出ました。
No documentation found for "perlintro".







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<157KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef