トップページ⇒tech
1001コメント344KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/31(火) 14:52:21
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3

前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/

リンク集は>>2-3
過去スレは>>4
0002デフォルトの名無しさん2006/10/31(火) 14:53:20
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www.site-cooler.com/kwl/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/4873112028/

[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0003デフォルトの名無しさん2006/10/31(火) 14:54:50

[モジュール]
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

[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん2006/10/31(火) 14:55:48
[過去スレ]
1 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/
0005デフォルトの名無しさん2006/10/31(火) 18:01:24
誰も言ってくれないから自分で言う

>>1乙
0006デフォルトの名無しさん2006/10/31(火) 18:12:14
>>5
乙
罰ゲームで新スレたてて誰も慰みの言葉かけてくれなきゃ腐るわなw
0007デフォルトの名無しさん2006/10/31(火) 22:02:46
>>1 乙
いまきただけだけどw
0008デフォルトの名無しさん2006/10/31(火) 22:22:30
>>1 お疲れ様
0009前スレ9922006/11/01(水) 00:18:14
>>前996
それは遅いと思い込んでいました。ありがとうございました。
0010デフォルトの名無しさん2006/11/01(水) 00:19:20
毎行、空行後か判定するよりは、ループを2つに分けた方が効率がいいと思うんだ。
好みによるだろうけど(´・ω・)

my (@head, @body);
while (<FH>) { push @head, $_; last if /^$/m; }
while (<FH>) { push @body, $_; }
0011デフォルトの名無しさん2006/11/01(水) 00:23:09
こうか

while (<FH>) { (/^$/) ? last : push @head, $_ }
while (<FH>) { push @body, $_ }

メールの処理かね。
0012デフォルトの名無しさん2006/11/01(水) 00:50:04
前スレで学んだことを無理矢理活用w

(/^$/ .. 0) ? push @body, $_ : push @head, $_ while (<FH>);
0013前スレ9922006/11/01(水) 00:56:52
すいません、ベンチマークしましたが、どれもあまり差が出ませんでした。また明日いろいろ試してみます。
0014デフォルトの名無しさん2006/11/01(水) 01:02:40
>>前スレ973

つ「Win32-IE-Mechanize」
http://search.cpan.org/~abeltje/Win32-IE-Mechanize-0.009/lib/Win32/IE/Mechanize.pm
0015デフォルトの名無しさん2006/11/01(水) 01:03:39
# ループを使わない例 (イロモノ)
local $/ = "\n\n";
push @retsu, <FH>;
@hai = split /(\n)/, shift @retsu, -1;

# ネタなので効率とかは知らん
0016デフォルトの名無しさん2006/11/01(水) 01:05:22
>>13
誰ひとりベンチなんか計らずにポストしてると思うがなw
0017デフォルトの名無しさん2006/11/01(水) 02:26:04
1行目に空行があれば最速w

while (<FH>) {/[^\s]/ ? push (@head,$_) : last;}
@body = <FH>;
0018デフォルトの名無しさん2006/11/01(水) 02:39:50
#!/Perl\bin\perl
$file="tes.txt";
$outfile="k.txt";
open (IN, $file) or die "$!";
open (OUT, ">$outfile") or die "$!";
$file = ~s/ABC/XYZ/g;
print out $file = ~s/ABC/XYZ/g;
close (IN);
close (OUT);

全く意味わからんのですが、ファイルを開いてABCをXYZに検索置換してk.txtに保存って
どうやるのだろう
0019デフォルトの名無しさん2006/11/01(水) 03:06:42
>>18
>>2
0020デフォルトの名無しさん2006/11/01(水) 03:23:06

2つの配列があって10%の確立でどっちかの配列を選ぶプログラムを書きたいんですが、
どうやればいいですか?
エロイ人お願いします。
0021デフォルトの名無しさん2006/11/01(水) 03:38:23
>>19ありがとう

while (<TEXTFILE>) {
s/ABC/xyz/g;
print "$_\n";
}

こんな感じの物があった。
0022デフォルトの名無しさん2006/11/01(水) 03:39:40
>>20
日本語でおk
0023212006/11/01(水) 03:56:31
できたけど、なんか動かない=できてない

#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";

open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, ">$outfile") or die "$!";

while (<INCSV>) {
# 改行コードの除去
chomp ($_);
# 各行をカンマ区切りで分割
@data = split(/,/, $_);
while (<INTEXT>) {
s/$data[0]/$data[1]/g;
print OUT "$_";
}
}

# ファイルハンドルを閉じる
close(INTEXT);
close (INCSV);
close (OUT);

どこかヘンですか?
0024デフォルトの名無しさん2006/11/01(水) 04:05:11
強いて言うなら頭かな?

まあ、上では while (<INTEXT>) { } は一回しか実行されないあたりとか大丈夫かな、っては思う。
0025デフォルトの名無しさん2006/11/01(水) 04:11:42
>>23
$TXfileを最初に全部読み込んどけ。
0026デフォルトの名無しさん2006/11/01(水) 04:12:24
>while (<INTEXT>) { } は一回しか実行されない

あぁそれですねー

どうすれば、動くようになりますかね?
0027デフォルトの名無しさん2006/11/01(水) 04:35:26
>>26
どこに問題があるかは分かった?
INCSVを読んだあとINTEXTの置換に取りかかってて、そこまではまあ悪くない。
けどINCSVの1行目のループでINTEXTを最後まで読んじゃってるでしょう。
ファイルの読み書きにはファイルポインタっていう「しおり」みたいなのがあるのは理解してる?
INTEXTを最後まで読んじゃって「しおり」が最後にあるから、INCSVの2行目からの処理では
INTEXTを先頭から読めないじゃん?ってことね。

そのスクリプトの場合なら「しおり」であるファイルポインタを移動すりゃ思ったように動く。
頑張れ。
0028212006/11/01(水) 04:44:02
ヒントをありがとう!
perlを始めて10時間。なかなか難しいですねぇ
もう少し、がんばってみます!!
0029デフォルトの名無しさん2006/11/01(水) 04:48:06
いや、それ直してできたらできたとこで >>23 だと、
$outfile に ($TXfile の行数 * $CSfile の行数) 分のデータが書き込まれそうなんだが、
これはわかってやってるのかね?

って 10時間かよwww
0030212006/11/01(水) 04:55:05
テキストファイル100MB超えました。

ただ、検索置換したいだけなのに・・・・・
0031202006/11/01(水) 05:19:11
20だけど
こういう感じにしてみた。$rateに何パーセントの確立で選ぶ値が入ります。例えば10とか20とか。

でもこれだと絶対にX%の確立で一方が選ばれないんだよね。
誤差が2−4%ぐらいでる。
何か言い方法ありませんか?

sub erabu{

my $rate = shift;

my $divider = $rate/10;
my $seed = 10/$divider;
my $randomInt = int(rand($seed));

if ( $randomInt == 0 )
{
return 0;
}
else
{
return 1;
}

}
0032デフォルトの名無しさん2006/11/01(水) 05:50:41
なんだ、今日はやけに初心者が多いな(´・ω・)
0033デフォルトの名無しさん2006/11/01(水) 06:31:46
>>31
print文などを使って、変数の値を確認することを勧める
0034212006/11/01(水) 06:54:58
どう書き換えても($TXfile の行数 * $CSfile の行数)が出力されますな・・・

0035デフォルトの名無しさん2006/11/01(水) 07:33:46
どう書き換えてもなるならしょうがないな。
それは呪いだよ。
0036デフォルトの名無しさん2006/11/01(水) 08:20:32
#>>31
$erabareta = 1 > rand 10;
・・・・しね
0037212006/11/01(水) 08:50:01
のろい( ゜Д゜)<呪呪呪呪呪呪呪呪呪

もうちょっと勉強してみる。
0038202006/11/01(水) 09:15:34
>>36
これ動かないんですが。
0039デフォルトの名無しさん2006/11/01(水) 10:07:27
win32::OLEとsamieで IEを操作しようと思うのですが、
アドレスとソースの取得はどのようにやればいいのでしょうか?

0040キューチャン2006/11/01(水) 10:37:07
oracle8*0*X 接続用perlモジュールDBD-Oracleをどうやって
手にいれるか知っている人いませんか? 教えてください
最新のものしかみつかりません
0041デフォルトの名無しさん2006/11/01(水) 12:05:45
>>32
質問スレなんだから問題ないと思うが。
0042デフォルトの名無しさん2006/11/01(水) 12:13:25
>>41
>>1
まぁいいじゃね?とは思うが。
0043デフォルトの名無しさん2006/11/01(水) 12:20:19
仲良くperlの話してるならなんでもいいよ。
0044デフォルトの名無しさん2006/11/01(水) 14:15:17
ここの「Perlの基礎」の5がわからない。
誰か解答教えて下さい。
ttp://www.ipc.hokusei.ac.jp/~z00104/semi/kadai4.html
0045デフォルトの名無しさん2006/11/01(水) 14:35:45
$str[$nn]
0046デフォルトの名無しさん2006/11/01(水) 15:03:01
perlのEncodeでiconvのEUC-JP-MSに相当するencodingは
なんていうの?
0047デフォルトの名無しさん2006/11/01(水) 17:54:32
>>46 Encode::EUCJPMSをインスコしてperldocでモジュールのドキュメント見ろ
0048デフォルトの名無しさん2006/11/01(水) 17:56:03
>>44
北星学園か。俺が昔かかわったことのある学校だなあ。

で、その5ってその手前で作ったのを変更して作れってことだよな?
変更する前のプログラムは作ったのか?
0049デフォルトの名無しさん2006/11/01(水) 18:12:42
>>48
これでよろしいでしょうか?

open(IN,"LIST.txt");
while( <IN> ) {
print $_ ; }
close (IN);
0050デフォルトの名無しさん2006/11/01(水) 18:25:26
>>47
追加モジュールをインスコしないとだめなんすね。回答ありがとうございました。

このくらい標準で入れといてほしいけどここで言ってもしょうがないか...
0051デフォルトの名無しさん2006/11/01(水) 18:45:59
>>49
それが4の答え? とするとそこからして間違いだと思うが。

まず4についてはね、ファイル開くのをいちいち自分で書く必要はなくて、
<>を使うと簡単。

@a = <>;

これだけで引数で指定したファイルまたはファイルを指定しなければ
標準入力からの入力が全部1行づつ @a に入る。文字列の数(行数)は
@a の数だ。これは @a を scalar として扱うだけでいい。これで
行数が出る。

print scalar(@a) . "\n";

で、@a の内容を全部表示するには

print @a;

でできる。

5はもう少し自分で考えろ。
0052デフォルトの名無しさん2006/11/01(水) 22:16:51
>>50
日本人だけが使ってるわけじゃないからね。
そもそもEncode関連はサイズ大きいから、必要としていない言語圏の方々からは嫌われてるとか聞いたこともあるし。

それにEncodeを使えば簡単にEncode::EUCJPMSみたいなのが作れるんだから、他言語よりはマシな気がする。
0053デフォルトの名無しさん2006/11/01(水) 23:37:58
本当に困っています。
行はいいのだが、列としてのあつかおうとすると
非常にめんどう(表計算ファイルとかのとき致命的)
たとえば2次元配列のリファレンス
$ref = ([ ],[ ], [ ])
があるとするとこれのそれぞれの
要素の第一成分を表示する
簡単な方法はないでしょうか?
print @{$・・@$ref->[0]};
といったかんじでできない?
0054532006/11/01(水) 23:44:18
いままで思いついた
簡単な方法は

foreach (@$ref){
print $$_[0];
}

ぐらいでもこれでもforeachとかかませて色々操作する必要がある
特に列間の計算とかすることになるとこれでは非常に
面倒
なにか一単語で簡潔にあらわせる方法があったはずなんだが・・・
おもいだせない
0055デフォルトの名無しさん2006/11/02(木) 00:29:55
print map { $_->[0] } @$ref
0056532006/11/02(木) 00:34:37
ありがと
ただ
@$\のくみあわせで
print @{$・・@$ref->[0]};
といったぐあいに(@{@$ref->[0]}  みたいなかんじ)
で表現できたはずなんだ
どうしてもできない
おしえてほしい
0057デフォルトの名無しさん2006/11/02(木) 02:20:21
>>51
他人事ながら親切回答に感激
0058デフォルトの名無しさん2006/11/02(木) 08:29:24
>>56
perldoc perllol しても情報はないなぁ
> @part = @{ $AoA[4] } [ 7..12 ];
は単なる slice だし。

そういう方法があれば知りたいもんだ。
0059212006/11/02(木) 08:49:43
#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, "> outfile.txt") or die "$!";
@lines = <INTEXT>;
$line_amount = @lines + 1; #行数計算
while (<INCSV>) {
chomp ($_);# 改行コードの除去
@data = split(/,/, $_);# 各行をカンマ区切りで分割
for($i=0;$i<$line_amount;$i++){
$lines[$i] =~ s/$data[0]/$data[1]/g;
}
}
print OUT @lines;
close(INTEXT);
close (INCSV);
close (OUT);

なんとなくできましたが、
速度が遅すぎる点と、結果が文字化けしている点がいかんともしがたい。
CSfile.csv=4万行以上・TXfile.txt=2万行程度(検索・置換は全て日本語です)
改善策をご指導ください。
0060デフォルトの名無しさん2006/11/02(木) 09:16:50
>>59
置換対象のファイルを@linesに行ごとに入れてループでまわすよりは
全体を一つの変数$linesにいれてまとめて置換した方がたぶん速い。

$lines = do { local $/; <INTEXT> };

文字化けの原因はここに書いてある情報だけではないともいえないが
たぶんEUCかSJISそのままでやってるせいじゃないかと思うので内部は
unicodeにしたほうがいいだろう。全部一緒ならopenプラグマで

use open ':encoding(sjis)';

のようにすればまとめて指定できるはず。
0061デフォルトの名無しさん2006/11/02(木) 10:48:08
>>51
どうもありがとう!やってみます!
0062212006/11/02(木) 12:22:58
>>60
文字化けは、解消されました。

速度については、速くはなったと思いますが、それでも遅い感じがします。
perlの限界なのかな・・・・

いろいろありがとうございました!
0063212006/11/02(木) 12:59:25
追記:
次はC言語でやってみたいと思います。
C言語も全くしたことないけど・・・・
速いのかな・・・・
0064デフォルトの名無しさん2006/11/02(木) 13:22:15
>>59
問題なのは行数よりサイズだと思うんだが・・・。
ってかそんな遅くなるとかどんなファイル扱ってんだよ('A`)
0065デフォルトの名無しさん2006/11/02(木) 13:37:55
>>62
2万行の文字列を4万回置換だからそれなりに時間はかかるだろうな。

4万回s///するのと置換対象の文字列を全部 | でならべて
s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
速いだろうか

あるいは発想を変えて、対応表を適当な有限状態オートマトンに
変換しといて置換対象の文字列を頭から食わすみたいな
アルゴリズムにするのもおもしろいかもしれない。

たとえば ab → d, ac → e

状態0:
aなら状態1へ
bなら状態2へ
それ以外はその文字を出力して状態0へ

状態1:
bならdを出力して状態0へ
cならeを出力して状態0へ
それ以外はaとその文字を出力して状態0へ

みたいな。
0066212006/11/02(木) 14:07:01

(´ヘ`;)
0067デフォルトの名無しさん2006/11/02(木) 14:29:13
Cならオブジェクト性能をマクロからミクロまで
自分でコントロールできるから試してみる
価値はあるな>63
OSコールが気に入らなきゃ、その部分を自分で
組み立てたっていいし
0068デフォルトの名無しさん2006/11/02(木) 14:29:24
辞書は予めソートしておき、辞書の1文字目がもしtxtに出現しなければ
同じ出だし辞書は全部飛ばし、別の出だし単語へ。
0069682006/11/02(木) 14:32:44
ソートしなくても、連想配列に1文字目該当無しフラグ作る等いろいろ。 $FG{'あ'}=1;
0070デフォルトの名無しさん2006/11/02(木) 15:08:23
> 4万回s///するのと置換対象の文字列を全部 | でならべて
> s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
> 速いだろうか

/(文字列1|文字列2|...)/ より /文字列1/ or /文字列2/ or ... って分けた方が早いらしいよ。
・・・って、どれかひとつにマッチしたら他にマッチしない前提なのかな
0071212006/11/02(木) 15:21:50
C言語・・・こりゃ道程が遠いね

0072デフォルトの名無しさん2006/11/02(木) 19:45:27
$max_buf = $size - $now_size if $size - $now_size < $max_buf;

これで $now_size が $size より小さければ $max_buf は0になります。
$now_size が $size より大きければ $max_buf には $size より足りない数になります。

どうなるかは解ったのですが、そうしてこうなるのかが解りません。
どういう風に解釈したら良いのでしょう。

<例>
$size = 12
$now_size = 10
$max_buf = 0

<例>
$size = 10
$now_size = 12
$max_buf = -2
0073デフォルトの名無しさん2006/11/02(木) 20:06:12
>>72
> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
>
> これで $now_size が $size より小さければ $max_buf は0になります。

ちがう。if文が偽を返しただけだ。



0074デフォルトの名無しさん2006/11/02(木) 20:14:27
>>73
ううん。
すみません、良くわかんないです。
ただ、理解する手がかりになりましたので勉強します。
回答をありがとうございました。
0075デフォルトの名無しさん2006/11/03(金) 20:42:55
>>59
毎回正規表現をコンパイルしにいってるから遅いとかはないかな?

このサンプルを元に作ってみたら?
日本語がほしけりゃPerl Cookbookを買いましょう。
ttp://www.unix.org.ua/orelly/perl/cookbook/ch01_18.htm
0076デフォルトの名無しさん2006/11/04(土) 13:25:02
>>74
> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
これは
if( $size - $now_size < $max_buf ){
    $max_buf = $size - $now_size;
}
と同じです。っていうのは分かってるのかな・・・?
0077デフォルトの名無しさん2006/11/05(日) 00:10:10
chompみたいに、引数を省略すると$_を処理するサブルーチンってどう書くの?
0078デフォルトの名無しさん2006/11/05(日) 00:22:57
>>77
@_の要素数を見ればいくつパラメタが与えられたかわかるので
適当に分岐なりなんなりすればよい。
0079デフォルトの名無しさん2006/11/05(日) 04:24:45
長い文章から正規表現で$1 .. $7まで取り出して使っているのですが、条件式が長くなってしまいます。
途中で改行したいのですが、実際に条件式の途中で改行するとエラーになってしまいます。
解決策を教えてください。

条件式
$hoge =~ /VALUE="(.*?)"(?:.|[^.])*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)"(?:.|[^.])*>(\d+)(?:\(hugahuga\)|\(hogehoge\))/;
0080デフォルトの名無しさん2006/11/05(日) 05:02:16
>>79
"x" をつける
0081デフォルトの名無しさん2006/11/05(日) 05:15:00
>>80
できました。
これ便利ですね。

どうもありがとうございました。
0082デフォルトの名無しさん2006/11/05(日) 13:16:32
$hoge = "熊のプーさん";
$hoge =~ /プーさん/;

を実行すると

Unmatched [ in regex; marked by <-- HERE in m/プー <-- HERE さん/ at C:\hoge\test.pl

とエラーになります。
パターンの先頭がパー、ピー、プー、ペー、ポーにだとエラーになるようです。

$hoge =~ /\プ\ー/;

エスケープしてもうまくいきません。
どうしてでしょうか?
0083デフォルトの名無しさん2006/11/05(日) 13:29:26
>>82
長音(ー)の2バイト目が 0x5B で、'[' (0x5B) として解釈されてしまうからです。
\Q と \E で囲むと、その間の文字列は正規表現として解釈されなくなります。

/\Qプーさん\E/

ではどうでしょうか?
0084デフォルトの名無しさん2006/11/05(日) 13:31:59
>>82
全部EUCで書いちゃうのも手かもね。
0085デフォルトの名無しさん2006/11/05(日) 17:56:01
SnUploaderについての質問です。
ファイルをアップすると[upxxxx.xxx]という名前に強制的になりますが、
これを[MAQxxxxx.MP4]という様にしたいです。
(xxxxxの部分は、アップされた順に00001,00002,00003という感じに)
どうすれば良いのでしょうか?
また、MP4ファイルをアップしそれを落とそうとしてファイル名のところを
クリックすると、QuickTimeによって再生され、保存することが出来ません。
これを再生されること無く、ファイル名をクリックしただけでDLが始まるようにするのは
どうすれば良いのでしょうか?
分かりにくい文章かもしれませんが、教えてください。お願いします。
0086デフォルトの名無しさん2006/11/05(日) 18:59:54
>>85
前半はすれ違い
後半はいた違い
0087デフォルトの名無しさん2006/11/05(日) 19:12:36
>>86
え・・・
uploder.cgiの中身を書き換えるんじゃないんですか?
そうだと思ってPerlのスレにに書いたのですが・・・。
もしかして、ここじゃなくてCGIの質問スレに書くべきでしたでしょうか。
0088デフォルトの名無しさん2006/11/05(日) 19:55:09
>>87
>>1
0089デフォルトの名無しさん2006/11/06(月) 00:06:18
>>87 書き込みするまえに2chの使い方,板とスレのそれぞれのローカルを覚えろ。それまではROMってろ
0090デフォルトの名無しさん2006/11/06(月) 00:55:10
そうまで言わなくてもいいだろ
0091デフォルトの名無しさん2006/11/06(月) 01:49:21
「親切10回につき罵倒1回」を心がけましょう
0092822006/11/06(月) 02:11:23
>>83-84
\Q, \Eを使って解決しました。
レスありがとうございました。
0093デフォルトの名無しさん2006/11/06(月) 04:18:12
printで標準出力に送られた文字列ををログとしてテキストファイルにも保存したいですのですが、
今は下のようにめんどくさいことをしています。何かうまい方法はありませんか?

print "ほげ";
print LOG "ほげ";

print "ふがふが";
print LOG "ふがふが";
0094デフォルトの名無しさん2006/11/06(月) 04:33:50
>>93
perl のプログラムでは標準出力に出すだけ。

tee を使ってリダイレクトするか、
単にリダイレクトしてそのファイルを別端末で tail -f する。
0095デフォルトの名無しさん2006/11/06(月) 04:54:25
>>93
二穴用のさぶる〜ちん作りゃいいやん
0096デフォルトの名無しさん2006/11/06(月) 05:29:48
>>93
open(STDOUT,"|tee log");
0097デフォルトの名無しさん2006/11/06(月) 06:20:27
前スレで出ていたIO::Teeとか。
0098デフォルトの名無しさん2006/11/07(火) 04:16:20
質問させてください。

  $data { 'Class_A' } [ 0 ] { 'FirstName' } = '太郎' ;

みたいな配列とハッシュを組み合わせた変数を用意しようと思います。
リファレンスとか多次元とかサブルーチンとかごちゃごちゃで混乱してます。


【1】変数の値を生成し、代入したい

  my %data;
    #(略。ループとかDBからの取得とか)
  my %hash;
  $hash{'FirstName'} = '太郎';
  $hash{'FamilyName'} = '田中';
  push ( @data{'Class_A'} , \%hash );
    #(略。ループ終了とか)

と書いてみたのですが、型が違ぇよボケ(意訳)と言われてしまいました。
(実際には、Class_Aや田中、太郎の部分にはデータベースから取得した値が入る)

仕方ないので、

  my @tmp = @data{'Class_A'};

と、あらかじめコピーしておいてから、最後に

  push(@tmp,\%hash);
  @data{'Class_A'} = \@tmp;

一時ファイルの中身を戻すとかやってる始末です。
もうちょっとスマートな方法はありませんでしょうか。
0099デフォルトの名無しさん2006/11/07(火) 04:17:50
なお、データベースから読み込んだとき、クラスごとや出席番号順に来るとは限りません。
A組→B組→B組→B組→C組→A組→C組 とかもありえます。
各クラスの生徒数は不明です。


【2】特定のクラスに所属する生徒の情報を取り出したい。
なお、取り出す順番(出席番号)については言及しない。もちろんしてもいい。

  foreach my $key (keys @data{'Class_A'} )

というループを作ってみたのですが、最終的な値(田中とか太郎とか)を取得する方法が分かりません。

  $data{'Class_A'}[$key]{'FirstName'}
  $key{'FirstName'}

など幾つか試してみましたが、全く取得できる気配はありませんでした。
(どちらも「太郎」などの文字列の取得を期待しています)
0100デフォルトの名無しさん2006/11/07(火) 04:36:35
>>98
push ( @data{'Class_A'} , ¥%hash );
のところを
push ( @{$data{'Class_A'} }, ¥%hash );
でいいんじゃないか
0101デフォルトの名無しさん2006/11/07(火) 04:44:23
>>99
my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push (@{$data{'Class_A'}},¥%hash);

foreach my $class ('Class_A', 'Class_B', 'Class_C') {
 foreach my $student (@{$data{$class}}) {
  print $student->{'FirstName'} . $student->{'FamilyName'} . "¥n";
 }
}
■ このスレッドは過去ログ倉庫に格納されています