my と local マニュアルを読んでも違いが分かりません。
ご存知の方いらっしゃいませんか?

A 回答 (1件)

結果的な動作はほぼいっしょです。

どちらも使用するブロックでローカルな変数を作り出すわけですし。
「myが変数をコピーして使用するのに対し、localはスタックへおしこめ、localのスコープからハズレたときに、元の値を書き戻すので、速度的にはmyのほうが有利です」
スコープの違いもあるんですが、この程度の説明にしておきます。

myが使えるならmyを、localしか使えない構文ならlocalをつかう程度でいいんじゃないでしょうかね。

Effective Perl(日本語訳/初版)の99ページに詳しく解説してありますので、読んでみるといいです。
    • good
    • 0
この回答へのお礼

本の紹介ありがとうございます。探して読んでみます。
素早い回答ありがとうございました。

お礼日時:2001/04/07 14:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qmy($Str)とmy $Strの違い

いつもお世話になります。
某高機能アクセス解析プロのPerlで書かれたCGIファイルの中に、
my($Str)と、my $Str が出てきます。
これは、何か特別な違いがあるのでしょうか。
知識も無いのにCGIを改造していて恐縮ですが、
このような ちょっとした事で非常に悩みます。
どうか教えて下さい。
よろしく、お願いします。

Aベストアンサー

my $str;とmy($str);はどちらもローカル変数にしているという点で同じですよ。ただNo.2の方も説明しているとおり、
同時に代入 (初期化) をする場合にその解釈 (スカラー、リスト) が違うので結果が変わり得ます。

括弧は同時に複数の変数をmy宣言する場合にも使います。
my($str1, $str2, @array, %hash);
これはmy $str1; my $str2; my @array; my %hash;と同じです。
1つの変数の場合は面倒なのでふつうは括弧を書かないでしょう。

Qファイルから読み込んで配列へ

PerlでCGIスクリプト(掲示板もどき)を作成しています。
配列の操作がうまくいかず、ご教授頂きたいと思います。

<やりたい事>
1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。
2.そのテキストの一部を使ってHTMLで表を作る。

<実際の作業>
1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。

&ReadParse;

#フォームからデータを受け取る
$o=$in{'name'};
$p=$in{'mail'};
$q=$in{'title'};
$r=$in{'comment'};

open(IN,"xxx.txt");
@tmp1=<IN>;
close(IN);

#1件1行として新規データを追加する
unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");

open(OUT,">xxx.txt");
print OUT @tmp1;
close(OUT);

2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。
データを読み込む時点でつまづき、先に進めません。

<テキストファイルの例>
1行目:a,b,c,d
2行目:e,f,g,h
3行目:i,j,k,l
以下同様

<症状>
print @tmp1;とすると、a~lの全てのデータが表示される。

$tmp1[0];とすると、(a)のみ表示される。

$tmp1[1];とすると、カンマ(,)が表示される。

$tmp1[2];とすると、(b)が表示される。

<質問>
一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。
気分的には↓こんな感じです。
foreach {
"行の処理"
foreach {
"列の処理"
}
}

そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。
宜しくお願いします。
なお、不足している情報がありましたら補足いたします。

PerlでCGIスクリプト(掲示板もどき)を作成しています。
配列の操作がうまくいかず、ご教授頂きたいと思います。

<やりたい事>
1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。
2.そのテキストの一部を使ってHTMLで表を作る。

<実際の作業>
1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。

&ReadParse;

#フォームからデータを受け取る
$o=$in{'name'};
$p=$in{'mail'};
$q=$in{'title'};
$r=$in{'c...続きを読む

Aベストアンサー

> unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");

ここがやはりちょっとおかしいですね。
本来は

unshift @tmp1, "$oo,$pp,$qq,$rr\n";

このようにすべきだと思います。
こうすれば一行につき一件のデータとなります。

> 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。

この場合も上記のようにしていれば簡単です。
一行につき一件のデータで、そのデータがカンマ区切りになっているわけですから、

open IN, "xxx.txt";
my @tmp1 = <IN>;
close IN;

my $HTML = "<table>\n";
$HTML .= "<tr><th>name</th><th>title</th></tr>\n";
for (@tmp1) {
chomp;
my @data = split /,/; # ←これでカンマ区切りのデータが配列に格納されます
$HTML .= "<tr><td>$data[0]</td><td>$data[2]</td></tr>\n";
}
$HTML .= "</table>\n";

print "Content-Type: text/html\n\n";
print $HTML;
exit;

となり、$data[0]と$data[2]でテーブルを作って下さい。

> unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n");

ここがやはりちょっとおかしいですね。
本来は

unshift @tmp1, "$oo,$pp,$qq,$rr\n";

このようにすべきだと思います。
こうすれば一行につき一件のデータとなります。

> 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。

この場合も上記のようにしていれば簡単です。
一行につき一件のデータで、そのデータがカンマ区切りになっているわけですから、

open IN, "xxx.txt";
my @tm...続きを読む

Qファイルからデータを読み込んで、配列に格納する方法

データファイル grep.dat があり、その中は
12345
67890
ABCDE
(EOF)
となっています。
 
このファイルの中身を読み込んで、配列 P[0]の
中に("12345","67890","ABCDE") に格納したい
のですが、どのように記述すればよいでしょうか。

Aベストアンサー

多次元配列に代入する場合

my @p;
open FILE, "grep.dat";
  @{$p[0]} = <FILE>;  ・・(a)
close FILE;

openの書式などは好みで変えてください。
結論を言えば、(a)のように書けばokです。

#細かい書式は他にもありますので調べてみるといいかもしれません。

QPerl ファイルを読込んで日付の降順に並べ替えるには?

お世話になります。
次の様な内容ファイルを読込み
=====================
"No""accessday"
"1""2007/1/10"
"2""2007/1/2"
"3""2007/1/5"
"4""2007/1/11"
=====================
日付の降順に並替えて下記のように表示したい場合

=====================
"No""accessday"
"4""2007/1/11"
"1""2007/1/10"
"3""2007/1/5"
"2""2007/1/2"
=====================

どの様なコードを書けばよいのでしょうか。
出来れば簡単なコーディング例などで解説お願いします。

Aベストアンサー

#!/usr/local/bin/perl

open FILE, 'test.txt';
@lines = <FILE>;
close FILE;

@sorted_lines = sort {sort_value($b) cmp sort_value($a)} @lines;

print @sorted_lines;
exit;

sub sort_value
{
if($_[0] =~ m|"(\d+)/(\d+)/(\d+)"|){
return sprintf("%04d%02d%02d",$1,$2,$3);
}else{
#タイトル行は先頭に来るように
return '99999999';
}
}


ソート用の関数で日付の桁をそろえて、それを元にsortしてます。

"2007/1/10" → "20070110"
"2007/1/2" → "20070102"

こんな感じでどうでしょう?

Qファイルを読み込んで特定の箇所のデータを表示

お世話になります。

掲示板のログファイルから、特定の箇所のデータを取得して表示させたいと思っています。

log.cgi(パーミッション666)
ログデータの中身

3<><><>
3<><><><><><><>
2<><><><><><><>
1<><><><><><><>

上記のような感じになっており、「<>」と「<>」の間にいろいろなデータが入っています。
1行目の最初の数字が、これまで投稿された記事総数になっており、この数字を取得したいと思っています。

log.cgiを読み込んで、この記事総数を「$allnumber」と記述すれば、その箇所に表示させるにはどのようにすれば良いでしょうか。

ご教授をお願い致します。

Aベストアンサー

ごめんなさい、勘違いしてますね私。
さっきまでのは無視でお願いします。

要は、最初の一行と全行数だけが必要な訳なんですね。
あんまり良い方法が思い浮かばないんですが、一応、思いつきで書きます。
なので、他の方の回答を待たれた方が良い回答をもらえるかも知れません。

とりあえず質問者さんのスクリプトをいじって、

#! perl
use strict;

my $room = q(.);

open(FH, "$room/log.cgi") or die "Can't open $room/log.cgi";

my $line = <FH>;

my( $allnumber ) = $line =~ /^(\d*)/;

my $count;

$count = $. while (<FH>);

close(FH);

print qq($allnumber : $count);

こんな感じでしょうか?
最初の行は行数に含めないんですよね?(違います?)
で、別な方法です。


---- あんまり良くなさそうな、配列に一気に取り込む例 ----

#! perl
use strict;
my $room = q(.);

open my $fh , '<' , "$room/log.cgi" or die $!;

my @lines = <$fh>;

close $fh or die $!;

my( $allnumber ) = $lines[0] =~ /^(\d*)/;
my $count = @lines - 1;# 最初の行の分を1引く

print qq($allnumber : $count);




---- Tie::File を使ってみた例 ----

#! perl

use strict;
use Tie::File;

my $room = q(.);

tie my @array, 'Tie::File', "$room/log.cgi" or die $!;

my( $allnumber ) = $array[0] =~ /^(\d*)/;

my $count = @array - 1;#最初の行はカウントしない?

print qq($allnumber : $count);

ごめんなさい、勘違いしてますね私。
さっきまでのは無視でお願いします。

要は、最初の一行と全行数だけが必要な訳なんですね。
あんまり良い方法が思い浮かばないんですが、一応、思いつきで書きます。
なので、他の方の回答を待たれた方が良い回答をもらえるかも知れません。

とりあえず質問者さんのスクリプトをいじって、

#! perl
use strict;

my $room = q(.);

open(FH, "$room/log.cgi") or die "Can't open $room/log.cgi";

my $line = <FH>;

my( $allnumber ) = $line =~ /^(\d...続きを読む


おすすめ情報