Perlコーディング初心者質問スレ Part 51
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/27(木) 17:04:23ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0474nobodyさん
2006/08/12(土) 02:17:54ID:???0475nobodyさん
2006/08/12(土) 02:56:22ID:???釣りとしか思えない。
0476nobodyさん
2006/08/12(土) 06:21:24ID:???0477nobodyさん
2006/08/12(土) 06:22:39ID:???0478nobodyさん
2006/08/12(土) 15:50:42ID:???0480nobodyさん
2006/08/12(土) 16:34:26ID:???0482nobodyさん
2006/08/12(土) 22:08:26ID:???>Net::FTPを知ってて代入を知らないなんて。
すいません。本当にわからないのです。
取得したサイズを変数に代入するにはどうしたらよいのでしょうか?
0483nobodyさん
2006/08/12(土) 22:25:59ID:???0484nobodyさん
2006/08/12(土) 22:30:29ID:???0486nobodyさん
2006/08/12(土) 22:36:10ID:???右辺です。
0487nobodyさん
2006/08/12(土) 22:47:26ID:???0488nobodyさん
2006/08/13(日) 00:42:28ID:BxCEpRljそこで無名配列にハッシュのリファレンスを順番にpushしたいのですが上手くいきません。
なんででしょうか。
use strict;
use MLDBM qw(DB_File);
use Fcntl;
tie(my %save, "MLDBM", "data.db", O_CREAT|O_RDWR, 0644) or die "エラー";
push @{$save{$aaa}}, $hash;
untie %save;
0490nobodyさん
2006/08/13(日) 02:45:17ID:???0491nobodyさん
2006/08/13(日) 22:31:10ID:???0492nobodyさん
2006/08/13(日) 22:48:17ID:???0493nobodyさん
2006/08/13(日) 23:43:12ID:???0494nobodyさん
2006/08/14(月) 00:24:45ID:???0495nobodyさん
2006/08/14(月) 16:23:58ID:???$size = $ftp->size($testfile) || print "サイズ取得失敗";
つまり、優先順位がわからなかったかったものと思われる。
>>473は、次のうち好きなのを選んでね。
$size = $ftp->size($testfile);
$size || print "サイズ取得失敗";
($size = $ftp->size($testfile)) || print "サイズ取得失敗";
$size = $ftp->size($testfile) or print "サイズ取得失敗";
エスパーからの回答でした。
0497nobodyさん
2006/08/15(火) 11:24:02ID:???結構気づきにくいところだね。
0498nobodyさん
2006/08/15(火) 15:09:13ID:amgg11pzヒアドキュメント内で関数は使えないのでしょうか?
$a = 1;
print <<DOC;
元の値:$a
処理後の値:&hoge($a)
DOC
sub hoge{
my $tmp = shift
$tmp++;
return $tmp;
}
0500nobodyさん
2006/08/15(火) 16:44:41ID:???l''''レ :l|゙'rレ,,゙'r, .,,,,,,,
l .l ゙'!,,゙レヘ!" :| |
l .l___,,~ | :| .,,,
'l~~~~~~ ̄ .,,,,,_,,,, .| │ :|,,irrr‐'''''"~.゙'!i、
 ̄ ̄ ゙̄,l リ: : .| :| ィー'''''' ̄` .,,,,,ir-ー''''}" ,r"
'|'| .,,,, l|,,,,―i、 ,,,,,,i、,,,、 .,ri、 'l'ト │ ,l゙ | | =--'''''"| | ,i" ,r"
.l | ._,,, | l '{\ _,,二,、 ,rlレ''l''l'''!i,'i、 l゙,| ,-rr,|.|,,,,,i、 .,l゙ .,l゙ .| .| | :| ,i" ,i"
.,,l`|,|レr" .|.| .'Lト .'l|レー'''=゙L .,l゙,i´ l゙,! .リ゙l |.| .゙~ ̄|:| .,,i´ ,/ | l゙ | | .~'〃
: ,i'レ'~ .|.| ,r, ゙l,,} .,"| l..l、,ト,i´ .,!,レ | | ,,r-ノ.|,、 .,,i'" ,r" : ..,,i´.レ l゙ │
: リリ----r, ゙l,,l,,,i" ,,,,r!二 ゙l,,,,レ゙ ,r',,レ" l゙.| .l|'ニ,l゙,!!ii,= .,〃 ,,r" .゙l~゙゙゙゛.,,/ リ, .゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙レ
.~゙゙゙゙゙゙゙゙゙゙" `` ゙='''" `~` `゙゛ `"'''~ ゙'!'" "'''''''~゛ ゙~''''''''''''''''''''''''"
0502nobodyさん
2006/08/15(火) 19:34:41ID:???確認しました。出来るんですね。
でも、邪道なのか・・・。
大量に変数あるんで、いつも困ってたんだが、
おとなしく普通にするかな。
配列にして、ループで処理か。
printf <<"DOC", $a, &hoge($a);
元の値:%d
処理後の値:%d
DOC
みたいな?
0504nobodyさん
2006/08/15(火) 19:56:22ID:???"処理後の値: &hoge()";
or
"処理後の値: {hoge()}";
でちゃんと展開されるよ。
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の中では臨機応変に。
■ このスレッドは過去ログ倉庫に格納されています