Skip to content

Context trong Perl ​

Context là một khái niệm cốt lõi trong Perl: cùng một biểu thức có thể cho kết quả khác nhau tùy vào ngữ cảnh nơi nó được dùng.

Ba loại context phổ biến là:

  • scalar context
  • list context
  • void context

1. Scalar context ​

Trong scalar context, biểu thức được kỳ vọng trả về một giá trị đơn.

perl
my @array = (1, 2, 3);
my $count = @array;     # @array ở scalar context -> số phần tử
print "$count\n";      # 3

Một ví dụ khác rất hay gây nhầm:

perl
my $x = (10, 20, 30);   # Toán tử comma trong scalar context -> phần tử cuối
print "$x\n";          # 30

Lưu ý: không phải "nhiều giá trị thì lấy phần tử đầu tiên"; trong ví dụ comma operator ở scalar context, Perl lấy giá trị cuối.

2. List context ​

Trong list context, biểu thức được kỳ vọng trả về danh sách giá trị.

perl
my @array = (1, 2, 3);
my @copy = @array;      # @array ở list context -> toàn bộ phần tử
print join(", ", @copy), "\n";  # 1, 2, 3

List context thường xuất hiện khi gán cho mảng, truyền danh sách đối số, hoặc khi dùng các hàm kỳ vọng danh sách.

3. Void context ​

Void context là khi kết quả biểu thức bị bỏ qua.

perl
sub compute {
    return 99;
}

compute();  # gọi hàm nhưng bỏ qua giá trị trả về -> void context

Void context hữu ích khi bạn chỉ cần side effect (ví dụ: ghi log, cập nhật state), không cần dùng kết quả trả về.

wantarray để nhận biết context ​

wantarray giúp hàm biết nó đang được gọi trong context nào:

  • undef: void context
  • true: list context
  • false (defined nhưng falsy): scalar context
perl
sub example {
    if (!defined wantarray) {
        print "Void context\n";
        return;
    }

    if (wantarray) {
        return (1, 2, 3);   # list context
    }

    return 42;              # scalar context
}

my @list = example();       # (1, 2, 3)
my $scalar = example();     # 42
example();                  # in "Void context"

Kết luận ​

Hiểu đúng context giúp bạn:

  • dự đoán chính xác giá trị trả về
  • tránh bug do dùng sai kiểu ngữ cảnh
  • viết hàm linh hoạt hơn với wantarray

Khi đọc hoặc viết Perl, luôn tự hỏi: "Biểu thức này đang ở scalar, list hay void context?".

DMCA.com Protection Status

Cập nhật lần cuối:

Context trong Perl has loaded