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

Perl コーディング初心者質問コーナー Part36

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/07/14 13:23ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0666nobodyさん04/08/13 17:47ID:???
>>665
お前はまずオブジェクトを何に見立てるかができてないんだろ?
例えばメインパッケージを注文を電話で聞くお姉さん。
モジュールの方を、お姉さんが使うパソコン。
とかな。まあお姉さんが注文が来るたびにパソコンを買う(new)なんてのはおかしな話だがなw
0667nobodyさん04/08/13 18:17ID:???
質問です。
$hoge="hoge=1&data=a-a-a&test=23456";
この$valueの中からdata=a-a-aだけを取り出したいです。
data=a-a-aのある位置は毎回違うのでsubstrではできません。
data=に続く文字列も毎回違います。
splitとforeachを使って%formなどを作るのは禁止で、実現したいです。

$hoge =~ s/(data=.*?)&//;
$value = $1;
で一応data=...の後に&がある時は取り出しに成功できますが、
$hoge="hoge=1&data=a-a-a";
などの場合もあるのです。それと
$hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
みたいな場合もあります。

どうにかどんなときでもdata=文字列だけを一発で取り出せないでしょうか?
0668nobodyさん04/08/13 18:20ID:???
>>667
if ($hoge =~ /data=.*&/){
$hoge =~ s/(data=.*?)&//;
$value = $1;
}else{
$hoge =~ s/(data=.*)//;
$value = $1;
}

ちと長いな。
0669nobodyさん04/08/13 18:31ID:???
($value) = $hoge =~ /(data=.*?)&?$/;
0670nobodyさん04/08/13 18:32ID:???
($str) = $hoge =~ m/(data=[^&]*)/;
067166704/08/13 18:42ID:???
>>668-9
ありがとうございます
/(data=.*?)&?$/
これ不思議なコードですね;どうしてこれでうまくいくのかな。
$は&?にかかってるけど、&がないときは(data=.*?)にかかるって言う便利なコードですか?

・・・すごいですね>>669さんは。本当にすごいです。
067266704/08/13 18:44ID:???
>>670
それ私も一度試しましたが、駄目でした。
理由はわかりませんが
print $str;
で何も表示されませんでした。
067366704/08/13 18:48ID:???
>>669
($value) = $hoge =~ s/(data=.*?)&?$//;
としたいんですが、置換にすると置換数?真偽?が帰ってくるので
$hoge =~ s/(data=.*?)&?$//;
$value = $1;
とするしかありませんか?一行でバチッとできるとカッコイイんですが。

ものすごく>>669さんからの返事が楽しみです^^(頼り切ってすみません;)
067466704/08/13 18:51ID:???
>>672の発言は私の勘違いでした。すみませんでした>>670さん。
0675nobodyさん04/08/13 19:02ID:???
>>667
for my $hoge (qw(
  hoge=1&data=a-a-a&test=23456
  hoge=2&data=a-a-a
  data=a-a-a&test=12345
)) {
  my($value) = $hoge =~ /(?:^|&)(data=[^&]*)(?:&|$)/;
  print "$value\n";
}
0676nobodyさん04/08/13 19:03ID:???
>>671
669ではうまくいかんはずだが。
ちゃんと試したのかい?
0677669※04/08/13 19:03ID:???
置換しなければならないのだろうか?
そして、ハシュを拒否する事由は?

my $hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
my %hash = map +(split /=/), split /&/, $hoge;
printf qq|%s = %s\n|, $_, $hash{$_} foreach keys %hash;

env.:
$ perl5.8.5 -v

This is perl, v5.8.5 built for i686-linux
0678nobodyさん04/08/13 19:10ID:???
>>675は冗長。
$hoge =~ /\b(data=[^&]*)/
で十分。
067966904/08/13 19:10ID:???
>>676
何でうまくいったのか検証してしまったよ(w
068066704/08/13 19:16ID:???
>>675-6
/(?:^|&)(data=[^&]*)(?:&|$)/;
これは>>669さんのやつの変形ですか?でも>>669さんのコードで試したらちゃんと表示されましたよ?
テストが足りないんですかね?もう一度やってみます。

>>677
フォームで送られてくるデータを一度変数に入れて、その後
dataの部分だけをAルーチンに渡して、
それ以外をBルーチンに渡したかったのです。(ルーチンは外部ファイルに作ってあるます)

今はAルーチンとBルーチンの方で、ハッシュにする流れです。先にこちらでハッシュにしてわたしてもいいのですが、
こういうのもできたらカッコイイなと思って質問いたしました。

0681nobodyさん04/08/13 19:21ID:???
>>673
一行でバチッとw
$str = ($hoge =~ s/\b(data=[^&]*)//, $1);
068266704/08/13 19:23ID:???
for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
($value) = $hoge =~ /(data=.*?)&?$/;
print "$value<br>";
}
>data=a-a-a&test=23456
>data=a-a-a
>data=a-a-a&test=12345

>>676
さっきはうまくいったと思いましたが、↑のソースでやってみたらうまくいきませんでした;
ちゃんとテストしたつもりが勘違いでした;

>>皆様
もの凄く勉強になりました!本当にありがとうございました!それでは失礼します。
0683nobodyさん04/08/13 19:27ID:???
>>681
それ無理じゃないか?
0684nobodyさん04/08/13 19:37ID:???
>>660-663
オブジェクト指向で書く場合は俺はサニタイジングモードを作ってるよ。
sub new {
my $self = shift;
my $buffer = shift;
my %harmless_mode = (
normal => 1,
html => 0,
sql => 0,
csv => 0,
);
みたいなね。(1=on,0=of)

んで状態移行のメソッドを作っておけば一応問題ないかな。まあ俺は小規模プログラムしかやったことないから
大丈夫なだけかもねw


0685nobodyさん04/08/13 20:13ID:???
>>678
確かに >>667 のは \b で充分だね。分かって言ってるんだろうけど一応。

for my $hoge (
  "hoge=1&data=a-a-a&test=23456",
  "hoge=2&a-data=a-a-a&test=12345",
  "data=a-a-a\n",
) {
  my($value1) = $hoge =~ /\b(data=[^&]*)/;
  my($value2) = $hoge =~ /(?:^|&)(data=[^&]*?)(?:&|$)/;
  print "1[$value1] 2[$value2]\n";
}
0686nobodyさん04/08/13 20:33ID:???
>>683
君の頭ん中のPerlでは動かないようだね。
0687nobodyさん04/08/13 20:37ID:???
>>685
後ろの(?:&|$)も必要なんでつか?
0688nobodyさん04/08/13 20:55ID:???
オブジェクト指向ってよくわかんないんですけど、自分でモジュールを作る時に
sub new{
    my $this = shift;
    my $propety = {
           color => shift,
           weight => shift,
           };
    bless $propety,$this;
}
ていうコンストラクタだったとして、あとから他のメソッドで
sub change{
    my $this = shift;
    $this->{color} = "red";
    $this->{changed} = "1";
}
みたいにコンストラクタではなかったchangedっていうプロパティをいきなり作っちゃっていいんですか?
それとも、コンストラクタを
$propety = {
      color => shift,
      weight => shift,
      changed => 0,
      };
みたいにするべきでしょうか?そうしてしまうと新しいプロパティがほしくなった時に
わざわざコンストラクタをいじらなければいけなくて、不便かなと思うんですが・・・
068968304/08/13 21:00ID:???
>>686
ウソ!?って思って試してみた。

for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
$str = ($hoge =~ s/\b(data=[^&]*)//, $1);
print "$str\n";
}

PCに入ってるPerlでも動かなかったw
0690nobodyさん04/08/13 21:25ID:???
>>689
そのコードの$hogeはReadOnlyな文字列への別名だから、
置換できるわけなかろう。
$hogeをループ先頭でmy $hoge=$_;とすりゃ動いたぞ。(Perl5.8)
#つか、foreachであるべきところをケチってforにすんな、紛らわしい。

ちなみに>>685の問題も回避したい場合、
置換では>>675でもうまくいかんので、
$str = ($hoge =~ s/(?:^|(?<=&))(data=[^&]*)//, $1);
とするといい。
#後ろの(?:&|$)はいらんべ?
0691nobodyさん04/08/13 21:57ID:???
>>688
作法として行儀がいいかどうかは別として、blessされてる以外は
ただのハッシュだからキーの追加だろうが削除だろうが自由にでき
ます。

use fields使ってりゃ別だけどな〜

069268804/08/13 22:39ID:vpkCloyF
>>691
できるのは知ってるのですが、どうするのが一番「十分に拡張的なプログラム」なのかで悩んでます。
0693nobodyさん04/08/13 23:27ID:???
>>692
一番かどうかはともかく一つのやり方として。
コンストラクタでは何もせず、プロパティは全てアクセサ経由で触り、
初期値はアクセサで設定する。

#--- Foo.pm ---
package Foo;
sub new {
  my $class = shift;
  bless { @_ }, $class;
}
sub color {
  my $self = shift;
  @_ or return $self->{'-color'} ||= 'red';
  $self->{'-color'} = shift;
  $self;
}
1;
#--- script ---
use Foo;
my @obj = (Foo->new, Foo->new(-color => 'green'), Foo->new);
$obj[2]->color('blue');
print $_->color, "\n" for @obj;
0694nobodyさん04/08/13 23:34ID:Dbtrqa9I
http://pc5.2ch.net/test/read.cgi/prog/1092405363/
喧嘩を売っています
0695nobodyさん04/08/14 03:15ID:HZTk9WgD
PerlでXMLファイルのデータを引き出したいのですが、方法がさっぱりなのです。
普通にファイルオープンの open(AAA,"<BBB.txt") のように開いて
データを取得することが出切るのでしょうか?

検索で、解説ページなどを探したのですが良いサイトが見つかりません。
(探し方が悪いだけかもしれませんが・・・・)
どこか良いサイトなどがありましたら、教えてください。
0696nobodyさん04/08/14 03:19ID:???
そのぐらい自分で探せないようならあきらめろ
069768804/08/14 10:22ID:???
>>693
例まで書いていただいてありがとうございます。

買う時には必要でなかったプロパティが、買ってから途中でほしくなった場合のために
プロパティを後から追加できるオブジェクトメソッドを作っておいたらオブジェクト指向の利点がどこかで
失われてしまいますか?

sub additional_propety {
  my $class = shift;
  $class->{shift} = shift;
}

第2、第3引数に新規に追加するプロパティとその値を期待します。
0698nobodyさん04/08/14 10:39ID:???
>>697
そもそもコンストラクタ(new)を「買う」ことだと思ってる時点で、間違ってるな。
まあよくある解説だけどw

人に置き換えて考えてみ?例えば友達に「ジュース買ってきて」って頼むだろ。
そんでその友達がジュースをkって来るのは友達にはそういう振る舞いができるってこと
で、お前はその友達のインターフェースさえ知っていれば何度でもジュースを買ってきてもらえるんだ(買ってこない友達の状態もあるけどな)。

んでこんな時に new=買う ではおかしいだろ?だから new=自分と同一世界にいると認識する
なわけよ。だから認識さえすれば、人の家のテレビだって使えるわけだ。これが自然。
0699nobodyさん04/08/14 11:03ID:???
くだらん例えはいい
0700nobodyさん04/08/14 11:16ID:???
>>699
オブジェクト指向を理解させるのに、正しい例え話を聞かせるのって結構有効だろ?
そんなに怒るなよ
0701nobodyさん04/08/14 11:20ID:???
>>699
この板きて珍しく禿同な意見
0702nobodyさん04/08/14 15:31ID:???
Perlの変数名とかに予約語を使っても大丈夫なのは仕様ですが?

$sub
$exit{for}

ここらへんがPerlのいいところですか?(Perlとmysqlしか知らないのでよくわかりませんが、すくなくともSQLでは予約語はdb_name,tbl_name,columns_nameには使えなかった気がしたので)
0703nobodyさん04/08/14 15:35ID:???
何だよ仕様ですが?って
0704nobodyさん04/08/14 15:52ID:???
$test = {
a => 1,
b => 2,
c => 3,
};
このハッシュのキーと値を「=」でjoinして、さらにそれを「&」でjoinしたいんです。

my @a;
foreach (keys %$test)
{ @a = $_."=".$test->{$_} }
$ok = join '*',@a;
undef @a;

わざわざ@aに一度入れるのが、冗長な気がするんですがいれない方法はありますでしょうか?
0705nobodyさん04/08/14 15:53ID:???
>>704
$ok = join '&',@a;
です
070670404/08/14 16:03ID:???
とりあえず思いつきました。
$a = join "&",map{$_."=".$test->{$_}} keys %$test;
0707nobodyさん04/08/14 16:24ID:???
$a = 1 if $a == undefined;
と
$a == undefined && $a =1;
と
if($a == undefined){ $a == 1 }

これってどれが一般的に可読性がよいのですか?僕は結構真ん中の書き方がすきなのですが
みんなでプログラムを組む時などにはどれを使うと喜ばれますか?
0708nobodyさん04/08/14 16:27ID:???
use strict;すると喜ばれるかもな。
0709nobodyさん04/08/14 16:35ID:???
>>708
それなんか意味があるんですか?無駄に処理を増やすのは嫌いです。
0710nobodyさん04/08/14 16:43ID:???
>>709
(´-`).。oO( おいおい… )
0711nobodyさん04/08/14 16:55ID:???
一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefできませんか?
071269504/08/14 17:13ID:HZTk9WgD
>>696
見つかりはするんですが、内容が難しかったり、関係無いものだったり・・・
わかりやすいページを見つけるにはどういった単語で検索すれば良いのでしょう?
0713nobodyさん04/08/14 17:20ID:???
>>707
undefinedじゃなくてundefだろ。
そういうミスを use strict が警告してくれるんだよ。

ちなみに普通はundefは使わず、それぞれ
$a = 1 if ! defined $a;
defined $a or $a = 1;
if (! defined $a) { $a = 1 }
のようにdefinedを使って書く。

また、if ! の代わりにunlessを使って
$a = 1 unless defined $a;
unless (defined $a) { $a = 1 }
のようにも書けるが、一般的にunlessやuntilなどの否定条件文は理解の
妨げになることが多いので使われない。
if ! より字数が多いのもネック。

で、or(または||)やand(または&&)を利用した「式1 or 式2」のような
記述は、副作用を持つ式1の結果如何で式2を評価するというものなので、
副作用のないただの条件式を式1に使うことはない。
#openがよい例

やるなら後付けif文か通常のif文かだが、今は$a=1しかすることが
なくても、後々他の処理も追加する可能性が少しでもあるなら
通常のif文を使うべき。

長文スマソ
0714nobodyさん04/08/14 17:21ID:???
>>712
何を悩んでるのか全くわからん。
0715nobodyさん04/08/14 17:27ID:???
>>712
>見つかりはするんですが、内容が難しかったり、
難しいんじゃなくてそれが普通なんだよ。
藻前には無理ってことだからあきらめろ。
0716nobodyさん04/08/14 17:45ID:???
>>713
undefined間違えてすみません。
でも聞く限りではuse strictはやっぱり無駄なモジュールなんですね。
一応文法チェックかけるんでそれで十分だと思います。というか何故に毎回そんなモジュールを読み込む必要が
あるのか?です。なんかアフォぽです。
0717nobodyさん04/08/14 17:51ID:???
>>716
もう好きにしろよ
0718nobodyさん04/08/14 17:51ID:???
>>711
( スカラ、アレイ、ハッシュ入り乱れてます) = (undef) x 入り乱れた数;

>>716
プラグマです。
0719nobodyさん04/08/14 17:55ID:???
use strict;
はstrict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、
$a == undefinedとか書いちゃうようなバカにはちょっと遅いくらいが
ちょうどいいと思いますよ。ほんと。
0720nobodyさん04/08/14 17:58ID:???
>>719
禿同
0721nobodyさん04/08/14 18:07ID:???
>>716
use strict; に厳しい添削をしてもらって完成したコードが
エラーや警告出なくなったらお引取り願えばいいことも
わからないバカは(ry
0722nobodyさん04/08/14 18:08ID:???
>>719
Perlオタクでない人にはオススメってことですか?
0723nobodyさん04/08/14 18:09ID:???
>>721
文法チェックだけで済ませられないバカは(ry
072471104/08/14 18:15ID:???
>>718

@a = qw/1 2 3 4/;
$a = "absnd";
%a = (a => 1);
(%a , $a , @a) = undef;
print "$a\n",%a,"\n@a";

これだけできました。でも一応
(%a , $a , @a) = (undef) x 3;
とかしたほうがいいですか?
0725nobodyさん04/08/14 18:17ID:???
どんぐりの背比べが始まったw
0726nobodyさん04/08/14 18:19ID:???
>>716みたいなのに限ってcgi.pmを使っている(w
0727nobodyさん04/08/14 18:22ID:???
>>726
何その妄想
0728nobodyさん04/08/14 18:34ID:???
>>723
文法チェックだけでは済まない問題も、use strictによって
解決できること分からないバカは(ry
0729nobodyさん04/08/14 18:36ID:???
飯食いながら左手で打ってたら「も」が抜けちゃったYO
0730nobodyさん04/08/14 18:44ID:???
夏満開
0731nobodyさん04/08/14 19:08ID:???
>>724
(%a, $a, @a) = ();
0732nobodyさん04/08/14 19:15ID:???
(>>1-1000) = undef;
0733nobodyさん04/08/14 19:19ID:???
>>732
だから、リストコンテキストにスカラーコンテキスト代入してどうするよ!
0734nobodyさん04/08/14 19:25ID:???
あんでふとーっ!
0735nobodyさん04/08/14 19:33ID:???
(´-`).。oO(>733 = '逝ってよし';だな)
073672404/08/14 19:33ID:???
>>731
それでもできるんですね。
>>733
代入できても、やってはいけないことなのでしょうか?
(%a , $a , @a) = (undef x 3);
これが一番ですか?
0737nobodyさん04/08/14 20:37ID:???
>>733
コンマ演算子の優先順位が代入演算子より低いから括弧で括る必要が
あるのであって、代入する要素が一つの場合はわざわざリストにする
必要はない。つまり @a = 'a'; は @a = ('a'); と等価。

>>736
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors

(%a, $a, @a) = undef; は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = (undef x 3); は構文エラー。
(%a, $a, @a) = (undef() x 3); は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = ((undef) x 3); は %a = (undef, undef, undef), ($a, @a) = (); と等価。
0738nobodyさん04/08/14 20:43ID:???
>>736
もまえは何がやりたいんだ?
(%a , $a , @a) = (undef x 3);
には少なくとも2つの大きな間違いが存在している。

まず、第1にundef x 3は文法エラーとなる。内容は実際に実行してから読め。
そして第2に、
(%a , $a , @a) = (1 => 2, 3, 4);
がどうなるのか考えろ。
0739nobodyさん04/08/14 20:46ID:???
しかしすごいなあ。
use strictの有用性を説明されても聞かないくせに、
自分の質問にだけは答えてもらおうとする。
さ す が 夏 休 み
0740nobodyさん04/08/14 21:08ID:???
そうか、>>707と>>711は同一人物だたのか。
0741nobodyさん04/08/14 21:41ID:???
夏休みに買うような本に載っているスクリプトはuse strictしたら
まったく動かない事くらい察してやれよ。
0742nobodyさん04/08/14 21:49ID:EgOE5Yt9
>>739
最初は釣りかと思ったが真性包茎みたいだねw
0743nobodyさん04/08/14 21:58ID:???
つーかずっとuse strictつけるとか思ってる奴ってww
簡易デバッガみたいな使い方だろ、use strictって
0744nobodyさん04/08/14 22:01ID:???
>strict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、

っていうか、人間の感覚じゃまずわからんだろ。
strictは結構効率良いみたいだ。
Benchmark測ればわかる。

そんなことより、速度が遅いとか、無駄とかアフォとか言う前に、基本を勉強するべ
きで、しかもuse strict;の必要性についても、もっと勉強したりここの上級者の言
うことを信用したりしろっての。
0745黒死犬 ◆EgxBlf8nvc 04/08/14 22:38ID:???
warnings に助けられたことはあるけど、strict は五月蝿いだけかも・・・
従わなかったところで、挙動が変わるわけでは無いし

http://perldoc.jp/docs/perl/5.8.1/strict.pod
0746nobodyさん04/08/14 22:55ID:???
my付けるのと付けないので挙動が変わったりするよ
0747nobodyさん04/08/14 23:00ID:???
use strict って擬似的なモジュールが存在するけど、実際はperlの内部で
完結してるんじゃないの?

まあuse strictと書きたくないなら
$^H |= 2|0x200|0x400;
とでも書きなさいっと。
0748nobodyさん04/08/14 23:01ID:???
use strict;なんてリリース時にはコメントアウトすればいいだろ。
0749nobodyさん04/08/14 23:04ID:???
>>748
いやそれが普通の使い方じゃないか?
ずっとuseしてる奴なんか居るのか?
0750黒死犬 ◆EgxBlf8nvc 04/08/14 23:11ID:???
>>746
ああ、my変数の typo を教えてくれるという重要な機能がありましたね・・・

sub unko {
 my $unko = shift;
$$unchi = $$**$$; # $$unko (ry のつもり
}
0751nobodyさん04/08/15 00:17ID:ThpZR4Ya
先ほど間違ってphpの方で質問してしまいました...
C-BOARDで、投稿画面に追加したセレクトボックスの
投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?

下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。

#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');

#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
0752nobodyさん04/08/15 00:33ID:???
>>749
めんどいから use strict つけたままだけど
俺んとこは mod_perl だから実行時の速度は変わんないし

しかし珍しく本当に「コーディング」の話題だなあ
0753nobodyさん04/08/15 00:49ID:???
>>751
■ 自分で改造するアドバイスが欲しい場合には
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/79(テンプレ)
0754nobodyさん04/08/15 00:57ID:3zveFoKh
↓のように記述して、csvファイルからデータを読み出したのですが、
読み出した文字列が文字化けしたままなのです。
&jcode'convertで文字コードが変換出来ていないようなのですが・・・
どこが原因なのか、良くわからないのです。
お手数ですが、教えてくださいまし。

require "jcode.pl";

open(FI,"aaa.csv") || return 0;
while(<FI>){
$_ = nkf("-ed",$_);
chomp();
split(",");
if($_[0] eq $bbb){
$ccc = $_[1];
&jcode'convert(*ccc, "sjis");
}
}
close(FI)
0755nobodyさん04/08/15 02:36ID:???
>>751
まずC-Boardのあるディレクトリを削除する。
075675404/08/15 06:40ID:3zveFoKh
すいません、解決しちゃいました。板汚しスイマセン・・・
075772404/08/15 11:33ID:???
>>737-738
とりあえず一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefして
メモリを開放したいんです。

($a,@a,%a) = ();
これで完全に未定義の時と同じメモリ状況になるんですか?一応消えるのは確認しましたが。
0758nobodyさん04/08/15 12:03ID:???
>>757
ならんて。
$aは未定義になるがメモリとは関係なし。
@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
undef @aするとその分の変数領域は解放されるが、システムリソースとしては
喰われたままでPerlが終了するまで解放されない。
過去ログ嫁
075972404/08/15 13:05ID:???
>>758
>$aは未定義になるがメモリとは関係なし。
>@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
>ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので

Perlではundefしてもメモリの開放はできないから、メモリ開放を期待して
ちょこちょこundefする必要はないってことですね。
0760nobodyさん04/08/15 14:37ID:???
ageておこう
0761ぢおぢお04/08/15 15:24ID:EbxomzZw
ifを使ってもしファイルがあったら〜の処理をするというのをしたいんですが
ファイルがあったらというのはどうやってすればいいんですか?
0762nobodyさん04/08/15 15:28ID:???
>761
ファイル検査演算子を使う。
0763nobodyさん04/08/15 15:31ID:???
演算子だらけのperl
0764ぢおぢお04/08/15 15:33ID:EbxomzZw
osがwindowsなので前やってみても駄目だったんです
0765nobodyさん04/08/15 15:36ID:???
>764
何をやってダメだったか書いてみ。
winだからって全てのファイル検査演算子が使えないわけじゃない。
tu-ka,環境依存の話なら先にそれを言え。
■ このスレッドは過去ログ倉庫に格納されています