Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0505nobodyさん
2006/08/15(火) 21:03:52ID:???tableの行をforeach文で増やしたい場合は、どのようにするのが適切でしょうか?
・
・
foreach (@abc){
$q->Tr(
$q->td($q->b("xxx")),
$q->td($q->b("yyy"))
)
}
・
・
のようなカタチでやってみると、うまく表示が出ません。
この描き方は間違っているのでしょうか?
ご教授お願いします。
0507505
2006/08/15(火) 21:59:06ID:???レスありがとうございます。
print は一番初めにかいて、
print $q->start_html,
$q->start_table,
foreach (@abc){
$q->Tr(
$q->td($q->b("xxx")),
$q->td($q->b("yyy"))
)
}
$q->end_table,
$q->end_html;
の用に利用していました。
ここで、foreach文を使うときは、foreach文のブロック部分と、それ以外の部分のところでつかうprintを分けてみたらできました。
506さんのレスで気がつくことができました。
ありがとうございます。
0508nobodyさん
2006/08/15(火) 22:15:10ID:OtEfXNbtmy $sca = join '',@arr;
どうしてもこんな処理をしたいんですけど、
もっとスマートに書く方法はありますか?
以前は
foreach my $line(<FH>){
chomp;
$sca = $line;
}
としてたんですが、
うまい方法をご教授願います
0509508
2006/08/15(火) 22:17:00ID:OtEfXNbt× $sca = $line;
〇 $sca .= $line;
0510nobodyさん
2006/08/15(火) 22:25:47ID:???my $sca = do {local $/; <FH>};
これはどう?
0511508
2006/08/15(火) 22:47:02ID:OtEfXNbtdoは使った事がないので、今はあまり理解できてませんが参考になりました。
ありがとうございます。
0512nobodyさん
2006/08/16(水) 00:10:37ID:???これじゃなにか不具合でも?
0514508
2006/08/16(水) 00:29:17ID:???そんな方法があったとは(゚д゚)
これに決めました。ありがとうございます。
>>513
どうしても空文字列を使うのが気に入らないので、質問させて貰ったんです。
すみません
0515nobodyさん
2006/08/16(水) 00:50:21ID:???( ^ω^)
0517nobodyさん
2006/08/16(水) 10:58:24ID:???0518nobodyさん
2006/08/16(水) 11:20:10ID:???0519508
2006/08/16(水) 12:08:18ID:???>>512の方法を使わせて貰ったんですが、
その後に
$sca =~ s/#command#/$hash{'command'}/g;
のような処理をしたいんですが、
マッチさせたい部分が
#com\n\tmand#
のようになってしまったらマッチできません。
$sca =~ s/\n|\t//g;
のように逃げる事も可能ですが、
さらにその後に
HTMLとして出力するのでソースが崩れてしまいます。
#command#等の種類が多いので
s/#(\r|\n|\t)?c(\r|\n|\t)?o(\r|\n|\t)?m(\r|\n|\t)?m(\r|\n|\t)?a(\r|\n|\t)?n(\r|\n|\t)?d(\r|\n|\t)?#/$hash{'command'}/g;
これじゃ酷いです。
長くてすみませんが解決策があれば教えてください。
0520nobodyさん
2006/08/16(水) 12:29:16ID:???0522508
2006/08/16(水) 13:57:25ID:???なるほど(゚∀゚)
>>521
コマンド名を見直せば解決できそうです。
あと、対応してないコマンドだったら&cmdからreturn $_[0];でぉkですね。
0523nobodyさん
2006/08/16(水) 15:28:27ID:???そもそもそのなかに改行やタブが入るのを
許す必要なくね?
0524nobodyさん
2006/08/16(水) 16:55:37ID:4j1cx25o159,info...
115,info...
090,info...
061,info...
048,info...
019,info...
003,info...
という風に先頭の数字が降順に並んでいるデータに
降順のルールを破らずに任意の数字(既存の数字は除く)のデータを追加したいんですが、
なかなか良い方法が思いつきません。
新しいデータを単純に行頭に追加してデータ全体をソートする方法で良いんでしょうか?
ちなみにデータ数(行数)は500前後あります。
アドバイスよろしくお願いします。
0525nobodyさん
2006/08/16(水) 17:02:45ID:???0526nobodyさん
2006/08/16(水) 17:03:17ID:???まずやってみろって・・・
0527524
2006/08/16(水) 17:15:20ID:???すみません。
>新しいデータを単純に行頭に追加してデータ全体をソートする方法で良いんでしょうか?
というのは、「この方法で出来ますか?」という意味ではなくて、
「この方法は回りくどい方法じゃないですか?もっとスマートな方法があればアドバイス下さい」
という意味です。
自分はこの方法しか思いつかなかったんですが、
もしかしたらもっと良い方法があるんじゃないかと思って書き込みしました。
ちなみに課題等でもありませんし、コードまで書けというつもりもありません。
「こういう方法でやった方が良い」というアドバイスがあれば教えて欲しいと思っただけです。
0528nobodyさん
2006/08/16(水) 17:52:25ID:???0529nobodyさん
2006/08/16(水) 17:56:34ID:???0530nobodyさん
2006/08/16(水) 18:01:59ID:???0531nobodyさん
2006/08/16(水) 18:15:18ID:???0532nobodyさん
2006/08/16(水) 18:30:15ID:???それなら納得。
0533nobodyさん
2006/08/16(水) 18:34:53ID:???これをスマートにしろと?
0534524
2006/08/16(水) 18:52:56ID:???>>528
連想配列を使ってソート?ということでしょうか。
>>531
b-tree構造というものを初めて知りました。
これはとても役立ちそうです。
これから調べて検討したいと思います。
>>532
>任意の数字(既存の数字は除く)
は「データ中に既に存在している数字を除く任意の数字」という意味です。
分かりにくくてすみません。
>>533
「ソートする方法の中でよりスマートな方法は何ですか?」
ということではなく
「ソートする方法以外でよりスマートな方法はありますか?」
という趣旨で質問しました。
ちなみに、私はソートなら以下のような方法でやろうと考えていました。
push(@data,$new);
@data = map {$_->[0]}
sort {$b->[1] <=> $a->[1]}
map {[$_, split /,/]} @data;
0535nobodyさん
2006/08/16(水) 19:18:55ID:???更新、参照の頻度等を考慮して適したデータ構造を利用することがスマートなのだよ。
データ構造を勉強したことがなさそうだから、おとなしくソート使っとけ。
0536nobodyさん
2006/08/16(水) 19:39:04ID:???0538nobodyさん
2006/08/16(水) 19:48:30ID:???コマンドは英数字のみ許可すればいい
0539508
2006/08/16(水) 20:10:41ID:???その通りですね。
>>538
abc#cmd_1#def#cmd_2#ghi
だった場合に#def#もマッチする気がするんですが…。
あとは自分で解決できそうです。
皆さんありがとうございました。
0540nobodyさん
2006/08/16(水) 20:13:39ID:???0541524
2006/08/16(水) 20:40:08ID:???b-treeがらみでデータ構造について読んでみましたが
かなり奥が深いので腰を据えた勉強が必要なようですね。
そもそもデータの「構造」という視点を持っていなかったので
その辺の収穫が大きかったと自分では思っています。
少なくとも今扱っているデータ量だとソート力技でやっても
大きな問題はなさそうなので、おとなしくソートでやろうと思います。
>>536
ソートの方法の中身についてはハッシュも含めて色々検討したいと思います。
ありがとうございました。
0542nobodyさん
2006/08/16(水) 20:53:48ID:???該当する一行を削除するcgiを作っているのですが、
うまくいきません。
csvを開いたときの処理はこう書いています。
&fileopen(CSV,"<",$csv);
while ($line = <CSV>)
{
if($line =~ m/^"$no",/)
{
$line =~ s/$line//;
}
else
{
$line = $line;
}
print CSV "$line";
}
close(CSV);
もし、入力した$noと読み込んだ行の先頭がマッチしたら、
その行を空白にし、そうでなければ、そのままCSVに出力するという
流れなのですが、どなたかご教授お願いします。
0543nobodyさん
2006/08/16(水) 21:18:04ID:???open(INFH, $csvin);
open(OUTFH, '>'.$csvout);
while(my $line = <INFH>){
chomp($line);
if($line !~ /^$no/){
print OUTFH . "\n";
}
}
close(INFH);
close(OUTFH);
0544nobodyさん
2006/08/16(水) 21:24:06ID:???これって、マジ?
何が問題?
0545542
2006/08/16(水) 21:25:08ID:???ありがとうございます。
固定長データのファイルじゃないというのは
どういうことなのでしょうか?
アホっぽい質問ですみません。
0546nobodyさん
2006/08/16(水) 21:36:30ID:???ちゃんと考えて読み書きするならいいが、
現在位置から30バイト読み取り、30バイト戻って31バイト書き出せば次のデータの1バイトが欠落するよね?
で、1行ずつ読み取って処理するのにprintしちゃったら正確な次の行が読み取れませんよと。
(seekつかって確かめてみるとわかります)
0547nobodyさん
2006/08/16(水) 21:40:17ID:s8jUvrs4これを読込んで、「2004年12月5日」という形にして表示させたいのですが、
どうやっていいか分からず困っています・・・・・・。よろしくお願いします orz
0550nobodyさん
2006/08/16(水) 21:49:13ID:???失礼 orz
では「20041205」を「2004年12月05日」ってのはできるでしょうか・・・・・・?
0551nobodyさん
2006/08/16(水) 21:51:23ID:???あぁ、なるほど。
1行ずつ読み取って書き込みという処理しないから考えたことなかった。
ちなみに$noをマッチングさせる方法だと
0とか1とか入れたらどうなるんだろ。
csvデータで1コ目のセルには$noの値のみが入っているという前提に立つと
open(FH, "+< $csv") or die;
flock(FH,2);
while(my $line = <FH>){
my @tmp = split(/,/,$line);
if($tmp[0] eq $no){$line = '';}
push(@data,$line);
}
seek(FH, 0, 0);
print FH @data;
truncate(FH, tell(FH));
close(FH);
オレならこう書くかなぁ。
0552nobodyさん
2006/08/16(水) 21:51:35ID:???0554nobodyさん
2006/08/16(水) 21:55:20ID:???例えば$flag = 1のときはエラーメッセージを出して処理終了、
そうでなければ処理続行、というとき
if($flag){&error;}
その後の処理
と書くべきか
if($flag){
&error;
}else{
その後の処理
}
と書くべきか、どちらが好ましいんでしょうか?
0555nobodyさん
2006/08/16(水) 21:57:07ID:???$date = "20041205";
$date =~ s/^(¥d{4})(¥d{2})(¥d{2})/$1年$2月$3日/;
or
sprintf("%d年%d月%d日", unpack("A4A2A2", $date));
0557nobodyさん
2006/08/16(水) 21:59:04ID:???0560nobodyさん
2006/08/16(水) 22:04:13ID:???最近
$flag and die "hogehoge";
みたいな書き方が好き。
next とかは next if ($flag); が読みやすい気がする。
0561nobodyさん
2006/08/16(水) 22:04:47ID:???俺は、elseの処理が長くなるなら前者の方法を取るし、数行で終わるならelseの中に書いちゃう。
>550
my $aa = "20060703";
($year, $month, $day) = $aa =~ /(\d{4})(\d{2})(\d{2})/;
print $year, $month, $day;
0563nobodyさん
2006/08/16(水) 22:08:52ID:???処理の速さとかに影響があるのかと思って神経質になってましたが、
単純に可読性とか好みだけで選んで良かったんですね。
>$flag and die "hogehoge";
エラー処理を別に書かなくて良いから便利そうですね。
0564nobodyさん
2006/08/16(水) 22:09:55ID:???最近やっと = ? : ; がしっくり来るようになった程度だ
0567あぼーん
NGNG0568nobodyさん
2006/08/16(水) 22:30:47ID:???0570nobodyさん
2006/08/16(水) 22:59:30ID:???0571nobodyさん
2006/08/17(木) 06:09:44ID:???慣れてくると快感になるよ。
というか、perlstyle にあるけど、その行で何をするか一目でわかるのが大事で、
それによって条件を前に書くか後に書くか分けるといいと思う。
0572nobodyさん
2006/08/17(木) 12:25:28ID:nQZCnFuY変数の名前やルーチンの名前。
オブジェクトの名前。ハッシュのキー。
&form_getなどとするときにつなぎはアンダーバーとハイフンとどちらがいいでしょうか?
ハイフンはダメだったようなきも擦るのですが、
それとハッシュのキーでは逆にアンダーバーがダメでしたのでしょうか?
クォートして$form{"test_test"}とすればよかったですかな?
なんというか。アンダーバー・ハイフン戦争が始まったのです。
画像やファイルなどのつなぎをどちらにするか、
パール内での色々な名前のつなぎをどちらにするか。
そしてcss・・・
迷いが迷いwうみ。
どちらかに統一できないものかと・・
dgんwぷ2つびん2pつb2
たすけてくさい。
0573nobodyさん
2006/08/17(木) 12:32:40ID:???多分統一は無理。どこかで折り合いをつけなされ。
Perlの中とその他を完全に切り離して考えることが一番なので、
フォルダ・ファイル名からhtmlのid属性の値などは全てハイフンでやり、
Perlの中では臨機応変に。
0574nobodyさん
2006/08/17(木) 12:35:32ID:tIcJSB0O起こすコード書きたいんですがちょいとどうすればいいか分からず悩んでます。
存在するXMLを開いて拡張追記することは出来たんですが…
0575nobodyさん
2006/08/17(木) 12:41:45ID:IXvxvsSuどのような手順で行えばよいでしょうか?
http://cpan.uwinnipeg.ca/search?query=uri.pm&mode=module
↑のURLまでは辿り着いたのですが、どれをどのように使えばよいのか分かりません。
0576nobodyさん
2006/08/17(木) 12:42:55ID:???でぐぐれ
0577nobodyさん
2006/08/17(木) 12:45:46ID:???0580nobodyさん
2006/08/17(木) 13:23:13ID:???統一する意味がわからん。
0581nobodyさん
2006/08/17(木) 13:37:45ID:???変数や関数の名前にハイフンを使う事はできない。
ハッシュのキーはクオートで囲む必要はない。
$form{test}としても常に大丈夫であって、strictも通る。
perl救命病棟という変な名前の本にその辺のかなりマニ
アックな話が載っている。
0582nobodyさん
2006/08/17(木) 17:21:35ID:???0583nobodyさん
2006/08/17(木) 17:33:16ID:???CSSいじってperlいじってhtmlいじって。
そんなことしてるときに何かに名前をあげるときが来る。
「
う〜んこれはホゲの背景のためだからだからhoge-backとするか。
ん?ハイフン?アンダーバー?どっちだっけ?
他を見てみるか・・・
ハイフンだったな。
それじゃ画像を作るか。ん?ハイフンか?アンダーバーか?
」
なんてこともある。
0584nobodyさん
2006/08/17(木) 17:39:57ID:???理由って「悩むから」だけ?
じゃあCSSだけハイフン、あとは全てアンダーバーでOK
0585nobodyさん
2006/08/17(木) 18:09:23ID:???そうなるとhtmlで違和感を覚える。
nameはアンダーバーなのにidやclassだけハイフンっておかしくねえか?
ってね。
0586nobodyさん
2006/08/17(木) 18:10:41ID:???全てかんええええええwwwww
マジでウエkルwwwwwww
0587nobodyさん
2006/08/17(木) 18:12:52ID:???0590nobodyさん
2006/08/17(木) 19:38:03ID:???とか言い出しそうだな。
0592nobodyさん
2006/08/17(木) 20:08:40ID:???elsif
elseif
else if
0593nobodyさん
2006/08/17(木) 20:28:56ID:tIcJSB0Omy $xslt = XML::XSLT->new("hoge.xsl");
これだけで
Use of uninitialized value in subroutine entry at C:/Perl/site/lib/XML/Parser/Ex
pat.pm line 474.
Error executing run mode 'install': Error while parsing:
no element found at line 1, column 0, byte -1 at C:/Perl/site/lib/XML/Parser.pm
line 187
C:/hoge.xsl at C:/Perl/site/lib/XML/XSLT.pm line 1507.
at index.cgi line 7
とエラーが出て動く気配がありません。
ちなみにXSLの中は以下のようになっています。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xml:lang="ja">
<xsl:template match="/contents">
hoge
</xsl:template>
</xsl:stylesheet>
ためしにXSLの中を全部消してみてもダメでした。XSLファイル自体を
削除するとまた違うエラーが出たのでとりあえず読めてはいると思います。
すみません、ここで丸一日悩んでいるのですがどうすればうまいことサーバサイドで
XMLを変換できるのか、どうかご教授お願いします。
0594nobodyさん
2006/08/17(木) 22:22:55ID:???_と-なんて気にする必要ない。
0595nobodyさん
2006/08/18(金) 11:29:18ID:???安心してください。あまり悩む必要はありません。
通常 Perl の識別子として使えるのは /[\w][\w\d]*/ にマッチする文字列だけだからです。
変数名、関数名、パッケージ名、クォートを省略したハッシュキーにはそういった文字列が要求されます。
裸の "-" はソースコード中のトークンを分割してしまい、perl はそれを「マイナス演算子」としてパースするでしょう。
従ってそれほど迷うことができる局面は多くありません。少なくとも Perl コード中では。
0596nobodyさん
2006/08/18(金) 13:49:32ID:???0597nobodyさん
2006/08/18(金) 14:42:19ID:xIt7iz8d詳細が乗っているサイト若しくはやり方を教えてください。
内容としては翻訳サイトのページ翻訳のようなことがしたいです
宜しくお願いします
0599nobodyさん
2006/08/18(金) 14:47:31ID:xIt7iz8d今レスしてきました。
こちらにも解決した旨書こうと思ってたところです、遅くなってすいません。
別にマルチするつもりはありませんでした、回され続けたもので・・ほんとスイマセン。。
>>597の質問は解決しました
ありがとうございました
0600582
2006/08/18(金) 16:47:54ID:???0601nobodyさん
2006/08/18(金) 17:14:01ID:???# A.pm
package A;
use CGI;
1;
# B.pm
package B;
use A;
@B::ISA = qw(A); # この1行はなくても動くけど、実際の用途で使ってるので。
my $Q = CGI->new();
1;
こんなことやってもいいのかな?
つまり、B.pm で use CGI; って入れなくても、A で use して require してるから動くし警告も出ないんだけど、
これってお行儀よくないのかな? ってことなんだけど。
0602nobodyさん
2006/08/18(金) 17:35:23ID:???0603nobodyさん
2006/08/18(金) 18:57:28ID:lccc8Mkuアンダースコアならクォートしなくてもいいし、
もしかして、perlに関する名前系には全てアンダースコアがいいの?
でもなんでだろ。なんでハイフンを今まで使ってたんだろ。
何か理由があるはずだけどな。
0604nobodyさん
2006/08/18(金) 19:08:57ID:???意味が分かりません。
■ このスレッドは過去ログ倉庫に格納されています