トップページ⇒php
1001コメント404KB

Perlコーディング初心者質問スレ Part 60

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/03(木) 23:51:12ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0357nobodyさん2009/12/03(木) 09:13:01ID:???
cgiのソースが出てくると言うんだからapacheの設定だな。
cgiだと思われてないよ。
0358nobodyさん2009/12/03(木) 11:50:21ID:???
AddHandler cgi-script .cgi の設定が欠けてるとか。
03593542009/12/03(木) 23:52:45ID:aPQfU5cA
>>355>>356>>357>>358
ありがとうございました。
やはりApacheの設定だったようです。

詳細の原因はわかりませんでしたが、
confファイルの色々直したら表示できるようになりました。
ありがとうございました。
0360nobodyさん2009/12/05(土) 16:36:46ID:???
----------input.txt-
1 2 3
4 5 6
7 8 9
-------------------
---------------output.txt-
6
15
24
---------------
input.txt->output.txt(行ごとに三つずつある数字の和を一行ずつ表示させるプログラム)の書き方を教えてください
0361nobodyさん2009/12/05(土) 16:51:05ID:???
>>360
こんな感じかな。違ったら誰か突っ込んでくれると思う。わからないところどこ?
use strict;
use warnings;

my $input_file = shift || 'input.txt'; # 引数もしくはinput.txt
my $output_file = shift || 'output.txt'; # 引数もしくはoutput.txt

# 読み込み処理
open my $rfh, '<', $input_file  or die "$!"; # ファイルの読み込み
my @results;
while (defined(my $line = <$rfh>)) { # 1行ずつ処理
  chomp $line;           # 改行は削除
  my @nums = split /\s+/, $line;  # 空白で分割

  my $sum;
  for my $num (@nums) {
    $sum += $num;
  }
  push @results, $sum;
}
close $rfh;

# 書き込み処理
open my $wfh, '>', $output_file  or die "$!";
for my $result (@results) {
  print {$wfh} "$result\n";
}
close $wfh;
0362nobodyさん2009/12/05(土) 17:16:59ID:???
perl -lpe'y/ /+/;$_=eval' input.txt>output.txt

perl -alpe'$_=$F[0]+$F[1]+$F[2]' input.txt>output.txt

perl -MList::Util=sum -alpe'$_=sum@F' input.txt>output.txt
0363nobodyさん2009/12/06(日) 04:07:59ID:gPKy+f2T
>>362
4つ目が合ったら・・・

>>360
use strict;
use warnings;

open(INFH, '<', 'in.txt');
open(OUTFH, '>', 'out.txt');
while(my $line = <INFH>){
  chomp $line; # 改行削除
  my $sum = 0; # ゼロで初期化
  map { $sum += $_ } split(/\s+/, $line); # 空白で分割し、要素を足し算
  print OUTFH "$sum\n"; # 出力
}
close(OUTFH);
close(INFH);

0364nobodyさん2009/12/06(日) 07:36:02ID:???
>>361
いつも思うのですがこのwhile文の中のdefinedって必要なんですかね?
空文字が来るこってあるのでしょうか?
0365nobodyさん2009/12/06(日) 08:26:49ID:???
>>364
特殊変数によっちゃあえりるとかじゃなかったっけか。
0366nobodyさん2009/12/06(日) 11:00:15ID:???
>>364
0が来たらどうすんだって話じゃないか?
この場面に限らず0の評価を回避するためにdefined書かなきゃいけないことが多すぎる
0367nobodyさん2009/12/06(日) 12:45:01ID:???
>>364
Perlクックブックに、以下3つの文で、下の2つには、Perlコンパイラが、definedを挿入する
ので、一番上のように丁寧に書かなくてもOKと書いてあります。

while (defined ($line = <DATAFILE>) { ・・・ }
while ($line = <DATAFILE) { ・・・ }
while (<DATAFILE>) { ・・・ }

このdefinedの挿入は、whileループでreadline、readdir、readlink呼び出しの結果を
スカラー変数に代入する場合のみに行われる。

とも書いてあります。
0368nobodyさん2009/12/06(日) 13:30:40ID:???
>>365-367
�d
確かに0の場合も偽でしたね。

勝手にdefinedを挿入してくれるのかー
ただベストプラクティス的には省略に頼らず、きちんと書いたほうがいいのかな。
0369nobodyさん2009/12/06(日) 17:16:48ID:???
配列のハッシュ、の参照に困っています。

use Data::Dumper;
print Dumper $a;

$VAR1 = [
{
'aaaaaa' => [
'1',
'2',
],
'bbbbbb' => [
'1',
'2',
]
}
];


Dumper してこのように表示されるのですが、参照がうまくできません。
03703692009/12/06(日) 17:19:20ID:???
# Dumper を使わずに出力
foreach my $key (keys %{$a}) {
print $key."¥n";
foreach my $name (@{$$a{$key}}) {
print $name."¥n";
}
}

print $key."¥n"; までは出来ていますが、そこから先が動きません。
この参照の仕方は間違っていますか?
0371nobodyさん2009/12/06(日) 17:36:42ID:???
$a->[0]{aaaaaa}


だいたい、>>370で何でkeysが出て来るのよ?
0372nobodyさん2009/12/06(日) 17:37:42ID:???
use strict;
use warnings;
my $var = [
  {
    'aaaaaa' => ['1', '2'],
    'bbbbbb' => ['1', '2'],
  }
];
for my $key (keys %{$var->[0]}) {
  print "$key\n";
  for my $name (@{$var->[0]{$key}}) {
    print "$name\n";
  }
}

やりたいことがわからないが、>>369の $VAR1 の内容を表示するコード
03733692009/12/06(日) 17:46:07ID:???
>>371
$a->[0]

->[0] だったのか('A`)
リファレンスがまだよく分からない。

>>372
データの集計をしようとしてたのですが、いきなり詰まってました。
有難うございました。
03743612009/12/06(日) 22:20:48ID:???
>>365-367
おぉ、なるほど。そうなのか。
>>306で言われてたからとりあえず付けてみただけでした。参考になるな
0375nobodyさん2009/12/07(月) 05:08:40ID:B0UFMTWM
$a->[0]->{'aaaaaa'}->[0]

@{$a->[0]->{'aaaaaa'}} で配列取得でける
0376nobodyさん2009/12/12(土) 16:38:26ID:???
>>361,363
ありがとうございます
  my @nums = split /\s+/, $line;  # 空白で分割
この部分が分かりませんでした
0377nobodyさん2009/12/12(土) 18:06:22ID:aQyC+qGS
\s → 1つ以上の連続した空白をあらわす (1つの空白でも、2つの空白でも一致)

\s で分割した結果を @nums に入れてるだけ。
基本中の基本なので、これぐらいは見て分からないと・・・
0378nobodyさん2009/12/12(土) 21:38:30ID:???
すいません初学者なもので…
続いて質問で申し訳ないのですが、
----------input.txt-
1 2 3
4 5 6
7 8 9
-------------------
---------------output.txt-
左上の数字は1です
中上の数字は2です
   ・
   ・
   ・
---------------
input.txt->output.txtのようなprogramの書き方を教えてください
できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが
0379nobodyさん2009/12/12(土) 22:10:49ID:???
windowsならこうかな

perl -aln0e "print qq{$_の数字は$F[$i++]です}for qw(左上 中上 右上 中段左 真ん中 中段右 左下 中下 右下)" input.txt>output.txt
0380nobodyさん2009/12/13(日) 02:10:50ID:???
>>360

どこの大学の宿題だろう
0381nobodyさん2009/12/13(日) 06:32:28ID:tGb7lH/N
データ主導で変数名を決めるのは、出来るには出来るが上手いやり方ではない
0382nobodyさん2009/12/13(日) 06:52:19ID:???
>>378
大きなお世話なのはわかっているが言わせてくれ。
君はどうしてその学部に進もうと思ったんだい?
そういうことを勉強したくて行ったんじゃないのかい?
その宿題の解を提出して「よし、じゃあなぜそのアプローチを取ったのか説明してくれ」
と教授に求められたら「2chで出来る人達が勧めてくれました」と答えるのかい?
答えを貰うならば次に、同じような問題を目の前で10分以内に解け、
と言われてもまったく出来ないままだぞ。
君自身はいいのか、それで?
夏休みの読書感想文をコピペサイトからコピーして提出する小学生と同じだぞ。

そして変数名をデータに依存するのは間違ったアプローチだ。
他の入力データを持ってこられたらもう動かなくなる可能性がある。
0383nobodyさん2009/12/13(日) 07:26:08ID:???
>>378
eval("\$a_$_ = $_") foreach split /\s+/, $line;
if ($a_1 == 1) {...
elsif ($a_2 == 2) {...

正気の沙汰とは思えない
use strict できないし


やるんだったら
$hash{$_} = 1 foreach split /\s+/, $line;
if (defined $hash{1}) {...
elsif (defined $hash{2}) {...
0384nobodyさん2009/12/13(日) 09:02:08ID:???
>>382
読書感想文って意味のない宿題だからコピペで正解
0385nobodyさん2009/12/13(日) 13:18:23ID:???
>>382
あまり意味が分からないのですが、自分は大学生ではなく、高校生です
0386nobodyさん2009/12/13(日) 16:26:55ID:???
ガキにこんな事言うのなんだけど。
初心者を免罪符にして甘えるより、いっぱい見本がWEBが転がっているんだから、
そのソース見て学んだ方がいいよ。自分の為に。
0387nobodyさん2009/12/13(日) 17:13:31ID:???
> いっぱい見本がWEBが転がっているんだから、

KENT 時代の見本とか要らないです><
0388nobodyさん2009/12/13(日) 17:33:29ID:???
この程度の質問でkentもモダンもないだろ(笑)
0389nobodyさん2009/12/13(日) 17:40:38ID:???
>>378
3×3の行列みたいな感じだからこんなのがいいんじゃないかなー

my @matrix;
open my $in, "input.txt" or die $!;

while (<$in>) {
push @matrix, [split];
}

close $in;

my @pos = (
[qw(左上 中上 右上)],
[qw(中段左 真ん中 中段右)],
[qw(左下 中下 右下)],
);

open my $out, ">output.txt" or die $!;

for my $i (0..$#matrix) {
for my $j (0..$#{$matrix[0]}) {
print {$out} "$pos[$i][$j]の数字は$matrix[$i][$j]です\n";
}
}

close $out;
0390nobodyさん2009/12/13(日) 20:13:53ID:tGb7lH/N
そもそも4行目または4桁目が来た時点で破綻するのだがw
0391nobodyさん2009/12/14(月) 06:14:02ID:???
>>390
4桁目がきたときには日本語でどうやって表現すんの?
「もっと右」?
4行目がきたときには日本語でどうやって表現すんの?
「もっと下」?
問題文も読めないの?バカなの?

0392nobodyさん2009/12/14(月) 08:15:42ID:???
そもそも、3x3固定じゃないと破綻するようなものを格納すんのに多次元配列使う意味ないわな。
0393nobodyさん2009/12/14(月) 16:20:18ID:???
my @pos = (
[qw(左上 中上 右上)],
[qw(左中 真中 右中)],
[qw(左下 中下 右下)],
);

open my $in, "input.txt" or die $!;
open my $out, ">output.txt" or die $!;

foreach my $p (@pos){
my @s = split(/\s+/, <$in>);
foreach(0..$#{$p}){
print $out "$p->[$_]の数字は$s[$_]です\n";
}
}

close $out;
close $in;

素直に書く。
0394nobodyさん2009/12/23(水) 12:34:01ID:???
質問です

あるファイルの容量を表示するのに、現在はこのように書いてます

my $size = -s('data.dat');
$size = sprintf('%.1fKB', $size / 1024);

これをもう少しスマートに書きたいと思っているんですが、どのような
書き方がありますか?
一応以下のようにしてみたんですが、use warningsさんに怒られて
しまいました

my $size = sprintf('%.1fKB', -s('data.dat') / 1024);
03953612009/12/23(水) 13:25:55ID:???
>>394
-sの外側に括弧付けても怒られる?何てメッセージ出るの?

use strict;
use warnings;

warn sprintf('%.1fKB', (-s 'data.dat') / 1024);
これでメッセージでなかったけど。
03963942009/12/23(水) 13:42:09ID:???
>>395
ありゃー
括弧は-sの外ですか
それで問題なく動きました

ありがとうございます
0397nobodyさん2009/12/23(水) 22:18:38ID:???
>>395じゃないけれど……

-sっていうのは演算子だから、組み込み関数とは違う、
という補足をしておこう
0398nobodyさん2009/12/24(木) 10:25:12ID:???
ActivePerlでStatistics::Basicモジュールは何処に、なんという名前で保存されているのでしょうか?
標準偏差を出す計算が、自分で書いた方がモジュール使う倍くらい速かったので、
モジュールは呼び出す分遅いのか、自分は計算にforeach使ってモジュール内部ではwhileだからなのだろうか、
とか思って、コードを見てみようとC\:Perl\libを漁ってみたのですが、見つからず・・・

このままだとコーディングの話ではないので取ってつけますが、
平均を出す処理 → その値を使って標準偏差の計算と、2回ループを回していたのですが、
(そんな泥臭い方法でモジュールを使う倍速なので驚いていたのです)
もう少し洗練された書き方があれば教えてください。
my $sum1;
my $sum2;
my $number = @data;

foreach my $i(@data) {
  $sum1 += $i;
}
my $avg = $sum / $number;

foreach my $i(@data) { #ここがいかにも胡散臭い・・・
  $sum2 += ($i - $avg)**2;
}
my $stddev = sqrt( $v / $number );
0399nobodyさん2009/12/24(木) 10:43:42ID:???
>>398
つperldoc -l Statistics::Basic
04003982009/12/24(木) 10:56:35ID:???
>>399
ありがとう、一つ賢くなりました。
初心者ほどmanコマンドを使わないという、Perl版の気分です。
0401nobodyさん2009/12/24(木) 15:08:02ID:Kh9UPbn8
>>398
こんな式じゃなかったっけ?

foreach my $i(@data) {
  $sum1 += $i;
  $sum2 += ($i)**2;
}
my $stddev = sqrt( ($sum2-$number*$sum**2)/ $number );

0402nobodyさん2009/12/24(木) 18:32:09ID:???
Statistics::Basic のソースちょっと追ってみたが、eval 使いまくり。
そりゃ遅いわ…。って呟くだけなのもなんなので。

見栄えが良いってんなら、
use List::Util qw( sum ) ;
my @ddata = ... ;
my $avg = ( sum @data ) / @data ;
my $stddev = sqrt ( ( sum map{ ( $_ - $avg )**2 } @data ) / @data ) ;

0403nobodyさん2009/12/24(木) 19:27:27ID:???
eval EXPRはコンパイルあるから遅いけどeval BLOCKはそんなに
遅くないんじゃないかなぁ。
0404nobodyさん2009/12/24(木) 19:41:39ID:???
ttp://d.hatena.ne.jp/tokuhirom/20080115/1200410601
の
*{"$pkg\::oh"}
なんですけど、
1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
3. なんで:の前にバックスラッシュが必要?
この三点を教えてもらえないでしょうか?
0405nobodyさん2009/12/24(木) 20:47:12ID:pZAKTGQQ
1より大きい平方数で割りきれない自然数全体の集合をSとする。
等差数列{a_n}は公差が正であり、その全ての項がSの要素である。
{a_n}の初項でないある項が2010のとき、{a_n}の個数の最大値が存在するならばそれを求めよ

この問題を解くために次のようなprogramを考えました
何がいけないのでしょうか

http://www1.axfc.net/uploader/Sc/so/66961

拡張子は適当に変更をお願いします
0406nobodyさん2009/12/24(木) 21:56:51ID:???
宿題は人に頼んな
0407nobodyさん2009/12/24(木) 22:11:33ID:???
540 :Name_Not_Found:2009/12/24(木) 20:38:14 ID:???
お前に指導するまえに言っておきたいことがある
かなり厳しい話もするが、俺の本音を聞いておけ
俺より先に投げてはいけない
俺より後に曲げてもいけない
バグはうまくとっぱらえ、いつもきれいに書け
できる範囲で構わないから
忘れてくれるな、デバッグもできない男に
このスレを守ることなどできないことを
お前にはお前にしかできないこともあるから
それ以外は口出しせず、黙って俺についてこい

お前の技術と俺の技術、どちらも同じだ大切にしろ
小技、大技、賢くこなせ
たやすいはずだ愛すればいい
人の陰口は言うな聞くな
それからつまらぬ嫉妬はするな
その方法はある
たぶんあると思う
あるんじゃないかな
ま、ちょっと覚悟はしておけ

スクリプトはみんなで育てるもので
誰かが苦労して
つくろうものではないはず
お前はこのスレへ、恥を忍んでくるのだから
帰る場所などないと思え
これからこのスレがお前の家
0408nobodyさん2009/12/24(木) 22:16:57ID:???
>404
1. 実行時に名前空間$pkgに関数ohを作るためにグロブを使う。この関数ohはlocalしてるのでrunを抜けた時点で破棄される。
2. runはプロトタイプrun(&)で宣言されてるので、これは関数のリファレンスを渡したものとして扱われる。
すなわちrun(sub { oh() })
3. $pkg::ohだとpkg名前空間の$ohという変数になってしまう。*{$pkg . '::oh'}と等価。
0409nobodyさん2009/12/24(木) 22:53:34ID:???
>>408
御回答ありがとうございます。
1.については自分がグロブをよく分かっていないことが分かりましたので勉強します。
2.については自分の質問の仕方がまずかったのかよく分かりません。
もう少し自分で考えてみます。
3.についてはすっきりしました。こんなテクがあるんですね。。。
0410nobodyさん2009/12/24(木) 23:23:20ID:???
あ、俺が変な受け取り方してたか。
*{"$pkg\::oh"}の中括弧はこの括弧でくくった範囲が識別子ですよ、ってこと。
0411nobodyさん2009/12/25(金) 12:15:55ID:???
>>410
中括弧にはそういう使い方もあるのですね。
perlは文法項目がたくさんあって覚えるのが大変ですが、
がんばって勉強したいと思います。
御回答ありがとうございました。
0412nobodyさん2009/12/25(金) 12:53:54ID:???
>>411
パッケージ変数(グローバル変数)には色々な型がありますが(スカラー$、配列@、ハッシュ%等)、
それらはグロブを経由して格納されています。

例えば、以下のように様々な型の同名変数が宣言されたとします。

$foo = "hoge";
@foo = ("hoge", "fuga");
%foo = (hoge => 1, fuga => 2);
sub foo { print "hoge" }

このとき、グロブ*fooには、下図に示すように、SCALAR、ARRAY、HASH、CODE・・・(他にもあります)
という場所に、各型に対する実体へのリファレンス(ポインタ)が格納されており、これをスロットと
呼びます。

┏━━━━━━━━━┓
┃    ┌────┐.┃$foo
┃    │SCALAR ┿╋━━→ "hoge"
┃    ├────┤.┃@foo
┃グロブ│ ARRAY ..┿╋━━→ ("hoge", "fuga")
┃*foo .├────┤.┃%foo
┃    │. HASH  ┿╋━━→ (hoge => 1, fuga => 2)
┃    ├────┤.┃&foo
┃    │. CODE  ┿╋━━→ sub { print "hoge" }
┃    └────┘.┃
┗━━━━━━━━━┛
04134122009/12/25(金) 12:54:42ID:???
各スロットへは、

*foo{SCALAR}
*foo{ARRAY}
*foo{HASH}
*foo{CODE}

と型を中括弧で囲んでアクセスできます。

スロットには各変数のリファレンスが格納されているので、実体にアクセスするにはデリファレンス
(リファレンス先の実体を見ること)する必要があります。

例えば、$fooの実体にアクセスするには、

print ${ *foo{SCALAR} }; #=> hoge

とします。
デリファレンスは、リファレンスを中括弧で囲み、適切な型識別子(この場合$)を前に付けます。

このように、実際のアドレス値が格納されているリファレンス(ポインタ)をハードリファレンスと
もいいます。

これに対して、文字列を変数名として認識するシンボリックリファレンス(ソフトリファレンス)
というのもあります。

print ${ "foo" }; #=> hoge

同じく中括弧で囲みデリファレンスします。
04144122009/12/25(金) 12:55:31ID:???
さてここまでが前置きで、質問に答えたいと思います。

>1. グロブを使う理由(右辺が関数リファレンスだから$でいいんじゃ。。。)
先述しましたように、関数を登録する場合、グロブのCODEスロットに関数リファレンスを代入する
必要があります

前置きで話した、*fooで説明しますと、*foo{CODE}に関数リファレンスを登録すればいいのです。

*foo = sub { print "fuga" };

この式の右辺が、関数リファレンスなので、Perlはこれを察して、CODEスロットにこの関数リフ
ァレンスを代入してくれます(*foo{CODE}に代入される)。

>2. ここの中括弧の意味(ハッシュでもブロックでもないような。。。)
前置きで話したシンボリックリファレンスのデリファレンスです。
デリファレンスは中括弧で囲みます。

え〜と、ここまで回答しておいてなんですが、私もまだPerl初心者です^^;
色々ググって調べました。
間違いがあれば詳しい人が訂正してくれるでしょう。
0415nobodyさん2009/12/25(金) 15:55:02ID:???
>>412
詳しい説明ありがとうございました。
グロブと中括弧によるデリファレンスの考え方が肝であり、
その肝が全く分かっていなかったようです。
まだ完全に理解出来たわけではありませんが、
じっくり考えれば首尾一貫した説明が自分の中で出来そうです。

ところで、
"&foo"は関数の実体である一方、
他方"sub { print "hoge" }"というエクスプレッションは関数へのリファレンスなので、
"sub { print "hoge" }"を"sub { print "hoge" }の実体"とするとより厳密になる気がします。
0416nobodyさん2009/12/25(金) 17:31:14ID:???
>>415
確かにコードだけは実体ではないですね。
この辺りの詳しい内容は実用Perlプログラミングに載っているそうです。
0417nobodyさん2009/12/25(金) 17:55:48ID:???
まーそういうのを無名関数というんだけどね
後、デリファレンスにはかぎかっこを使わない方法もある(つか、普通はそっちを使うな)
0418nobodyさん2009/12/26(土) 12:21:31ID:???
>>405
とりあえず作ってみた。
答えがあってるかどうかはわからないけど。

my $num_needed = 2010;
my $max = 10**6; # $max個以上の個数は計算しない(無限ループ対策)
my %answer = ( n => 0 );

for my $a1 ( 0 .. $num_needed-1 ) { # 初項
for my $d ( 1 .. $num_needed ) { # 公差
next if ( $num_needed - $a1 ) % $d != 0;
my $n = calc_n( $a1, $d, $num_needed );
@answer{ qw(n a1 d) } = ($n, $a1, $d) if $n > $answer{n};
}
}

print "最大個数は$answer{n}個、その時の初項は$answer{a1}で、公差は$answer{d}";
0419nobodyさん2009/12/26(土) 12:22:18ID:???
>>418の続き

sub calc_n {
my ($a1, $d, $num_needed) = @_;
my ($an, $n);

for ( $n = 1; $n < $max; $n++ ) {
$an = $a1 + ($n - 1)*$d;
last if is_divisible_by_square($an);
}

return $an < $num_needed ? 0 : $n;
}


sub is_divisible_by_square {
my $num = shift;

return if $num < 4;

for my $i ( 2 .. int sqrt($num) ) {
return 1 if $num % $i**2 == 0;
}

return;
}
0420nobodyさん2009/12/26(土) 15:04:14ID:???
宿題の上にマルチポスト(2ch以外ん所)する奴に
遅レスなんかすんなよ。
0421nobodyさん2009/12/26(土) 17:55:21ID:???
use XML::DOM;
としたのですがこの行でエラーが起きています。
XML::DOMを使う場合には別途インストールしないといけないのでしょうか?
0422nobodyさん2009/12/26(土) 17:57:34ID:???
エラー内容見ればインストールすべきか分かるだろアホ
0423nobodyさん2009/12/27(日) 16:45:54ID:???
perlのcgiで変数から指定したxmlファイルがない場合はファイルを作成し、保存したいです。
また、xmlがある場合はそれに追加していく形で処理したいのですが
参考になるコードなどはあるでしょうか?
0424nobodyさん2009/12/27(日) 18:40:27ID:???
>>423
-f xmlファイル ? 追加 : xmlファイルを作成し保存 ;
0425nobodyさん2009/12/28(月) 13:39:29ID:gHIXK3gx
正規表現で、ひらがな/カタカナ問わずにマッチさせたいのですが、うまくいっていません。
現状のテストコードは以下です
(@wordsの末尾要素はタイプミスでカタカナの"ヘ"になってしまっているもの)

use utf8;
use charnames qw(katakana hiragana);
my @words = qw(ヘシ折る へし折る ヘし折る);
for my $word (@words) {
 my $re = qr/\N{he}\N{si}折る/; #なんらかの方法でこのような正規表現を作成する
 if ($word =~ $re) { print "matched!!\n"; }
 else { print "unmatched...\n"; }
}

出力は以下です
matched!!
unmatched...
unmatched...

use charnameのカタカナの方しか効いていません。
useの引数内の順番を変えるとマッチングも変わるので、一方しかマッチしない様子です。
両方マッチさせることは可能でしょうか。

また、Unicodeブロックを使ってもう少し効率的にできそうな気もするのですが、
いろいろ試した範囲では、カタカナやひらがなの有無は判断できても
それ以上には使えない気がしました。(随分調べたのですが・・・

$word =~ /(\N{katakana}|\N{hiragana})+/
これでは@wordsすべてにマッチしますが、"ググる"にもマッチしてしまう

なにかとっかかりがあれば、お願いします
0426nobodyさん2009/12/28(月) 13:55:13ID:???
アドバイスとして、かなカナ両方にマッチさせたいときはその両方パターンにマッチさせるよりも
どちらかに変換してマッチさせたほうがスマートな気がする
04274252009/12/28(月) 13:56:20ID:???
訂正です
×$word =~ /(\N{katakana}|\N{hiragana})+/
○$word =~ /(\p{InKatakana}|\p{InHiragana})+/
0428nobodyさん2009/12/28(月) 14:25:43ID:???
charnameが片方しか効かないとかいうのは理解が
おかしくて、

use charnames qw(katakana hiragana);

と2つ書いても検索の順番を決めてるだけ。
同じ名前があれば先に見つけた方になる。
うまいこと文字クラスにしてくれるような便利な
ものではない。

[へヘ][しシ]でいいんじゃねーの?
0429nobodyさん2009/12/28(月) 14:37:42ID:???
$word =~ tr/ここに平仮名を並べる(もしくは文字コード指定)/ここにカタカナを並べる((ry)/;
04304252009/12/28(月) 14:42:33ID:???
>>426 >>428 >>429 ありがとうございます。それぞれシンプルですね。

正規表現の方ですが、次の記述で対応できそうでした。
(>>425の変更部分の抜粋)
use charnames qw(:full);
my $re = qr/[\N{KATAKANA LETTER HE}\N{HIRAGANA LETTER HE}]
      [\N{KATAKANA LETTER SI}\N{HIRAGANA LETTER SI}]折る/x;

けどこれだと>>428をややこしくしただけ・・・
両方にマッチする記法があるはずというところからスタートしてしまったので、
ちょっとハマってしまっていたようですm(_ _)m
0431nobodyさん2009/12/29(火) 07:27:32ID:???
>>426
case sensitiveでない検索エンジンを作ったときはその対策でいったな。
インデックス作る時に全部一旦大文字に変換して流し込んだ。

ちなみにヶ、ヵは本来漢字やその誤用だからひらがなにすべきではないし、
ヴは本来外来語の表現専用だからひらがなにすべきではないと俺は思う。
だからやるんだったら平仮名->片仮名変換。
0432○~* ◆q7u/null4U 2010/01/01(金) 04:02:13ID:PXOfMB4R
あけおめ.
ことよろ.
0433今日からperl2010/01/02(土) 20:11:44ID:jeXHm8zZ
1:XML::RSSのダウンロードがわかりません。
2:5_10.dbがないと言われたので勝手に空のファイル作ったら
3:ダウンロードできたみたいな雰囲気になったけど、ダウンロードされてない。

宜しくお願いします。
0434nobodyさん2010/01/03(日) 08:10:22ID:???
>>433
sudo cpan -i XML::RSS

これで質問に適当に答えればインストールされるはずだが。
2: は何でのエラー?cpanコマンド?
0435今日からperl2010/01/03(日) 13:03:19ID:6EQQX2jn
>>434
sudoは内部コマンドまた外部コマンド、操作可能なプログラムまたはバッチファイル
として認識されていません。と出ます。

cpanと打つと動いて
cpan>
の画面になります。そこでinstall XML::RSSと打つと
長々と動きますが、途中でさっきの「内部コマンドまたは外部〜」
のエラーが出たり、makefile NOと最後のあたりに出たりします。
0436nobodyさん2010/01/03(日) 13:25:56ID:???
まともな答えがほしいなら自分の環境くらい最初に書け
windowsのactiveperlならcpanじゃなくてppm使え
0437今日からperl2010/01/03(日) 14:47:50ID:6EQQX2jn
OSはXP Home Edition2で
activeperlをインストールしました。

必要な情報がわかりませんのですいません。
0438今日からperl2010/01/03(日) 14:51:40ID:6EQQX2jn
ppmと打つと
〜5_10.dbが
unable to open database file
と帰ってきます。
0439nobodyさん2010/01/03(日) 17:38:27ID:???
それパソコンが物故割れてるから新しいの買った方がいいよ
0440nobodyさん2010/01/03(日) 17:41:26ID:???
http://oshiete1.watch.impress.co.jp/qa5106481.html
0441nobodyさん2010/01/04(月) 01:50:08ID:???
>>438
エラーの原因を人に聞くときは、
> 〜5_10.dbが
などと勝手に省略しないで、丸ごとコピペするのが鉄則。余りに長い場合を除くが。

>>440
DOS時代からPC使っていると本能的に避けてる問題だから、ユーザー名に漢字を使っていてエラーになったPCをチェックしたとき、それが原因だと気づくまではまったことがある。
0442nobodyさん2010/01/04(月) 11:09:43ID:???
家庭用PCだし、ユーザ名なんぞイニシャル一字でいいや



と思って入力したら、実は全角が入ってて泣いた。
0443nobodyさん2010/01/04(月) 14:11:57ID:N9GeTuHk
はじめまして!初心者です。
いい感じのフリースクリプトのページを見つけたのですが、
改造したいのにどこを変えればいいのか、全然意味がわかりません!

http://homepage1.nifty.com/kkuri/computer/ExAuction.html

ここに載ってるスクリプトをどなたか解説していただけませんか??(涙)


0444nobodyさん2010/01/04(月) 17:13:05ID:???
>>443
授業料払ってくれるならな・・・。
ついでに言えば一体何年前のスクリプトなんだといいたくなる位
ひどい代物だから学ぶことなんか何もないぞ。
0445nobodyさん2010/01/04(月) 19:24:02ID:???
こういうの見るとネットの普及も良し悪しだなと思う
0446nobodyさん2010/01/04(月) 19:34:23ID:N9GeTuHk
>>444
古いものなんですか、初心者過ぎてわかりませんでした。
フリーマーケットの出来るプログラムを書きたかったんですけど、独学じゃ無理っぽくて。
エクセルも使えないし(涙)
0447nobodyさん2010/01/04(月) 19:43:17ID:N9GeTuHk
無理だと早く気づいていればよかった;;

愚痴すいません。
0448nobodyさん2010/01/05(火) 07:28:10ID:???
>>446
そういう時のためにサポート付きのプロダクトがあるわけだが。
まあ普通それなりの値段はするから覚悟しとけよ、と。

結局必死で勉強するか金払うかの二択。
0449nobodyさん2010/01/05(火) 09:53:32ID:???
お金やら信用やら絡むから人に改造頼んでも自分でメンテできないと恐ろしいかも。
0450nobodyさん2010/01/05(火) 11:59:11ID:???
>>444
現代風の学ぶべきサンプルがあったら紹介お願いします。
0451nobodyさん2010/01/05(火) 12:14:07ID:???
>>450
PlaggerとかMojoじゃないかな?
0452nobodyさん2010/01/05(火) 16:51:16ID:???
>>450
とりあえず一定規模以上の開発にCGIスクリプトはありえん。WAF使えと。
WAF: Catalyst
DB: DBIC / CDBI
Tmpl: TT / CS

Moose Catalyst使うならMooseも覚えとけ。

サンプルはそれぞれのマニュアル参照。
フリマのサンプル?知るか。有償で作ってやってもいいが。
0453nobodyさん2010/01/05(火) 16:52:22ID:???
>>451
さすがに物販サイトにそれPlaは言いすぎだろ。
0454nobodyさん2010/01/05(火) 17:15:38ID:???
じゃあPlack/PSGIで
0455nobodyさん2010/01/05(火) 17:18:20ID:???
>>454
Plackはレイヤーが違う。
Plack::Apache2とCatalyst::Engine::Plack入れときゃいい話で
WAF使うならPSGIは意識しなくていい。

モジュール名はうろ覚えだから間違ってたらスマソ。
0456nobodyさん2010/01/05(火) 17:27:13ID:???
ClearSilverはコンパイル必須なのが敷居高いな
それとPerlバインディングは妙な使いづらさがある
速いのはいいんだけど
■ このスレッドは過去ログ倉庫に格納されています